mORMot2 Daily每日上游提交速读

RSA 引入 FIPS 见证值,同时修复 AES-GCM 与数据库缺陷

本期主要是一组覆盖 RSA 正确性、合规性与性能的改动:固定宽度编码及更严格的 PKCS#1/PSS 校验先落地,随后采用 NIST DRBG 和 FIPS 186-5 Miller-Rabin 见证值选择。同时修复 AES-GCM 分块、x86 进位传播、ECC 密钥校验、定时器等待以及若干 PostgreSQL/SQLite 边界问题。直接使用公开 TBigInt API 的代码需要处理一次 IsPrime 签名变更,并可使用新增方法。

要点

  • 应升级到 build 2.4.17586,以获得完整的 RSA 合规与优化系列。
  • TBigInt.IsPrime 现接受 TAesPrngAbstract 而非 PLecuyer;直接调用方必须迁移。
  • RSA 输出采用固定宽度,PKCS#1/PSS 校验会拒绝非规范或畸形编码。
  • AES-GCM 现可正确处理 AVX 部分块以及克隆或重置状态。
  • PostgreSQL 空字符串、BOOLINT 读取和线程安全连接销毁均已修复。

升级建议

请使用最终 build 2.4.17586。将直接调用 TBigInt.IsPrime 的代码改为传入 TAesPrngAbstract,并复测 RSA 密钥生成、PKCS#1/PSS 签名验证、非块对齐 AES-GCM 流、PostgreSQL 空参数与 BOOLINT、SQLite 备份失败以及定时器关闭。还应以已知向量交叉验证 x86/x64 与 AArch64 加密后端。

版本号2.4.17551 → 2.4.17586
提交35
行数+1759 -469
阅读2 分钟

35 条中的 35 条 · 上游 35 次提交

# 条目 类别 单元
1 严重 x86 汇编现可正确跨大整数块传播进位 x86/x64 的 _xasmadd/_xasmsub 循环在跨越展开块边界时,用 BT 在 ADC/SBB 前恢复进位或借位。 修复 mormot.crypt.core.asmx64+1 8ea03422+10-10

crypt: fixed _xasmadd/sub x86/x64 asm carry propagation

影响

特定操作数模式此前可能产生错误的大整数加减结果,从而破坏 Intel 后端 RSA 计算。

Arnaud Bouchez · 15:41 UTC · 在 GitHub 上查看该提交 →

2 高 RSA 素性测试从 L'Ecuyer 状态切换到 NIST DRBG TBigInt.IsPrime 将可选 PLecuyer 参数替换为 TAesPrngAbstract;内部素数生成使用 TAesPrng.Main 产生 Miller-Rabin 见证值。 破坏性变更 mormot.crypt.rsa 9bce2b48+23-18

crypt: enhanced RSA compliance with NIST recommandations

影响

传入 PLecuyer 指针的直接调用将无法编译;默认调用会静默改用框架的 AES DRBG。

需要迁移

搜索带第三个参数的 TBigInt.IsPrime 调用,并改为传入 TAesPrngAbstract 实例。

公开 API

  • TBigInt.IsPrimesignature-changed — 第三个参数由 PLecuyer 改为 TAesPrngAbstract。

Arnaud Bouchez · 08:41 UTC · 在 GitHub 上查看该提交 →

3 高 RSA 序列化与签名校验现强制规范宽度 TBigInt.SaveFixed 增加前导零填充;RSA 拒绝大于等于模数的值,PKCS#1/PSS 路径使用精确宽度并加强盐值与填充校验。 安全 mormot.crypt.rsa b4a21003+99-33

crypt: ensure fixed-width RSA serialization

影响

Delphi/FPC RSA 密文与签名保持所需模数宽度;此前可能接受的畸形或非规范签名会被拒绝。

公开 API

  • TBigInt.SaveFixedadded — 以大端格式导出精确字节数,并填充前导零。

Arnaud Bouchez · 20:01 UTC · 在 GitHub 上查看该提交 →

