安全加固:常量时间改进与侧信道缓解

- SM2: 常量时间标量乘法、点验证和域运算
- SM3: 常量时间填充和长度处理
- SM4: bitslice S-box 实现,避免缓存时序攻击
- SM4 模式: 常量时间 CBC 填充和标签比较
- SM9: 常量时间 Fp12 求逆和哈希到标量
- 添加 zeroize 用于私钥清理
- 改进错误处理,使用常量时间比较
This commit is contained in:
huangxt
2026-03-07 15:28:02 +08:00
parent e929e6a103
commit 7ec2580514
8 changed files with 412 additions and 158 deletions
+14 -1
View File
@@ -151,7 +151,13 @@ impl Default for Sm3Hasher {
///
/// # 返回
/// 32 字节 HMAC 值
///
/// # 安全性
/// `k_pad`/`ipad`/`opad` 含密钥派生材料,函数返回前用 `zeroize` 清零,
/// 防止密钥残留在栈上被后续代码或内存扫描工具读取。
pub fn hmac_sm3(key: &[u8], data: &[u8]) -> [u8; DIGEST_LEN] {
use zeroize::Zeroize;
// 将 key 标准化到 64 字节(不足补零,过长先哈希)
let mut k_pad = [0u8; 64];
if key.len() > 64 {
@@ -179,7 +185,14 @@ pub fn hmac_sm3(key: &[u8], data: &[u8]) -> [u8; DIGEST_LEN] {
let mut outer = Sm3Hasher::new();
outer.update(&opad);
outer.update(&inner_hash);
outer.finalize()
let result = outer.finalize();
// Reason: 清零栈上的密钥派生材料,防止密钥残留
k_pad.zeroize();
ipad.zeroize();
opad.zeroize();
result
}
#[cfg(test)]