开源之夏-18

前几天在社区问关于铜锁SDF模块构建项目的问题:
今天收到了回复。分析一下:

@董海玄 SDF 库集成配置
Tongsuo 项目已经内置了对 SDF 库的支持。 Configure:1054-1061 您可以通过以下配置选项来指定 SDF 库的路径:

–with-sdf-lib=PATH: 指定 SDF 动态库的路径
–with-sdf-include=PATH: 指定 SDF 头文件的路径

编译配置步骤

启用 SDF 支持: Configure:949-952

./Configure –enable-sdf-lib-dynamic –with-sdf-lib=/path/to/gmssl/lib –with-sdf-include=/path/to/gmssl/include
动态库加载机制: sdf_lib.c:92-118
Tongsuo 使用 DSO(Dynamic Shared Object)机制来动态加载 SDF 库,默认库名为 “sdf”。

SDF 命令行工具

编译完成后,您可以使用 openssl sdf 命令来测试 SDF 功能: build.info:78-80 sdf.c:113-140 SDF 命令行工具支持多种操作,包括:

  • SM2 密钥生成和管理
  • 加密解密操作
  • 数字签名
  • MAC 计算
    依赖关系配置 Configure:713-714 配置系统会自动处理 SDF 库的依赖关系,确保在启用 sdf-lib 时同时启用 sdf-lib-dynamic。

验证集成

编译完成后,您可以通过以下方式验证 SDF 库是否正确集成:

  • 检查 openssl sdf 命令是否可用
  • 测试基本的 SDF 操作,如设备打开和会话创建
  • 验证与 GmSSL 软实现的兼容性

Notes

确保您的 GmSSL 动态库实现了标准的 SDF API 接口,包括 SDF_OpenDevice、SDF_OpenSession 等函数。 sdf.h:62-117 Tongsuo 的 SDF 实现遵循 GM/T 0018-2012 标准。

上边内容感觉是AI生成的(帮他补回来了了markdown格式😉),因为现在铜锁不支持SDF(不然也不会有我的事了)
而且开了编译选项也不能用,因为TSAPI写穿了,直接依赖厂商库头文件。没插硬件会编译报错。

但是这引导我去花时间理清铜锁的构建系统方式,perl脚本构建逻辑。

项目总Configure:

  • 启用模块的选择(配合00-base-templates.conf解析成宏,配合C程序完成)
  • 动态库路径传入选项解析 => -L
  • SDF头文件路径解析(让编译器能找到sdf的头文件) => -I
  • 程序的链接库名 => -l
  • etc

分立模块的build.info

完成模块间的依赖指定

你的疑问很有代表性。OpenSSL/Tongsuo 采用这种“分散式”build.info 设计,主要有以下考虑:

1. 模块化和可维护性
每个子目录(如 crypto/sdf)有自己的 build.info,便于各自维护和扩展。这样新增、修改、删除某个模块时,只需关注本目录的 build.info,不影响全局。

2. 依赖关系清晰
虽然主 build.info(如 crypto/build.info)会汇总依赖,但每个子模块也要声明自己对 libcrypto 的依赖,确保即使单独构建该模块也能正确链接。这种“冗余”是为了防止依赖遗漏。

3. 自动化脚本处理
Perl 脚本会自动收集所有 build.info,统一生成最终的 Makefile/Ninja 文件。分散声明有利于自动化工具灵活组合和管理构建目标。

4. 兼容性和灵活性
有些模块可能被多个上层模块复用,分散声明依赖可以让构建系统根据实际需要灵活组合目标,支持不同平台和构建方式。

总结:
这种设计牺牲了一些集中性,但换来了模块独立、易维护、自动化友好和灵活适配多平台的能力,是大型跨平台项目常见的构建策略。


开源之夏-18
https://43.242.201.154/2025/08/23/开源之夏-18/
Author
Dong
Posted on
August 23, 2025
Licensed under