4 高 AES-GCM 校验流式调用顺序并保留待处理状态 TAesGcm 改用 PtrUInt 长度,克隆待处理 AVX 块,拒绝在密文后追加 AAD,校验高层 AAD 调用,并修正隧道标签写入目标。 安全 mormot.crypt.core+1 36e581ed+22-21

crypt: several fixes to TAesGcm

影响

流式及克隆 AES-GCM 上下文会认证预期字节;无效 AAD 顺序现在会失败,而非生成误导性标签。

Arnaud Bouchez · 14:17 UTC · 在 GitHub 上查看该提交 →

5 高 Miller-Rabin 见证值现按 FIPS 186-5 采样 TBigInt.FillMillerRabinWitness 在候选数完整位宽上执行拒绝采样,再将结果映射到 FIPS 186-5 B.3.1 区间。 安全 mormot.crypt.rsa 319cd63e+19-18

crypt: RSA Miller-Rabin witness selection as described in FIPS 186-5 B.3.1

影响

RSA 素数测试不再因截断取模而偏置见证值;Delphi/FPC 密钥生成获得最终合规修正。

Arnaud Bouchez · 09:06 UTC · 在 GitHub 上查看该提交 →

6 高 ECC 加载器拒绝畸形及类型错误的密钥 PemDerRawToEcc 校验压缩公钥前缀,DerParse 拒绝零长度或过大的 ASN.1 INTEGER;回归测试防止公私钥互换。 安全 mormot.crypt.ecc+1 e3133b00+19-8

crypt: fixed #652 ECC key parsing and validation

影响

畸形 DER 或把私钥当公钥传入时,不再能通过 Delphi/FPC 加密后端加载。

Arnaud Bouchez · 12:17 UTC · PR #652 · 在 GitHub 上查看该提交 →

7 高 RSA 素数轮次与 PKCS 填充校验得到修正 FipsMinIterations 改为比较完整位数;PKCS#1 解填充接受至少八字节的任意填充长度;PSS 校验要求签名宽度精确等于模数。 安全 mormot.crypt.rsa c21e6cfa+6-6

crypt: several RSA fixes

影响

RSA 素性保障与标准填充接受逻辑得到修正;畸形 PSS 长度会被一致拒绝。

Arnaud Bouchez · 18:26 UTC · 在 GitHub 上查看该提交 →

8 高 环境变量可保留空值并恢复未设置状态 环境缓存新增显式初始化标志;SetSystemEnv 始终写入;ResetSystemEnv 在 Windows/POSIX 上恢复缓存值,或取消最初不存在的变量。 修复 mormot.core.os+3 4fc7e59a+90-43

core: fixed #651 environment variables functions

影响

已有空环境值不再被误判为缓存缺失,临时变量也能一致恢复为最初未设置状态。

公开 API

  • SetSystemEnvbehaviour-changed — 始终写入请求值,包括空字符串。
  • ResetSystemEnvbehaviour-changed — 对缓存建立时不存在的变量执行取消设置。

Arnaud Bouchez · 12:00 UTC · PR #651 · 在 GitHub 上查看该提交 →

9 高 LDAP URI 解析可区分默认与自定义端口 TLdapClient URI 解析会把无 scheme 且缺省端口映射到 LDAP_PORT,保留显式端口,并在有效端口为 LDAPS_PORT 时启用 TLS。 修复 mormot.net.ldap c46549d6+21-7

net: fixed #653 LDAP port parsing

影响

LDAP 端点不再错误继承通用 URI 解析的 HTTP 80 端口,自定义端口也能生效。

Arnaud Bouchez · 12:17 UTC · PR #653 · 在 GitHub 上查看该提交 →

10 高 PostgreSQL 空参数不再与 SQL NULL 混淆 TSqlDBPostgresStatement.BindParams 将零长度非空字符串指向 NULCHAR,而不是向 libpq 传 nil。 修复 mormot.db.sql.postgres 9a90c009+7-3

