GMSSL库编译使用记录

部署运行你感兴趣的模型镜像

前言

由于之前调研过使用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,流程如下:

  1. 安装vs2022

我已经有了就不写怎么安装了

  1. 安装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.
  1. 安装NASM

下载链接:https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/
image.png
**管理员身份运行,**安装后把安装目录添加到系统环境变量中image.png

  1. 下载GmSSL源码

github链接:https://github.com/guanzhi/GmSSL
管理员选项打开VS命令行(这里要使用32位的,实际测试使用64位编译出来的gmssl在调用时有些问题):
image.png
切换到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

还可以将这个路径添加到系统环境变量
image.png
使用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;
}

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

CentOS8

  1. 解压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

  1. 修改源码解决bug

如果不修改代码,编译时会报错:/usr/bin/ld: bin/libgmssl.so.3.0: undefined reference to _rdseed64_step’`

image.png
通过查看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

image.png

  1. 开始编译、安装
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

  1. 添加系统路径

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
  1. 测试官网提供的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

  1. 搭建编译环境

apt-get install cmake

  1. 解压GmSSL源码包

unzip GmSSL-master.zip
源码包获取参照上一节

  1. 编译安装
mkdir build
cd build/
cmake ..
make -j4
make install
ldconfig
  1. 验证是否安装成功
root@nfs-PC:~/gmssl/GmSSL-master/build# gmssl version
GmSSL 3.1.1 Dev
  1. 编写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

  1. 搭建编译环境

apt-get install cmake

  1. 解压GmSSL源码包

unzip GmSSL-master.zip
源码包获取参照上一节

  1. 修改源码解决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; // 成功获取随机数据
}

image.png

  1. 编译安装
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

  1. 安装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
  1. 安装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
  1. 测试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
  1. 生成sm2公钥/私钥
[root@control gen_key]# python3 gen_key.py
cf8981ddf42ae98c92018a1e30c086a4826662f0b21a99f85fd623128058413d
bd6c9623b221a5da39919ad932ed8c5b72a721ffa5be5acf687abff59b41e68da9e4816012a9bfb9ee466f82ceeee98602365c66bc551271b4cf2a4cf6807f12

Windows

  1. 安装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
  1. 安装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

  1. 安装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
  1. 安装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
  1. 测试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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

为了在Linux环境下使用GMSSL和Paho-MQTT客户端编译Mosquitto代理服务器,首先需要确保系统中安装了GMSSL。在编译Mosquitto之前,应当设置好环境变量,特别是LD_LIBRARY_PATH,以确保链接到正确的文件。 参考资源链接:[使用GMSSL编译Mosquitto,建立国密的MQTT消息通道](https://wenku.youkuaiyun.com/doc/6401abedcce7214c316ea006?spm=1055.2569.3001.10343) 接下来,需要下载并编译GMSSL,这可能涉及执行如下命令: ./configure --prefix=/usr/local/gmssl make make install 安装完成后,你需要将GMSSL生成的libssl和libcrypto文件路径添加到LD_LIBRARY_PATH环境变量中。然后,下载Paho-MQTT客户端,并在编译时指定使用GMSSL文件: ./configure --with-ssl=/usr/local/gmssl make make install 最后,下载Mosquitto源代码,同样在编译时指定使用GMSSL文件,并确保配置参数中包含国密算法的支持: ./configure --with-ssl=/usr/local/gmssl --enable-ssl make make install 完成以上步骤后,你将得到一个使用GMSSL支持国密算法的Mosquitto服务器,这样就可以建立一个安全的国密加密的MQTT消息通道。 为了更深入地理解整个编译和配置过程,建议仔细阅读《使用GMSSL编译Mosquitto,建立国密的MQTT消息通道》这份资料。这份指南详细地记录了每个步骤的操作细节,提供了必要的配置参数,以及如何在遇到冲突时进行处理。通过实践和阅读这份材料,你将能更好地掌握如何在物联网设备中安全地传输数据。 参考资源链接:[使用GMSSL编译Mosquitto,建立国密的MQTT消息通道](https://wenku.youkuaiyun.com/doc/6401abedcce7214c316ea006?spm=1055.2569.3001.10343)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值