大家好,欢迎来到IT知识分享网。
前言
由于之前调研过使用GMSSL库进行sm2加解密,并适配多个系统及环境,将当时的搭建过程记录下来
GMSSL开发库编译
以下为多个操作系统编译记录,所引用的链接均为2023年6月记录的,可能已经失效
windows
windows端环境搭建主要参照GMSSL库编译使用记录 这篇博客,但是由于gmssl版本更新,且我用的vs版本为2022,因此编译部分主要参照gmssl的github主页:https://github.com/guanzhi/GmSSL,流程如下:
- 安装vs2022
我已经有了就不写怎么安装了
- 安装ActivePerl
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
- 下载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
/* * 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: 97ECD03590B038BF1947DFDBBD424DD0B6A70974D5D9B7069EB y: C41C697B6E71AE38A508A44D47B227B2967F07FE2A8DACE privateKey: 67FFB10F7E5D3EFB48BB1FA6A77AEC84A2AFA75DC73A4C943 ciphertext: CC6BF21303E3C41FF7C7AE2C9FCCB86E4D923AE9826C0C93E0C0F8E4A631B6355DB0BCD999A84AF99CE0A4AC5973FE158C4EB360D8F6BDCFDAA862C4AF2FFE4BAB5A34C2BDD2B2DCB2986C2040B112A1F972D163CF43F6F9E 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: CE205F767DB13FFCA21C13CBA86C2067C78BB279C y: FA4C60B1EE4EF16A89C5D1F9BCFFA1EF53EDFD55EF564BB3F9E1C49A4677B099 privateKey: CC87D1BB0948CE0BBB8BB811B8AEACAFF249E73B74E ciphertext: CB8D4D2ADABF08D4FCF97902DFDC25AC7FD774EFFE1B8C78509CAF3021F6D17FF599B30DA6451AEB5A37FAA0B3F36D376F989FE20420CD82357A04A752B8C49F601F6334F8287B97E06D7DE72FD85F0CACF39006F45E040BC3307EF6B29CB6B9 plaintext: hello world
debian9
- 搭建编译环境
apt-get install cmake
- 解压GmSSL源码包
unzip GmSSL-master.zip
源码包获取参照上一节
- 修改源码解决bug
#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运行库搭建
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 n6tA//zrRnj9BnCqeg68Bd+rKDIxEnC5sTG7HmqtTnF45jwGFKbmcjQxtB4Ty4tQaHKJovXSAL2PF+KRS3MpzboE7qkQgfrDZNWlijI7gt57/b6ETLURVPtuvkY2LDJarkvFzU6C [root@control gmssl]# [root@control gmssl]# python3 sm2-demo.py decrypt n6tA//zrRnj9BnCqeg68Bd+rKDIxEnC5sTG7HmqtTnF45jwGFKbmcjQxtB4Ty4tQaHKJovXSAL2PF+KRS3MpzboE7qkQgfrDZNWlijI7gt57/b6ETLURVPtuvkY2LDJarkvFzU6C
- 生成sm2公钥/私钥
[root@control gen_key]# python3 gen_key.py cf8981ddf42ae98c92018a1e30c086af0b21a99f85fd3d bd6c9623b221a5da39919ad932ed8c5b72a721ffa5be5acf687abff59b41e68da9ea9bfb9ee466f82ceeeec66bcb4cf2a4cf6807f12
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 /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
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/125532.html