购物网站建设合同,Wordpress 打开xml rpc,公司商城网站开发费做什么科目,金戈枸橼酸西地那非片前言
最近在做一个换电柜的项目#xff0c;需要和云端平台对接json协议#xff0c;由于服务端规定了#xff0c;需要采用sm2 sm3 sm4用来加密。在嵌入式方面只能用北京大学的GmSSL了。
下载GmSSL
在https://github.com/guanzhi/GmSSL下载库 也可以通过git命令下载#x…前言
最近在做一个换电柜的项目需要和云端平台对接json协议由于服务端规定了需要采用sm2 sm3 sm4用来加密。在嵌入式方面只能用北京大学的GmSSL了。
下载GmSSL
在https://github.com/guanzhi/GmSSL下载库 也可以通过git命令下载下载不了请注意科学上网。 git clone https://github.com/guanzhi/GmSSL 我采用的3.0.0版本 git checkout 3.0.0
在linux下测试一下库是否能用
编译 mkdir build cd build cmake .. cmake --build . 在build\bin可以看到有aestest block_ciphertest cmstest ectest gmssl hkdftest...等等可执行文件了。 测试通过后下面可以移植到嵌入式平台了。
添加一些缺少的C标准库函数
添加syscalls.c文件放到src目录下
#include unistd.h
#include sys/types.h
#include sys/stat.h
#include errno.h
#include time.h // 包含timegm需要的头文件
#include stdio.h // 用于assert// 用于断言的简单实现
void _exit(int status) { return; }void *_sbrk_r(struct _reent *r, int nbytes)
{extern char _end; // 末尾符号static char *heap_end;char *prev_heap_end;if (heap_end 0){heap_end _end; // 初始化堆指针}prev_heap_end heap_end;heap_end nbytes;return (char *)prev_heap_end;
}int _write(int file, char *ptr, int len)
{// 将数据写入特定的输出设备通常是串口return -1;
}int _open(const char *pathname, int flags)
{return -1;
}
int _close(int file) { return-1; }int _fstat(int file, struct stat *st) { return -1; }int _isatty(int file)
{return 1; // 默认所有文件为终端
}int _lseek(int file, int ptr, int dir) { return -1; }int _read(int file, char *ptr, int len)
{return -1;
}// 添加 _assert 函数
void _assert(const char *expr, const char *file, int line)
{// 这里可以根据需要处理// 例如输出错误信息或进入死循环while (1){// 进入死循环或者根据需要重启系统}
}// 添加 timegm 函数
time_t timegm(struct tm *tm)
{// 这里可以实现根据 tm 结构计算 UTC 时间// 一个简单的实现示例具体实现可能需要根据需要调整time_t seconds 0;// 计算总秒数这是一个简化的示例实际可能需要更多处理seconds tm-tm_sec;seconds tm-tm_min * 60;seconds tm-tm_hour * 3600;seconds (tm-tm_year - 70) * 31536000; // 1970年起的年数seconds (tm-tm_mon) * 2592000; // 简化的月份处理seconds (tm-tm_mday - 1) * 86400; // 日数return seconds;
}GmSSL依赖随机数
修改src/rand.c为如下伪随机数函数
/** Copyright 2014-2022 The GmSSL Project. All Rights Reserved.** Licensed under the Apache License, Version 2.0 (the License); you may* not use this file except in compliance with the License.** http://www.apache.org/licenses/LICENSE-2.0*/#include stdio.h
#include string.h
#include stdlib.h
#include gmssl/rand.h
#include gmssl/error.h#define RAND_MAX_BUF_SIZE 4096
static uint32_t seed 123456789; // 初始种子static uint32_t lcg_rand()
{seed (1103515245 * seed 12345) % (1U 31);return seed;
}int rand_bytes(uint8_t *buf, size_t len)
{if (!buf) {return -1;}if (len RAND_MAX_BUF_SIZE) {return -1;}if (!len) {return 0;}for (size_t i 0; i len; i) {buf[i] lcg_rand() 0xFF; // 取低8位}return 1;
}编译通过可以生成sm2test.elf没有链接错误了。