static void paged_file_crypt_internal_decrypt (PagedFile *f) { if (f->size - f->pos > 0) { if (f->crypt == PAGED_FILE_CRYPT_AES_128_CBC) { u8 iv[0x10]; memcpy (iv, f->iv, 0x10); if ((f->size - f->pos) >= 0x10) memcpy (f->iv, f->ptr + f->size - 0x10, 0x10); aes128cbc (f->key, iv, f->ptr + f->pos, f->size - f->pos, f->ptr + f->pos); } else if (f->crypt == PAGED_FILE_CRYPT_AES_256_CBC) { u8 iv[0x10]; memcpy (iv, f->iv, 0x10); if ((f->size - f->pos) >= 0x10) memcpy (f->iv, f->ptr + f->size - 0x10, 0x10); aes256cbc (f->key, iv, f->ptr + f->pos, f->size - f->pos, f->ptr + f->pos); } else if (f->crypt == PAGED_FILE_CRYPT_AES_128_CTR) { aes128ctr (f->key, f->iv, f->ptr + f->pos, f->size - f->pos, f->ptr + f->pos); } else if (f->crypt == PAGED_FILE_CRYPT_CUSTOM) { f->crypt_cb (f, PAGED_FILE_CRYPT_DECRYPT, f->ptr + f->pos, f->size - f->pos, f->crypt_cb_data); } } }
static void decrypt_npdrm(uint8_t *metadata, struct keylist *klist, struct key *klicensee) { struct key d_klic; // iv is 0 memset(&d_klic, 0, sizeof(struct key)); aes128(klist->klic->key, klicensee->key, d_klic.key); aes128cbc(d_klic.key, d_klic.iv, metadata, 0x40, metadata); }
static void decrypt_npdrm(uint8_t *metadata, struct keylist *klist, u8 *klicensee) { u8 d_klic[0x10]; u8 iv[0x10]; aes128(klist->klic, klicensee, d_klic); // iv is 0 memset(iv, 0, sizeof iv); aes128cbc(d_klic, iv, metadata, 0x40, metadata); }
void sce_decrypt_npdrm(u8 *ptr, struct keylist *klist, struct key *klicensee) { u32 meta_offset; struct key d_klic; meta_offset = be32(ptr + 0x0c); // iv is 0 memset(&d_klic, 0, sizeof(struct key)); aes128(klist->klic->key, klicensee->key, d_klic.key); aes128cbc(d_klic.key, d_klic.iv, ptr + meta_offset + 0x20, 0x40, ptr + meta_offset + 0x20); }
void sce_decrypt_npdrm(u8 *ptr, struct keylist *klist, u8 *klicensee) { u32 meta_offset; u8 d_klic[0x10]; u8 iv[0x10]; meta_offset = be32(ptr + 0x0c); aes128(klist->klic, klicensee, d_klic); // iv is 0 memset(iv, 0, sizeof iv); aes128cbc(d_klic, iv, ptr + meta_offset + 0x20, 0x40, ptr + meta_offset + 0x20); }