db: fixed #658 TSqlDBPostgresStatement.BindParams with '' value

影响

绑定 '' 不再插入 SQL NULL,避免 Delphi/FPC PostgreSQL 语句中的静默数据变化。

Arnaud Bouchez · 12:51 UTC · PR #658 · 在 GitHub 上查看该提交 →

11 高 定时器关闭会按请求秒数等待 TSynBackgroundTimer.WaitUntilNotProcessing 在传给 SleepHiRes 前把超时从秒转换为毫秒。 修复 mormot.core.threads 630707ac+3-3

core: fixed TSynBackgroundTimer.WaitUntilNotProcessing #660

影响

等待时间不再比请求值短约一千倍,从而减少与活动回调的关闭竞态。

Arnaud Bouchez · 12:56 UTC · PR #660 · 在 GitHub 上查看该提交 →

12 高 线程安全 SQL 连接池会销毁所有已分配连接 TSqlDBConnectionPropertiesThreadSafe.Destroy 遍历实际连接数组边界,而非配置的最小/最大值。 修复 mormot.db.sql db7c4721+3-3

db: fixed TSqlDBConnectionPropertiesThreadSafe.Destroy #657

影响

连接池销毁时不会在配置变化后泄漏已初始化连接或越过已分配数组。

Arnaud Bouchez · 12:45 UTC · PR #657 · 在 GitHub 上查看该提交 →

13 高 AES-GCM 重置会清除残留部分块长度 此前操作以不完整块结束后,TAesGcmEngine.Reset 现在会把 state.blen 清零。 修复 mormot.crypt.core e8367af5+3-2

crypt: fixed TAesGcmEngine.Reset after non-complete blocks

影响

复用 AES-GCM 引擎时,不再把过期字节偏移带入下一条消息并破坏加密或认证。

Arnaud Bouchez · 13:18 UTC · 在 GitHub 上查看该提交 →

14 高 后台定时器会在更新计数器前标记为处理中 TSynBackgroundTimer.EverySecond 在递增并调用定时回调前设置 fProcessing,关闭 WaitUntilNotProcessing 剩余竞态。 修复 mormot.core.threads a0b02203+3-2

core: fix #660 part II

影响

等待定时器完成的关闭代码不再从处理标志设置前的狭小窗口穿过。

Arnaud Bouchez · 12:59 UTC · PR #660 · 在 GitHub 上查看该提交 →

15 高 AVX AES-GCM 支持部分与截断分块 TAesGcmEngine 跨调用缓存不完整 AAD 与文本块,正确续用 CTR 字节,并将 Init 的 AllowAvx 默认值设为 true。 新功能 mormot.crypt.core 2d95c74a+128-27

crypt: allow partial/truncated AES-GCM encryption

影响

支持 AVX 的 Delphi/FPC 构建可流式处理任意分块大小;省略 AllowAvx 参数时现在会启用 AVX。

值得一看

测试从单字节到多块的分块,并明确决定调用方是否应传 AllowAvx=false。

公开 API

  • TAesGcmEngine.Initsignature-changed — AllowAvx 现新增默认值 true。

Arnaud Bouchez · 14:05 UTC · 在 GitHub 上查看该提交 →

16 中 未知命令行参数会报告正确 token TCommandLine.DetectUnknown 改为报告解析后的 fNames 项,而不是以错误偏移索引原始参数列表。 修复 mormot.core.os 938a6bb1+12-3

core: fixed #654 unexpected command line argument reporting

影响

在解析开关和值后,诊断会指出真实意外选项;参数接受规则不变。

Arnaud Bouchez · 12:29 UTC · PR #654 · 在 GitHub 上查看该提交 →

17 中 LDAP 在连接设置中保留显式端口 TLdapClient 在创建套接字时保留 URI 解析出的端口,不再经过残留的默认端口路径。 修复 mormot.net.ldap fa932d76+9-4

net: one leftover of #653

影响

使用自定义端口的 LDAP/LDAPS 端点会连接到配置服务,而非协议默认端口。

