1use std::collections::HashMap;
13
14use aes_gcm::aead::{Aead, KeyInit};
15use aes_gcm::{Aes256Gcm, Key, Nonce};
16use hmac::{Hmac, Mac};
17use pbkdf2::pbkdf2_hmac;
18use rand::rngs::OsRng;
19use rand::RngCore;
20use sha2::{Digest, Sha256};
21use subtle::ConstantTimeEq;
22
23type HmacSha256 = Hmac<Sha256>;
24
25pub fn sha256(data: &[u8]) -> [u8; 32] {
31 let mut hasher = Sha256::new();
32 hasher.update(data);
33 let result = hasher.finalize();
34 let mut out = [0u8; 32];
35 out.copy_from_slice(&result);
36 out
37}
38
39pub fn sha256_hex(data: &[u8]) -> String {
41 sha256(data).iter().map(|b| format!("{:02x}", b)).collect()
42}
43
44pub fn hmac_sha256(key: &[u8], message: &[u8]) -> [u8; 32] {
46 let mut mac = match <HmacSha256 as Mac>::new_from_slice(key) {
49 Ok(m) => m,
50 Err(_) => {
51 return [0u8; 32];
54 }
55 };
56 mac.update(message);
57 let result = mac.finalize().into_bytes();
58 let mut out = [0u8; 32];
59 out.copy_from_slice(&result);
60 out
61}
62
63pub fn hmac_sha256_hex(key: &[u8], message: &[u8]) -> String {
65 hmac_sha256(key, message)
66 .iter()
67 .map(|b| format!("{:02x}", b))
68 .collect()
69}
70
71fn constant_time_eq(a: &[u8], b: &[u8]) -> bool {
73 a.ct_eq(b).into()
74}
75
76pub trait Crypter: Send + Sync {
81 fn encrypt(&self, plaintext: &[u8]) -> Result<Vec<u8>, CryptoError>;
82 fn decrypt(&self, ciphertext: &[u8]) -> Result<Vec<u8>, CryptoError>;
83}
84
85pub struct AesGcmCrypter {
90 cipher: Aes256Gcm,
91}
92
93impl AesGcmCrypter {
94 pub fn new(key: &[u8; 32]) -> Self {
96 let key = Key::<Aes256Gcm>::from_slice(key);
97 Self {
98 cipher: Aes256Gcm::new(key),
99 }
100 }
101
102 pub fn from_key_str(key: &str) -> Self {
104 let hash = sha256(key.as_bytes());
105 Self::new(&hash)
106 }
107
108 fn random_nonce() -> [u8; 12] {
109 let mut nonce = [0u8; 12];
110 OsRng.fill_bytes(&mut nonce);
111 nonce
112 }
113}
114
115impl Crypter for AesGcmCrypter {
116 fn encrypt(&self, plaintext: &[u8]) -> Result<Vec<u8>, CryptoError> {
117 self.encrypt_with_aad(plaintext, &[])
118 }
119
120 fn decrypt(&self, ciphertext: &[u8]) -> Result<Vec<u8>, CryptoError> {
121 self.decrypt_with_aad(ciphertext, &[])
122 }
123}
124
125impl AesGcmCrypter {
126 pub fn encrypt_with_aad(&self, plaintext: &[u8], aad: &[u8]) -> Result<Vec<u8>, CryptoError> {
132 let nonce_bytes = Self::random_nonce();
133 let nonce = Nonce::from_slice(&nonce_bytes);
134 let payload = aes_gcm::aead::Payload {
135 msg: plaintext,
136 aad,
137 };
138 let ciphertext = self
139 .cipher
140 .encrypt(nonce, payload)
141 .map_err(|e| CryptoError::EncryptionFailed(e.to_string()))?;
142 let mut result = Vec::with_capacity(12 + ciphertext.len());
143 result.extend_from_slice(&nonce_bytes);
144 result.extend_from_slice(&ciphertext);
145 Ok(result)
146 }
147
148 pub fn decrypt_with_aad(&self, ciphertext: &[u8], aad: &[u8]) -> Result<Vec<u8>, CryptoError> {
152 if ciphertext.len() < 12 {
153 return Err(CryptoError::DecryptionFailed(
154 "Ciphertext too short".to_string(),
155 ));
156 }
157 let nonce = Nonce::from_slice(&ciphertext[..12]);
158 let encrypted = &ciphertext[12..];
159 let payload = aes_gcm::aead::Payload {
160 msg: encrypted,
161 aad,
162 };
163 self.cipher
164 .decrypt(nonce, payload)
165 .map_err(|e| CryptoError::DecryptionFailed(e.to_string()))
166 }
167}
168
169pub trait PasswordHasher: Send + Sync {
174 fn hash(&self, password: &str) -> Result<String, CryptoError>;
175 fn verify(&self, password: &str, hash: &str) -> Result<bool, CryptoError>;
176}
177
178pub struct Pbkdf2Hasher {
183 iterations: u32,
184}
185
186impl Pbkdf2Hasher {
187 const DEFAULT_ITERATIONS: u32 = 100_000;
188 const SALT_LEN: usize = 16;
189 const HASH_LEN: usize = 32;
190
191 pub fn new() -> Self {
192 Self {
193 iterations: Self::DEFAULT_ITERATIONS,
194 }
195 }
196
197 pub fn with_iterations(iterations: u32) -> Self {
198 Self {
199 iterations: iterations.max(1),
200 }
201 }
202
203 fn compute_hash(password: &str, salt: &[u8], iterations: u32) -> [u8; Self::HASH_LEN] {
204 let mut out = [0u8; Self::HASH_LEN];
205 pbkdf2_hmac::<Sha256>(password.as_bytes(), salt, iterations, &mut out);
206 out
207 }
208}
209
210impl Default for Pbkdf2Hasher {
211 fn default() -> Self {
212 Self::new()
213 }
214}
215
216impl PasswordHasher for Pbkdf2Hasher {
217 fn hash(&self, password: &str) -> Result<String, CryptoError> {
218 if password.is_empty() {
219 return Err(CryptoError::InvalidHash(
220 "Password cannot be empty".to_string(),
221 ));
222 }
223 let salt = random_bytes(Self::SALT_LEN);
224 let hash = Self::compute_hash(password, &salt, self.iterations);
225 Ok(format!(
226 "${}${}${}",
227 self.iterations,
228 hex_encode(&salt),
229 hex_encode(&hash)
230 ))
231 }
232
233 fn verify(&self, password: &str, hash: &str) -> Result<bool, CryptoError> {
234 if !hash.starts_with('$') {
235 return Err(CryptoError::InvalidHash("Invalid hash format".to_string()));
236 }
237 let parts: Vec<&str> = hash[1..].splitn(3, '$').collect();
238 if parts.len() != 3 {
239 return Err(CryptoError::InvalidHash("Invalid hash format".to_string()));
240 }
241 let iterations: u32 = parts[0]
242 .parse()
243 .map_err(|_| CryptoError::InvalidHash("Invalid iterations".to_string()))?;
244 let salt = hex_decode(parts[1])
245 .map_err(|_| CryptoError::InvalidHash("Invalid salt hex".to_string()))?;
246 let expected_hash = hex_decode(parts[2])
247 .map_err(|_| CryptoError::InvalidHash("Invalid hash hex".to_string()))?;
248 let computed = Self::compute_hash(password, &salt, iterations);
249 Ok(constant_time_eq(&computed, &expected_hash))
250 }
251}
252
253pub trait ApiSigner: Send + Sync {
258 fn sign(&self, params: &HashMap<String, String>, secret: &str) -> String;
259 fn verify(&self, params: &HashMap<String, String>, secret: &str, signature: &str) -> bool;
260}
261
262pub struct HmacSigner;
266
267impl HmacSigner {
268 pub fn new() -> Self {
269 Self
270 }
271
272 fn compute_signature(params: &HashMap<String, String>, secret: &str) -> String {
273 let mut sorted: Vec<_> = params.iter().collect();
274 sorted.sort_by(|a, b| a.0.cmp(b.0));
275
276 let query_string: String = sorted
277 .iter()
278 .map(|(k, v)| format!("{}={}", k, v))
279 .collect::<Vec<_>>()
280 .join("&");
281
282 hmac_sha256_hex(secret.as_bytes(), query_string.as_bytes())
283 }
284}
285
286impl Default for HmacSigner {
287 fn default() -> Self {
288 Self::new()
289 }
290}
291
292impl ApiSigner for HmacSigner {
293 fn sign(&self, params: &HashMap<String, String>, secret: &str) -> String {
294 Self::compute_signature(params, secret)
295 }
296
297 fn verify(&self, params: &HashMap<String, String>, secret: &str, signature: &str) -> bool {
298 let computed = Self::compute_signature(params, secret);
299 constant_time_eq(computed.as_bytes(), signature.as_bytes())
300 }
301}
302
303use rsa::oaep::Oaep;
308use rsa::{RsaPrivateKey, RsaPublicKey};
309use sha2::Sha256 as RsaSha256;
310
311pub struct RsaOaepCrypter {
316 public_key: RsaPublicKey,
317 private_key: RsaPrivateKey,
318}
319
320impl RsaOaepCrypter {
321 pub fn generate(key_bits: usize) -> Result<Self, CryptoError> {
323 let mut rng = OsRng;
324 let private_key = RsaPrivateKey::new(&mut rng, key_bits)
325 .map_err(|e| CryptoError::InvalidKey(e.to_string()))?;
326 let public_key = RsaPublicKey::from(&private_key);
327 Ok(Self {
328 public_key,
329 private_key,
330 })
331 }
332
333 pub fn from_keys(public_key: RsaPublicKey, private_key: RsaPrivateKey) -> Self {
335 Self {
336 public_key,
337 private_key,
338 }
339 }
340
341 pub fn public_key(&self) -> &RsaPublicKey {
343 &self.public_key
344 }
345
346 pub fn private_key(&self) -> &RsaPrivateKey {
348 &self.private_key
349 }
350
351 pub fn encrypt(&self, plaintext: &[u8]) -> Result<Vec<u8>, CryptoError> {
353 let mut rng = OsRng;
354 let padding = Oaep::new::<RsaSha256>();
355 self.public_key
356 .encrypt(&mut rng, padding, plaintext)
357 .map_err(|e| CryptoError::EncryptionFailed(e.to_string()))
358 }
359
360 pub fn decrypt(&self, ciphertext: &[u8]) -> Result<Vec<u8>, CryptoError> {
362 let padding = Oaep::new::<RsaSha256>();
363 self.private_key
364 .decrypt(padding, ciphertext)
365 .map_err(|e| CryptoError::DecryptionFailed(e.to_string()))
366 }
367}
368
369impl Crypter for RsaOaepCrypter {
370 fn encrypt(&self, plaintext: &[u8]) -> Result<Vec<u8>, CryptoError> {
371 self.encrypt(plaintext)
372 }
373
374 fn decrypt(&self, ciphertext: &[u8]) -> Result<Vec<u8>, CryptoError> {
375 self.decrypt(ciphertext)
376 }
377}
378
379pub trait SignatureVerifier: Send + Sync {
385 fn sign(&self, message: &[u8]) -> Vec<u8>;
387 fn verify(&self, message: &[u8], signature: &[u8]) -> bool;
389}
390
391pub struct HmacSignatureVerifier {
395 key: Vec<u8>,
396}
397
398impl HmacSignatureVerifier {
399 pub fn new(key: &[u8]) -> Self {
401 Self { key: key.to_vec() }
402 }
403
404 pub fn from_key_str(key: &str) -> Self {
406 Self::new(key.as_bytes())
407 }
408}
409
410impl SignatureVerifier for HmacSignatureVerifier {
411 fn sign(&self, message: &[u8]) -> Vec<u8> {
412 hmac_sha256(&self.key, message).to_vec()
413 }
414
415 fn verify(&self, message: &[u8], signature: &[u8]) -> bool {
416 let expected = self.sign(message);
417 constant_time_eq(&expected, signature)
418 }
419}
420
421#[derive(Clone)]
427struct KeyVersion {
428 version: u32,
429 key: Vec<u8>,
430 created_at: u64,
431}
432
433pub struct KeyRotationManager {
441 keys: Vec<KeyVersion>,
442 current_version: u32,
443 max_versions: usize,
444}
445
446impl KeyRotationManager {
447 pub fn new(max_versions: usize) -> Self {
449 Self {
450 keys: vec![],
451 current_version: 0,
452 max_versions: max_versions.max(1),
453 }
454 }
455
456 pub fn with_initial_key(key: Vec<u8>) -> Self {
458 let mut mgr = Self::new(3);
459 mgr.rotate_key(key);
460 mgr
461 }
462
463 pub fn rotate_key(&mut self, new_key: Vec<u8>) -> u32 {
465 self.current_version += 1;
466 let now = current_timestamp_secs();
467 self.keys.push(KeyVersion {
468 version: self.current_version,
469 key: new_key,
470 created_at: now,
471 });
472 while self.keys.len() > self.max_versions {
474 self.keys.remove(0);
475 }
476 self.current_version
477 }
478
479 pub fn sign(&self, message: &[u8]) -> (u32, Vec<u8>) {
481 if let Some(kv) = self.keys.last() {
482 let sig = hmac_sha256(&kv.key, message).to_vec();
483 (kv.version, sig)
484 } else {
485 (0, vec![])
486 }
487 }
488
489 pub fn verify(&self, message: &[u8], version: u32, signature: &[u8]) -> bool {
491 for kv in &self.keys {
492 if kv.version == version {
493 let expected = hmac_sha256(&kv.key, message);
494 return constant_time_eq(&expected, signature);
495 }
496 }
497 false
498 }
499
500 pub fn current_version(&self) -> u32 {
502 self.current_version
503 }
504
505 pub fn version_count(&self) -> usize {
507 self.keys.len()
508 }
509
510 pub fn versions(&self) -> Vec<u32> {
512 self.keys.iter().map(|kv| kv.version).collect()
513 }
514
515 pub fn key_created_at(&self, version: u32) -> Option<u64> {
517 self.keys
518 .iter()
519 .find(|kv| kv.version == version)
520 .map(|kv| kv.created_at)
521 }
522}
523
524fn current_timestamp_secs() -> u64 {
525 use std::time::{SystemTime, UNIX_EPOCH};
526 SystemTime::now()
527 .duration_since(UNIX_EPOCH)
528 .unwrap_or_default()
529 .as_secs()
530}
531
532use std::sync::RwLock;
537use std::time::Duration;
538
539const DEFAULT_ROTATION_INTERVAL_SECS: u64 = 90 * 24 * 60 * 60;
541
542#[derive(Debug, Clone)]
544pub struct VersionedKey {
545 pub version: u32,
547 pub key: Vec<u8>,
549 pub created_at: std::time::SystemTime,
551}
552
553pub struct KeyManager {
558 current: RwLock<VersionedKey>,
560 previous: RwLock<Vec<VersionedKey>>,
562 rotation_interval: Duration,
564 last_rotation: RwLock<std::time::SystemTime>,
566}
567
568impl KeyManager {
569 pub fn new(initial_key: Vec<u8>) -> Self {
571 let now = std::time::SystemTime::now();
572 Self {
573 current: RwLock::new(VersionedKey {
574 version: 1,
575 key: initial_key,
576 created_at: now,
577 }),
578 previous: RwLock::new(Vec::new()),
579 rotation_interval: Duration::from_secs(DEFAULT_ROTATION_INTERVAL_SECS),
580 last_rotation: RwLock::new(now),
581 }
582 }
583
584 pub fn with_rotation_interval(mut self, interval: Duration) -> Self {
586 self.rotation_interval = interval;
587 self
588 }
589
590 pub fn rotate(&self, new_key: Vec<u8>) -> Result<(), CryptoError> {
592 let mut current = self.current.write().expect("KeyManager lock poisoned");
593 let mut previous = self.previous.write().expect("KeyManager lock poisoned");
594
595 previous.push(current.clone());
597
598 if previous.len() > 3 {
600 previous.remove(0);
601 }
602
603 *current = VersionedKey {
605 version: current.version + 1,
606 key: new_key,
607 created_at: std::time::SystemTime::now(),
608 };
609
610 *self.last_rotation.write().expect("KeyManager last_rotation lock poisoned") = std::time::SystemTime::now();
611 Ok(())
612 }
613
614 pub fn needs_rotation(&self) -> bool {
616 let last = *self.last_rotation.read().expect("KeyManager last_rotation lock poisoned");
617 std::time::SystemTime::now()
618 .duration_since(last)
619 .map(|d| d >= self.rotation_interval)
620 .unwrap_or(false)
621 }
622
623 pub fn current_key(&self) -> VersionedKey {
625 self.current.read().expect("KeyManager current lock poisoned").clone()
626 }
627
628 pub fn key_by_version(&self, version: u32) -> Option<VersionedKey> {
630 if self.current.read().expect("KeyManager current lock poisoned").version == version {
631 return Some(self.current.read().expect("KeyManager current lock poisoned").clone());
632 }
633 self.previous
634 .read()
635 .expect("KeyManager previous lock poisoned")
636 .iter()
637 .find(|k| k.version == version)
638 .cloned()
639 }
640
641 pub fn previous_count(&self) -> usize {
643 self.previous
644 .read()
645 .expect("KeyManager previous lock poisoned")
646 .len()
647 }
648}
649
650fn hex_encode(bytes: &[u8]) -> String {
655 bytes.iter().map(|b| format!("{:02x}", b)).collect()
656}
657
658fn hex_decode(hex: &str) -> Result<Vec<u8>, ()> {
659 if !hex.len().is_multiple_of(2) {
660 return Err(());
661 }
662 (0..hex.len())
663 .step_by(2)
664 .map(|i| u8::from_str_radix(&hex[i..i + 2], 16).map_err(|_| ()))
665 .collect()
666}
667
668fn random_bytes(len: usize) -> Vec<u8> {
669 let mut result = vec![0u8; len];
670 OsRng.fill_bytes(&mut result);
671 result
672}
673
674#[derive(Debug)]
679pub enum CryptoError {
680 EncryptionFailed(String),
681 DecryptionFailed(String),
682 InvalidKey(String),
683 InvalidNonce(String),
684 InvalidHash(String),
685 SigningFailed(String),
686}
687
688impl std::fmt::Display for CryptoError {
689 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
690 match self {
691 CryptoError::EncryptionFailed(msg) => write!(f, "Encryption failed: {}", msg),
692 CryptoError::DecryptionFailed(msg) => write!(f, "Decryption failed: {}", msg),
693 CryptoError::InvalidKey(msg) => write!(f, "Invalid key: {}", msg),
694 CryptoError::InvalidNonce(msg) => write!(f, "Invalid nonce: {}", msg),
695 CryptoError::InvalidHash(msg) => write!(f, "Invalid hash: {}", msg),
696 CryptoError::SigningFailed(msg) => write!(f, "Signing failed: {}", msg),
697 }
698 }
699}
700
701impl std::error::Error for CryptoError {}
702
703impl serde::Serialize for CryptoError {
704 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
705 where
706 S: serde::Serializer,
707 {
708 serializer.serialize_str(&self.to_string())
709 }
710}
711
712#[cfg(test)]
717mod tests {
718 use super::*;
719
720 #[test]
723 fn test_sha256_empty() {
724 assert_eq!(
725 sha256_hex(b""),
726 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
727 );
728 }
729
730 #[test]
731 fn test_sha256_abc() {
732 assert_eq!(
733 sha256_hex(b"abc"),
734 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
735 );
736 }
737
738 #[test]
739 fn test_sha256_hello() {
740 assert_eq!(
741 sha256_hex(b"hello"),
742 "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
743 );
744 }
745
746 #[test]
747 fn test_sha256_long_message() {
748 assert_eq!(
749 sha256_hex(b"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"),
750 "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"
751 );
752 }
753
754 #[test]
755 fn test_sha256_deterministic() {
756 assert_eq!(sha256_hex(b"test"), sha256_hex(b"test"));
757 assert_ne!(sha256_hex(b"test"), sha256_hex(b"Test"));
758 }
759
760 #[test]
763 fn test_hmac_sha256_rfc4231_case1() {
764 let key = vec![0x0bu8; 20];
765 let result = hmac_sha256_hex(&key, b"Hi There");
766 assert_eq!(
767 result,
768 "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
769 );
770 }
771
772 #[test]
773 fn test_hmac_sha256_rfc4231_case2() {
774 let result = hmac_sha256_hex(b"Jefe", b"what do ya want for nothing?");
775 assert_eq!(
776 result,
777 "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843"
778 );
779 }
780
781 #[test]
782 fn test_hmac_sha256_long_key() {
783 let key = vec![0xaau8; 130];
784 let result = hmac_sha256_hex(&key, b"test message");
785 assert_eq!(result.len(), 64);
786 let short_key = vec![0xaau8; 32];
787 let result_short = hmac_sha256_hex(&short_key, b"test message");
788 assert_ne!(result, result_short);
789 }
790
791 #[test]
792 fn test_hmac_sha256_different_messages() {
793 let key = b"secret";
794 assert_ne!(hmac_sha256_hex(key, b"msg1"), hmac_sha256_hex(key, b"msg2"));
795 }
796
797 #[test]
800 fn test_aes_gcm_roundtrip() {
801 let key = [0x42u8; 32];
802 let crypter = AesGcmCrypter::new(&key);
803 let plaintext = b"Hello, World!";
804 let encrypted = crypter.encrypt(plaintext).unwrap();
805 let decrypted = crypter.decrypt(&encrypted).unwrap();
806 assert_eq!(decrypted, plaintext);
807 }
808
809 #[test]
810 fn test_aes_gcm_random_nonce_per_encryption() {
811 let key = [0x42u8; 32];
812 let crypter = AesGcmCrypter::new(&key);
813 let plaintext = b"same plaintext";
814 let encrypted1 = crypter.encrypt(plaintext).unwrap();
815 let encrypted2 = crypter.encrypt(plaintext).unwrap();
816 assert_ne!(encrypted1, encrypted2, "随机 nonce 应使密文不同");
817 assert_eq!(crypter.decrypt(&encrypted1).unwrap(), plaintext);
818 assert_eq!(crypter.decrypt(&encrypted2).unwrap(), plaintext);
819 }
820
821 #[test]
822 fn test_aes_gcm_from_key_str() {
823 let crypter = AesGcmCrypter::from_key_str("my-secret-key");
824 let plaintext = b"data to encrypt";
825 let encrypted = crypter.encrypt(plaintext).unwrap();
826 let decrypted = crypter.decrypt(&encrypted).unwrap();
827 assert_eq!(decrypted, plaintext);
828 }
829
830 #[test]
831 fn test_aes_gcm_short_ciphertext() {
832 let key = [0x42u8; 32];
833 let crypter = AesGcmCrypter::new(&key);
834 assert!(crypter.decrypt(&[0u8; 8]).is_err());
835 }
836
837 #[test]
838 fn test_aes_gcm_empty_plaintext() {
839 let key = [0x42u8; 32];
840 let crypter = AesGcmCrypter::new(&key);
841 let encrypted = crypter.encrypt(b"").unwrap();
842 assert_eq!(encrypted.len(), 28);
844 let decrypted = crypter.decrypt(&encrypted).unwrap();
845 assert_eq!(decrypted, b"");
846 }
847
848 #[test]
849 fn test_aes_gcm_tampered_ciphertext() {
850 let key = [0x42u8; 32];
851 let crypter = AesGcmCrypter::new(&key);
852 let encrypted = crypter.encrypt(b"sensitive data").unwrap();
853 let mut tampered = encrypted.clone();
854 tampered[15] ^= 0x01;
855 assert!(crypter.decrypt(&tampered).is_err());
856 }
857
858 #[test]
861 fn test_pbkdf2_hasher_hash_format() {
862 let hasher = Pbkdf2Hasher::new();
863 let hash = hasher.hash("password123").unwrap();
864 assert!(hash.starts_with('$'));
865 let parts: Vec<&str> = hash[1..].splitn(3, '$').collect();
866 assert_eq!(parts.len(), 3);
867 assert_eq!(parts[0].parse::<u32>().unwrap(), 100_000);
868 assert_eq!(parts[1].len(), 32);
870 assert_eq!(parts[2].len(), 64);
872 }
873
874 #[test]
875 fn test_pbkdf2_hasher_verify_correct() {
876 let hasher = Pbkdf2Hasher::new();
877 let hash = hasher.hash("password123").unwrap();
878 assert!(hasher.verify("password123", &hash).unwrap());
879 }
880
881 #[test]
882 fn test_pbkdf2_hasher_verify_wrong() {
883 let hasher = Pbkdf2Hasher::new();
884 let hash = hasher.hash("password123").unwrap();
885 assert!(!hasher.verify("wrongpassword", &hash).unwrap());
886 }
887
888 #[test]
889 fn test_pbkdf2_hasher_different_passwords_different_hashes() {
890 let hasher = Pbkdf2Hasher::new();
891 let h1 = hasher.hash("pass1").unwrap();
892 let h2 = hasher.hash("pass2").unwrap();
893 assert_ne!(h1, h2);
894 }
895
896 #[test]
897 fn test_pbkdf2_hasher_same_password_different_salts() {
898 let hasher = Pbkdf2Hasher::new();
899 let h1 = hasher.hash("same").unwrap();
900 let h2 = hasher.hash("same").unwrap();
901 assert_ne!(h1, h2);
902 assert!(hasher.verify("same", &h1).unwrap());
903 assert!(hasher.verify("same", &h2).unwrap());
904 }
905
906 #[test]
907 fn test_pbkdf2_hasher_invalid_format() {
908 let hasher = Pbkdf2Hasher::new();
909 assert!(hasher.verify("password", "invalid-hash").is_err());
910 assert!(hasher.verify("password", "$abc").is_err());
911 assert!(hasher.verify("password", "$abc$def").is_err());
912 }
913
914 #[test]
915 fn test_pbkdf2_hasher_with_iterations() {
916 let hasher = Pbkdf2Hasher::with_iterations(1000);
917 let hash = hasher.hash("secret").unwrap();
918 let parts: Vec<&str> = hash[1..].splitn(3, '$').collect();
919 assert_eq!(parts[0], "1000");
920 assert!(hasher.verify("secret", &hash).unwrap());
921 }
922
923 #[test]
924 fn test_pbkdf2_hasher_empty_password() {
925 let hasher = Pbkdf2Hasher::new();
926 assert!(hasher.hash("").is_err());
927 }
928
929 #[test]
932 fn test_hmac_signer_sign_not_empty() {
933 let signer = HmacSigner::new();
934 let mut params = HashMap::new();
935 params.insert("name".to_string(), "test".to_string());
936 let signature = signer.sign(¶ms, "secret123");
937 assert_eq!(signature.len(), 64);
938 }
939
940 #[test]
941 fn test_hmac_signer_verify_correct() {
942 let signer = HmacSigner::new();
943 let mut params = HashMap::new();
944 params.insert("name".to_string(), "test".to_string());
945 params.insert("age".to_string(), "25".to_string());
946
947 let signature = signer.sign(¶ms, "mysecret");
948 assert!(signer.verify(¶ms, "mysecret", &signature));
949 }
950
951 #[test]
952 fn test_hmac_signer_verify_wrong_secret() {
953 let signer = HmacSigner::new();
954 let mut params = HashMap::new();
955 params.insert("name".to_string(), "test".to_string());
956 let signature = signer.sign(¶ms, "correctsecret");
957 assert!(!signer.verify(¶ms, "wrongsecret", &signature));
958 }
959
960 #[test]
961 fn test_hmac_signer_verify_wrong_signature() {
962 let signer = HmacSigner::new();
963 let mut params = HashMap::new();
964 params.insert("name".to_string(), "test".to_string());
965 let valid_sig = signer.sign(¶ms, "secret");
966 let tampered = if let Some(stripped) = valid_sig.strip_prefix('0') {
967 format!("1{}", stripped)
968 } else {
969 format!("0{}", &valid_sig[1..])
970 };
971 assert!(!signer.verify(¶ms, "secret", &tampered));
972 }
973
974 #[test]
975 fn test_hmac_signer_different_params_different_signatures() {
976 let signer = HmacSigner::new();
977 let mut params1 = HashMap::new();
978 params1.insert("a".to_string(), "1".to_string());
979
980 let mut params2 = HashMap::new();
981 params2.insert("b".to_string(), "2".to_string());
982
983 let sig1 = signer.sign(¶ms1, "secret");
984 let sig2 = signer.sign(¶ms2, "secret");
985 assert_ne!(sig1, sig2);
986 }
987
988 #[test]
989 fn test_hmac_signer_param_order_independent() {
990 let signer = HmacSigner::new();
991 let mut params1 = HashMap::new();
992 params1.insert("b".to_string(), "2".to_string());
993 params1.insert("a".to_string(), "1".to_string());
994
995 let mut params2 = HashMap::new();
996 params2.insert("a".to_string(), "1".to_string());
997 params2.insert("b".to_string(), "2".to_string());
998
999 let sig1 = signer.sign(¶ms1, "secret");
1000 let sig2 = signer.sign(¶ms2, "secret");
1001 assert_eq!(sig1, sig2);
1002 }
1003
1004 #[test]
1005 fn test_hmac_signer_empty_params() {
1006 let signer = HmacSigner::new();
1007 let params = HashMap::new();
1008 let sig = signer.sign(¶ms, "secret");
1009 assert_eq!(sig.len(), 64);
1010 assert!(signer.verify(¶ms, "secret", &sig));
1011 }
1012
1013 #[test]
1016 fn test_random_bytes_length() {
1017 assert_eq!(random_bytes(0).len(), 0);
1018 assert_eq!(random_bytes(16).len(), 16);
1019 assert_eq!(random_bytes(100).len(), 100);
1020 }
1021
1022 #[test]
1023 fn test_random_bytes_random() {
1024 let a = random_bytes(32);
1025 let b = random_bytes(32);
1026 assert_ne!(a, b, "随机字节序列应不同");
1027 }
1028
1029 #[test]
1030 fn test_constant_time_eq() {
1031 assert!(constant_time_eq(b"abc", b"abc"));
1032 assert!(!constant_time_eq(b"abc", b"abd"));
1033 assert!(!constant_time_eq(b"abc", b"ab"));
1034 assert!(!constant_time_eq(b"abc", b"abcd"));
1035 assert!(constant_time_eq(b"", b""));
1036 }
1037
1038 #[test]
1039 fn test_hex_encode_decode_roundtrip() {
1040 let original = vec![0x00, 0xff, 0xab, 0x42];
1041 let encoded = hex_encode(&original);
1042 let decoded = hex_decode(&encoded).unwrap();
1043 assert_eq!(decoded, original);
1044 }
1045
1046 #[test]
1047 fn test_hex_decode_invalid() {
1048 assert!(hex_decode("abc").is_err());
1049 assert!(hex_decode("xy").is_err());
1050 }
1051
1052 #[test]
1055 fn test_aes_gcm_aad_roundtrip() {
1056 let key = [0x42u8; 32];
1057 let crypter = AesGcmCrypter::new(&key);
1058 let plaintext = b"sensitive data";
1059 let aad = b"associated metadata";
1060 let encrypted = crypter.encrypt_with_aad(plaintext, aad).unwrap();
1061 let decrypted = crypter.decrypt_with_aad(&encrypted, aad).unwrap();
1062 assert_eq!(decrypted, plaintext);
1063 }
1064
1065 #[test]
1066 fn test_aes_gcm_aad_wrong_aad_fails() {
1067 let key = [0x42u8; 32];
1068 let crypter = AesGcmCrypter::new(&key);
1069 let plaintext = b"sensitive data";
1070 let aad = b"correct aad";
1071 let encrypted = crypter.encrypt_with_aad(plaintext, aad).unwrap();
1072 let result = crypter.decrypt_with_aad(&encrypted, b"wrong aad");
1074 assert!(result.is_err());
1075 }
1076
1077 #[test]
1078 fn test_aes_gcm_aad_empty_aad_equivalent_to_no_aad() {
1079 let key = [0x42u8; 32];
1080 let crypter = AesGcmCrypter::new(&key);
1081 let plaintext = b"test data";
1082 let encrypted_no_aad = crypter.encrypt(plaintext).unwrap();
1084 let encrypted_empty_aad = crypter.encrypt_with_aad(plaintext, b"").unwrap();
1085 assert_eq!(crypter.decrypt(&encrypted_no_aad).unwrap(), plaintext);
1087 assert_eq!(
1088 crypter.decrypt_with_aad(&encrypted_empty_aad, b"").unwrap(),
1089 plaintext
1090 );
1091 }
1092
1093 #[test]
1094 fn test_aes_gcm_aad_tampered_ciphertext_fails() {
1095 let key = [0x42u8; 32];
1096 let crypter = AesGcmCrypter::new(&key);
1097 let encrypted = crypter.encrypt_with_aad(b"data", b"aad").unwrap();
1098 let mut tampered = encrypted.clone();
1099 tampered[15] ^= 0x01;
1100 assert!(crypter.decrypt_with_aad(&tampered, b"aad").is_err());
1101 }
1102
1103 #[test]
1104 fn test_aes_gcm_aad_empty_plaintext() {
1105 let key = [0x42u8; 32];
1106 let crypter = AesGcmCrypter::new(&key);
1107 let encrypted = crypter.encrypt_with_aad(b"", b"aad").unwrap();
1108 assert_eq!(encrypted.len(), 28);
1110 let decrypted = crypter.decrypt_with_aad(&encrypted, b"aad").unwrap();
1111 assert_eq!(decrypted, b"");
1112 }
1113
1114 #[test]
1117 fn test_rsa_oaep_roundtrip() {
1118 let crypter = RsaOaepCrypter::generate(2048).expect("RSA key generation");
1119 let plaintext = b"Hello, RSA-OAEP!";
1120 let encrypted = crypter.encrypt(plaintext).unwrap();
1121 let decrypted = crypter.decrypt(&encrypted).unwrap();
1122 assert_eq!(decrypted, plaintext);
1123 }
1124
1125 #[test]
1126 fn test_rsa_oaep_different_ciphertexts_same_plaintext() {
1127 let crypter = RsaOaepCrypter::generate(2048).unwrap();
1128 let plaintext = b"same message";
1129 let enc1 = crypter.encrypt(plaintext).unwrap();
1130 let enc2 = crypter.encrypt(plaintext).unwrap();
1131 assert_ne!(enc1, enc2);
1133 assert_eq!(crypter.decrypt(&enc1).unwrap(), plaintext);
1135 assert_eq!(crypter.decrypt(&enc2).unwrap(), plaintext);
1136 }
1137
1138 #[test]
1139 fn test_rsa_oaep_empty_plaintext() {
1140 let crypter = RsaOaepCrypter::generate(2048).unwrap();
1141 let encrypted = crypter.encrypt(b"").unwrap();
1142 let decrypted = crypter.decrypt(&encrypted).unwrap();
1143 assert_eq!(decrypted, b"");
1144 }
1145
1146 #[test]
1147 fn test_rsa_oaep_tampered_ciphertext_fails() {
1148 let crypter = RsaOaepCrypter::generate(2048).unwrap();
1149 let encrypted = crypter.encrypt(b"secret").unwrap();
1150 let mut tampered = encrypted.clone();
1151 tampered[0] ^= 0x01;
1152 assert!(crypter.decrypt(&tampered).is_err());
1153 }
1154
1155 #[test]
1156 fn test_rsa_oaep_max_message_length() {
1157 let crypter = RsaOaepCrypter::generate(2048).unwrap();
1159 let plaintext = vec![0xABu8; 190];
1160 let encrypted = crypter.encrypt(&plaintext).unwrap();
1161 let decrypted = crypter.decrypt(&encrypted).unwrap();
1162 assert_eq!(decrypted, plaintext);
1163 }
1164
1165 #[test]
1166 fn test_rsa_oaep_oversized_message_fails() {
1167 let crypter = RsaOaepCrypter::generate(2048).unwrap();
1168 let plaintext = vec![0xABu8; 191];
1170 assert!(crypter.encrypt(&plaintext).is_err());
1171 }
1172
1173 #[test]
1174 fn test_rsa_oaep_from_keys() {
1175 let crypter1 = RsaOaepCrypter::generate(2048).unwrap();
1176 let crypter2 = RsaOaepCrypter::from_keys(
1177 crypter1.public_key().clone(),
1178 crypter1.private_key().clone(),
1179 );
1180 let plaintext = b"test from_keys";
1181 let encrypted = crypter2.encrypt(plaintext).unwrap();
1182 let decrypted = crypter2.decrypt(&encrypted).unwrap();
1183 assert_eq!(decrypted, plaintext);
1184 }
1185
1186 #[test]
1187 fn test_rsa_oaep_crypter_trait() {
1188 let crypter = RsaOaepCrypter::generate(2048).unwrap();
1189 let plaintext = b"trait test";
1190 let encrypted = Crypter::encrypt(&crypter, plaintext).unwrap();
1191 let decrypted = Crypter::decrypt(&crypter, &encrypted).unwrap();
1192 assert_eq!(decrypted, plaintext);
1193 }
1194
1195 #[test]
1198 fn test_hmac_signature_verifier_sign_verify() {
1199 let verifier = HmacSignatureVerifier::new(b"my-secret-key");
1200 let message = b"important message";
1201 let signature = verifier.sign(message);
1202 assert_eq!(signature.len(), 32);
1203 assert!(verifier.verify(message, &signature));
1204 }
1205
1206 #[test]
1207 fn test_hmac_signature_verifier_wrong_message() {
1208 let verifier = HmacSignatureVerifier::new(b"key");
1209 let signature = verifier.sign(b"message1");
1210 assert!(!verifier.verify(b"message2", &signature));
1211 }
1212
1213 #[test]
1214 fn test_hmac_signature_verifier_wrong_signature() {
1215 let verifier = HmacSignatureVerifier::new(b"key");
1216 let signature = verifier.sign(b"message");
1217 let mut tampered = signature.clone();
1218 tampered[0] ^= 0x01;
1219 assert!(!verifier.verify(b"message", &tampered));
1220 }
1221
1222 #[test]
1223 fn test_hmac_signature_verifier_from_key_str() {
1224 let verifier = HmacSignatureVerifier::from_key_str("string-key");
1225 let message = b"test";
1226 let sig = verifier.sign(message);
1227 assert!(verifier.verify(message, &sig));
1228 }
1229
1230 #[test]
1231 fn test_hmac_signature_verifier_different_keys_different_signatures() {
1232 let v1 = HmacSignatureVerifier::new(b"key1");
1233 let v2 = HmacSignatureVerifier::new(b"key2");
1234 let message = b"same message";
1235 let sig1 = v1.sign(message);
1236 let sig2 = v2.sign(message);
1237 assert_ne!(sig1, sig2);
1238 }
1239
1240 #[test]
1241 fn test_hmac_signature_verifier_empty_message() {
1242 let verifier = HmacSignatureVerifier::new(b"key");
1243 let sig = verifier.sign(b"");
1244 assert_eq!(sig.len(), 32);
1245 assert!(verifier.verify(b"", &sig));
1246 }
1247
1248 #[test]
1249 fn test_hmac_signature_verifier_wrong_length_signature() {
1250 let verifier = HmacSignatureVerifier::new(b"key");
1251 assert!(!verifier.verify(b"message", b"short"));
1253 assert!(!verifier.verify(b"message", &[]));
1254 }
1255
1256 #[test]
1259 fn test_key_rotation_initial_key() {
1260 let mgr = KeyRotationManager::with_initial_key(b"key-v1".to_vec());
1261 assert_eq!(mgr.current_version(), 1);
1262 assert_eq!(mgr.version_count(), 1);
1263 assert_eq!(mgr.versions(), vec![1]);
1264 }
1265
1266 #[test]
1267 fn test_key_rotation_sign_verify_current() {
1268 let mgr = KeyRotationManager::with_initial_key(b"secret-key".to_vec());
1269 let message = b"test message";
1270 let (version, signature) = mgr.sign(message);
1271 assert_eq!(version, 1);
1272 assert!(mgr.verify(message, version, &signature));
1273 }
1274
1275 #[test]
1276 fn test_key_rotation_old_version_still_valid() {
1277 let mut mgr = KeyRotationManager::with_initial_key(b"key-v1".to_vec());
1278 let message = b"persistent message";
1279 let (v1, sig1) = mgr.sign(message);
1280 mgr.rotate_key(b"key-v2".to_vec());
1282 let (v2, sig2) = mgr.sign(message);
1283 assert_eq!(v1, 1);
1284 assert_eq!(v2, 2);
1285 assert!(mgr.verify(message, v1, &sig1));
1287 assert!(mgr.verify(message, v2, &sig2));
1289 }
1290
1291 #[test]
1292 fn test_key_rotation_max_versions_evicts_oldest() {
1293 let mut mgr = KeyRotationManager::new(2);
1294 mgr.rotate_key(b"key-v1".to_vec());
1295 mgr.rotate_key(b"key-v2".to_vec());
1296 assert_eq!(mgr.version_count(), 2);
1297 mgr.rotate_key(b"key-v3".to_vec());
1299 assert_eq!(mgr.version_count(), 2);
1300 assert_eq!(mgr.versions(), vec![2, 3]);
1301 assert!(!mgr.versions().contains(&1));
1302 }
1303
1304 #[test]
1305 fn test_key_rotation_old_version_evicted_fails_verify() {
1306 let mut mgr = KeyRotationManager::new(2);
1307 mgr.rotate_key(b"key-v1".to_vec());
1308 let message = b"test";
1309 let (v1, sig1) = mgr.sign(message);
1310 mgr.rotate_key(b"key-v2".to_vec());
1311 mgr.rotate_key(b"key-v3".to_vec());
1312 assert!(!mgr.verify(message, v1, &sig1));
1314 }
1315
1316 #[test]
1317 fn test_key_rotation_wrong_version_fails() {
1318 let mgr = KeyRotationManager::with_initial_key(b"key".to_vec());
1319 let message = b"test";
1320 let (_, signature) = mgr.sign(message);
1321 assert!(!mgr.verify(message, 999, &signature));
1323 }
1324
1325 #[test]
1326 fn test_key_rotation_multiple_rotations() {
1327 let mut mgr = KeyRotationManager::new(5);
1328 for i in 1..=4 {
1329 let key = format!("key-v{}", i);
1330 let version = mgr.rotate_key(key.as_bytes().to_vec());
1331 assert_eq!(version, i as u32);
1332 }
1333 assert_eq!(mgr.current_version(), 4);
1334 assert_eq!(mgr.version_count(), 4);
1335 assert_eq!(mgr.versions(), vec![1, 2, 3, 4]);
1336 }
1337
1338 #[test]
1339 fn test_key_rotation_empty_manager_sign_returns_zero() {
1340 let mgr = KeyRotationManager::new(3);
1341 let (version, sig) = mgr.sign(b"message");
1342 assert_eq!(version, 0);
1343 assert!(sig.is_empty());
1344 }
1345
1346 #[test]
1347 fn test_key_rotation_verify_with_wrong_signature() {
1348 let mgr = KeyRotationManager::with_initial_key(b"key".to_vec());
1349 let message = b"test";
1350 let (version, _) = mgr.sign(message);
1351 let wrong_sig = vec![0u8; 32];
1352 assert!(!mgr.verify(message, version, &wrong_sig));
1353 }
1354
1355 #[test]
1356 fn test_key_rotation_max_versions_min_one() {
1357 let mut mgr = KeyRotationManager::new(0);
1359 mgr.rotate_key(b"k1".to_vec());
1360 mgr.rotate_key(b"k2".to_vec());
1361 assert_eq!(mgr.version_count(), 1);
1362 assert_eq!(mgr.versions(), vec![2]);
1363 }
1364
1365 #[test]
1368 fn test_key_manager_initial_key() {
1369 let mgr = KeyManager::new(b"initial-key".to_vec());
1370 let current = mgr.current_key();
1371 assert_eq!(current.version, 1);
1372 assert_eq!(current.key, b"initial-key");
1373 assert_eq!(mgr.previous_count(), 0);
1374 }
1375
1376 #[test]
1377 fn test_key_manager_rotate_increments_version() {
1378 let mgr = KeyManager::new(b"v1".to_vec());
1379 assert!(mgr.rotate(b"v2".to_vec()).is_ok());
1380 let current = mgr.current_key();
1381 assert_eq!(current.version, 2);
1382 assert_eq!(current.key, b"v2");
1383 assert_eq!(mgr.previous_count(), 1);
1384 }
1385
1386 #[test]
1387 fn test_key_manager_key_by_version_current() {
1388 let mgr = KeyManager::new(b"v1".to_vec());
1389 let found = mgr.key_by_version(1).expect("v1 should exist");
1390 assert_eq!(found.key, b"v1");
1391 }
1392
1393 #[test]
1394 fn test_key_manager_key_by_version_previous() {
1395 let mgr = KeyManager::new(b"v1".to_vec());
1396 mgr.rotate(b"v2".to_vec()).unwrap();
1397 let old = mgr.key_by_version(1).expect("v1 should still be retained");
1399 assert_eq!(old.key, b"v1");
1400 let new = mgr.key_by_version(2).expect("v2 should exist");
1402 assert_eq!(new.key, b"v2");
1403 }
1404
1405 #[test]
1406 fn test_key_manager_key_by_version_not_found() {
1407 let mgr = KeyManager::new(b"v1".to_vec());
1408 assert!(mgr.key_by_version(999).is_none());
1409 }
1410
1411 #[test]
1412 fn test_key_manager_retains_at_most_three_previous() {
1413 let mgr = KeyManager::new(b"v1".to_vec());
1414 mgr.rotate(b"v2".to_vec()).unwrap();
1415 mgr.rotate(b"v3".to_vec()).unwrap();
1416 mgr.rotate(b"v4".to_vec()).unwrap();
1417 assert_eq!(mgr.previous_count(), 3);
1419 mgr.rotate(b"v5".to_vec()).unwrap();
1420 assert_eq!(mgr.previous_count(), 3);
1421 assert!(mgr.key_by_version(1).is_none());
1423 assert!(mgr.key_by_version(2).is_some());
1425 assert_eq!(mgr.current_key().version, 5);
1427 }
1428
1429 #[test]
1430 fn test_key_manager_needs_rotation_false_initially() {
1431 let mgr = KeyManager::new(b"k".to_vec());
1432 assert!(!mgr.needs_rotation());
1434 }
1435
1436 #[test]
1437 fn test_key_manager_needs_rotation_true_after_interval() {
1438 let mgr = KeyManager::new(b"k".to_vec()).with_rotation_interval(Duration::from_millis(0));
1439 std::thread::sleep(Duration::from_millis(1));
1441 assert!(mgr.needs_rotation());
1442 }
1443
1444 #[test]
1445 fn test_key_manager_with_rotation_interval() {
1446 let mgr = KeyManager::new(b"k".to_vec()).with_rotation_interval(Duration::from_secs(60));
1447 assert!(!mgr.needs_rotation());
1448 }
1449
1450 #[test]
1451 fn test_key_manager_rotate_resets_last_rotation() {
1452 let mgr = KeyManager::new(b"k".to_vec()).with_rotation_interval(Duration::from_millis(1));
1453 std::thread::sleep(Duration::from_millis(5));
1454 assert!(mgr.needs_rotation());
1455 mgr.rotate(b"k2".to_vec()).unwrap();
1456 assert!(!mgr.needs_rotation());
1458 }
1459
1460 #[test]
1461 fn test_key_manager_concurrent_access() {
1462 use std::sync::Arc;
1463 use std::thread;
1464 let mgr = Arc::new(KeyManager::new(b"base".to_vec()));
1465 let mut handles = vec![];
1466 for _ in 0..4 {
1468 let m = mgr.clone();
1469 handles.push(thread::spawn(move || {
1470 let _ = m.current_key();
1471 let _ = m.previous_count();
1472 }));
1473 }
1474 for h in handles {
1475 h.join().expect("thread panicked");
1476 }
1477 assert_eq!(mgr.current_key().version, 1);
1479 }
1480}