int kirk_CMD1_ex(void* outbuff, void* inbuff, int size, KIRK_CMD1_HEADER* header) { u8* buffer = (u8*)malloc(size); memcpy(buffer, header, sizeof(KIRK_CMD1_HEADER)); memcpy(buffer+sizeof(KIRK_CMD1_HEADER), inbuff, header->data_size); int ret = kirk_CMD1(outbuff, buffer, size, 1); free(buffer); return ret; }
int sceUtilsBufferCopyWithRange(void* outbuff, int outsize, void* inbuff, int insize, int cmd) { switch(cmd) { case KIRK_CMD_DECRYPT_PRIVATE: if(insize % 16) return SUBCWR_NOT_16_ALGINED; int ret = kirk_CMD1(outbuff, inbuff, insize, 1); if(ret == KIRK_HEADER_HASH_INVALID) return SUBCWR_HEADER_HASH_INVALID; return ret; break; case KIRK_CMD_ENCRYPT_IV_0: return kirk_CMD4(outbuff, inbuff, insize); break; case KIRK_CMD_DECRYPT_IV_0: return kirk_CMD7(outbuff, inbuff, insize); break; case KIRK_CMD_PRIV_SIG_CHECK: return kirk_CMD10(inbuff, insize); break; case KIRK_CMD_SHA1_HASH: return kirk_CMD11(outbuff, inbuff, insize); break; } return -1; }
void test_cmd1() { int result; u8 src[0x100] = { 0 }; u8 dst[0x10] = { 0 }; printf("CMD1 test...\n"); *(u32 *)(&src[0x60]) = 1 ; // Mode *(u32 *)(&src[0x70]) = 0x10; // DataSize *(u32 *)(&src[0x74]) = 0 ; // DataOffset result = kirk_CMD1(dst, (void*)src, 0x100, 0); hex_dump("CMD 1 in", src, 0x100); hex_dump("CMD 1 out", dst, 0x10); printf("CMD 1 result: %d\n", result); }