From 9ca9c135ccba37968d9fe3539bc5d70abcac8498 Mon Sep 17 00:00:00 2001 From: d0k3 Date: Thu, 2 Feb 2017 00:40:59 +0100 Subject: [PATCH] Fix remaing bugs + cosmetics --- source/installer.c | 23 +++++++++++++---------- source/nand/nand.c | 21 +++++++++++---------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/source/installer.c b/source/installer.c index 93657d5..f11ea51 100644 --- a/source/installer.c +++ b/source/installer.c @@ -54,13 +54,13 @@ u32 ShowInstallerStatus(void) { DrawStringF(BOT_SCREEN, pos_x0, pos_y0 + 50, COLOR_STD_FONT, COLOR_STD_BG, "Backup Status :"); DrawStringF(BOT_SCREEN, pos_x0, pos_y0 + 60, COLOR_STD_FONT, COLOR_STD_BG, "Install Status:"); - DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 0, COLOR_STATUS(statusA9lh) , COLOR_STD_BG, msgA9lh ); - DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 10, COLOR_STATUS(statusSdCard) , COLOR_STD_BG, msgSdCard ); - DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 20, COLOR_STATUS(statusFirm) , COLOR_STD_BG, msgFirm ); - DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 30, COLOR_STATUS(statusSector) , COLOR_STD_BG, msgSector ); - DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 40, COLOR_STATUS(statusCrypto) , COLOR_STD_BG, msgCrypto ); - DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 50, COLOR_STATUS(statusBackup) , COLOR_STD_BG, msgBackup ); - DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 60, COLOR_STATUS(statusInstall), COLOR_STD_BG, msgInstall); + DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 0, COLOR_STATUS(statusA9lh) , COLOR_STD_BG, "%-22.22s", msgA9lh ); + DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 10, COLOR_STATUS(statusSdCard) , COLOR_STD_BG, "%-22.22s", msgSdCard ); + DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 20, COLOR_STATUS(statusFirm) , COLOR_STD_BG, "%-22.22s", msgFirm ); + DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 30, COLOR_STATUS(statusSector) , COLOR_STD_BG, "%-22.22s", msgSector ); + DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 40, COLOR_STATUS(statusCrypto) , COLOR_STD_BG, "%-22.22s", msgCrypto ); + DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 50, COLOR_STATUS(statusBackup) , COLOR_STD_BG, "%-22.22s", msgBackup ); + DrawStringF(BOT_SCREEN, pos_x1, pos_y0 + 60, COLOR_STATUS(statusInstall), COLOR_STD_BG, "%-22.22s", msgInstall); return 0; } @@ -73,7 +73,6 @@ u32 SafeSigHaxInstaller(void) { // step #0 - a9lh check - InitNandCrypto(); // for sector0x96 crypto and NAND drives snprintf(msgA9lh, 64, CheckA9lh() ? "installed" : "not installed"); statusA9lh = STATUS_GREEN; ShowInstallerStatus(); @@ -91,7 +90,8 @@ u32 SafeSigHaxInstaller(void) { statusSdCard = STATUS_RED; return 1; } - snprintf(msgSdCard, 64, "%lluMB / %lluMB free", sdFree / (1024 * 1024), sdTotal / (1024 * 1024)); + InitNandCrypto(); // for sector0x96 crypto and NAND drives + snprintf(msgSdCard, 64, "%lluMB/%lluMB free", sdFree / (1024 * 1024), sdTotal / (1024 * 1024)); statusSdCard = (sdFree < MIN_SD_FREE) ? STATUS_RED : STATUS_GREEN; ShowInstallerStatus(); if (sdFree < MIN_SD_FREE) return 1; @@ -177,6 +177,8 @@ u32 SafeSigHaxInstaller(void) { if (!ShowUnlockSequence(1, "All input files verified.\nTo install FIRM, enter the sequence\nbelow or press B to cancel.")) { snprintf(msgBackup, 64, "cancelled by user"); snprintf(msgInstall, 64, "cancelled by user"); + statusBackup = STATUS_YELLOW; + statusInstall = STATUS_YELLOW; return 1; } @@ -215,7 +217,7 @@ u32 SafeSigHaxInstaller(void) { u8 sector_backup0[0x200]; u8 sector_backup1[0x200]; f_unlink(NAME_SECTORBACKUP); - if ((ReadNandSectors(sector_backup0, 96, 1, 0xFF) != 0) || + if ((ReadNandSectors(sector_backup0, 0x96, 1, 0xFF) != 0) || (f_qwrite(NAME_SECTORBACKUP, sector_backup0, 0, 0x200, &bt) != FR_OK) || (bt != 0x200) || (f_qread(NAME_SECTORBACKUP, sector_backup1, 0, 0x200, &bt) != FR_OK) || (bt != 0x200) || (memcmp(sector_backup0, sector_backup1, 0x200) != 0)) { @@ -230,6 +232,7 @@ u32 SafeSigHaxInstaller(void) { // backups done // step #6 - install sighaxed FIRM + ShowPrompt(false, "Install not finished - this is only a preview"); return 0; diff --git a/source/nand/nand.c b/source/nand/nand.c index 3f44750..2f21692 100644 --- a/source/nand/nand.c +++ b/source/nand/nand.c @@ -11,8 +11,8 @@ static const u8 slot0x05KeyY_sha256[0x20] = { // hash for slot0x05KeyY (16 byte) }; static const u8 slot0x11Key95_sha256[0x20] = { // slot0x11Key95 hash (first 16 byte of sector0x96) - 0xBF, 0x01, 0x4C, 0x85, 0x9B, 0xA1, 0x07, 0xFA, 0x3B, 0xAC, 0x25, 0x20, 0x1A, 0x3F, 0x3A, 0xF4, - 0x4E, 0x97, 0xE9, 0x5C, 0x06, 0x46, 0xF8, 0xE7, 0xC1, 0xC2, 0xC3, 0x29, 0x88, 0xBF, 0xF6, 0x50 + 0xBA, 0xC1, 0x40, 0x9C, 0x6E, 0xE4, 0x1F, 0x04, 0xAA, 0xC4, 0xE2, 0x09, 0x5C, 0xE9, 0x4F, 0x78, + 0x6C, 0x78, 0x5F, 0xAC, 0xEC, 0x7E, 0xC0, 0x11, 0x26, 0x9D, 0x4E, 0x47, 0xB3, 0x64, 0xC4, 0xA5 }; static const u8 nand_magic_n3ds[0x60] = { // NCSD NAND header N3DS magic @@ -95,7 +95,8 @@ bool InitNandCrypto(void) u32 NandCid[4]; u8 shasum[32]; - sdmmc_get_cid( 1, NandCid); + sdmmc_sdcard_init(); + sdmmc_get_cid(1, NandCid); sha_quick(shasum, (u8*) NandCid, 16, SHA256_MODE); memcpy(CtrNandCtr, shasum, 16); sha_quick(shasum, (u8*) NandCid, 16, SHA1_MODE); @@ -131,11 +132,12 @@ bool InitNandCrypto(void) // part #3: CTRNAND N3DS KEY // thanks AuroraWright and Gelex for advice on this // see: https://github.com/AuroraWright/Luma3DS/blob/master/source/crypto.c#L347 - - // keyY 0x05 is encrypted @0x0EB014 in the FIRM90 - // keyY 0x05 is encrypted @0x0EB24C in the FIRM81 - if ((LoadKeyYFromP9(slot0x05KeyY, slot0x05KeyY_sha256, 0x0EB014, 0x05) != 0) && - (LoadKeyYFromP9(slot0x05KeyY, slot0x05KeyY_sha256, 0x0EB24C, 0x05) != 0)) {}; + if (CheckA9lh()) { // only for a9lh + // keyY 0x05 is encrypted @0x0EB014 in the FIRM90 + // keyY 0x05 is encrypted @0x0EB24C in the FIRM81 + if ((LoadKeyYFromP9(slot0x05KeyY, slot0x05KeyY_sha256, 0x0EB014, 0x05) != 0) && + (LoadKeyYFromP9(slot0x05KeyY, slot0x05KeyY_sha256, 0x0EB24C, 0x05) != 0)) {}; + } return true; } @@ -175,12 +177,11 @@ bool CheckFirmCrypto(void) u8 buffer[0x200]; for (u32 i = 0; i < sizeof(sectors) / sizeof(u32); i++) { ReadNandSectors(buffer, sectors[i], 1, 0x06); - ShowPrompt(false, "%016llX\n%016llX", getbe64(magic), getbe64(buffer)); if (memcmp(buffer, magic, 8) != 0) return false; } // success if we arrive here - return false; + return true; } bool CheckA9lh(void)