diff --git a/source/installer.c b/source/installer.c index 152a599..cf1ac6a 100644 --- a/source/installer.c +++ b/source/installer.c @@ -132,6 +132,11 @@ u32 SafeB9SInstaller(void) { statusFirm = STATUS_RED; return 1; } + if (CheckBoot9Strap(FIRM_BUFFER) != 0) { + snprintf(msgFirm, 64, "not boot9strap"); + statusFirm = STATUS_RED; + return 1; + } snprintf(msgFirm, 64, "loaded & verified"); statusFirm = STATUS_GREEN; ShowInstallerStatus(); diff --git a/source/safety/validator.c b/source/safety/validator.c index 5436e44..2a5f0bd 100644 --- a/source/safety/validator.c +++ b/source/safety/validator.c @@ -5,6 +5,9 @@ #define FIRM_MAGIC 'F', 'I', 'R', 'M' #define FIRM_MAX_SIZE 0x400000 // 4MB, due to FIRM partition size +#define B9S_MAGIC "B9S" +#define B9S_OFFSET (0x40 - strnlen(B9S_MAGIC, 0x10)) + // see: https://www.3dbrew.org/wiki/FIRM#Firmware_Section_Headers typedef struct { u32 offset; @@ -110,3 +113,7 @@ u32 CheckFirmSigHax(void* firm) { FirmHeader* header = (FirmHeader*) firm; return (sha_cmp(sighaxHash, header->signature, 0x100, SHA256_MODE) == 0) ? 0 : 1; } + +u32 CheckBoot9Strap(void* firm) { + return (memcmp(((u8*) firm) + B9S_OFFSET, B9S_MAGIC, strnlen(B9S_MAGIC, 0x10)) == 0) ? 0 : 1; +} diff --git a/source/safety/validator.h b/source/safety/validator.h index e03adca..fb9225a 100644 --- a/source/safety/validator.h +++ b/source/safety/validator.h @@ -5,3 +5,4 @@ u32 ValidateFirm(void* firm, u8* firm_sha, u32 firm_size, char* output); u32 ValidateSector(void* sector); u32 CheckFirmSigHax(void* firm); +u32 CheckBoot9Strap(void* firm);