Safety check for B9S magic in FIRM

This commit is contained in:
d0k3 2017-05-19 00:01:44 +02:00
parent 94e324df8b
commit 490da2e17b
3 changed files with 13 additions and 0 deletions

View File

@ -132,6 +132,11 @@ u32 SafeB9SInstaller(void) {
statusFirm = STATUS_RED; statusFirm = STATUS_RED;
return 1; return 1;
} }
if (CheckBoot9Strap(FIRM_BUFFER) != 0) {
snprintf(msgFirm, 64, "not boot9strap");
statusFirm = STATUS_RED;
return 1;
}
snprintf(msgFirm, 64, "loaded & verified"); snprintf(msgFirm, 64, "loaded & verified");
statusFirm = STATUS_GREEN; statusFirm = STATUS_GREEN;
ShowInstallerStatus(); ShowInstallerStatus();

View File

@ -5,6 +5,9 @@
#define FIRM_MAGIC 'F', 'I', 'R', 'M' #define FIRM_MAGIC 'F', 'I', 'R', 'M'
#define FIRM_MAX_SIZE 0x400000 // 4MB, due to FIRM partition size #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 // see: https://www.3dbrew.org/wiki/FIRM#Firmware_Section_Headers
typedef struct { typedef struct {
u32 offset; u32 offset;
@ -110,3 +113,7 @@ u32 CheckFirmSigHax(void* firm) {
FirmHeader* header = (FirmHeader*) firm; FirmHeader* header = (FirmHeader*) firm;
return (sha_cmp(sighaxHash, header->signature, 0x100, SHA256_MODE) == 0) ? 0 : 1; 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;
}

View File

@ -5,3 +5,4 @@
u32 ValidateFirm(void* firm, u8* firm_sha, u32 firm_size, char* output); u32 ValidateFirm(void* firm, u8* firm_sha, u32 firm_size, char* output);
u32 ValidateSector(void* sector); u32 ValidateSector(void* sector);
u32 CheckFirmSigHax(void* firm); u32 CheckFirmSigHax(void* firm);
u32 CheckBoot9Strap(void* firm);