因为工作需要用到SM2算法加解密,网络上找一圈,没有合用的,还被骗了一堆积分。

无奈只得自行编译,从GITHUB的GMSSL下载到最新的SSL库,VS2012下编译踩了不少坑,记录一下

GITHUB链接:https://github.com/guanzhi/GmSSL

fork了一下分支:https://github.com/eaglexmw-gmail/GmSSL

首先编译需要perl、VS2012、NASM三个工具,分别安装后,由于VS2012与NASM没有修改PATH环境变量

在执行perl Configure VC-WIN32时会报告工具缺失,可以使用set path=%path%;xxx;方式添加路径

这里记录第一个坑,VS2012修改PATH变量,不能只将VC\BIN这样的目录加入就完了,需要增加

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE;C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin;C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcpackages;C:\Windows\Microsoft.NET\Framework64\v4.0.30319;C:\Windows\Microsoft.NET\Framework64\v3.5;C:\Windows\Microsoft.NET\Framework\v4.0.30319;C:\Windows\Microsoft.NET\Framework\v3.5;

这么一堆路径都需要加入,否则还是会编译出错,参考:https://www.cnblogs.com/bluestorm/p/3321558.html

最简便的方法是调用VC提供的批处理,C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\vsvars32.bat

修改好后,使用nmake即可开始编译。

编译时有几处代码提示编译失败,都是属于C语言中,变量声明在有效代码后(VS严格禁止的),调换一下顺序即可

