Добавлено определение наличия и размера подписи

master
forth32 7 years ago
parent 2baea5037c
commit 09ea71bb62

@ -30,6 +30,9 @@ unsigned int errflag=0;
// флаг цифровой подписи
int gflag;
// тип прошивки из заголовка файла
int dload_id;
//***********************************************
//* Таблица разделов
//***********************************************

@ -1 +1 @@
226
229

@ -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;
}

@ -1,4 +1,5 @@
//
// Процедуры обработки цифровых подписей
//
#include <stdio.h>
@ -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<sizeof(SVrsp)) || (memcmp(replybuf,SVrsp,sizeof(SVrsp)) != 0) ) {
exit(-2);
}
}
//***************************************************
//* Поиск цифровой подписи в прошивке
//***************************************************
int32_t serach_sign() {
int i;
uint32_t pt;
uint32_t signsize;
for (i=0;i<2;i++) {
pt=*((uint32_t*)&ptable[i].pimage[ptable[i].hd.psize-4]);
if (pt == 0xffaaaffa) {
// подпись найдена
signsize=*((uint32_t*)&ptable[i].pimage[ptable[i].hd.psize-12]);
return signsize;
}
}
// не найдена
return -1;
}

@ -1,3 +1,8 @@
void glist();
void gparm(char* sparm);
void send_signver();
char* fw_description(uint8_t code);
int32_t serach_sign();
extern char* fwtypes[];
Loading…
Cancel
Save