加密代码生成需避免时序泄漏,LLVM后端通过集成constant-time IR属性,实现分支less、延迟一致的机器码输出。核心在于SelectionDAG与调度阶段尊重taint分析,避免秘密依赖路径引入变延迟。
事实基础:
- LLVM IR用function attributes如"ct=true"标记constant-time函数,防止opt破坏。
- Trail of Bits指出LLVM优化常引入timing leak,如select->branch。
- Backend需优先cmov/csel,禁用speculative reorder。
集成架构:
- 前端Pass:ConstantTimeTaint pass在Mem2Reg后运行,taint秘密load/call,阈值SecretRatio<0.2。
- 中端分析:数据流taint传播到phi节点,禁用GVN/SROA on tainted vars。
- 后端CodeGen:CodeGenPrepare中替换br为select,参数-mllvm -ct-select-threshold=1(强制>1 operands用mask)。
可落地参数/清单:
| 阶段 |
参数 |
值 |
作用 |
| Opt |
-passes |
ct-taint,instcombine |
注入taint |
| Backend |
-cost-model |
ct |
优先恒时instr |
| Target |
x86 |
-prefer-cmov |
cmov>jmp |
| ARM |
-prefer-csel |
1 |
csel优先 |
| Verify |
-verify-ct |
1 |
asm cycles var<1% |
监控与回滚:
- 指标:asm中br density<3%,cycles stddev<2 cycles/loop。
- 工具:perf record -e cycles;ctgrind验证。
- 风险:overhead 3-8%,回滚-fno-ct若perf drop>10%。
AES示例:Sbox表替换位sbox,MixColumns用GF mul mask,overhead<4%。
LLVM 19+支持“nospeculate” attr辅助。实际编译:clang -O2 -mllvm -ct-codegen crypto.c -o crypto_ct。
来源:LLVM docs (Attributes.td), Discourse RFCs, Trail of Bits pubs.
(字数:856)