重构:RustCrypto 兼容接口

主要变更:
- 新增 sm2/、sm3/、sm4/ 独立 crate,实现 RustCrypto traits
  - sm2:实现 signature、elliptic-curve traits
  - sm3:实现 digest、crypto-common traits
  - sm4:实现 cipher、aead traits
- 新增 fuzz/ 模糊测试目标
- 新增 tests/sm2_proptest.rs 属性测试
- 重构 src/sm4/ 使用 RustCrypto AEAD traits
- 更新 CI 工作流支持多 crate 测试
- 更新 .gitignore 忽略 fuzz/target/
This commit is contained in:
huangxt
2026-03-11 18:32:21 +08:00
parent 21e7e65b32
commit a4ca734d0d
36 changed files with 5184 additions and 961 deletions
+22
View File
@@ -0,0 +1,22 @@
//! Fuzz target: SM2 验签不 panic(接受任意字节输入)
//!
//! 对任意输入调用 sm2::verify 不应 panic,只能返回 Ok 或 Err。
//! 验证实现对格式错误输入的健壮性。
#![no_main]
use libfuzzer_sys::fuzz_target;
fuzz_target!(|data: &[u8]| {
// 需要至少 32 + 65 + 64 = 161 字节
if data.len() < 161 {
return;
}
let e: &[u8; 32] = data[..32].try_into().unwrap();
let pub_key: &[u8; 65] = data[32..97].try_into().unwrap();
let sig: &[u8; 64] = data[97..161].try_into().unwrap();
// 只要不 panic 即可;Ok 或 Err 都是合法结果
let _ = sm2::verify(e, pub_key, sig);
});
+22
View File
@@ -0,0 +1,22 @@
//! Fuzz target: SM3 一次性哈希与流式哈希必须一致
//!
//! 验证 Sm3::digest(data) == 逐字节 Sm3::update + finalize 的结果相同。
#![no_main]
use libfuzzer_sys::fuzz_target;
use sm3::Digest;
fuzz_target!(|data: &[u8]| {
// 一次性哈希
let hash1 = sm3::Sm3::digest(data);
// 流式哈希(逐字节)
let mut h = sm3::Sm3::new();
for byte in data {
h.update(&[*byte]);
}
let hash2 = h.finalize();
assert_eq!(hash1, hash2, "one-shot and streaming SM3 must agree");
});
+31
View File
@@ -0,0 +1,31 @@
//! Fuzz target: SM4 加密后解密必须还原原始数据
//!
//! 验证对任意 key + blockencrypt 后 decrypt 得到原始 block。
#![no_main]
use libfuzzer_sys::fuzz_target;
use sm4::{Sm4, KeyInit, BlockCipherEncrypt, BlockCipherDecrypt};
use sm4::cipher::array::Array;
fuzz_target!(|data: &[u8]| {
// 需要至少 32 字节(16 字节 key + 16 字节 block
if data.len() < 32 {
return;
}
let key: [u8; 16] = data[..16].try_into().unwrap();
let block_data: [u8; 16] = data[16..32].try_into().unwrap();
let cipher = Sm4::new(&Array::from(key));
let mut block = Array::from(block_data);
let original = block.clone();
// 加密
cipher.encrypt_block(&mut block);
// 解密
cipher.decrypt_block(&mut block);
// 还原检查
assert_eq!(block, original, "SM4 encrypt then decrypt must restore original");
});