// // Процедуры обработки цифровых подписей // #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; //**************************************************** //* Получение описания типа прошивки по коду //**************************************************** char* fw_description(uint8_t code) { return fwtypes[code&0x7]; } //**************************************************** //* Получение списка параметров ключа -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; sprintf(signver,"^SIGNVER=%i,0,778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697,%i",signtype,signlen); printf("\n Режим цифровой подписи: %s (%i байт)",fw_description(signtype),signlen); // 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]; res=atcmd(signver,replybuf); if ( (res