diff -r -u -N -w GmSSL-master/crypto/sm9/sm9_asn1.c GmSSL-master_new/crypto/sm9/sm9_asn1.c
--- GmSSL-master/crypto/sm9/sm9_asn1.c -- ::35.000000000 +
+++ GmSSL-master_new/crypto/sm9/sm9_asn1.c -- ::49.931390600 +
@@ -, +, @@
{
int ret;
ASN1_OCTET_STRING s;
+ int len = ;
s.type = V_ASN1_OCTET_STRING;
s.data = NULL;
- int len = ; if (inlen > SM9_MAX_PLAINTEXT_LENGTH) {
SM9err(SM9_F_SM9_CIPHERTEXT_SIZE, SM9_R_PLAINTEXT_TOO_LONG);
diff -r -u -N -w GmSSL-master/crypto/sm9/sm9_rate.c GmSSL-master_new/crypto/sm9/sm9_rate.c
--- GmSSL-master/crypto/sm9/sm9_rate.c -- ::35.000000000 +
+++ GmSSL-master_new/crypto/sm9/sm9_rate.c -- ::18.959395000 +
@@ -, +, @@ static int fp12_inv(fp12_t r, const fp12_t a, const BIGNUM *p, BN_CTX *ctx)
{
- if (fp4_is_zero(a[])) {
fp4_t k;
fp4_t t;
+ fp4_t r0, r1, r2;
+
+ if (fp4_is_zero(a[])) {
if (!fp4_init(t, ctx)) {
return ;
} - fp4_t r0, r1, r2;
fp4_init(r0, ctx);
fp4_init(r1, ctx);
fp4_init(r2, ctx);
@@ -, +, @@
BIGNUM *k = BN_new();
int ok; + fp12_t x, y;
+
point_init(&G, ctx);
point_init(&P, ctx); @@ -, +, @@
ok = point_equ_hex(&P, Ppubs, ctx);
printf("point test %d: %s\n", __LINE__, ok ? "ok" : "error"); - fp12_t x, y;
-
fp12_init(x, ctx);
fp12_init(y, ctx); diff -r -u -N -w GmSSL-master/ssl/statem/statem_gmtls.c GmSSL-master_new/ssl/statem/statem_gmtls.c
--- GmSSL-master/ssl/statem/statem_gmtls.c -- ::35.000000000 +
+++ GmSSL-master_new/ssl/statem/statem_gmtls.c -- ::36.844416900 +
@@ -, +, @@
int gmtls_construct_server_certificate(SSL *s)
{
unsigned long alg_a;
- alg_a = s->s3->tmp.new_cipher->algorithm_auth;
int l;
unsigned char *p;
int al = -; + alg_a = s->s3->tmp.new_cipher->algorithm_auth;
+
l = + SSL_HM_HEADER_LENGTH(s); if (alg_a & SSL_aSM2) {

patch文件下载地址:https://files.cnblogs.com/files/eaglexmw/gmssl_20190625_patch.7z

编译成功后,使用nmake install安装,由于默认安装路径在C:\Program Files (x86)\GmSSL,因此,需要管理员权限

管理员权限我通常是采取找到cmd.exe(所在路径C:\windows\system32),右键后管理员运行办法来完成

安装后,即可包含、链接相应库等后续开发了。

GMSSL在Window下的编译的更多相关文章

  1. Window下 Qt 编译MySQL驱动(居然用到了动态库格式转换工具)

    一步步在Window下开发Qt 今天开始安装MySQL,看了些关于MySQL安装的博文,方法大致相同,但是遇到的细节问题各有不同,或者没有讲全面,下面来说说个人的安装过程及遇到的问题. 1.首先下载, ...

  2. window下如何使用文本编辑器(如记事本)创建、编译和执行Java程序

    window下如何使用文本编辑器(如记事本)创建Java源代码文件,并编译执行 第一步:在一个英文目录下创建一个 .text 文件 第二步:编写代码 第三步:保存文件 方法一:选择 文件>另存为 ...

  3. 在Window下编译LibGeotiff(含Libtiff)

    核心提示:1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件. 1.GeoTiff简介 GeoTiff是包含地理信息的一种Tiff格式的文件.Libgeotiff就是一个操作 ...

  4. Window下Latex加速编译方法以及西农毕设论文模板推荐

    近些日子用Latex写了一遍文章,一共有11页,但是在window下编译需要2分多的时间,使用的是xeletex编译器. 经过查找,得到了以下方法: 如果坚持使用windows下的latex,使用以下 ...

  5. window下搭建c开发环境(GNU环境的安装)

    一.在windows平台上安装GNU环境 windows操作系统不自带GNU环境,如果需要开发跨平台的C语言程序,那么需要给windows安装GNU环境 windows下的两款GNU环境:MinGW和 ...

  6. window下安装wamp环境

    Wamp就是Windos Apache Mysql PHP集成安装环境,即在window下的apache.php和mysql的服务器软件.其中php环境配置是至关重要的一部分,本文就针对php在本地的 ...

  7. boost库在windows下的编译和使用

    因为跨平台的原因,现在要使用到boost库,boost库非常大,现在处于摸索阶段. 首先来说boost库在window下的安装和使用. 一.下载 首先从boost官方主页http://www.boos ...

  8. 【转】android 最新 NDK r8 在window下开发环境搭建 安装配置与使用 详细图文讲解,完整实际配置过程记录(原创)

    原文网址:http://www.cnblogs.com/zdz8207/archive/2012/11/27/android-ndk-install.html android 最新 NDK r8 在w ...

  9. 安装Window下Jenkins

    之前没接触过持续集成工具,之前只是了解了下自动化部署,最近一直在看自动化集成这块,发现要学的东西好多好多,可能在小公司用的不多,但如果在大公司,如果每个项目都要手动build.deploy的话那也太耗 ...

随机推荐

  1. make_smbcodepage - 为Samba创建代码页文件

    总览 make_smbcodepage c|d 代码页 输入文件 输出文件 描述 这个工具是是Samba组件的一部分. 针对Samba 2.2的国际化功能,使用make_smbcodepage可以编译 ...

  2. python--线程锁,队列

    #线程数据安全处理--同步锁 import time def sub(): global num print("ok") lock.acquire()#获取这把锁--->只有 ...

  3. hdlg WM_INITDIALOG

    https://www.cnblogs.com/gakusei/articles/1585212.html // “关于”框的消息处理程序. LRESULT CALLBACK About(HWND h ...

  4. 【前端】HTML基础

    前端 HTML:一个人 CSS:这个人的衣服 JS:这个人的行为 1 head标签 head相关标签 <!--html5--> <!DOCTYPE html> <html ...

  5. 043:Django使用原生SQL语句操作数据库

    Django使用原生SQL语句操作数据库 Django配置连接数据库: 在操作数据库之前,首先先要连接数据库.这里我们以配置 MySQL 为例来讲解. Django 连接数据库,不需要单独的创建一个连 ...

  6. 【bzoj4552】【Tjoi2016&Heoi2016】【NOIP2016模拟7.12】排序

    题目 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次 ...

  7. 使用layui iframe弹层,各弹层之前的传值问题

    最近做一个后台管理系统,用到的layui,主要是使用它的弹层,但是各个弹层之前的传值经常容易搞晕,写个个博客记录一下,方便自己,也方便别人, 首先我的页面已经嵌套了好几个iframe页面了,嵌套了三个 ...

  8. layui下拉框右边图标动画,不要动画

    /* 取消动画 / .layui-form-selected .layui-edge { margin-top: -3px; -webkit-transform: rotate(0deg); tran ...

  9. 【leetcode】848. Shifting Letters

    题目如下: 解题思路:本题首先要很快速的计算出任意一个字符shift后会变成哪个字符,其实也很简单,让shift = shift % 26,接下来再做计算.第二部是求出每个字符要shift的次数.可以 ...

  10. SQL Server参数优化

    内存参数: 此处为512G物理内存,一般来说设置为物理内存80%左右,设置过大资源不会自动释放,内存可能会持续增长:设置过小资源浪费. CPU参数: 最大工作线程数: 此处为4个CPU40核,调整后物 ...