use std::collections::HashMap;
use sz_orm_crypto::{ApiSigner, HmacSigner, PasswordHasher, Pbkdf2Hasher};
#[test]
fn regress_hmac_signer_parameter_smuggling_blocked() {
let signer = HmacSigner::new();
let secret = "shared-api-secret";
let mut legit = HashMap::new();
legit.insert("a".to_string(), "1".to_string());
legit.insert("b".to_string(), "2".to_string());
let legit_sig = signer.sign(&legit, secret);
let mut smuggled = HashMap::new();
smuggled.insert("a".to_string(), "1&b=2".to_string());
let smuggled_sig = signer.sign(&smuggled, secret);
println!("[regress-H-1] legit_sig = {legit_sig}");
println!("[regress-H-1] smuggled_sig = {smuggled_sig}");
assert_ne!(
legit_sig, smuggled_sig,
"两个语义不同的参数集必须产生不同签名(参数走私修复失效)"
);
assert!(
!signer.verify(&smuggled, secret, &legit_sig),
"走私载荷必须验证失败"
);
println!("[regress-H-1] ✅ 修复验证通过:参数走私被切断(percent-encoding 生效)");
}
#[test]
fn regress_hmac_signer_special_chars_roundtrip() {
let signer = HmacSigner::new();
let secret = "secret";
let mut params = HashMap::new();
params.insert("q".to_string(), "a b&c=d%".to_string());
params.insert("user".to_string(), "张三".to_string());
let sig = signer.sign(¶ms, secret);
assert!(
signer.verify(¶ms, secret, &sig),
"合法含特殊字符参数必须签名-验证一致"
);
println!("[regress-H-1] ✅ 特殊字符/中文参数签名往返一致");
}
#[test]
fn regress_pbkdf2_iteration_bounds_enforced() {
let hasher = Pbkdf2Hasher::new();
let c1_hash = "$1$73616c74$120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b";
assert!(
hasher.verify("password", c1_hash).is_err(),
"c=1 弱哈希必须被拒绝(M-8 修复失效)"
);
let dos_hash =
"$4294967295$73616c74$120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b";
assert!(
hasher.verify("password", dos_hash).is_err(),
"u32::MAX 迭代载荷必须被拒绝(CPU DoS 修复失效)"
);
let hashed = hasher.hash("password").unwrap();
assert!(hasher.verify("password", &hashed).unwrap());
println!("[regress-M-8] ✅ 迭代上下限生效(c=1 / u32::MAX 均拒绝,正常往返通过)");
}