mirror of
https://github.com/forth32/balongflash
synced 2024-11-03 15:40:15 +00:00
Добавлен выбор цифровой подписи в ключе -g
This commit is contained in:
parent
c91a7001e5
commit
9ac30b03ec
135
balong_flash.c
135
balong_flash.c
@ -1,5 +1,6 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
@ -14,7 +15,132 @@
|
||||
|
||||
unsigned char replybuf[4096];
|
||||
|
||||
// Цифровые подписи
|
||||
|
||||
unsigned char signhash[]="778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697"; // параметр 2 - hash
|
||||
|
||||
struct {
|
||||
uint8_t type;
|
||||
uint32_t len;
|
||||
char* descr;
|
||||
} signbase[] = {
|
||||
{1,2958,"Основная прошивка"},
|
||||
{1,2694,"Прошивка E3372s-stick"},
|
||||
{2,1110,"ISO для HLINK-модема"},
|
||||
{6,1110,"Вебинтерфейс+ISO"},
|
||||
{2,846,"ISO (dashboard) для stick-модема"},
|
||||
};
|
||||
|
||||
#define signbaselen 5
|
||||
|
||||
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}
|
||||
};
|
||||
|
||||
|
||||
// результирующая строка ^signver - команды
|
||||
static unsigned char signver[100];
|
||||
// Флаг режима цифровой подписи
|
||||
int gflag=0;
|
||||
|
||||
//****************************************************
|
||||
//* Получение описания типа прошивки по коду
|
||||
//****************************************************
|
||||
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;
|
||||
}
|
||||
|
||||
//****************************************************
|
||||
//* Получение списка параметров ключа -g
|
||||
//****************************************************
|
||||
void glist() {
|
||||
|
||||
int i;
|
||||
printf("\n # длина тип описание \n--------------------------------------");
|
||||
for (i=0; i<signbaselen; i++) {
|
||||
printf("\n%1i %5i %2i %s",i,signbase[i].len,signbase[i].type,signbase[i].descr);
|
||||
}
|
||||
printf("\n\n Также можно указать произвольные параметры подписи в формате:\n -g *,type,len\n\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
//***************************************************
|
||||
//* Обработка параметров ключа -g
|
||||
//***************************************************
|
||||
void gparm(char* sparm) {
|
||||
|
||||
int index;
|
||||
char* sptr;
|
||||
char parm[100];
|
||||
|
||||
// Параметры текущей цифровой подписи
|
||||
uint32_t signtype; // тип прошивки
|
||||
uint32_t signlen; // длина подписи
|
||||
|
||||
|
||||
if (gflag != 0) {
|
||||
printf("\n Дублирующийся ключ -g\n\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
strcpy(parm,sparm); // локальная копия параметров
|
||||
|
||||
if (parm[0] == 'l') {
|
||||
glist();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (strncmp(parm,"*,",2) == 0) {
|
||||
// произвольные параметры
|
||||
// выделяем длину
|
||||
sptr=strrchr(parm,',');
|
||||
if (sptr == 0) goto perror;
|
||||
signlen=atoi(sptr+1);
|
||||
*sptr=0;
|
||||
// выделяем тип раздела
|
||||
sptr=strrchr(parm,',');
|
||||
if (sptr == 0) goto perror;
|
||||
signtype=atoi(sptr+1);
|
||||
if (fw_description(signtype) == 0) {
|
||||
printf("\n Ключ -g: неизвестный тип прошивки - %i\n",signtype);
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
else {
|
||||
index=atoi(parm);
|
||||
if (index >= signbaselen) goto perror;
|
||||
signlen=signbase[index].len;
|
||||
signtype=signbase[index].type;
|
||||
}
|
||||
|
||||
gflag=1;
|
||||
sprintf(signver,"AT^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(0);
|
||||
}
|
||||
|
||||
|
||||
//****************************************************
|
||||
//* Определение версии прошивальщика
|
||||
@ -53,7 +179,7 @@ struct ptb_t ptable[100];
|
||||
unsigned char buf[40960];
|
||||
unsigned char devname[50]="/dev/ttyUSB0";
|
||||
|
||||
unsigned char signver[]="^SIGNVER=1,0,778A8D175E602B7B779D9E05C330B5279B0661BF2EED99A20445B366D63DD697,2958";
|
||||
|
||||
unsigned int err;
|
||||
|
||||
unsigned char OKrsp[]={0x0d, 0x0a, 0x4f, 0x4b, 0x0d, 0x0a};
|
||||
@ -63,7 +189,6 @@ unsigned char SVrsp[]={0x0d, 0x0a, 0x30, 0x0d, 0x0a, 0x0d, 0x0a, 0x4f, 0x4b, 0x0
|
||||
|
||||
unsigned int dpattern=0xa55aaa55;
|
||||
unsigned int mflag=0,eflag=0,rflag=0,sflag=0,nflag=0;
|
||||
int gflag=0;
|
||||
unsigned char filename [100];
|
||||
|
||||
unsigned char fdir[40]; // каталог для мультифайловой прошивки
|
||||
@ -77,7 +202,7 @@ unsigned char cmd_dload_end[30]={0x43}; // команда конца ра
|
||||
// Коды типов разделов
|
||||
//-d - попытка переключить модем из режима HDLC в АТ-режим\n\
|
||||
|
||||
while ((opt = getopt(argc, argv, "hp:mersng")) != -1) {
|
||||
while ((opt = getopt(argc, argv, "hp:mersng:")) != -1) {
|
||||
switch (opt) {
|
||||
case 'h':
|
||||
|
||||
@ -86,7 +211,7 @@ printf("\n Утилита предназначена для прошивки м
|
||||
Допустимы следующие ключи:\n\n\
|
||||
-p <tty> - последовательный порт для общения с загрузчиком (по умолчанию /dev/ttyUSB0)\n\
|
||||
-n - режим мультифайловой прошивки из указанного каталога\n\
|
||||
-g - прошивки в режиме цифровой подписи\n\
|
||||
-g# - установка режима цифровой подписи (-gl - описание параметров)\n\
|
||||
-m - вывести карту файла прошивки и завершить работу\n\
|
||||
-e - разобрать файл прошивки на разделы без заголовков\n\
|
||||
-s - разобрать файл прошивки на разделы с заголовками\n\
|
||||
@ -119,7 +244,7 @@ printf("\n Утилита предназначена для прошивки м
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
gflag=1;
|
||||
gparm(optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
|
Loading…
Reference in New Issue
Block a user