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; }
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); }