From 43eddd123bad829330a572c4aa42a7b50acb3de1 Mon Sep 17 00:00:00 2001 From: schneider Date: Tue, 19 Jul 2011 01:12:53 +0200 Subject: [PATCH] filesystem: check signature of loadables with cbc-mc --- firmware/filesystem/execute.c | 19 +++++++++++++++++-- firmware/filesystem/execute.h | 2 +- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/firmware/filesystem/execute.c b/firmware/filesystem/execute.c index 3232f02..071b910 100644 --- a/firmware/filesystem/execute.c +++ b/firmware/filesystem/execute.c @@ -10,11 +10,14 @@ #include "filesystem/ff.h" #include "filesystem/select.h" + +const uint32_t signature_key[4] = {0,0,0,0}; + extern void * sram_top; /**************************************************************************/ -void execute_file (const char * fname){ +void execute_file (const char * fname, uint8_t checksignature){ FRESULT res; FIL file; UINT readbytes; @@ -27,6 +30,7 @@ void execute_file (const char * fname){ dst=(void (*)(void)) 0x10001800; res=f_open(&file, fname, FA_OPEN_EXISTING|FA_READ); + //lcdPrint("open: "); //lcdPrintln(f_get_rc_string(res)); //lcdRefresh(); @@ -41,7 +45,18 @@ void execute_file (const char * fname){ if(res){ return; }; + + if( checksignature ){ + uint32_t mac[4]; + uint32_t *data = (uint32_t*)dst; + uint32_t len = readbytes/4; + xxtea_cbcmac(mac, (uint32_t*)dst, len-4, signature_key); + if( data[len-4] != mac[0] || data[len-3] != mac[1] + || data[len-2] != mac[2] || data[len-1] != mac[3] ){ + return; + } + } //lcdPrintInt(readbytes); //lcdPrintln(" bytes"); //lcdRefresh(); @@ -60,6 +75,6 @@ void executeSelect(char *ext){ filename[2]=0; if( selectFile(filename+2,ext) == 0) - execute_file(filename); + execute_file(filename,0); }; diff --git a/firmware/filesystem/execute.h b/firmware/filesystem/execute.h index 7242d6d..2b4b0f1 100644 --- a/firmware/filesystem/execute.h +++ b/firmware/filesystem/execute.h @@ -1,7 +1,7 @@ #ifndef _EXECUTE_H_ #define _EXECUTE_H_ -void execute_file (const char * fname); +void execute_file (const char * fname, uint8_t checksignature); void executeSelect(char *ext); #endif