]> Chaos Git - corbenik/corbenik.git/commitdiff
Still broken, lol
authorchaoskagami <chaos.kagami@gmail.com>
Sun, 31 Jul 2016 03:12:57 +0000 (23:12 -0400)
committerchaoskagami <chaos.kagami@gmail.com>
Sun, 31 Jul 2016 03:12:57 +0000 (23:12 -0400)
source/firm/decryptor.c
source/firm/firm.c

index 9a45018c121f9907a2e712f78978144cfe86deb7..fe2599a3232ac7cb2fd7ccd02e5abc15838ef738 100644 (file)
@@ -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;
     }
 }
 
index 9b231143631d58b6c81c92ee0af7b15d627e62aa..ae5a329ae8da7a84009bf84cefa397b7af04114a 100644 (file)
@@ -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);