Arnaud Bouchez · 12:25 UTC · PR #653 · 在 GitHub 上查看该提交 →

18 中 PostgreSQL 布尔整数在 true 时返回一 TSqlDBPostgresStatement.ColumnInt 识别 BOOLOID,并把线协议值 't' 映射为 1,其余布尔文本映射为 0。 修复 mormot.db.sql.postgres c0bc6984+9-3

db: fixed #659 TSqlDBPostgresStatement.ColumnInt with BOOLINT value

影响

通过 ColumnInt 读取 PostgreSQL 布尔列的 Delphi/FPC 代码现在获得预期数值。

值得一看

复测 BOOLINT 字段映射及把布尔表达式投影为整数的查询。

Arnaud Bouchez · 12:53 UTC · PR #659 · 在 GitHub 上查看该提交 →

19 中 SQLite 备份可正确报告目标打开失败 BackupBackground 捕获创建目标 TSqlDatabase 时的异常,释放部分状态并返回 false。 修复 mormot.db.raw.sqlite3 81dcd78a+7-3

db: fixed #655 backup destination creation failure

影响

不可写或无效的备份目标不再从后台备份 API 冒出意外构造异常。

值得一看

测试无效路径与权限失败,并确保调用方处理 false 结果。

Arnaud Bouchez · 12:33 UTC · PR #655 · 在 GitHub 上查看该提交 →

20 中 AArch64 获得 RSA 大整数原生算术实现 新增 AArch64 汇编实现加、减、乘、除原语,并由 mormot.defines 与 TBigInt 分派启用。 性能 mormot.core.base+3 78fb3897+518-69

crypt: new aarch64 asm primitives for RSA computing

影响

Delphi/FPC AArch64 RSA 操作可使用原生优化算术;正确性依赖新后端与 Pascal 向量一致。

值得一看

在所有受支持 AArch64 操作系统上运行 RSA 与 TBigInt 测试向量。

Arnaud Bouchez · 16:54 UTC · 在 GitHub 上查看该提交 →

21 中 Barrett 约简只计算所需低位 limb 新增 TBigInt.MultiplyLow,TRsaContext.BarrettReduction 用它避免计算随后丢弃的高位 limb。 性能 mormot.crypt.rsa c12db49f+182-6

crypt: optimized RSA barret reduction implementation

影响

RSA 模约简分配和乘法数据更少,从而加快签名与私钥工作负载,输出不变。

值得一看

在各字长平台运行 TBigInt 别名与 RSA 已知答案测试。

公开 API

  • TBigInt.MultiplyLowadded — 仅计算指定数量的低位 limb,并像 Multiply 一样释放操作数。

Arnaud Bouchez · 15:50 UTC · 在 GitHub 上查看该提交 →

22 中 RSA 素数搜索以更低成本更新余数并跳过候选 TBigInt.FillPrime 在递增候选时保留小素数余数,避免每次素性尝试都执行完整除法。 性能 mormot.crypt.rsa 2791c66f+127-15

crypt: huge performance boost of RSA generation

影响

RSA 密钥生成显著加快,尤其在较慢的 Delphi/FPC 目标上;密钥格式不变。

值得一看

评测实际使用的密钥尺寸,并用独立工具验证生成的密钥。

Arnaud Bouchez · 17:13 UTC · 在 GitHub 上查看该提交 →

23 中 RSA 密钥生成在两个核心上并行计算素数 TRsa.Generate 在两个工作任务中搜索 p 与 q,并协调完成,同时保留现有超时与清理逻辑。 性能 mormot.crypt.rsa 0f2aa131+103-27

crypt: compute p/q RSA primes in parallel in two CPU cores

影响

RSA 密钥创建可使用两个 CPU 核心并更快完成;密钥格式与应用调用不变。

值得一看

在受限服务中评测密钥生成并确认工作线程上限。

Arnaud Bouchez · 08:09 UTC · 在 GitHub 上查看该提交 →

