From: chaoskagami Date: Sat, 6 Aug 2016 04:42:10 +0000 (-0400) Subject: Still busted X-Git-Tag: v0.3.0~66^2~1^2~2 X-Git-Url: https://chaos.moe/g/?a=commitdiff_plain;h=4592645ab262e4479f6b17c76e3af948676841be;p=corbenik%2Fcorbenik.git Still busted --- diff --git a/include/firm/decryptor.h b/include/firm/decryptor.h index c7f95f6..92a1739 100644 --- a/include/firm/decryptor.h +++ b/include/firm/decryptor.h @@ -3,8 +3,6 @@ void sha256sum(void* sum, void* data, uint32_t size); -void cbc_decrypt(void *inbuf, void *outbuf, size_t size, uint32_t mode, uint8_t *iv); - typedef enum { NCCHTYPE_EXHEADER = 1, NCCHTYPE_EXEFS = 2, diff --git a/source/firm/decryptor.c b/source/firm/decryptor.c index 1d792db..32dbde3 100644 --- a/source/firm/decryptor.c +++ b/source/firm/decryptor.c @@ -35,30 +35,6 @@ 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; - - while (blocks) { - size_t current_blocks = (blocks > 0xFFFF) ? 0xFFFF : blocks; - - set_ctr(iv); - - 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; - } -} - void sha256sum(void* sum, void* data, uint32_t size) { diff --git a/source/firm/firm.c b/source/firm/firm.c index ae5a329..6ae3dfc 100644 --- a/source/firm/firm.c +++ b/source/firm/firm.c @@ -61,7 +61,7 @@ void dump_firm(firm_h** buffer, uint8_t index) { use_aeskey(0x06); set_ctr(ctr); - ctr_decrypt(firm, firm, firm_b_size / AES_BLOCK_SIZE, AES_CTR_MODE|AES_CNT_INPUT_ENDIAN|AES_CNT_OUTPUT_ENDIAN|AES_CNT_INPUT_ORDER|AES_CNT_OUTPUT_ORDER, ctr); + ctr_decrypt(firm, firm, firm_b_size / AES_BLOCK_SIZE, AES_CNT_CTRNAND_MODE, ctr); if (memcmp((char*) & firm->magic, "FIRM", 4)) abort(" Decryption failed on FIRM.\n"); @@ -208,8 +208,7 @@ decrypt_cetk_key(void *key, const void *cetk) memcpy(iv, ticket->titleID, sizeof(ticket->titleID)); memcpy(key, ticket->titleKey, sizeof(ticket->titleKey)); - set_ctr(iv); - cbc_decrypt(key, key, 1, AES_CBC_DECRYPT_MODE|AES_CNT_INPUT_ENDIAN|AES_CNT_OUTPUT_ENDIAN|AES_CNT_INPUT_ORDER|AES_CNT_OUTPUT_ORDER, iv); + cbc_decrypt(key, key, 1, AES_CNT_TITLEKEY_DECRYPT_MODE, iv); fprintf(stderr, " Extracted titlekey from cetk.\n"); @@ -228,7 +227,7 @@ decrypt_firm_title(firm_h *dest, ncch_h *ncch, uint32_t *size, void *key) setup_aeskey(0x16, key); use_aeskey(0x16); - 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); + cbc_decrypt(ncch, ncch, *size / AES_BLOCK_SIZE, AES_CNT_CBC_DECRYPT_MODE, firm_iv); if (ncch->magic != NCCH_MAGIC) return 1; @@ -245,7 +244,7 @@ decrypt_firm_title(firm_h *dest, ncch_h *ncch, uint32_t *size, void *key) 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); + ctr_decrypt(exefs, exefs, exefs_size / AES_BLOCK_SIZE, AES_CNT_CTRNAND_MODE, exefs_iv); // Get the decrypted FIRM // We assume the firm.bin is always the first file @@ -273,7 +272,7 @@ decrypt_arm9bin(arm9bin_h *header, uint64_t firm_title, uint8_t version) slot = 0x16; use_aeskey(0x11); - aes_decrypt(decrypted_keyx, header->slot0x16keyX, 1, AES_ECB_DECRYPT_MODE|AES_CNT_INPUT_ENDIAN|AES_CNT_OUTPUT_ENDIAN|AES_CNT_INPUT_ORDER|AES_CNT_OUTPUT_ORDER); + aes_decrypt(decrypted_keyx, header->slot0x16keyX, 1, AES_CNT_ECB_DECRYPT_MODE); setup_aeskeyX(slot, decrypted_keyx); } @@ -284,7 +283,7 @@ decrypt_arm9bin(arm9bin_h *header, uint64_t firm_title, uint8_t version) int size = atoi(header->size); use_aeskey(slot); - ctr_decrypt(arm9bin, arm9bin, size / AES_BLOCK_SIZE, AES_CTR_MODE|AES_CNT_INPUT_ENDIAN|AES_CNT_OUTPUT_ENDIAN|AES_CNT_INPUT_ORDER|AES_CNT_OUTPUT_ORDER, header->ctr); + ctr_decrypt(arm9bin, arm9bin, size / AES_BLOCK_SIZE, AES_CNT_CTRNAND_MODE, header->ctr); if (firm_title == NATIVE_FIRM_TITLEID) return *(uint32_t *)arm9bin != ARM9BIN_MAGIC; @@ -446,7 +445,7 @@ boot_firm() use_aeskey(0x11); uint8_t keyx[AES_BLOCK_SIZE]; for (int slot = 0x19; slot < 0x20; slot++) { - aes_decrypt(keyx, keydata, 1, AES_ECB_DECRYPT_MODE|AES_CNT_INPUT_ENDIAN|AES_CNT_OUTPUT_ENDIAN|AES_CNT_INPUT_ORDER|AES_CNT_OUTPUT_ORDER); + ecb_decrypt(keyx, keydata, 1, AES_CNT_ECB_DECRYPT_MODE); setup_aeskeyX(slot, keyx); *(uint8_t *)(keydata + 0xF) += 1; }