修复upSend中packMsg引起的数组异常

cryp.c更新aes_file函数,使支持输入输出为同一文件
This commit is contained in:
CSSC-WORK\murmur 2023-11-08 15:00:17 +08:00
parent 20605db7f8
commit f57ebee26d
3 changed files with 168 additions and 22 deletions

View File

@ -166,13 +166,6 @@ void aes_file(const char *fin, const char *fout)
goto _exit;
}
fd_out = open(fout, O_WRONLY | O_CREAT | O_TRUNC, 0);
if (fd_out < 0)
{
LOG_E("open the output file : %s error!\n", fout);
goto _exit;
}
rt_uint16_t file_size = lseek(fd_in, 0, SEEK_END);
lseek(fd_in, 0, SEEK_SET);
@ -185,8 +178,15 @@ void aes_file(const char *fin, const char *fout)
}
read(fd_in, buffer, file_size);
close(fd_in);//读取完毕后及时关闭使支持fin=fout覆盖写入
size_t len = aes_256_cbc_pkcs7(buffer, file_size, outbuffer);
fd_out = open(fout, O_WRONLY | O_CREAT | O_TRUNC, 0);
if (fd_out < 0)
{
LOG_E("open the output file : %s error!\n", fout);
goto _exit;
}
write(fd_out, outbuffer, len);
LOG_I("AESed to %s done. File size from %d bytes to %d.\n", fout,file_size, len);
@ -214,7 +214,7 @@ void aes_file(const char *fin, const char *fout)
// return RT_EOK;
}
void aes_file_test(int argc, char **argv)
void crypt_file_test(int argc, char **argv)
{
if (argc == 3)
@ -230,7 +230,88 @@ void aes_file_test(int argc, char **argv)
}
/**
* AES-256
* @param fin
* @param fout
*/
void deaes_file(const char *fin, const char *fout)
{
rt_uint8_t *buffer = RT_NULL, *outbuffer = RT_NULL;
int fd_in = -1, fd_out = -1;
fd_in = open(fin, O_RDONLY, 0);
if (fd_in < 0)
{
LOG_E("open the input file : %s error!\n", fin);
goto _exit;
}
rt_uint16_t file_size = lseek(fd_in, 0, SEEK_END);
lseek(fd_in, 0, SEEK_SET);
buffer = (rt_uint8_t *) malloc(file_size);
outbuffer = (rt_uint8_t *) malloc(file_size + 16); //加密后最大大16字节
if (!buffer || !outbuffer)
{
LOG_E("No memory for AES!\n");
goto _exit;
}
read(fd_in, buffer, file_size);
close(fd_in);//读取完毕后及时关闭使支持fin=fout覆盖写入
size_t len = aes_256_cbc_pkcs7_de(buffer, file_size, outbuffer);
fd_out = open(fout, O_WRONLY | O_CREAT | O_TRUNC, 0);
if (fd_out < 0)
{
LOG_E("open the output file : %s error!\n", fout);
goto _exit;
}
write(fd_out, outbuffer, len);
LOG_I("deAESed to %s done. File size from %d bytes to %d.\n", fout,file_size, len);
// goto _exit;
_exit: if (buffer)
{
rt_free(buffer);
}
if (outbuffer)
{
rt_free(outbuffer);
}
if (fd_in >= 0)
{
close(fd_in);
}
if (fd_out >= 0)
{
close(fd_out);
}
// return RT_EOK;
}
void decrypt_file_test(int argc, char **argv)
{
if (argc == 3)
{
deaes_file(argv[1], argv[2]);
}
else
{
rt_kprintf("Usage:\n");
rt_kprintf("deaes_file_test [input_file] [output_file] \"input_file\" to \"output_file\" \n");
}
}
#include <finsh.h>
/* 导出到自动初始化 */
MSH_CMD_EXPORT(aes_string_test, 使AES-256crypt string using AES-256.);
MSH_CMD_EXPORT(aes_file_test, 使AES-256crypt file using AES-256.);
MSH_CMD_EXPORT(crypt_file_test, 使AES-256crypt file using AES-256.);
MSH_CMD_EXPORT(decrypt_file_test, 使AES-256decrypt file using AES-256.);

View File