24 中 RSA 约简改用预计算 Barrett 倒数 TRsaContext 为模数预计算 Barrett 常量,Reduce 以乘法和移位替代重复除法。 性能 mormot.crypt.rsa bcdff3ac+68-7

crypt: use Barret Reduction for TRsaContext.Reduce()

影响

RSA 签名与验证在模约简上耗时更少;序列化值与 API 不变。

值得一看

在 32 位与 64 位目标上比较约简变更前后的 RSA 向量。

Arnaud Bouchez · 15:19 UTC · 在 GitHub 上查看该提交 →

25 中 Delphi Intel 构建重新启用汇编加密路径 mormot.defines 恢复 Delphi x86/x64 的 ASMINTELARM64 选择,使预期优化原语重新参与编译。 编译器与平台 mormot.defines b6fd1b2e+4-2

crypt: restore asm for Delphi Intel targets

影响

Delphi Win32/Win64 加密代码恢复汇编性能;FPC 与非 Intel 行为不变。

值得一看

重新构建 Delphi Intel 目标,并在 Win32 与 Win64 上运行加密向量。

Arnaud Bouchez · 17:04 UTC · 在 GitHub 上查看该提交 →

26 低 RSA 模幂开始使用滑动窗口 TRsaContext.ModPower 引入三位滑动窗口与预计算奇数幂,替代逐位乘法循环。 性能 mormot.crypt.rsa 9b9e71e3+51-14

crypt: 3-bit sliding window for RSA ModPower

影响

私钥指数 RSA 操作所需乘法更少;无需迁移或格式变更。

Arnaud Bouchez · 17:39 UTC · 在 GitHub 上查看该提交 →

27 低 基数 2 预检更早排除 RSA 合数候选 TBigInt.IsPrime 在分配并运行随机 Miller-Rabin 轮次前,先以见证值 2 做一次强伪素数测试。 性能 mormot.crypt.rsa 5be3ad0c+46-18

crypt: faster TBigInt.IsPrime by using base-2 pretest

影响

RSA 生成能以更低成本排除大量合数候选,无需修改应用。

Arnaud Bouchez · 07:03 UTC · 在 GitHub 上查看该提交 →

28 低 Barrett 约简避免重复 RSA 计算 TRsaContext 在优化的 Barrett 约简路径中复用预计算模数尺寸并缩小临时值。 性能 mormot.crypt.rsa bc529ee6+36-17

crypt: optimized RSA Barret Reduction

影响

RSA 模约简减少分配与复制;应用代码和加密输出不变。

Arnaud Bouchez · 18:02 UTC · 在 GitHub 上查看该提交 →

29 低 大整数新增专用平方实现 TBigInt.Square 直接计算对角项与双倍交叉项,不再复制后调用 Multiply。 性能 mormot.crypt.rsa 7be82719+39-4

crypt: dedicated TBigInt.Square method

影响

RSA 幂运算的平方步骤更快,同时保持 TBigInt.Square 契约。

公开 API

  • TBigInt.Squarebehaviour-changed — 改用专用平方算法而非通用乘法。

Arnaud Bouchez · 17:51 UTC · 在 GitHub 上查看该提交 →

30 低 Pascal 大整数除以十的实现得到优化 TBigInt.IntDivMod10 重写纯 Pascal 商余循环,以减少分支与重复索引。 性能 mormot.crypt.rsa dec4ec58+25-17

crypt: optimized TBigInt.IntDivMod10 pascal code

影响

无汇编路径的后端上,大整数十进制格式化更快;结果不变。

Arnaud Bouchez · 17:03 UTC · 在 GitHub 上查看该提交 →

31 低 常用 RSA 指数获得专用快速路径 TRsaContext 检测指数 65537,并使用固定的短平方乘序列替代通用循环。 性能 mormot.crypt.rsa 4f07c5c3+16-12

crypt: optimize exponent common prime 65537

影响

Delphi/FPC 上使用指数 65537 的 RSA 公钥操作更快,API 与输出不变。

