GmSSL3.X編譯iOS和Android動態庫

yujiabo發表於2024-05-18

一、環境準備

我用的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

sc_20240518120629

出現如上錯誤,使用Xcode開啟build目錄下的GmSSL工程,選擇TARGETS-->gmssl-->Build Setting-->Signing配置中設定Development Team,然後重新執行cmake --build . --config Release命令。

sc_20240518122452

編譯模擬器動態庫:Xcode開啟GmSSL工程,cmd+b快捷鍵編譯工程。

編譯真機動態庫:使用資料線將電腦和手機連線,Xcode開啟GmSSL工程選擇真機編譯,

sc_20240518123519

Debug目錄下的libgmssl.3.1.dylib即為動態庫,將動態庫重新命名為gmssl3.dylib

2.5、使用動態庫
  • 新增動態庫到iOS工程,複製GmSSL原始碼根目錄下的include檔案新增到iOS工程。

sc_20240518125459

  • 修改標頭檔案搜尋路徑

sc_20240518130155

  • 解決動態庫標頭檔案找不到的錯誤

全域性搜尋gmssl/,全部替換為空即可

sc_20240518130732

  • 解決動態庫檔案連線不到的問題

sc_20240518131242

Build Phases建立Copy Files

sc_20240518135742

新增動態庫路徑

sc_20240518140456

點"+"新增動態庫

sc_20240518140638

  • 選擇模擬器重新執行

三、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中。

sc_20240518144133

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、編譯中可能遇到的問題
  1. 原始碼都檔案找不到

sc_20240518145414

這個問題是在Android.mk檔案中LOCAL_C_INCLUDES設定的標頭檔案路徑下找不到標頭檔案,解決辦法是將標頭檔案目錄複製到設定的路徑下即可。

sc_20240518145932

  1. 編譯過程中找不到方法或變數的引用

截圖2024-05-18 02.05.30

解決辦法是找到宣告方法或者變數的.c檔案新增到Android.mk中的LOCAL_SRC_FILES原始檔列表中即可。

  1. Android.mk原始檔列表中新增的.c檔案找不到

sc_20240518150958

解決辦法是刪除Android.mk原始檔列表sm4_common.c檔案的宣告

相關文章