}
}
-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)
{
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");
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");
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;
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
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);
}
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;
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;
}