立即处理可能影响正在运行的系统
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 加密后端。
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 计算。
建议升级
升级 Intel 构建,并重新运行覆盖长全 1 进位链的 RSA 已知答案测试。
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。
3
高
RSA 序列化与签名校验现强制规范宽度
TBigInt.SaveFixed 增加前导零填充;RSA 拒绝大于等于模数的值,PKCS#1/PSS 路径使用精确宽度并加强盐值与填充校验。
安全
mormot.crypt.rsa
b4a21003+99-33
crypt: ensure fixed-width RSA serialization
影响
Delphi/FPC RSA 密文与签名保持所需模数宽度;此前可能接受的畸形或非规范签名会被拒绝。
建议升级
使用独立实现复测 PKCS#1 v1.5/PSS 互操作性,并检查已存签名宽度。
公开 API
TBigInt.SaveFixedadded — 以大端格式导出精确字节数,并填充前导零。
4
高
AES-GCM 校验流式调用顺序并保留待处理状态
TAesGcm 改用 PtrUInt 长度,克隆待处理 AVX 块,拒绝在密文后追加 AAD,校验高层 AAD 调用,并修正隧道标签写入目标。
安全
mormot.crypt.core+1
36e581ed+22-21
crypt: several fixes to TAesGcm
影响
流式及克隆 AES-GCM 上下文会认证预期字节;无效 AAD 顺序现在会失败,而非生成误导性标签。
建议升级
AES-GCM 与隧道用户应升级,并测试克隆上下文、AAD 顺序及非块对齐消息。
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 密钥生成获得最终合规修正。
建议升级
使用 build 2.4.17586,并重新运行 RSA 生成及独立素性检查。
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 加密后端加载。
建议升级
ECC 用户应升级,并增加截断 DER、超大整数及公私钥类型互换的负向测试。
7
高
RSA 素数轮次与 PKCS 填充校验得到修正
FipsMinIterations 改为比较完整位数;PKCS#1 解填充接受至少八字节的任意填充长度;PSS 校验要求签名宽度精确等于模数。
安全
mormot.crypt.rsa
c21e6cfa+6-6
crypt: several RSA fixes
影响
RSA 素性保障与标准填充接受逻辑得到修正;畸形 PSS 长度会被一致拒绝。
建议升级
RSA 用户应升级并重新运行填充、签名与生成素数测试。
8
高
环境变量可保留空值并恢复未设置状态
环境缓存新增显式初始化标志;SetSystemEnv 始终写入;ResetSystemEnv 在 Windows/POSIX 上恢复缓存值,或取消最初不存在的变量。
修复
mormot.core.os+3
4fc7e59a+90-43
core: fixed #651 environment variables functions
影响
已有空环境值不再被误判为缓存缺失,临时变量也能一致恢复为最初未设置状态。
建议升级
在 Windows 与 POSIX 上复测 SetSystemEnv/ResetSystemEnv 对未设置、空值及非空变量的处理。
公开 API
SetSystemEnvbehaviour-changed — 始终写入请求值,包括空字符串。ResetSystemEnvbehaviour-changed — 对缓存建立时不存在的变量执行取消设置。
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 端口,自定义端口也能生效。
建议升级
验证仅主机名、ldap://、ldaps:// 及显式端口连接串。
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 语句中的静默数据变化。
建议升级
PostgreSQL 用户应升级,并测试绑定空 RawUtf8 或 string 的插入与更新。
11
高
定时器关闭会按请求秒数等待
TSynBackgroundTimer.WaitUntilNotProcessing 在传给 SleepHiRes 前把超时从秒转换为毫秒。
修复
mormot.core.threads
630707ac+3-3
core: fixed TSynBackgroundTimer.WaitUntilNotProcessing #660
影响
等待时间不再比请求值短约一千倍,从而减少与活动回调的关闭竞态。
建议升级
升级在负载下停止后台定时器的服务,并验证关闭延迟。
12
高
线程安全 SQL 连接池会销毁所有已分配连接
TSqlDBConnectionPropertiesThreadSafe.Destroy 遍历实际连接数组边界,而非配置的最小/最大值。
修复
mormot.db.sql
db7c4721+3-3
db: fixed TSqlDBConnectionPropertiesThreadSafe.Destroy #657
影响
连接池销毁时不会在配置变化后泄漏已初始化连接或越过已分配数组。
建议升级
在泄漏检测下复测连接池重配置与应用关闭。
13
高
AES-GCM 重置会清除残留部分块长度
此前操作以不完整块结束后,TAesGcmEngine.Reset 现在会把 state.blen 清零。
修复
mormot.crypt.core
e8367af5+3-2
crypt: fixed TAesGcmEngine.Reset after non-complete blocks
影响
复用 AES-GCM 引擎时,不再把过期字节偏移带入下一条消息并破坏加密或认证。
建议升级
升级复用 AES-GCM 上下文,并测试连续的非块对齐消息。
14
高
后台定时器会在更新计数器前标记为处理中
TSynBackgroundTimer.EverySecond 在递增并调用定时回调前设置 fProcessing,关闭 WaitUntilNotProcessing 剩余竞态。
修复
mormot.core.threads
a0b02203+3-2
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。
16
中
未知命令行参数会报告正确 token
TCommandLine.DetectUnknown 改为报告解析后的 fNames 项,而不是以错误偏移索引原始参数列表。
修复
mormot.core.os
938a6bb1+12-3
core: fixed #654 unexpected command line argument reporting
影响
在解析开关和值后,诊断会指出真实意外选项;参数接受规则不变。
17
中
LDAP 在连接设置中保留显式端口
TLdapClient 在创建套接字时保留 URI 解析出的端口,不再经过残留的默认端口路径。
修复
mormot.net.ldap
fa932d76+9-4
net: one leftover of #653
影响
使用自定义端口的 LDAP/LDAPS 端点会连接到配置服务,而非协议默认端口。
建议升级
复测带或不带 scheme、且端口非 389/636 的 LDAP URI。
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 字段映射及把布尔表达式投影为整数的查询。
19
中
SQLite 备份可正确报告目标打开失败
BackupBackground 捕获创建目标 TSqlDatabase 时的异常,释放部分状态并返回 false。
修复
mormot.db.raw.sqlite3
81dcd78a+7-3
db: fixed #655 backup destination creation failure
影响
不可写或无效的备份目标不再从后台备份 API 冒出意外构造异常。
值得一看
测试无效路径与权限失败,并确保调用方处理 false 结果。
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 测试向量。
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 一样释放操作数。
22
中
RSA 素数搜索以更低成本更新余数并跳过候选
TBigInt.FillPrime 在递增候选时保留小素数余数,避免每次素性尝试都执行完整除法。
性能
mormot.crypt.rsa
2791c66f+127-15
crypt: huge performance boost of RSA generation
影响
RSA 密钥生成显著加快,尤其在较慢的 Delphi/FPC 目标上;密钥格式不变。
值得一看
评测实际使用的密钥尺寸,并用独立工具验证生成的密钥。
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 核心并更快完成;密钥格式与应用调用不变。
值得一看
在受限服务中评测密钥生成并确认工作线程上限。
24
中
RSA 约简改用预计算 Barrett 倒数
TRsaContext 为模数预计算 Barrett 常量,Reduce 以乘法和移位替代重复除法。
性能
mormot.crypt.rsa
bcdff3ac+68-7
crypt: use Barret Reduction for TRsaContext.Reduce()
影响
RSA 签名与验证在模约简上耗时更少;序列化值与 API 不变。
值得一看
在 32 位与 64 位目标上比较约简变更前后的 RSA 向量。
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 上运行加密向量。
26
低
RSA 模幂开始使用滑动窗口
TRsaContext.ModPower 引入三位滑动窗口与预计算奇数幂,替代逐位乘法循环。
性能
mormot.crypt.rsa
9b9e71e3+51-14
27
低
基数 2 预检更早排除 RSA 合数候选
TBigInt.IsPrime 在分配并运行随机 Miller-Rabin 轮次前,先以见证值 2 做一次强伪素数测试。
性能
mormot.crypt.rsa
5be3ad0c+46-18
crypt: faster TBigInt.IsPrime by using base-2 pretest
影响
RSA 生成能以更低成本排除大量合数候选,无需修改应用。
28
低
Barrett 约简避免重复 RSA 计算
TRsaContext 在优化的 Barrett 约简路径中复用预计算模数尺寸并缩小临时值。
性能
mormot.crypt.rsa
bc529ee6+36-17
29
低
大整数新增专用平方实现
TBigInt.Square 直接计算对角项与双倍交叉项,不再复制后调用 Multiply。
性能
mormot.crypt.rsa
7be82719+39-4
crypt: dedicated TBigInt.Square method
影响
RSA 幂运算的平方步骤更快,同时保持 TBigInt.Square 契约。
公开 API
TBigInt.Squarebehaviour-changed — 改用专用平方算法而非通用乘法。
30
低
Pascal 大整数除以十的实现得到优化
TBigInt.IntDivMod10 重写纯 Pascal 商余循环,以减少分支与重复索引。
性能
mormot.crypt.rsa
dec4ec58+25-17
31
低
常用 RSA 指数获得专用快速路径
TRsaContext 检测指数 65537,并使用固定的短平方乘序列替代通用循环。
性能
mormot.crypt.rsa
4f07c5c3+16-12
crypt: optimize exponent common prime 65537
影响
Delphi/FPC 上使用指数 65537 的 RSA 公钥操作更快,API 与输出不变。
32
低
指数 65537 通过十六次平方与一次乘法计算
TRsaContext.ModPower 识别指数 65537,并直接执行精确二进制链,无需分配通用滑动窗口表。
性能
mormot.crypt.rsa
d283eeda+17-2
33
低
RSA 模幂采用四位滑动窗口
TRsaContext.ModPower 将预计算奇数幂表从三位扩展到四位,并相应调整扫描循环。
性能
mormot.crypt.rsa
e1d2b232+6-6
crypt: use 4-bit sliding window for TRsaContext.ModPower
影响
大私钥指数 RSA 操作减少模乘次数;调用方式与序列化结果不变。
34
低
加密核心代码重组但行为不变
mormot.crypt.core 移动辅助代码并简化局部声明,同时保持 AES 与哈希控制流不变。
内部重构
mormot.crypt.core
4d9c5730+19-22
crypt: minor refactoring with no functional change
影响
对 Delphi/FPC 应用代码、公共 API 或预期加密结果均无影响。
35
低
大整数十进制转换代码得到整理
TBigInt.IntDivMod10 整理局部变量与循环结构,不改变除法结果或公开签名。
内部重构
mormot.crypt.rsa
260dd9cb+9-14
crypt: minor TBigInt.IntDivMod10 refactoring/cleaning
影响
对 Delphi/FPC 应用代码无影响;这是后续优化前的内部整理。
往期
- TTunnelLocal 改用带方向独立密钥的认证 AES-GCM11
- 重定向限制趋于一致,POSIX 子进程等待可及时返回9
- HTTP 客户端与 WebSocket 在大规模 ECC 优化后趋于稳定33
- FPC ARM 原子操作恢复内存顺序,HTTP.sys WebSocket 完成重构35
- 代理路由趋于稳定,WebSocket 子类陷阱得到修复27
- HTTP 状态机趋于稳定,Unix 客户端关闭不再删除服务端 socket37
- 异步关闭修复泄漏,HTTP 超时按阶段拆分26
- RTSP-over-HTTP 测试不再共享监听端口1
- PostgreSQL 数组绑定与并发等待得到修复15
- AES-GCM 认证恢复,Tunnel 与队列生命周期重构32
- WebSocket 死锁得到修复,TLS 与异常日志趋于稳定30
- SChannel 获得原生 mTLS,服务器启动竞态得到修复26