到官网 https://www.openssl.org 下载并解压 openssl-1.1.1-pre6.tar.gz ,可以看到在 crypto 目录下包含 sm2、sm3、sm4 三个子目录,各子目录下包含对应国密算法的 C 语言实现。在 crypto\objects\objects.txt 文件中,可以找到以下与SM2、SM3算法有关的内容:
sm-scheme 301 : SM2 : sm2
sm-scheme 401 : SM3 : sm3
sm-scheme 504 : RSA-SM3 : sm3WithRSAEncryption
还可以找到与SM4算法有关的内容:
# Definitions for SM4 cipher
sm-scheme 104 1 : SM4-ECB : sm4-ecb
sm-scheme 104 2 : SM4-CBC : sm4-cbc
!Cname sm4-ofb128
sm-scheme 104 3 : SM4-OFB : sm4-ofb
!Cname sm4-cfb128
sm-scheme 104 4 : SM4-CFB : sm4-cfb
sm-scheme 104 5 : SM4-CFB1 : sm4-cfb1
sm-scheme 104 6 : SM4-CFB8 : sm4-cfb8
sm-scheme 104 7 : SM4-CTR : sm4-ctr
OpenSSL 1.1.1-pre6 版与以前版本相比,在接口上有一些变化,不能保证对以前接口的兼容性,所以在使用时要特别注意。OpenSSL 1.1.1-pre6 版在 Windows 平台上的编译方法也与以前版本有所不同,这里介绍一下在 64 位 Windows 7 上使用 Visual Studio 2010 编译的过程,具体步骤如下:
首先需要安装 Perl,可以到网站 https://www.activestate.com/activeperl 下载并安装 ActivePerl。然后要考虑是否需要编译汇编模块,如果需要的话,必须先到 https://www.nasm.us/ 网站下载安装 NASM。该版本的 OpenSSL 只支持 NASM,不支持微软的汇编编译器。在执行 nmake test 时,会出现如下的一些提示信息:
skipped: md2 is not supported by this OpenSSL build查看 C:\Program Files(x86)\OpenSSL 或 C:\Program Files\OpenSSL 目录,下面都包含 bin, html, include, lib 四个子目录。openssl.exe 及 32位动态库文件libcrypto-1_1.dll 和 libssl-1_1.dll (或 64 位动态库文件 libcrypto-1_1-x64.dll 和 libssl-1_1-x64.dll)存放在 bin 子目录下,html 目录下存放网页形式的用户手册,include\openssl 目录下存放 .h 头文件,与dll动态库对应的导入库文件 libcrypto.lib 和 libssl.lib,以及 egnines 相关文件存放在 lib 目录下。注意在 lib 目录下的 libcrypto.lib 和 libssl.lib 不是静态库。
对于 SM2 算法,在 include\openssl 目录下包含 sm2.h 和 sm2err.h 两个头文件。对于 SM3 和 SM4 算法,没有独立的头文件,调用前可以参考 html\man3 路径下的以下文件:EVP_sm3.html,EVP_sm4_cbc.html,EVP_sm4_cfb.html,EVP_sm4_ctr.html,EVP_sm4_ecb.html,EVP_sm4_ofb.html 。
在 include\openssl 路径下的 obj_mac.h 文件中,定义了以下与 SM2、SM3 算法相关的内容:
#define SN_sm2 "SM2"
#define LN_sm2 "sm2"
#define NID_sm2 1172
#define OBJ_sm2 OBJ_sm_scheme,301L
#define SN_sm3 "SM3"
#define LN_sm3 "sm3"
#define NID_sm3 1143
#define OBJ_sm3 OBJ_sm_scheme,401L
定义了以下与 SM4 算法相关的内容:
#define SN_sm4_ecb "SM4-ECB"
#define LN_sm4_ecb "sm4-ecb"
#define NID_sm4_ecb 1133
#define OBJ_sm4_ecb OBJ_sm_scheme,104L,1L
#define SN_sm4_cbc "SM4-CBC"
#define LN_sm4_cbc "sm4-cbc"
#define NID_sm4_cbc 1134
#define OBJ_sm4_cbc OBJ_sm_scheme,104L,2L
#define SN_sm4_ofb128 "SM4-OFB"
#define LN_sm4_ofb128 "sm4-ofb"
#define NID_sm4_ofb128 1135
#define OBJ_sm4_ofb128 OBJ_sm_scheme,104L,3L
#define SN_sm4_cfb128 "SM4-CFB"
#define LN_sm4_cfb128 "sm4-cfb"
#define NID_sm4_cfb128 1137
#define OBJ_sm4_cfb128 OBJ_sm_scheme,104L,4L
#define SN_sm4_cfb1 "SM4-CFB1"
#define LN_sm4_cfb1 "sm4-cfb1"
#define NID_sm4_cfb1 1136
#define OBJ_sm4_cfb1 OBJ_sm_scheme,104L,5L
#define SN_sm4_cfb8 "SM4-CFB8"
#define LN_sm4_cfb8 "sm4-cfb8"
#define NID_sm4_cfb8 1138
#define OBJ_sm4_cfb8 OBJ_sm_scheme,104L,6L
#define SN_sm4_ctr "SM4-CTR"
#define LN_sm4_ctr "sm4-ctr"
#define NID_sm4_ctr 1139
#define OBJ_sm4_ctr OBJ_sm_scheme,104L,7L
还定义了以下与中国算法有关的标识:
#define SN_ISO_CN "ISO-CN"
#define LN_ISO_CN "ISO CN Member Body"
#define NID_ISO_CN 1140
#define OBJ_ISO_CN OBJ_member_body,156L
#define SN_oscca "oscca"
#define NID_oscca 1141
#define OBJ_oscca OBJ_ISO_CN,10197L
#define SN_sm_scheme "sm-scheme"
#define NID_sm_scheme 1142
#define OBJ_sm_scheme OBJ_oscca,1L