关于 FIBEMATE:FIBEMATE 是一个开源的后量子密码(PQC)工程验证平台,覆盖算法元数据注册表、CBOM 盘点、CI 策略门禁、KAT 自测与硬件加速基准五条流水线。本文的全部数据来自其独立子项目 pqc-hw-bench(github.com/Lennonhaha/pqc-hw-bench)——一个以统一方法论测量 ML-KEM / ML-DSA 在 FPGA 与 CPU 上延迟、吞吐、资源与能效的基准框架。本篇聚焦其中的预硅功耗侧信道评估流水线,构建脚本、测试向量与原始统计结果全部开源。官网:fibemate.net
物理侧信道测量需要硬件平台:采集设备(示波器、电流探针或 ChipWhisperer 一类专用板)、被测板、同步触发与屏蔽环境。这套门槛决定了多数团队的实际做法——等到流片或上板之后再评估。而此时若检出泄露,修改成本已经从「改 RTL」上升为「改版图、重新流片」。
由此产生的需求是:在没有物理测量平台的条件下,能否在 RTL 阶段就筛掉一部分明显的泄露。答案是可以,但必须清楚它筛掉的是什么。
本系列第 3 篇给出了 NTT 核的资源与时序基准。本篇是其延续:同一块设计,在功耗维度上如何做一次可复现的、可被引用的预硅评估。
物理测量测的是真实电流/电磁轨迹;RTL 仿真测不到这些量。折中方案是采用功耗模型代理。CMOS 动态功耗的主项为:
其中 α(翻转率)正比于信号的汉明距离(Hamming Distance, HD):HD(v₀, v₁) = popcount(v₀ ⊕ v₁)。因此,在每个周期累加关键数据通路上若干信号的 HD,就得到一个与动态功耗正相关的标量——这就是业界通用的 HW/HD 模型。
本项目采用的正是这一路径(Telescope 式预硅评估,Liu/Schaumont, ACM AsiaCCS 2025):RTL 行为仿真 + toggle 计数 + 统计检验。
必须明确三条边界:
把「预硅 PASS」表述为「侧信道安全」,是对该方法最常见的误用。
标准 TVLA 使用 fixed-vs-random 设计:一组固定明文、一组随机明文,用于检测秘密依赖。本项目 DUT 是 ML-KEM 的 NTT 变换,其输入是多项式系数(在实际方案中可能含秘密),因此采用同分布异值设计:
组 | 输入分布 | 种子 |
|---|---|---|
A | 均匀伪随机系数 U[0, 3328] | 0xA11CE |
B | 均匀伪随机系数 U[0, 3328] | 0xC0FFEE |
两组的分布相同、取值不同。若 toggle 计数分布出现显著差异,说明数据通路功耗依赖输入取值——这是一个潜在的泄露信号;若无差异,则得到一个干净基线。
一个容易被忽略的细节:RTL 仿真是确定性的,没有测量噪声。因此组内标准差反映的是输入取值带来的多样性,而非采集噪声。这恰好是值依赖检测所需要的量;但也意味着不能把这里的 stdev 与实测轨迹的噪声水平做任何横向比较。
监测信号共 5 个:写回总线 ram_din、蝶形输出 bf_a_out / bf_b_out、RAM 读总线 ram_dout_a / ram_dout_b。每组执行 128 次完整 NTT 变换,每次输出一个总 toggle 计数。
判定:|t| < 4.5 → PASS。该阈值为业界 TVLA 惯例值,对应显著性约 3.4×10⁻⁶。
TVLA 只比较均值,对同均值、异方差或异分布的情形存在盲区——而 shuffling、随机抖动这类防护手段恰恰会制造这种盲区。ADLA 检验的是两条经验 CDF 是否相等(Mikulec / Breier / Hou, arXiv:2603.18647, 2026):
判定:A² < 11.99 → PASS。
关于该阈值的来源与含义需要说明三点。
其一,11.99 的推导方式。 该值并非经验取整,而是原论文在显著性水平 α ≈ 3.4×10⁻⁶ 下,对两样本 AD 统计量的极限分布 A²_∞ 求上 (1−α) 分位数得到的(Pearson 曲线拟合)。原论文为与标准 TVLA 直接比较,主动采用了与 |t| > 4.5 相同的 α,因此两个判定界在"假阳性率"这一维度上经过统一标定,可以并置使用。
其二,标定一致不等于检验能力相同。 两个统计量的原假设并不相同——Welch t 检验的是均值相等,AD 检验的是完整分布函数相等。同一 α 只意味着两者在各自原假设下的假阳性率一致,不意味着对同一组数据的检出能力相同。对某些泄露形态,ADLA 更敏感;对另一些则未必。
其三,阈值取自极限分布而施加于有限样本统计量,属渐近近似,原论文亦按此方式使用。本项目沿用该阈值而非自行标定,因此上述三点同样是本项目的适用前提。
一处必须声明的迁移边界:ADLA 原论文的验证对象是 ChipWhisperer-Husky 采集的神经网络推理物理功耗迹(MNIST MLP,目标板 Atmel SAM4S / ARM Cortex-M4,含 shuffling 与 random jitter 防护)。本项目将其统计量用于预硅 RTL 仿真的 toggle 计数,属于跨领域方法借鉴——统计量本身与阈值推导是通用的,但"该阈值在预硅 toggle 计数场景下的实际功效"并未由原论文建立。这一点的后果由 §7 的效力边界部分承担。
两个统计量组合后出现三种可区分的结果:
结果 | 含义 | 处置 |
|---|---|---|
TVLA PASS + ADLA PASS | 当前模型下未检出值依赖 | 基线干净 |
TVLA FAIL | 均值差异,强值依赖信号 | 排查数据通路分支与乘加时序 |
TVLA PASS + ADLA FAIL | 同均值异分布,疑似被 shuffling / jitter 掩盖 | 深入分析 CDF 差异 |
只跑 TVLA 会漏掉第三行——这正是引入第二个统计量的理由。
组件 | 工具 |
|---|---|
RTL 仿真 | iverilog 12.0(hardware/sim/tb_ntt_toggle_tvla.v) |
向量生成 | scripts/gen_ntt_vectors.py(xorshift64,确定性) |
一键编排 | scripts/run_tvla_sim.py |
统计分析 | scripts/analyze_toggle.py(纯标准库,无第三方依赖) |
四个阶段:
sim/vectors_{A,B}.mem(正变换)或 sim/inv/vectors_{A,B}.mem(逆变换),ASCII hex,每行 256 个系数;-DMODE_INV,非默认轮数追加 -DRUNS_A/B;vvp 输出 TOGGLE <grp> <run> <count> 至 sim/toggle_raw.txt;results/raw/ntt-toggle-tvla-{fwd,inv}-b2b3.json。复现命令:
退出码约定:0 = 全部 PASS;1 = 基础设施错误(工具缺失、编译失败、日志行数不符);2 = 检出泄露。
把退出码接进 CI 才有意义。 项目中的 .github/workflows/tvla-regression.yml 在 push 或 PR 触及 RTL 及流水线文件时(亦支持 workflow_dispatch 手动触发),于 Ubuntu 环境安装 iverilog 并跑双模式冒烟。GitHub Actions 将步骤的非零退出视为失败,因此退出码 2 会使该 job 标记为 failed。
这里有两处需要如实说明,避免过度声称:
即便如此,其工程价值仍然成立:一次性评估会随 RTL 演进而失效,而每次改动后自动重跑的评估不会。区别在于它当前是"预警"而非"闸门"——这两个词不能互换使用。
| 模式 | 组 | n | mean | stdev | TVLA |t| | ADLA A² | 判定 | |:--|:--|--:|--:|--:|--:|--:|:-- | --- | --- | | fwd | A | 128 | 1723.19 | 55.74 | 0.657 | 0.753 | PASS / PASS | | fwd | B | 128 | 1727.66 | 53.05 | | | | | inv | A | 128 | 3604.80 | 55.78 | 1.108 | 2.122 | PASS / PASS | | inv | B | 128 | 3596.85 | 58.90 | | | |
阈值:TVLA 4.5,ADLA 11.99。逆变换的 toggle 计数约为正变换的 2.1 倍,源于额外的 scale 乘法,属预期现象。
另有一项工程性证据:正变换在 B1(单模式原型)与 B2(完整流水线)两次独立实现下,均值、标准差、|t| 与 A² 逐位一致(0.657 / 0.753)。这表明从原型迁移到自动化管道的过程中未引入回归——管道重构前后的数值一致性,本身就是一个值得报告的指标。
结论表述:在 HD toggle 模型下,NTT 核数据通路未检出输入值依赖的功耗差异。
PASS 不等于无泄露,它只表示「在给定样本量与给定模型下未检出」。这个边界可以量化。
按本次观测到的组内标准差,在 n=128/组 的条件下,使 |t| 达到阈值 4.5 所需的最小均值差为:
模式 | 组内 stdev | 标准误 | 检出所需均值差 | 相对均值 |
|---|---|---|---|---|
fwd | 55.74 / 53.05 | 6.80 | ≈ 30.6 个 toggle | ≈ 1.8% |
inv | 55.78 / 58.90 | 7.17 | ≈ 32.3 个 toggle | ≈ 0.9% |
含义是:量级小于均值 1.8%(正变换)的差异,在该样本量下无法与输入值本身的多样性区分开。若需检出更弱的泄露,必须增加 runs,而不是把 PASS 解读为绝对安全。
此外,ADLA 的 A² 随样本量的行为与 t 统计量不同,32 runs 的 CI 冒烟模式只用于回归防护(capture 明显的管道破坏),不具备与 128 runs 相同的检出能力——两者不可互相替代。
为便于引用,以下明确列出本篇结论不适用的范围:
tensor_ntt_scheduler → ntt_core_pipe),结论不可外推至完整 ML-KEM 实现或其他模块。预硅侧信道评估的价值不在于给出「安全」结论,而在于把一部分本会在流片后才发现的问题提前到 RTL 阶段,并且可被他人复现与反驳。方法与阈值公开、测试向量确定性生成、统计量双口径、退出码接入 CI——四件事缺一,这份评估就只是一张自证清白的截图。
第 3 篇讨论的是「数字能不能被复现」,本篇讨论的是「结论能不能被推翻」。两者是同一件事的两面。
docs/tvla-methodology.md(CC-BY-SA-4.0).github/workflows/tvla-regression.yml(路径触发 + workflow_dispatch,32 runs/组 冒烟)results/raw/ntt-toggle-tvla-{fwd,inv}-b2b3.jsonFIBEMATE · 开源后量子密码(PQC)工程验证平台 · fibemate.net · github.com/Lennonhaha/fibemate
本文数据均来自开源仓库 pqc-hw-bench,流水线脚本与原始统计结果可自由获取与核对。转载请注明出处。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。