一、環境準備
我用的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檔案的宣告