GmSSL3.X编译iOS和Android动态库

news/2024/11/18 9:27:41/文章来源:https://www.cnblogs.com/yujiabo/p/18199463

一、环境准备

我用的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文件的声明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/708274.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验31-hanlp_textrank

版本python3.7 tensorflow版本为tensorflow-gpu版本2.6

关于cmd运行javac提示javac 不是内部或外部命令,也不是可运行的程序的问题

大家可以看到我这边cmd运行javac命令,它对我进行了错误的提示,提示javac不是可运行命令和程序。这个问题的根本在于环境变量的配置出现了错误。 接下来就要进行jdk的环境配置了。 注意点:这里要定位到自身存放jdk的bin目录才会生效。点击确定即可,然后打开cmd窗口输入java…

[SWPUCTF 2016]Web7 利用ssrf攻击redis

今天做了一道攻击redis的相关题目,以前没接触过。 初始界面有输入框,随便输入看看。是urllib2相关库报错,去搜了搜发现是Python2的Urllib2头部注入(CVE-2016-5699)。那就看看这个cve。说是Python2.x 3.x的urllib/urllib2从数据解析到发包的整个流程中,均未对URL提供安全性过…

通配符查找

问题:Vlookup查找值在查找范围内对应的并非完全匹配,而是仅几个字相同,该如何使用公式。 函数公式永远不会有最完善的解决方法(如下图第5行查找结果),最好的方法是事先列出简全称对照表。 以下公式可以解决绝大部分问题:=VLOOKUP("*"&TEXTJOIN("*&qu…

CTFshow pwn075

栈迁移CTFshow pwn075 题目描述:栈空间不够怎么办? 首先检查保护:32位开启NX保护,部分开启RELRO,放入ida中看有两次输入点,输入只能到返回地址,所以考虑用到栈迁移 exp: from pwn import *p = remote("pwn.challenge.ctf.show",28276) elf = ELF("./pwn7…

提取字符串中间的字母数字

问题:字符串包含汉字、字母、数字、符号等,需要提取汉字后连续9个字母数字符号 函数公式解决:老套路: =LEFT(MIDB(A2,SEARCHB("?",A2),99),9) WPS专用新套路: =@REGEXP(A2,"[--Z]+")老套路: SearchB:查找第一个单字节字符的位置 MidB:中取汉字后所…

曼哈顿距离与切比雪夫距离

曼哈顿距离与切比雪夫距离 距离 - OI Wiki (oi-wiki.org)已经说的比较清晰,提取要点和结论便于复习使用。 曼哈顿距离:\(d \left(\right. A , B \left.\right) = \left|\right. x_{1} - x_{2} \left|\right. + \left|\right. y_{1} - y_{2} \left|\right.\) 切比雪夫距离:\(…

primethus

监控介绍 监控数据流程介绍监控优势 如果监控的是物理机,则用 Zabbix,Zabbix 在传统监控系统中,尤其是在服务器相关监控方面,占据绝对优势。甚至环境变动不会很频繁的情况下,Zabbix 也会比 Pometheus好使。但如果是云环境的话,除非是Zabbix玩的非常溜,可以做各种定制,否…

embedding

1 one-hot编码 首先讲讲one-hot编码,这种编码很简单。假设你有N个词,那么就直接创建一个N维度的向量,之后每个词在不同位置上取1来区分。N个词相当于在一个N维空间里,刚好N个单位向量。而且这些向量彼此正交 这种简单的表示方法存在几个问题:维度高:N个词有N个维度,所以…

美团一面问我i++跟++i的区别是什么

美团一面问我i++跟++i的区别是什么 面试官:“i++跟++i的区别是什么?” 我:“i++是先使用然后再执行+1的操作,++i是先执行+1的操作然后再去使用i” 面试官:“那你看看下面这段代码,运行结果是什么?” public static void main(String[] args) {int j = 0;for (int i = 0;…

成功实现FaceTime数据筛选,FaceTime蓝号检测,检测是否开通FaceTime功能的实现原理

FaceTime是苹果公司iOS和macOS(以前称Mac OS X或OS X)内置的一款视频通话软件,通过Wi-Fi或者蜂窝数据接入互联网,在两个装有FaceTime的设备之间实现视频通话。其要求通话双方均具有装有FaceTime的苹果设备,苹果ID以及可接入互联网的3G/4G/5G或者Wi-Fi网络。一、Windows电脑…

一文掌握:数据湖是什么?可不是数据仓库

一、什么是数据湖 数据湖(Data Lake)是指一个大型数据存储和处理系统,它能够存储各种类型和格式的数据,包括结构化数据、半结构化数据和非结构化数据。数据湖的目的是为了让企业可以更好地管理和利用大量的数据,以便进行数据分析、机器学习等工作。数据湖通常采用分布式计…