前言
由于之前调研过使用GMSSL库进行sm2加解密,并适配多个系统及环境,将当时的搭建过程记录下来
GMSSL开发库编译
以下为多个操作系统编译记录,所引用的链接均为2023年6月记录的,可能已经失效
windows
windows端环境搭建主要参照https://blog.youkuaiyun.com/zyhse/article/details/112325129 这篇博客,但是由于gmssl版本更新,且我用的vs版本为2022,因此编译部分主要参照gmssl的github主页:https://github.com/guanzhi/GmSSL,流程如下:
- 安装vs2022
我已经有了就不写怎么安装了
- 安装ActivePerl
现在官网下载需要安装他们的工具,可能由于是外网的问题,一直没法下载,于是我找了一篇博文,从他的百度网盘里面下载的:https://blog.youkuaiyun.com/weixin_46767998/article/details/107830121
我下载的版本是5.26,下载后安装时安装类型选择“Typical”,之后一直下一步就行,安装完成后,cmd中执行perl -v查看是否安装成功
C:\Users\wanghan>perl -v
This is perl 5, version 26, subversion 3 (v5.26.3) built for MSWin32-x64-multi-thread
(with 2 registered patches, see perl -V for more detail)
Copyright 1987-2018, Larry Wall
Binary build 0000 [15feb953] provided by ActiveState http://www.ActiveState.com
Built Apr 10 2020 18:45:08
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
- 安装NASM
下载链接:https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/

**管理员身份运行,**安装后把安装目录添加到系统环境变量中
- 下载GmSSL源码
github链接:https://github.com/guanzhi/GmSSL
管理员选项打开VS命令行(这里要使用32位的,实际测试使用64位编译出来的gmssl在调用时有些问题):

