]> Chaos Git - corbenik/corbenik.git/commitdiff
Still busted
authorchaoskagami <chaos.kagami@gmail.com>
Sat, 6 Aug 2016 04:42:10 +0000 (00:42 -0400)
committerchaoskagami <chaos.kagami@gmail.com>
Sat, 6 Aug 2016 04:42:10 +0000 (00:42 -0400)
include/firm/decryptor.h
source/firm/decryptor.c
source/firm/firm.c

index c7f95f67887b592d056036f17cc60822a3e1e708..92a1739d57f24d63fae54137367cd49bbd34561b 100644 (file)
@@ -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,
index 1d792db2b8a5b2a8889af3bcbdc025912ab4039e..32dbde3c05ee693f3cc16e5cfcc8587ddc2fdbaf 100644 (file)
@@ -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)
 {
index ae5a329ae8da7a84009bf84cefa397b7af04114a..6ae3dfc692c7fc3cedba59a4bdbfda8a6758fe3e 100644 (file)
@@ -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;
         }