From: chaoskagami Date: Tue, 26 Jul 2016 15:17:20 +0000 (-0400) Subject: Failing at ExeFs now X-Git-Tag: v0.3.0~66^2~1^2~7 X-Git-Url: https://chaos.moe/g/?a=commitdiff_plain;h=95ce35202daac6b1d136822e6190d9c068892a89;p=corbenik%2Fcorbenik.git Failing at ExeFs now --- diff --git a/external/libctr9 b/external/libctr9 index 1629815..c1132b2 160000 --- a/external/libctr9 +++ b/external/libctr9 @@ -1 +1 @@ -Subproject commit 1629815c5a08ff95c3b0d592bbf9583c63cd124b +Subproject commit c1132b2afc849f1736c64dafe543d0e3a3fe9def diff --git a/source/firm/decryptor.c b/source/firm/decryptor.c index b93555d..367e8fc 100644 --- a/source/firm/decryptor.c +++ b/source/firm/decryptor.c @@ -48,7 +48,7 @@ cbc_decrypt(void *inbuf, void *outbuf, size_t size, uint32_t mode, uint8_t *iv) aes_decrypt(in, out, current_blocks, mode); - memcpy(iv, out + (blocks - 1) * AES_BLOCK_SIZE, AES_BLOCK_SIZE); + memcpy(iv, out + (current_blocks - 1) * AES_BLOCK_SIZE, AES_BLOCK_SIZE); blocks -= current_blocks; in += AES_BLOCK_SIZE * current_blocks; diff --git a/source/firm/firm.c b/source/firm/firm.c index a534738..34c0e12 100644 --- a/source/firm/firm.c +++ b/source/firm/firm.c @@ -222,24 +222,26 @@ decrypt_firm_title(firm_h *dest, ncch_h *ncch, uint32_t *size, void *key) uint8_t exefs_key[16] = { 0 }; uint8_t exefs_iv[16] = { 0 }; - fprintf(stderr, " Decrypting FIRM container\n"); + fprintf(stderr, " Decrypting FIRM container (size is %u blocks)\n", *size / AES_BLOCK_SIZE); setup_aeskey(0x16, key); use_aeskey(0x16); - set_ctr(firm_iv); + cbc_decrypt(ncch, ncch, *size / AES_BLOCK_SIZE, AES_CBC_DECRYPT_MODE|AES_CNT_INPUT_ENDIAN|AES_CNT_OUTPUT_ENDIAN|AES_CNT_INPUT_ORDER|AES_CNT_OUTPUT_ORDER, firm_iv); if (ncch->magic != NCCH_MAGIC) return 1; memcpy(exefs_key, ncch, 16); + ncch_getctr(ncch, exefs_iv, NCCHTYPE_EXEFS); // Get the exefs offset and size from the NCCH 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\n"); + fprintf(stderr, " Decrypting ExeFs for FIRM (size is %u blocks)\n", exefs_size / 16); + setup_aeskeyY(0x2C, exefs_key); use_aeskey(0x2C); ctr_decrypt(exefs, exefs, exefs_size / AES_BLOCK_SIZE, AES_CTR_MODE|AES_CNT_INPUT_ENDIAN|AES_CNT_OUTPUT_ENDIAN|AES_CNT_INPUT_ORDER|AES_CNT_OUTPUT_ORDER, exefs_iv);