Example #1
0
int pspDecryptPRX(const u8 *inbuf, u8 *outbuf, u32 size)
{
	kirk_init();
	int retsize = DecryptPRX1(inbuf, outbuf, size, (u32)*(u32_le *)&inbuf[0xD0]);
	if (retsize == MISSING_KEY)
	{
		return MISSING_KEY;
	}

	if (retsize <= 0)
	{
		retsize = DecryptPRX2(inbuf, outbuf, size, (u32)*(u32_le *)&inbuf[0xD0]);
	}

	return retsize;
}
Example #2
0
int main(int argc, char *argv[])
{
	u8 *prx_file = NULL, *prx = NULL;
	const char *src, *dst;
	long file_size;
	int ret;
	
	kirk_init();
	src = dst = NULL;

	if (argc < 3) {
		PrintUsage(argc, argv);

		return -1;
	} else {
		src = argv[1];
		dst = argv[2];
	}

	printf("PSPCipher by TPU & liquidzigong\n");
	ret = LoadFile(src, &prx_file, &file_size);

	if (ret < 0) {
		ErrorExit("Load file failed (%d)\n", ret);
	}

	prx = CheckPrxHeader(prx_file, file_size);

	if (prx == NULL) {
		ErrorExit("Invalid PRX\n");
	}

	DispPrxInfo(src, prx);
	CipherDecrypt(prx, file_size, dst);
	SAFE_FREE(prx_file);

    return 0;
}
int main(int argc, char **argv)
{
	header_keys keys;
	u8 rawkheaderBk[0x90];

	if(argc < 2)
	{
		printf("USAGE: PrxEncrypter [prx]\n");
		return 0;
	}

	memset(in_buffer, 0, sizeof(in_buffer));
	memset(out_buffer, 0, sizeof(out_buffer));
	memset(kirk_raw, 0, sizeof(kirk_raw));
	memset(kirk_enc, 0, sizeof(kirk_enc));
	memset(elf, 0, sizeof(elf));

	kirk_init();

	int elfSize = load_elf(argv[1]);

	if(elfSize < 0) {
		printf("Cannot open %s\n", argv[1]);

		return 0;
	}

	Header_List *target_header = get_header_list( elfSize );

	if( target_header == NULL ) {
		printf("PRX SIGNER: Elf is to big\n");

		return 0;
	}

	u8 *kirkHeader	= target_header->kirkHeader;
	u8 *pspHeader	= target_header->pspHeader;
	int krawSize = get_kirk_size(kirkHeader);

	if (is_compressed(pspHeader)) {
		elfSize = get_elf_size(pspHeader);
		gzip_compress(elf, elf, elfSize);
	}

	memcpy(kirk_raw, kirkHeader, 0x110);
	memcpy(rawkheaderBk, kirk_raw, sizeof(rawkheaderBk));

	kirk_decrypt_keys((u8*)&keys, kirk_raw);
	memcpy(kirk_raw, &keys, sizeof(header_keys));
	memcpy(kirk_raw+0x110, elf, elfSize);

	if(kirk_CMD0(kirk_enc, kirk_raw, sizeof(kirk_enc), 0) != 0)
	{
		printf("PRX SIGNER: Could not encrypt elf\n");
		return 0;
	}

	memcpy(kirk_enc, rawkheaderBk, sizeof(rawkheaderBk));

	if(kirk_forge(kirk_enc, sizeof(kirk_enc)) != 0)
	{
		printf("PRX SIGNER: Could not forge cmac block\n");

		return 0;
	}

	memcpy(out_buffer, pspHeader, 0x150);
	memcpy(out_buffer+0x150, kirk_enc+0x110, krawSize-0x110);

	return dumpFile("./data.psp", out_buffer, (krawSize-0x110)+0x150);
}