From: chaoskagami Date: Sun, 31 Jul 2016 03:12:57 +0000 (-0400) Subject: Still broken, lol X-Git-Tag: v0.3.0~66^2~1^2~4 X-Git-Url: https://chaos.moe/g/?a=commitdiff_plain;h=10be4a2c9369a3a376f65fd1bae09018a658774b;p=corbenik%2Fcorbenik.git Still broken, lol --- diff --git a/source/firm/decryptor.c b/source/firm/decryptor.c index 9a45018..fe2599a 100644 --- a/source/firm/decryptor.c +++ b/source/firm/decryptor.c @@ -38,21 +38,24 @@ ncch_getctr(const ncch_h *ncch, uint8_t *ctr, uint8_t type) 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; } } diff --git a/source/firm/firm.c b/source/firm/firm.c index 9b23114..ae5a329 100644 --- a/source/firm/firm.c +++ b/source/firm/firm.c @@ -233,7 +233,7 @@ decrypt_firm_title(firm_h *dest, ncch_h *ncch, uint32_t *size, void *key) 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); @@ -241,7 +241,7 @@ decrypt_firm_title(firm_h *dest, ncch_h *ncch, uint32_t *size, void *key) 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);