本文记录 Guomi 的后续工作方向。已发布版本的完成项与行为变化请查看 CHANGELOG.md。
当前 P0/P1/P2 基线实现与自动化验证均已完成(2026-08-19 自审查与热点分析已归档,见 SECURITY_REVIEW.md / bench/sm2_hotspot_analysis.md);后续工作包括第三方审计等外部依赖,以及下方未勾选的高风险性能优化候选项,已完成项保留在本文中作为验收记录。
优先级说明
- P0:安全性、正确性或兼容性问题,应优先处理。
- P1:会显著改善公开 API、CLI 或发布质量的工作。
- P2:性能、扩展能力和长期维护工作。
已采用的执行顺序
- 完成发布版本校验、最低版本 CI 和无效 CLI 选项清理。
- 先形成 SM2 标准签名与新密文格式设计,再修改公开 API。
- 实现版本化 SM2 密文、标准 KDF 和旧格式迁移策略。
- 增加标准测试向量、跨实现测试和独立安全审查。
- 统一 CLI 输入语义并补齐公开 API 与文档示例测试。
- 最后处理基准、流式 API、证书解析与 SM9 调研。
P0:SM2 标准兼容与安全迁移
标准签名 API
- [x] 设计标准兼容的 SM2 签名与验签 API,明确用户 ID 必须显式传入以及 ZA 的计算方式。
- [x] 决定第一阶段使用 raw
r || s,DER 留作显式扩展,并避免静默改变现有sign/2、verify/3的兼容行为。 - [x] 增加 GB/T 32918.5 ZA/签名测试向量及 OpenSSL 双向签名互操作测试。
版本化密文与 KDF
- [x] 定义新的标准兼容密文格式,明确 C1/C2/C3 排列、点编码、空消息待互操作确认和显式解析规则。
- [x] 新增按消息长度扩展且不会重复掩码的标准 KDF 与显式标准加密 API;旧 API 保持原语义并明确记录兼容限制。
- [x] 为新旧密文定义不同的显式 API,并为未来持久化 envelope 预留版本字段,禁止解密时猜测格式。
- [x] 制定旧兼容格式的弃用和迁移策略;迁移完成前继续明确其长消息风险和非生产用途。
- [x] 增加 GB/T 32918.5 密文向量、畸形密文测试及 OpenSSL 双向加解密互操作测试。
完整性与安全边界
- [x] 为需要完整性保护的 SM4 使用场景记录协议级认证加密或独立密钥 encrypt-then-MAC 方案,并强调裸 CBC/CTR 仅提供机密性。
- [x] 对公开 API、密钥与随机数处理、错误行为和时间侧信道开展独立安全审查。见
SECURITY_REVIEW.md(2026-08-19,基于代码证据、负面测试与 eprof 热点剖析;结论:文档化边界内通过自审查,仍未达第三方审计标准,已回填SECURITY.md:35-42)。 - [x] 在安全文档中记录当前验证范围、残余风险及明确不适用场景。
P1:发布与测试质量
- [x] 在 release workflow 中校验 Git tag 与
mix.exs版本一致,并在创建 Release 和发布 Hex 包前失败退出。 - [x] 增加受支持 Elixir/OTP 版本的 CI 矩阵,至少覆盖 README 声明的最低组合和当前主要组合。
- [x] 增加文档示例测试:库 API 使用 doctest,CLI 示例使用集成测试,避免 README、
cli.md与实际行为漂移。 - [x] 将 SM2 官方 ZA/签名向量和 OpenSSL 双向签名互操作纳入 CI;外部实现不可用时明确报告原因。
- [x] 提供严格的本地 OpenSSL 互操作脚本,覆盖 SM3、SM4 ECB/CBC/CTR 和标准 SM2;OpenSSL 能力缺失时失败退出。
- [x] 在 CI 中执行严格 OpenSSL 互操作脚本,并为核心库设置 85% 覆盖率门槛;CLI 由黑盒集成测试单独验证。
P1:API 与 CLI 完善
- [x] 移除当前已解析但无实际行为的 SM2
--hex选项,并对该无效选项返回明确错误。 - [x] 统一 CLI 中单参数“文件路径”和“消息文本”的语义:位置参数表示消息文本,文件输入使用显式
--file,并记录迁移方法。 - [x] 为 CLI 增加 SM4 CTR 模式,使用独立的
--counter接收固定 16 字节大端初始计数器,并拒绝 padding 选项。 - [x] 为所有公开函数补充
@doc、参数与二进制格式、返回值、错误原因和安全限制说明。 - [x] 统一无效 iodata、密钥、签名和密文的错误分类,避免把非密钥输入错误报告为
:invalid_key。
P2:性能与扩展
- [x] 完善现有
bench/bench.exs:记录架构、操作系统、Elixir/OTP/ERTS 版本、调度器数量、消息大小、运行参数、预热次数和重复样本统计。 - [x] 为基准建立稳定的结果记录与比较规范;明确禁止把单次 wall-clock 结果作为性能结论。
- [x] 继续分析 SM2 曲线热点;此项只处理性能,标准 KDF 与密文迁移归入 P0。见
bench/sm2_hotspot_analysis.md(2026-08-19,mix run bench/bench.exs基线 + eprof/fprof 剖析:mod/255% 为首要热点,已给出mod快速路径、窗口化、Montgomery 三级优化路径)。 - [x] 分别评估流式 SM3、SM4 CBC 和 SM4 CTR API,明确状态对象、分块规则、padding/finalize 行为及认证边界。
- [x] 调研国密证书解析与 SM9 支持,形成范围、依赖、标准与测试来源说明;当前决定暂不实现 SM9。
P2:后续性能优化候选
以下项目不属于当前已完成的 P2 基线,必须在标准兼容性和侧信道边界明确后再实施:
- [ ] 重新执行
eprof/fprof,在固定硬件、OTP/Elixir、调度器和输入规模下记录 SM2 热点,确认mod/2优化后的新瓶颈。 - [ ] 评估固定窗口或 wNAF 标量乘法,比较生成、签名、验签和加解密收益;必须补充窗口查表的缓存侧信道风险评估,不能只按吞吐量验收。
- [ ] 评估 Montgomery 域乘法与恒定时间模逆,明确是否以侧信道加固为目标;实现前先确定中间值范围、转换边界、错误语义和公开测试向量。
- [ ] 评估批量验签的 Montgomery batch inversion,明确批量 API 的失败项定位、内存上限和调用方是否接受批量语义。
- [ ] 为 SM2 性能建立可重复的基准门禁:固定运行环境或专用 runner,至少两轮独立样本,使用 median 与置信区间,避免将单次 wall-clock 作为发布阻断依据。
后续性能优化的完成条件:
- 保持 GB/T 测试向量、负面测试和 OpenSSL 双向互操作通过。
- 同机同参 median 至少改善 10%,且 max 不恶化超过 15%;结果必须附带提交号和运行环境。
- 若引入窗口化、Montgomery 或其他时序敏感实现,必须同步更新
SECURITY.md和安全审查报告。 - 第三方安全审计前,不得以性能优化结果宣称纯 Elixir 曲线运算具备恒定时间安全性。
完成定义
- 密码学功能必须有标准测试向量、负面测试和明确的二进制格式说明。
- 兼容性功能必须至少与一种独立实现完成双向验证,或记录无法验证的原因。
- 公开 API 变更必须同步更新模块文档、README、CLI 文档、CHANGELOG 和迁移说明。
- CI、发布或文档待办只有在对应自动化检查落地后才能标记完成。
- 安全相关功能在独立审查完成前不得宣称适合生产环境或敏感数据。
已完成里程碑
- [x] 纯 Elixir SM2、SM3、SM4 核心实现,不依赖 OpenSSL 国密算法支持。
- [x] SM4 ECB、CBC 与 CTR 库 API。
- [x] SM2 输入校验和确定性错误返回。
- [x] CLI 必填参数校验与显式 hex 输入/输出选项。
- [x] 跨平台 CI、GitHub Release 与 Hex 自动发布流程。
- [x] README、CLI、兼容性和安全边界文档。