32 lines
888 B
Rust
32 lines
888 B
Rust
|
|
//! Fuzz target: SM4 加密后解密必须还原原始数据
|
|||
|
|
//!
|
|||
|
|
//! 验证对任意 key + block,encrypt 后 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");
|
|||
|
|
});
|