s32 Title_GetTitleKey(tik *p_tik, u8 *key) { static u8 iv[16] ATTRIBUTE_ALIGN(32); static u8 enc[16] ATTRIBUTE_ALIGN(32); static u8 dec[16] ATTRIBUTE_ALIGN(32); s32 ret; /* Set IV */ memset(iv, 0, sizeof(iv)); memcpy(iv, &p_tik->titleid, sizeof(u64)); /* Set encrypted key */ memset(enc, 0, sizeof(enc)); memcpy(enc, &p_tik->cipher_title_key, sizeof(enc)); /* Clear output buffer */ memset(dec, 0, sizeof(dec)); /* Decrypt title key */ ret = ES_Decrypt(ES_KEY_COMMON, iv, enc, sizeof(enc), dec); if (ret < 0) return ret; /* Copy key */ memcpy(key, dec, sizeof(dec)); return 0; }
//--------------------------------------------------------------------------------- int get_title_key(signed_blob *s_tik, u8 *key){ //--------------------------------------------------------------------------------- static u8 iv[16] ATTRIBUTE_ALIGN(0x20); static u8 keyin[16] ATTRIBUTE_ALIGN(0x20); static u8 keyout[16] ATTRIBUTE_ALIGN(0x20); int retval; const tik *p_tik; p_tik = (tik*)SIGNATURE_PAYLOAD(s_tik); u8 *enc_key = (u8 *)&p_tik->cipher_title_key; memcpy(keyin, enc_key, sizeof keyin); memset(keyout, 0, sizeof keyout); memset(iv, 0, sizeof iv); memcpy(iv, &p_tik->titleid, sizeof p_tik->titleid); retval = ES_Decrypt(ES_KEY_COMMON, iv, keyin, sizeof keyin, keyout); if (retval){ // printf("ES_Decrypt returned %d\n", retval); } memcpy(key, keyout, sizeof keyout); return retval; }