一、cmake+gcc基础编译
windows+cmake+mingw 搭建c/c++开发环境 - 知乎 (zhihu.com)
一定要安装mingw,不然会出现会出现编译出来的不存在makefile,无法进行下一步的make,
之后采用编译代码为
cmake -G"Unix Makefiles" ../
二、openssl
环境篇-Windows下安装OpenSSL_openssl 安装
三、vcpkg 安装:包管理器、方便其他包的下载。
四、gmp安装
五、SEAL安装
六、cgo 调用gmssl:
山东大学软件工程应用与实践——GMSSL开源库(一) ——WINDOWS下GMSSL的安装与编译的超详细保姆级攻略_windows 编译gmssl_乔未的博客-CSDN博客
修改点:
1.执行到nmake即可,获得libcrypto-1_1-x64.dll libssl-1_1-x64.dll,不要改名字,这俩就是我们需要的依赖库。
2.在需要使用的.h头部增加:
#cgo CFLAGS: -I.
#cgo LDFLAGS: -L. -lcrypto-1_1-x64 -lssl-1_1-x64
有些C.free()并无法释放openssl中的char*,window的适配性较差。可以手动增加释放模块。
void openssl_free(unsigned char *ptr) {
OPENSSL_free(ptr);
}
func (pk *PublicKey) Encrypt(alg string, in []byte, eng *Engine) ([]byte, error) {
calg := C.CString(alg)
defer C.free(unsafe.Pointer(calg))
var outlen C.size_t
out := C.pk_encrypt(pk.pkey, calg, (*C.uchar)(&in[0]),
C.size_t(len(in)), &outlen, nil)
if out == nil {
return nil, GetErrors()
}
//defer C.free(unsafe.Pointer(out))
outByte := C.GoBytes(unsafe.Pointer(out), C.int(outlen))
defer C.openssl_free(out)
return outByte, nil
}