int sce_encrypt_header(u8 *ptr, struct key *k) { u32 meta_offset; u32 meta_len; u64 header_len; u8 iv[16]; meta_offset = be32(ptr + 0x0c); header_len = be64(ptr + 0x10); meta_len = header_len - meta_offset; memcpy(iv, ptr + meta_offset + 0x40, 0x10); aes128ctr(ptr + meta_offset + 0x20, iv, ptr + meta_offset + 0x60, meta_len - 0x60, ptr + meta_offset + 0x60); aes256cbc_enc(k->key, k->iv, ptr + meta_offset + 0x20, 0x40, ptr + meta_offset + 0x20); return 0; }
static void paged_file_crypt_internal_encrypt (PagedFile *f) { if (f->size > 0) { if (f->crypt == PAGED_FILE_CRYPT_AES_128_CBC) { aes128cbc_enc (f->key, f->iv, f->ptr, f->size, f->ptr); if (f->size >= 0x10) memcpy (f->iv, f->ptr + f->size - 0x10, 0x10); } else if (f->crypt == PAGED_FILE_CRYPT_AES_256_CBC) { aes256cbc_enc (f->key, f->iv, f->ptr, f->size, f->ptr); if (f->size >= 0x10) memcpy (f->iv, f->ptr + f->size - 0x10, 0x10); } else if (f->crypt == PAGED_FILE_CRYPT_AES_128_CTR) { aes128ctr (f->key, f->iv, f->ptr, f->size, f->ptr); } else if (f->crypt == PAGED_FILE_CRYPT_CUSTOM) { f->crypt_cb (f, PAGED_FILE_CRYPT_ENCRYPT, f->ptr, f->size, f->crypt_cb_data); } } }