一、环境准备
我用的Mac电脑编译,Xcode版本15.2,安卓的NDK版本是android-ndk-r21e。
1.1、下载国密源码
下载最新的国密SDK源码到本地。
1.2、安装Xcode
前往Mac系统的AppStore下载安装最新Xcode。
1.3、安卓NDK下载
下载NDK到本地,选择一个比较新的版本下载即可,我选择的是android-ndk-r21e-darwin-x86_64.zip。
二、iOS动态库编译
2.1、进入源码根目录
cd /Users/xxxx/Downloads/GmSSL-master
2.2、创建Build目录
mkdir build; cd build
2.3、下载ios.toolchain.cmake
下载ios.toolchain.cmake,将ios.toolchain.cmake
文件复制到源码的根目录。
2.4、编译arm64和x86_64
在build目录下执行下面命令
cmake .. -G Xcode -DCMAKE_TOOLCHAIN_FILE=../ios.toolchain.cmake -DPLATFORM=OS64COMBINED
cmake --build . --config Release
出现如上错误,使用Xcode打开build目录下的GmSSL工程,选择TARGETS-->gmssl-->Build Setting-->Signing配置中设置Development Team,然后重新执行cmake --build . --config Release命令。
编译模拟器动态库:Xcode打开GmSSL工程,cmd+b快捷键编译工程。
编译真机动态库:使用数据线将电脑和手机连接,Xcode打开GmSSL工程选择真机编译,
Debug目录下的libgmssl.3.1.dylib即为动态库,将动态库重新命名为gmssl3.dylib
2.5、使用动态库
- 添加动态库到iOS工程,复制GmSSL源码根目录下的include文件添加到iOS工程。
- 修改头文件搜索路径
- 解决动态库头文件找不到的错误
全局搜索gmssl/,全部替换为空即可
- 解决动态库文件连接不到的问题
Build Phases创建Copy Files
添加动态库路径
点"+"添加动态库
- 选择模拟器重新运行
三、Android动态库编译
3.1、NDK下载
下载方法查看1.3章节
3.2、创建Android.mk
LOCAL_PATH := $(call my-dir) //获取当前文件路径
include $(CLEAR_VARS)
# 编译的源文件列表
LOCAL_SRC_FILES := ../src/version.c \
../src/debug.c \
../src/sm4_common.c \
../src/sm4_enc.c \
../src/sm4_modes.c \
../src/sm4_setkey.c \
../src/sm3.c \
../src/rand.c \
../src/http.c \
../src/sm3_hmac.c \
../src/sm3_kdf.c \
../src/sm2_alg.c \
../src/sm2_key.c \
../src/sm2_lib.c \
../src/sm9_alg.c \
../src/sm9_key.c \
../src/sm9_lib.c \
../src/zuc.c \
../src/zuc_modes.c \
../src/aes.c \
../src/aes_modes.c \
../src/sha256.c \
../src/sha512.c \
../src/chacha20.c \
../src/hash_drbg.c \
../src/block_cipher.c \
../src/digest.c \
../src/hmac.c \
../src/hkdf.c \
../src/pbkdf2.c \
../src/gf128.c \
../src/gcm.c \
../src/aead.c \
../src/pkcs8.c \
../src/ec.c \
../src/rsa.c \
../src/asn1.c \
../src/hex.c \
../src/base64.c \
../src/pem.c \
../src/x509_alg.c \
../src/x509_cer.c \
../src/x509_ext.c \
../src/x509_req.c \
../src/x509_crl.c \
../src/x509_new.c \
../src/cms.c \
../src/sdf/sdf.c \
../src/sdf/sdf_lib.c \
../src/sdf/sdf_meth.c \
../src/sdf/sdf_ext.c \
../src/sdf/sdf_sansec.c \
../src/skf/skf.c \
../src/skf/skf_lib.c \
../src/skf/skf_meth.c \
../src/skf/skf_ext.c \
../src/skf/skf_prn.c \
../src/skf/skf_wisec.c \
../src/socket.c \
../src/tls.c \
../src/tls_ext.c \
../src/tls_trace.c \
../src/tlcp.c \
../src/tls12.c \
../src/tls13.c \
../src/file.c \
../tools/gmssl.c \
../tools/version.c \
../tools/sm4.c \
../tools/sm3.c \
../tools/sm3hmac.c \
../tools/sm2keygen.c \
../tools/sm2sign.c \
../tools/sm2verify.c \
../tools/sm2encrypt.c \
../tools/sm2decrypt.c \
../tools/sm9setup.c \
../tools/sm9keygen.c \
../tools/sm9sign.c \
../tools/sm9verify.c \
../tools/sm9encrypt.c \
../tools/sm9decrypt.c \
../tools/zuc.c \
../tools/rand.c \
../tools/pbkdf2.c \
../tools/certgen.c \
../tools/certparse.c \
../tools/certverify.c \
../tools/certrevoke.c \
../tools/reqgen.c \
../tools/reqparse.c \
../tools/reqsign.c \
../tools/crlgen.c \
../tools/crlget.c \
../tools/crlparse.c \
../tools/crlverify.c \
../tools/cmssign.c \
../tools/cmsverify.c \
../tools/cmsencrypt.c \
../tools/cmsdecrypt.c \
../tools/cmsparse.c \
../tools/sdfutil.c \
../tools/skfutil.c \
../tools/tlcp_client.c \
../tools/tlcp_server.c \
../tools/tls12_client.c \
../tools/tls12_server.c \
../tools/tls13_client.c \
../tools/tls13_server.c \
# 包含的头文件目录
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
# 生成的动态库名称
LOCAL_MODULE := gmssl
include $(BUILD_SHARED_LIBRARY)
3.3、创建Application.mk文件
# APP_ABI 定义了要构建的目标平台,例如 armeabi-v7a、arm64-v8a、x86 和 x86_64
APP_ABI := armeabi-v7a arm64-v8a x86 x86_64
# APP_PLATFORM 定义了要针对的 Android 平台版本
APP_PLATFORM := android-21
3.4、创建jni目录
在GmSSL源码根目录下创建jni目录,NDK编译过程中在jni目录下查询编译描述文件,所以要将Android.mk和Application.mk文件放在jni中。
3.5、设置环境变量
- 执行export PATH=$PATH:下载到本地的ndk路径
export PATH=$PATH:/Users/xxxx/Desktop/out/android-ndk-r21e
- 检查设置是否生效
ndk-build -version
如果有输出Copyright (C) 1988-2016 Free Software Foundation, Inc.等信息则设置生效。
3.6、执行编译
- 在GmSSL源码根目录下执行编译
ndk-build
如果编译过程中弹出<未识别的来源>弹窗,在设置-->隐私与安全性-->安全性中点击允许,然后重新执行编译。
3.7、编译中可能遇到的问题
- 源码都文件找不到
这个问题是在Android.mk文件中LOCAL_C_INCLUDES设置的头文件路径下找不到头文件,解决办法是将头文件目录复制到设置的路径下即可。
- 编译过程中找不到方法或变量的引用
解决办法是找到声明方法或者变量的.c文件添加到Android.mk中的LOCAL_SRC_FILES源文件列表中即可。
- Android.mk源文件列表中添加的.c文件找不到
解决办法是删除Android.mk源文件列表sm4_common.c文件的声明