Skip to main content

dec_cryptor/
crypto_utils.rs

1use rand::random;
2
3// 常量定义
4pub const MAGIC_NUMBER: &str = "DEC!";
5pub const VERSION_SIGN: u8 = 0x02;
6pub const SALT_LENGTH: usize = 16;
7pub const IV_LENGTH: usize = 16;
8pub const ARGON2_ITERATIONS: u32 = 3;
9pub const ARGON2_MEMORY_KIB: u32 = 65536;
10pub const ARGON2_PARALLELISM: u32 = 4;
11pub const MASTER_KEY_LENGTH: usize = 32;
12pub const ENCRYPTION_KEY_LENGTH: usize = 32;
13pub const HMAC_KEY_LENGTH: usize = 32;
14pub const BUFFER_SIZE: usize = 256 * 1024;
15
16/// 获取 CPU 线程数
17pub fn get_parts() -> usize {
18    std::thread::available_parallelism().map_or(4, |n| n.get())
19}
20
21/// 生成随机盐
22pub fn generate_salt() -> Vec<u8> {
23    let salt: [u8; SALT_LENGTH] = random();
24    salt.to_vec()
25}
26
27/// 生成随机IV
28pub fn generate_iv() -> Vec<u8> {
29    let iv: [u8; IV_LENGTH] = random();
30    iv.to_vec()
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn test_generate_salt() {
39        let salt1 = generate_salt();
40        let salt2 = generate_salt();
41
42        assert_eq!(salt1.len(), SALT_LENGTH);
43        assert_eq!(salt2.len(), SALT_LENGTH);
44        // 确保两次生成的盐不同(极大概率)
45        assert_ne!(salt1, salt2);
46    }
47
48    #[test]
49    fn test_generate_iv() {
50        let iv1 = generate_iv();
51        let iv2 = generate_iv();
52
53        assert_eq!(iv1.len(), IV_LENGTH);
54        assert_eq!(iv2.len(), IV_LENGTH);
55        // 确保两次生成的IV不同(极大概率)
56        assert_ne!(iv1, iv2);
57    }
58
59    #[test]
60    fn test_get_parts() {
61        let parts = get_parts();
62        // 确保返回的线程数合理(至少1个)
63        assert!(parts >= 1);
64    }
65
66    #[test]
67    fn test_constants() {
68        assert_eq!(MAGIC_NUMBER, "DEC!");
69        assert_eq!(VERSION_SIGN, 0x02);
70        assert_eq!(SALT_LENGTH, 16);
71        assert_eq!(IV_LENGTH, 16);
72        assert_eq!(MASTER_KEY_LENGTH, 32);
73        assert_eq!(ENCRYPTION_KEY_LENGTH, 32);
74        assert_eq!(HMAC_KEY_LENGTH, 32);
75    }
76}