Arnaud Bouchez · 07:05 UTC · 在 GitHub 上查看该提交 →

32 低 指数 65537 通过十六次平方与一次乘法计算 TRsaContext.ModPower 识别指数 65537,并直接执行精确二进制链,无需分配通用滑动窗口表。 性能 mormot.crypt.rsa d283eeda+17-2

crypt: optimized RSA for exponent=65537

影响

标准指数下的 RSA 验证与加密更快;行为及公开签名不变。

Arnaud Bouchez · 17:42 UTC · 在 GitHub 上查看该提交 →

33 低 RSA 模幂采用四位滑动窗口 TRsaContext.ModPower 将预计算奇数幂表从三位扩展到四位,并相应调整扫描循环。 性能 mormot.crypt.rsa e1d2b232+6-6

crypt: use 4-bit sliding window for TRsaContext.ModPower

影响

大私钥指数 RSA 操作减少模乘次数;调用方式与序列化结果不变。

Arnaud Bouchez · 07:04 UTC · 在 GitHub 上查看该提交 →

34 低 加密核心代码重组但行为不变 mormot.crypt.core 移动辅助代码并简化局部声明,同时保持 AES 与哈希控制流不变。 内部重构 mormot.crypt.core 4d9c5730+19-22

crypt: minor refactoring with no functional change

影响

对 Delphi/FPC 应用代码、公共 API 或预期加密结果均无影响。

Arnaud Bouchez · 15:19 UTC · 在 GitHub 上查看该提交 →

35 低 大整数十进制转换代码得到整理 TBigInt.IntDivMod10 整理局部变量与循环结构,不改变除法结果或公开签名。 内部重构 mormot.crypt.rsa 260dd9cb+9-14

crypt: minor TBigInt.IntDivMod10 refactoring/cleaning

影响

对 Delphi/FPC 应用代码无影响;这是后续优化前的内部整理。

Arnaud Bouchez · 17:14 UTC · 在 GitHub 上查看该提交 →

上游活动 每日提交数 · 最近 60 天
提交977
活跃天数44/60
最忙一天2026-09-30
峰值60
2026-08-15: 0 commits2026-08-16: 0 commits2026-08-17: 0 commits2026-08-18: 0 commits2026-08-19: 0 commits2026-08-20: 0 commits2026-08-21: 0 commits2026-08-22: 0 commits2026-08-23: 0 commits2026-08-24: 0 commits2026-08-25: 0 commits2026-08-26: 0 commits2026-08-27: 26 commits2026-08-28: 11 commits2026-08-29: 10 commits2026-08-30: 1 commit2026-08-31: 23 commits2026-09-01: 0 commits2026-09-02: 20 commits2026-09-03: 29 commits2026-09-04: 35 commits2026-09-05: 13 commits2026-09-06: 0 commits2026-09-07: 0 commits2026-09-08: 23 commits2026-09-09: 10 commits2026-09-10: 17 commits2026-09-11: 23 commits2026-09-12: 14 commits2026-09-13: 9 commits2026-09-14: 7 commits2026-09-15: 4 commits2026-09-16: 24 commits2026-09-17: 26 commits2026-09-18: 21 commits2026-09-19: 59 commits2026-09-20: 13 commits2026-09-21: 5 commits2026-09-22: 34 commits2026-09-23: 17 commits2026-09-24: 57 commits2026-09-25: 22 commits2026-09-26: 26 commits2026-09-27: 0 commits2026-09-28: 2 commits2026-09-29: 19 commits2026-09-30: 60 commits2026-10-01: 26 commits2026-10-02: 30 commits2026-10-03: 32 commits2026-10-04: 15 commits2026-10-05: 1 commit2026-10-06: 26 commits2026-10-07: 37 commits2026-10-08: 27 commits2026-10-09: 35 commits2026-10-10: 33 commits2026-10-11: 9 commits2026-10-12: 11 commits2026-10-13: 35 commits
2026-08-152026-10-13

往期

全部往期 →