diff --git a/balong_flash.c b/balong_flash.c index f751d41..e08722b 100644 --- a/balong_flash.c +++ b/balong_flash.c @@ -30,6 +30,9 @@ unsigned int errflag=0; // флаг цифровой подписи int gflag; +// тип прошивки из заголовка файла +int dload_id; + //*********************************************** //* Таблица разделов //*********************************************** diff --git a/build b/build index f414671..bf18240 100644 --- a/build +++ b/build @@ -1 +1 @@ -226 +229 diff --git a/ptable.c b/ptable.c index 05206d6..3976b4e 100644 --- a/ptable.c +++ b/ptable.c @@ -15,7 +15,9 @@ #include "ptable.h" #include "hdlcio.h" #include "util.h" +#include "signver.h" +extern int dload_id; //****************************************************** //* поиск символического имени раздела по его коду @@ -246,6 +248,7 @@ int findparts(FILE* in) { // буфер префикса BIN-файла uint8_t prefix[0x5c]; +int32_t signsize; // Маркер начала заголовка раздела const unsigned int dpattern=0xa55aaa55; @@ -269,7 +272,12 @@ fseek(in,-0x60,SEEK_CUR); // отъезжаем на начало BIN-файла // вынимаем префикс fread(prefix,0x5c,1,in); -printf("\n Код файла прошивки: %i (0x%x)",*((uint32_t*)&prefix[0]),*((uint32_t*)&prefix[0])); +dload_id=*((uint32_t*)&prefix[0]); +if (dload_id > 0xf) { + printf("\n Неверный код типа прошивки (dload_id) в заголовке - %x",dload_id); + exit(0); +} +printf("\n Код файла прошивки: %x (%s)",dload_id,fw_description(dload_id)); // поиск остальных разделов @@ -279,7 +287,16 @@ do { fseek(in,-4,SEEK_CUR); // отъезжаем назад, на начало заголовка extract(in); // извлекаем раздел } while(1); - + +// ищем цифровую подпись +signsize=serach_sign(); +if (signsize == -1) printf("\n Цифровая подпись: не найдена"); +else printf("\n Цифровая подпись: %i байт",signsize); +if (((signsize == -1) && (dload_id>7)) || + ((signsize != -1) && (dload_id<8))) + printf("\n ! ВНИМАНИЕ: Наличие цифровой подписи не соответствует коду типа прошивки: %02x",dload_id); + + return npart; } diff --git a/signver.c b/signver.c index 4ceb335..fa7e484 100644 --- a/signver.c +++ b/signver.c @@ -1,4 +1,5 @@ // + // Процедуры обработки цифровых подписей // #include @@ -39,25 +40,20 @@ struct { {6,1110,"Вебинтерфейс+ISO для HLINK-модема"}, {2,846,"ISO (dashboard) для stick-модема"}, {7,3750,"Прошивка+ISO+вебинтерфейс"}, - {99,3750,"универсальная"}, }; -#define signbaselen 7 +#define signbaselen 6 // таблица типов подписей -struct { - uint8_t code; - char* descr; -} fwtypes[]={ - {1,"ONLY_FW"}, - {2,"ONLY_ISO"}, - {3,"FW_ISO"}, - {4,"ONLY_WEBUI"}, - {5,"FW_WEBUI"}, - {6,"ISO_WEBUI"}, - {7,"FW_ISO_WEBUI"}, - {99,"COMPONENT_MAX"}, - {0,0} +char* fwtypes[]={ +"UNKNOWN", // 0 +"ONLY_FW", // 1 +"ONLY_ISO", // 2 +"FW_ISO", // 3 +"ONLY_WEBUI", // 4 +"FW_WEBUI", // 5 +"ISO_WEBUI", // 6 +"FW_ISO_WEBUI" // 7 }; @@ -72,11 +68,7 @@ extern int gflag; //**************************************************** char* fw_description(uint8_t code) { -int i; -for (i=0; (fwtypes[i].code != 0); i++) { - if (code == fwtypes[i].code) return fwtypes[i].descr; -} -return 0; +return fwtypes[code&0x7]; } //**************************************************** @@ -170,3 +162,24 @@ if ( (res