Сделан режим автоопределения цифровой подписи, включен по умолчанию

master
forth32 7 years ago
parent 09ea71bb62
commit c1924a9379

@ -28,7 +28,7 @@
unsigned int errflag=0;
// флаг цифровой подписи
int gflag;
int gflag=0;
// тип прошивки из заголовка файла
int dload_id;
@ -65,7 +65,9 @@ printf("\n Утилита предназначена для прошивки м
"-p <tty> - последовательный порт для общения с загрузчиком\n"
#endif
"-n - режим мультифайловой прошивки из указанного каталога\n\
-g# - установка режима цифровой подписи (-gl - описание параметров)\n\
-g# - установка режима цифровой подписи\n\
-gl - описание параметров\n\
-gd - запрет автоопределения подписи\n\
-m - вывести карту файла прошивки и завершить работу\n\
-e - разобрать файл прошивки на разделы без заголовков\n\
-s - разобрать файл прошивки на разделы с заголовками\n\
@ -208,7 +210,7 @@ if (res == 0) {
}
// Если надо, отправляем команду цифровой подписи
if (gflag) send_signver();
if (gflag != -1) send_signver();
// Входим в HDLC-режим

@ -1 +1 @@
229
231

@ -17,8 +17,6 @@
#include "util.h"
#include "signver.h"
extern int dload_id;
//******************************************************
//* поиск символического имени раздела по его коду
//******************************************************

@ -47,3 +47,5 @@ int findparts(FILE* in);
void find_pname(unsigned int id,unsigned char* pname);
void findfiles (char* fdir);
uint32_t psize(int n);
extern int dload_id;

@ -63,6 +63,12 @@ uint8_t signver[200];
// Флаг режима цифровой подписи
extern int gflag;
// Параметры текущей цифровой подписи
uint32_t signtype; // тип прошивки
uint32_t signlen; // длина подписи
int32_t serach_sign();
//****************************************************
//* Получение описания типа прошивки по коду
//****************************************************
@ -94,10 +100,6 @@ int index;
char* sptr;
char parm[100];
// Параметры текущей цифровой подписи
uint32_t signtype; // тип прошивки
uint32_t signlen; // длина подписи
if (gflag != 0) {
printf("\n Дублирующийся ключ -g\n\n");
@ -111,6 +113,12 @@ if (parm[0] == 'l') {
exit(0);
}
if (parm[0] == 'd') {
// запрет автоопределения подписи
gflag = -1;
return;
}
if (strncmp(parm,"*,",2) == 0) {
// произвольные параметры
// выделяем длину
@ -135,8 +143,6 @@ else {
}
gflag=1;
sprintf(signver,"^SIGNVER=%i,0,778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697,%i",signtype,signlen);
printf("\n Режим цифровой подписи: %s (%i байт)",fw_description(signtype),signlen);
// printf("\nstr - %s",signver);
return;
@ -156,6 +162,15 @@ uint32_t res;
unsigned char SVrsp[]={0x0d, 0x0a, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a};
uint8_t replybuf[200];
if (gflag == 0) {
// автоопределение цифровой подписи
signtype=dload_id|0x80;
signlen=serach_sign();
if (signlen == -1) return; // подпись в файле не найдена
}
printf("\n Режим цифровой подписи: %s (%i байт)",fw_description(signtype),signlen);
sprintf(signver,"^SIGNVER=%i,0,778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697,%i",signtype,signlen);
res=atcmd(signver,replybuf);
if ( (res<sizeof(SVrsp)) || (memcmp(replybuf,SVrsp,sizeof(SVrsp)) != 0) ) {
printf("\n ! Ошибка проверки цифровой сигнатуры - %02x\n",replybuf[2]);

Loading…
Cancel
Save