切换到gmssl路径后,依次执行如下命令:
mkdir build
cd build
cmake .. -G "NMake Makefiles"
nmake
nmake install
执行nmake后报错:
D:\code\client_state_secret_login\GmSSL-master>"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2022\Visual Studio Tools\VC\x64 Native Tools Command Prompt for VS 2022.ln
k"
**********************************************************************
** Visual Studio 2022 Developer Command Prompt v17.2.6
** Copyright (c) 2022 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86'
C:\Program Files\Microsoft Visual Studio\2022\Professional>cd /d D:\code\client_state_secret_login\GmSSL-master
D:\code\client_state_secret_login\GmSSL-master>mkdir build
D:\code\client_state_secret_login\GmSSL-master>cd build
D:\code\client_state_secret_login\GmSSL-master\build>cmake .. -G "NMake Makefiles"
-- The C compiler identification is MSVC 19.32.31332.0
-- The CXX compiler identification is MSVC 19.32.31332.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.32.31326/bin/Hostx64/x64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files/Microsoft Visual Studio/2022/Professional/VC/Tools/MSVC/14.32.31326/bin/Hostx64/x64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS
-- Configuring done
-- Generating done
-- Build files have been written to: D:/code/client_state_secret_login/GmSSL-master/build
D:\code\client_state_secret_login\GmSSL-master\build>
D:\code\client_state_secret_login\GmSSL-master\build>nmake
Microsoft (R) 程序维护实用工具 14.32.31332.0 版
版权所有 (C) Microsoft Corporation。 保留所有权利。
[ 0%] Building C object CMakeFiles/gmssl.dir/src/version.c.obj
version.c
?⒁? 包含文件: D:\code\client_state_secret_login\GmSSL-master\include\gmssl/version.h
[ 0%] Building C object CMakeFiles/gmssl.dir/src/debug.c.obj
debug.c
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\stdio.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\vcruntime.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\concurrencysal.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\vadefs.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_wstdio.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_stdio_config.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\string.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_memory.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\errno.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\vcruntime_string.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_wstring.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\stdlib.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_malloc.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_search.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\stddef.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_wstdlib.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\limits.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\stdint.h
?⒁? 包含文件: D:\code\client_state_secret_login\GmSSL-master\include\gmssl/error.h
[ 1%] Building C object CMakeFiles/gmssl.dir/src/sm4_common.c.obj
... 省略 ...
[ 15%] Building C object CMakeFiles/gmssl.dir/src/asn1.c.obj
asn1.c
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(1): warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\stdio.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\vcruntime.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\sal.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\concurrencysal.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\vadefs.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_wstdio.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_stdio_config.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\string.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_memory.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\errno.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\vcruntime_string.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_wstring.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\stdlib.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_malloc.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_search.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\stddef.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_wstdlib.h
?⒁? 包含文件: C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\include\limits.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\assert.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\time.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\corecrt_wtime.h
?⒁? 包含文件: C:\Program Files (x86)\Windows Kits\10\include\10.0.19041.0\ucrt\ctype.h
?⒁? 包含文件: D:\code\client_state_secret_login\GmSSL-master\include\gmssl/oid.h
?⒁? 包含文件: D:\code\client_state_secret_login\GmSSL-master\include\gmssl/asn1.h
?⒁? 包含文件: D:\code\client_state_secret_login\GmSSL-master\include\gmssl/error.h
?⒁? 包含文件: D:\code\client_state_secret_login\GmSSL-master\include\gmssl/endian.h
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(221): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(222): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(226): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(229): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(229): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(230): error C2065: “data”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(234): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(234): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(234): warning C4022: “memcpy”: 指针与实参 1 不匹配
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(234): error C2065: “data”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(234): warning C4022: “memcpy”: 指针与实参 2 不匹配
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(234): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(235): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(235): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(235): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(237): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(237): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(237): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(243): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(244): error C2065: “data”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(244): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(248): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(252): error C2065: “data”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(252): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(252): warning C4047: “=”:“int”与“const uint8_t *”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(253): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(254): error C2065: “datalen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(259): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(260): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(265): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(265): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(266): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(266): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(266): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(266): error C2065: “tag”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(266): error C2106: “=”: 左操作数必须为左值
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(268): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(268): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(270): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(270): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(270): warning C4047: “函数”:“uint8_t **”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(270): warning C4024: “asn1_length_to_der”: 形参和实参 2 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(270): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(270): warning C4047: “函数”:“size_t *”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(270): warning C4024: “asn1_length_to_der”: 形参和实参 3 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(275): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(276): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(281): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(282): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(290): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(290): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(291): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(291): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(291): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(291): error C2065: “tag”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(291): error C2106: “=”: 左操作数必须为左值
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(293): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(293): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(296): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(296): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(296): warning C4047: “函数”:“uint8_t **”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(296): warning C4024: “asn1_length_to_der”: 形参和实参 2 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(296): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(296): warning C4047: “函数”:“size_t *”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(296): warning C4024: “asn1_length_to_der”: 形参和实参 3 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(299): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(299): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(300): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(300): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(300): warning C4022: “memcpy”: 指针与实参 1 不匹配
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(300): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(300): warning C4022: “memcpy”: 指针与实参 2 不匹配
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(300): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(301): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(301): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(301): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(303): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(303): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(303): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(309): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(310): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(310): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(316): error C2065: “tag”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(317): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(317): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(317): warning C4047: “=”:“int”与“void *”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(318): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(318): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(325): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(325): warning C4047: “函数”:“size_t *”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(325): warning C4024: “asn1_length_from_der”: 形参和实参 1 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(331): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(331): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(331): warning C4047: “=”:“int”与“const uint8_t *”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(332): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(332): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(333): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(333): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(338): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(341): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(341): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): error C2065: “tag”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): warning C4047: “函数”:“const uint8_t *”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): warning C4024: “asn1_type_to_der”: 形参和实参 2 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): error C2065: “out”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): warning C4047: “函数”:“uint8_t **”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): warning C4024: “asn1_type_to_der”: 形参和实参 4 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): error C2065: “outlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): warning C4047: “函数”:“size_t *”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(345): warning C4024: “asn1_type_to_der”: 形参和实参 5 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(353): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(356): error C2065: “tag”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(356): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(356): warning C4047: “函数”:“const uint8_t **”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(356): warning C4024: “asn1_type_from_der”: 形参和实参 2 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(356): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(356): warning C4047: “函数”:“size_t *”与“int”的间接级别不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(356): warning C4024: “asn1_type_from_der”: 形参和实参 3 的类型不同
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(360): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(360): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(368): error C2143: 语法错误: 缺少“;”(在“{”的前面)
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(369): error C2065: “tag”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(369): error C2065: “d”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(369): error C2065: “dlen”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(375): error C2065: “tag”: 未声明的标识符
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(375): error C2100: 非法的间接寻址
D:\code\client_state_secret_login\GmSSL-master\src\asn1.c(375): fatal error C1003: 错误计数超过 100;正在停止编译
NMAKE : fatal error U1077: “"C:\Program Files\CMake\bin\cmake.exe"”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.
NMAKE : fatal error U1077: “"C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.32.31326\bin\HostX64\x64\nmake.exe"”: 返回代码“0x2”
Stop.
通过报错信息,猜测是字符编码的问题,网上检索资料,执行set CL=/utf-8,即可解决问题:
D:\code\client_state_secret_login\GmSSL-master\build>set CL=/utf-8
D:\code\client_state_secret_login\GmSSL-master\build>nmake
Microsoft (R) 程序维护实用工具 14.32.31332.0 版
版权所有 (C) Microsoft Corporation。 保留所有权利。
Consolidate compiler generated dependencies of target gmssl
[ 1%] Building C object CMakeFiles/gmssl.dir/src/asn1.c.obj
asn1.c
... 省略 ...
[100%] Linking C executable bin\demo_zuc.exe
[100%] Built target demo_zuc
D:\code\client_state_secret_login\GmSSL-master\build>
D:\code\client_state_secret_login\GmSSL-master\build>
D:\code\client_state_secret_login\GmSSL-master\build>
D:\code\client_state_secret_login\GmSSL-master\build>
D:\code\client_state_secret_login\GmSSL-master\build>nmake install
Microsoft (R) 程序维护实用工具 14.32.31332.0 版
版权所有 (C) Microsoft Corporation。 保留所有权利。
... ...
切换目录到安装路径,查看是否安装成功:
C:\Program Files\GmSSL\bin>cd /d "C:\Program Files\GmSSL\bin"
C:\Program Files\GmSSL\bin>gmssl.exe version
GmSSL 3.1.1 Dev
还可以将这个路径添加到系统环境变量

使用VS编译官网提供的sm2加解密demo:
代码如下:
/*
* 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/sm2.h>
#include <gmssl/error.h>
int main(void)
{
SM2_KEY sm2_key;
SM2_KEY pub_key;
unsigned char plaintext[SM2_MAX_PLAINTEXT_SIZE];
unsigned char ciphertext[SM2_MAX_CIPHERTEXT_SIZE];
size_t len;
sm2_key_generate(&sm2_key);
memcpy(&pub_key, &sm2_key, sizeof(SM2_POINT));
sm2_key_print(stdout, 0, 0, "SM2Key", &sm2_key);
sm2_encrypt(&pub_key, (uint8_t*)"hello world", strlen("hello world"), ciphertext, &len);
format_bytes(stdout, 0, 0, "ciphertext", ciphertext, len);
if (sm2_decrypt(&sm2_key, ciphertext, len, plaintext, &len) != 1) {
fprintf(stderr, "error\n");
return 1;
}
plaintext[len] = 0;
printf("plaintext: %s\n", plaintext);
return 0;
}



编译完成后,将gmssl.dll复制到编译出的exe目录,运行程序:

CentOS8
- 解压GmSSL源码包
unzip GmSSL-master.zip
源码包获取参照上一节
中途为了解决报错,安装了如下软件包,不确定是否和依赖有关系:
yum install -y libmicrohttpd-devel perl-ExtUtils-Embed yasm gcc gcc-c++ make automake autoconf libtool rng-tools libcurl-devel
- 修改源码解决bug
如果不修改代码,编译时会报错:/usr/bin/ld: bin/libgmssl.so.3.0: undefined reference to _rdseed64_step’`

通过查看github中的issues:https://github.com/guanzhi/GmSSL/pull/1447/files
vim src/rdrand.c
增加如下内容:
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
#include <x86intrin.h>
#endif

- 开始编译、安装
mkdir build
cd build/
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/gzgmssllib
make -j16
make install
cmake时不加参数会报错,参照github中的issues:https://github.com/guanzhi/GmSSL/issues/1446
- 添加系统路径
将gmssl可执行文件链接到/usr/bin中:
ln -s /usr/local/gzgmssllib/bin/gmssl /usr/bin/gmssl
将gmssl库目录添加到系统目录中:
vim /etc/ld.so.conf.d/gmssl-3.conf
# 增加以下内容:
/usr/local/gzgmssllib/lib/
#最后执行命令:
ldconfig
- 测试官网提供的sm2加解密demo
[root@localhost sm2_gmssl_demo]# cat c-sm2-demo.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/sm2.h>
#include <gmssl/error.h>
int main(void)
{
SM2_KEY sm2_key;
SM2_KEY pub_key;
unsigned char plaintext[SM2_MAX_PLAINTEXT_SIZE];
unsigned char ciphertext[SM2_MAX_CIPHERTEXT_SIZE];
size_t len;
sm2_key_generate(&sm2_key);
memcpy(&pub_key, &sm2_key, sizeof(SM2_POINT));
sm2_key_print(stdout, 0, 0, "SM2Key", &sm2_key);
sm2_encrypt(&pub_key, (uint8_t*)"hello world", strlen("hello world"), ciphertext, &len);
format_bytes(stdout, 0, 0, "ciphertext", ciphertext, len);
if (sm2_decrypt(&sm2_key, ciphertext, len, plaintext, &len) != 1) {
fprintf(stderr, "error\n");
return 1;
}
plaintext[len] = 0;
printf("plaintext: %s\n", plaintext);
return 0;
}
[root@localhost sm2_gmssl_demo]# gcc c-sm2-demo.c -o c-sm2-demo -L/usr/local/gzgmssllib/lib/ -lgmssl -I/usr/local/gzgmssllib/include/
[root@localhost sm2_gmssl_demo]# ./c-sm2-demo
SM2Key
publicKey
x: 97ECD03590B038BF1947DF9470292DBB588468D424DD0B6A70974D5D9B7069EB
y: C1130771201941C697B6E71AE38A508A44D47B227B2967F07FE2A8D838816ACE
privateKey: 67FFB10F7E5D3EF115359B48BB1F393255873A6A77AEC84A2AFA75DC73A4C943
ciphertext: 3073022041CC6B284602090F21303E3C41F8651930F7C7AE2C9FCCB86E4D923AE9826C8102206031704320177C93E0C0F8E4A631B6355DB0B5465020CD999A84AF99CE0A4A120420C5973FE158C4EB360D8F6BDCFDAA862C4AF2FFE4BAB5A34C2BDD2B2DCB2986C2040B112A1F972D163CF43F6F9E
plaintext: hello world
debian10
- 搭建编译环境
apt-get install cmake
- 解压GmSSL源码包
unzip GmSSL-master.zip
源码包获取参照上一节
- 编译安装
mkdir build
cd build/
cmake ..
make -j4
make install
ldconfig
- 验证是否安装成功
root@nfs-PC:~/gmssl/GmSSL-master/build# gmssl version
GmSSL 3.1.1 Dev
- 编写demo验证库是否可用
root@nfs-PC:~/gmssl/sm2-enc-dec-demo# gcc c-sm2-demo.c -o c-sm2-demo -lgmssl
root@nfs-PC:~/gmssl/sm2-enc-dec-demo#
root@nfs-PC:~/gmssl/sm2-enc-dec-demo# ls
c-sm2-demo c-sm2-demo.c mk.sh
root@nfs-PC:~/gmssl/sm2-enc-dec-demo# ./c-sm2-demo
SM2Key
publicKey
x: C742611E205F767DB13FFCA21C13C806719BA86C2067C78BB279C49334662687
y: FA4C60B1EE4EF16A89C5D1F9BCFFA1EF53EDFD55EF564BB3F9E1C49A4677B099
privateKey: CC87D1BB0948C3052855958E0BBB8B97134650157B811B8AEACAFF249E73B74E
ciphertext: 307202202CB8D4D2ADABF08D4FC69548507F97902DFDC25AC7FD774EFFE1B8C78509CAF3021F6D17FF599B30DA6451AEB5A37F9784324736A6199885A0B3F36D376F989FE20420CD82357A04A752B8C49F601F6334F8287B97E06D7DE72FD85F0CACF39006F45E040B819304C3307EF6B29CB6B9
plaintext: hello world
debian9
- 搭建编译环境
apt-get install cmake
- 解压GmSSL源码包
unzip GmSSL-master.zip
源码包获取参照上一节
- 修改源码解决bug
主要报错有2项:
bin/libgmssl.so.3.0:对‘_rdseed64_step’未定义的引用:
解决方案:参照RPM版编译的这部分
bin/libgmssl.so.3.0:对‘getentropy’未定义的引用:
参考:https://wenku.baidu.com/view/2f6d998e1ae8b8f67c1cfad6195f312b3069eb01.html?wkts=1684203502703
原因为系统版本太旧,没有getentropy函数,因此我们需要手动实现getentropy函数,编辑src/rand_unix.c文件,增加如下内容:
#include <fcntl.h>
int getentropy(void* buffer, size_t length) {
int urandom_fd = open("/dev/urandom", O_RDONLY);
if (urandom_fd == -1) {
return -1; // 打开设备失败,返回错误
}
ssize_t bytes_read = read(urandom_fd, buffer, length);
close(urandom_fd);
if (bytes_read == -1 || (size_t)bytes_read != length) {
return -1; // 读取随机数据失败或读取的数据长度不符合要求,返回错误
}
return 0; // 成功获取随机数据
}

- 编译安装
mkdir build
cd build/
cmake ..
make -j4
make install
ldconfig
GMSSL python运行库搭建
由于pip的源下载太慢,经常导致失败,因此手动下载安装包,搭建环境,由于pycryptodomex没有提供python3.6的包,需要使用源码安装。
下载gmssl安装包:https://files.pythonhosted.org/packages/41/b1/01d707a2edfaad77715b2d27e5fbf14b6bcd34dd72ea179a5facfe4b1dd7/gmssl-3.2.2-py3-none-any.whl
下载依赖pycryptodomex源码包:
https://files.pythonhosted.org/packages/3d/07/cfd8f52b9068877801317d26dc7225e19421bc659e1395d2cd6933b1a351/pycryptodomex-3.17.tar.gz
CentOS8
- 安装pycryptodomex
# 解压pycryptodomex源码包
[root@control gmssl]# tar xzvf pycryptodomex-3.17.tar.gz
[root@control gmssl]# cd pycryptodomex-3.17/
# 直接安装会报错,需要制定prefix路径
[root@control pycryptodomex-3.17]# python3 setup.py install --prefix=/usr
... ...
Installed /usr/lib64/python3.6/site-packages/pycryptodomex-3.17-py3.6-linux-x86_64.egg
Processing dependencies for pycryptodomex==3.17
Finished processing dependencies for pycryptodomex==3.17
- 安装gmssl
[root@control gmssl]# pip3 install gmssl-3.2.2-py3-none-any.whl
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Processing ./gmssl-3.2.2-py3-none-any.whl
Requirement already satisfied: pycryptodomex in /usr/lib64/python3.6/site-packages/pycryptodomex-3.17-py3.6-linux-x86_64.egg (from gmssl==3.2.2)
Installing collected packages: gmssl
Successfully installed gmssl-3.2.2
- 测试sm2加解密
[root@control gmssl]# python3 sm2-demo.py encrypt 123456
n6tA//zrRnj9BnCqeg68Bd+rKDIxEnC5sTG7HmqtTnF45jwGFKbmcjQxtB4Ty4tQaHKJovXSAL2PF+KRS3MpzboE7qkQgfrDZNWlijI7gt57/b6ETLURVPtuvkY2LDJarkvFzU6C
[root@control gmssl]#
[root@control gmssl]# python3 sm2-demo.py decrypt n6tA//zrRnj9BnCqeg68Bd+rKDIxEnC5sTG7HmqtTnF45jwGFKbmcjQxtB4Ty4tQaHKJovXSAL2PF+KRS3MpzboE7qkQgfrDZNWlijI7gt57/b6ETLURVPtuvkY2LDJarkvFzU6C
123456
- 生成sm2公钥/私钥
[root@control gen_key]# python3 gen_key.py
cf8981ddf42ae98c92018a1e30c086a4826662f0b21a99f85fd623128058413d
bd6c9623b221a5da39919ad932ed8c5b72a721ffa5be5acf687abff59b41e68da9e4816012a9bfb9ee466f82ceeee98602365c66bc551271b4cf2a4cf6807f12
Windows
- 安装pycryptodomex
省略:解压tar.gz源码包
D:\FreeDownloadManager\pycryptodomex-3.17.tar\pycryptodomex-3.17>python setup.py install
Testing support for clang
test1.c
... ...
Installed c:\users\wanghan\appdata\local\programs\python\python36\lib\site-packages\pycryptodomex-3.17-py3.6-win-amd64.egg
Processing dependencies for pycryptodomex==3.17
Finished processing dependencies for pycryptodomex==3.17
- 安装gmssl
D:\FreeDownloadManager>pip3 install gmssl-3.2.2-py3-none-any.whl
Processing d:\freedownloadmanager\gmssl-3.2.2-py3-none-any.whl
Requirement already satisfied: pycryptodomex in c:\users\wanghan\appdata\local\programs\python\python36\lib\site-packages\pycryptodomex-3.17-py3.6-win-amd64.egg (from gmssl==3.2.2) (3.17)
Installing collected packages: gmssl
Successfully installed gmssl-3.2.2
debian9
- 安装pycryptodomex
root@wanghan-virtual-machine:/home/wanghan/桌面/gmssl环境# cd pycryptodomex-3.17root@wanghan-virtual-machine:/home/wanghan/桌面/gmssl环境/pycryptodomex-3.17# python3 setup.py install
... ...
Writing /usr/local/lib/python3.5/dist-packages/pycryptodomex-3.17.egg-info
- 安装gmssl
root@wanghan-virtual-machine:/home/wanghan/桌面/gmssl环境# pip3 install gmssl-3.2.2-py3-none-any.whl
Processing ./gmssl-3.2.2-py3-none-any.whl
Requirement already satisfied: pycryptodomex in /usr/local/lib/python3.5/dist-packages (from gmssl==3.2.2)
Installing collected packages: gmssl
Successfully installed gmssl-3.2.2
- 测试sm2加解密
root@wanghan-virtual-machine:/home/wanghan/桌面/gmssl环境# python3 sm2-demo.py encrypt 123456
/9jb5KyNFYkL1tHvbstE+VN5CO5HxbF3kQXe4AQgURIaWiEi4+sVJCNpczWSAaMy8OpfT0+eCnQi2jtfwoKPT1KucX3h48SGMO73dlQt/SPRdamZtiEpPRL42x8LzWcuAcUFgnQv
root@wanghan-virtual-machine:/home/wanghan/桌面/gmssl环境#
root@wanghan-virtual-machine:/home/wanghan/桌面/gmssl环境#
root@wanghan-virtual-machine:/home/wanghan/桌面/gmssl环境# python3 sm2-demo.py decrypt /9jb5KyNFYkL1tHvbstE+VN5CO5HxbF3kQXe4AQgURIaWiEi4+sVJCNpczWSAaMy8OpfT0+eCnQi2jtfwoKPT1KucX3h48SGMO73dlQt/SPRdamZtiEpPRL42x8LzWcuAcUFgnQv
123456

1845

被折叠的 条评论
为什么被折叠?



