// // Процедуры обработки цифровых подписей // #include #include #ifndef WIN32 #include #include #include #include #include #include #include #include #include #else #include #include "getopt.h" #include "printf.h" #include "buildno.h" #endif #include "hdlcio.h" #include "ptable.h" #include "flasher.h" #include "util.h" #include "zlib.h" // таблица параметров ключа -g struct { uint8_t type; uint32_t len; char* descr; } signbase[] = { {1,2958,"Основная прошивка"}, {1,2694,"Прошивка E3372s-stick"}, {2,1110,"Вебинтерфейс+ISO для HLINK-модема"}, {6,1110,"Вебинтерфейс+ISO для HLINK-модема"}, {2,846,"ISO (dashboard) для stick-модема"}, {7,3750,"Прошивка+ISO+вебинтерфейс"}, }; #define signbaselen 6 // таблица типов подписей 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 }; // результирующая строка ^signver-команды uint8_t signver[200]; // Флаг режима цифровой подписи extern int gflag; // Флаг типа прошивки extern int dflag; // Параметры текущей цифровой подписи uint32_t signtype; // тип прошивки uint32_t signlen; // длина подписи int32_t serach_sign(); // Хеш открытого ключа для ^signver char signver_hash[100]="778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697"; //**************************************************** //* Получение описания типа прошивки по коду //**************************************************** char* fw_description(uint8_t code) { return fwtypes[code&0x7]; } //**************************************************** //* Получение списка типов прошивок //**************************************************** void dlist() { int i; printf("\n # Описание\n--------------------------------------"); for(i=1;i<8;i++) { printf("\n %i %s",i,fw_description(i)); } printf("\n\n"); exit(0); } //*************************************************** //* Обработка параметров ключа -d //*************************************************** void dparm(char* sparm) { if (dflag != 0) { printf("\n Дублирующийся ключ -d\n\n"); exit(-1); } if (sparm[0] == 'l') { dlist(); exit(0); } sscanf(sparm,"%x",&dload_id); if ((dload_id == 0) || (dload_id >7)) { printf("\n Неправильное значение ключа -d\n\n"); exit(-1); } dflag=1; } //**************************************************** //* Получение списка параметров ключа -g //**************************************************** void glist() { int i; printf("\n # длина тип описание \n--------------------------------------"); for (i=0; i= signbaselen) goto perror; signlen=signbase[index].len; signtype=signbase[index].type; } gflag=1; // printf("\nstr - %s",signver); return; perror: printf("\n Ошибка в параметрах ключа -g\n"); exit(-1); } //*************************************************** //* Отправка цифровой подписи //*************************************************** void send_signver() { uint32_t res; // ответ на ^signver unsigned char SVrsp[]={0x0d, 0x0a, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a}; uint8_t replybuf[200]; if (gflag == 0) { // автоопределение цифровой подписи signtype=dload_id&0x7; signlen=serach_sign(); if (signlen == -1) return; // подпись в файле не найдена } printf("\n Режим цифровой подписи: %s (%i байт)",fw_description(signtype),signlen); sprintf(signver,"^SIGNVER=%i,0,%s,%i",signtype,signver_hash,signlen); res=atcmd(signver,replybuf); if ( (res