void
cbc_decrypt(void *inbuf, void *outbuf, size_t size, uint32_t mode, uint8_t *iv)
{
- size_t blocks = size;
- uint8_t *in = inbuf;
- uint8_t *out = outbuf;
+ size_t blocks = size;
+
+ uint8_t *in = inbuf;
+ uint8_t *out = outbuf;
+
while (blocks) {
- set_ctr(iv);
+ size_t current_blocks = (blocks > 0xFFFF) ? 0xFFFF : blocks;
- size_t current_blocks = blocks > 0xFFFF ? 0xFFFF : blocks;
+ set_ctr(iv);
- memcpy(iv, &in[(current_blocks - 1) * AES_BLOCK_SIZE], AES_BLOCK_SIZE);
+ memcpy(iv, in + (current_blocks - 1) * AES_BLOCK_SIZE, AES_BLOCK_SIZE);
aes_decrypt(in, out, current_blocks, mode);
blocks -= current_blocks;
- in += AES_BLOCK_SIZE * current_blocks;
- out += AES_BLOCK_SIZE * current_blocks;
+
+ in += AES_BLOCK_SIZE;
+ out += AES_BLOCK_SIZE;
}
}
if (ncch->magic != NCCH_MAGIC)
return 1;
- memcpy(exefs_key, ncch, 16);
+ memcpy(exefs_key, ncch, AES_BLOCK_SIZE);
ncch_getctr(ncch, exefs_iv, NCCHTYPE_EXEFS);
exefs_h *exefs = (exefs_h *)((uint8_t *)ncch + ncch->exeFSOffset * MEDIA_UNITS);
uint32_t exefs_size = ncch->exeFSSize * MEDIA_UNITS;
- fprintf(stderr, " Decrypting ExeFs for FIRM (size is %u blocks)\n", exefs_size / 16);
+ fprintf(stderr, " Decrypting ExeFs for FIRM (size is %u blocks)\n", exefs_size / AES_BLOCK_SIZE);
setup_aeskeyY(0x2C, exefs_key);
use_aeskey(0x2C);