@ -154,8 +154,8 @@ return 0x63;
typedef struct
{
rt_uint8_t len;
rt_uint8_t data[200];
uint16_t len;
rt_uint8_t data[300];
} SMSG;//single messgae
@ -168,6 +168,8 @@ void upSend_thread_entry(void* parameter)
// LOG_HEX("--",16,msg->data,msg->len);
//check status
#define CHK_STA
#ifdef CHK_STA
uint8_t trycnt = 0;
while (!isTTjh()) //判断TT状态
{
@ -184,7 +186,7 @@ void upSend_thread_entry(void* parameter)
cacheDataToFile(msg->data, msg->len);
return ;
}
#endif
//打包数据
uint8_t dout[300];
@ -200,17 +202,19 @@ void upSend_thread_entry(void* parameter)
#ifdef CRYPT_BEFRE_PACK
//crypt before pack
//更改后3S单帧数据升为200+超出TT最大单包数据容量须分包
for (size_t var = 0; var < msg->len; var=var+PACK_SIZE) {
cfg.fcurpiece[0] = var/PACK_SIZE+1;
uint8_t tmp[200];
uint8_t len = cryptSingleMsg(msg->data+var, (msg->len-var)>PACK_SIZE?PACK_SIZE:(msg->len-var), tmp);
size_t rst = packMsg(&cfg, tmp, len, dout);//packMsgs
static uint8_t tmp[200];
uint8_t tlen = (msg->len-var)>PACK_SIZE?PACK_SIZE:(msg->len-var);
uint8_t len = cryptSingleMsg(msg->data+var, tlen, tmp);
// LOG_HEX("2",16,msg->data+var,tlen);
size_t rst = packMsg(&cfg, tmp, len, dout);//引起数据异常
#else
size_t rst = packMsg(&cfg, tmpmsg->data, msg->len, dout);//packMsgs
#endif
// LOG_HEX("upSend", 27, dout, rst);
LOG_HEX("upSend", 27, dout, rst);
if (rst)
{
if (sendMsg(dout, rst) == RT_EOK)
@ -394,10 +398,33 @@ void setCommWindow(uint8_t *t, size_t len)
}
void d_sw(void)
void d_demo(int argc, char **argv)
{
uint8_t cfg[]={0x03, 0x1F, 0x03, 0x20, 0x07, 0x1F, 0x09, 0x1E};
setCommWindow(cfg, 8);
if (argc == 2)
{
int fd = open(argv[1], O_RDONLY, 0);
if (fd < 0)
{
LOG_E("open the input file : %s error!\n", argv[1]);
return;
}
rt_uint16_t file_size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
rt_uint8_t *buffer = RT_NULL;
buffer = (rt_uint8_t *) malloc(file_size);
if (!buffer)
{
LOG_E("No memory for reading file!\n");
close(fd);
return;
}
read(fd, buffer, file_size);
close(fd);
upSend(buffer, file_size);
rt_free(buffer);
}
}
@ -1851,6 +1878,44 @@ int isNeedRestore(void)
return rst;
}
/**
*
* @param fin
* @param buffer
* @return
*/
size_t decryptCdata(const char *fin, uint8_t *dout)
{
int fd = -1;
fd = open(fin, O_RDONLY, 0);
if (fd < 0)
{
LOG_E("[hex] open the input file : %s error.", fin);
return RT_ERROR;
}
size_t file_size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
rt_uint8_t *buffer = RT_NULL;
buffer = rt_malloc(file_size);
read(fd, buffer, file_size);
close(fd);
size_t rst = decryp_data(buffer, file_size, dout);
rt_free(buffer);
return rst;
}
/**
*
* @param f
*/
void cryptCdata(const char *f)
{
aes_file(f, f);
}
#define FUNC_DEMO
#ifdef FUNC_DEMO //测试时导出命令到控制台
@ -1863,7 +1928,7 @@ MSH_CMD_EXPORT(d_getFileSize,d_getFileSize);
MSH_CMD_EXPORT(isEthUP,isEthUP);
MSH_CMD_EXPORT(reportSysCfg,reportSysCfg);
MSH_CMD_EXPORT(d_isInFence,d_isInFence);
MSH_CMD_EXPORT(d_sw,msw);
MSH_CMD_EXPORT(d_demo,demo for debug function);
MSH_CMD_EXPORT(set3SRTC,RTC);
#endif

View File

@ -86,7 +86,7 @@ void show_version(void)
char str[30];
uint8_t t[10];
size_t len=time2Byte(t);
rt_kprintf("SW Version: %s, build-%s\n","2.61d",bytes2str(t, 3, 10, "", str));
rt_kprintf("SW Version: %s, build-%s\n","2.7d",bytes2str(t, 3, 10, "", str));
}
MSH_CMD_EXPORT(show_version,);