1pub mod aead;
4pub mod cipher;
5
6use std::ops::Deref;
7
8use hkdf::Hkdf;
9use sha1::Sha1;
10
11#[derive(Debug)]
13pub struct Nonce {
14 value: Vec<u8>,
15}
16
17impl Nonce {
18 pub fn new(len: usize) -> Self {
20 Nonce {
21 value: vec![0; len],
22 }
23 }
24
25 pub fn increment(&mut self) {
27 for i in 0..self.value.len() {
28 self.value[i] = self.value[i].wrapping_add(1);
29 if self.value[i] != 0 {
30 break;
31 }
32 }
33 }
34}
35
36impl Deref for Nonce {
37 type Target = [u8];
38
39 fn deref(&self) -> &Self::Target {
40 &self.value
41 }
42}
43
44pub fn hkdf_sha1(key: &[u8], salt: &[u8], subkey: &mut [u8]) {
46 let hkdf = Hkdf::<Sha1>::new(Some(salt), key);
47 hkdf.expand(b"ss-subkey", subkey).expect(&format!(
48 "{} is a invalid output length, expected {}",
49 subkey.len(),
50 key.len()
51 ));
52}
53
54pub fn derive_key(password: &[u8], key: &mut [u8]) {
56 let key_size = key.len();
57 let mut md_buf: Vec<u8> = Vec::new();
58
59 let mut j = 0;
60 while j < key_size {
61 md_buf.append(&mut password.to_vec());
62 let md = md5::compute(&md_buf).0;
63
64 for &b in md.iter() {
65 if j >= key_size {
66 break;
67 }
68
69 key[j] = b;
70 j += 1;
71 }
72
73 md_buf = md.to_vec();
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80
81 #[test]
82 fn test_hkdf_sha1_key128() {
83 let key = [1u8; 16];
84 let salt = b"1234567812345678";
85 let mut subkey = [0u8; 16];
86 let expected_subkey: [u8; 16] = [
87 176, 72, 135, 140, 255, 57, 14, 7, 193, 98, 58, 118, 112, 42, 119, 97,
88 ];
89
90 hkdf_sha1(&key, salt, &mut subkey);
91
92 assert_eq!(subkey, expected_subkey);
93 }
94
95 #[test]
96 fn test_hkdf_sha1_key256() {
97 let key = [1u8; 32];
98 let salt = b"12345678123456781234567812345678";
99 let mut subkey = [0u8; 32];
100 let expected_subkey: [u8; 32] = [
101 128, 145, 113, 44, 108, 52, 99, 117, 243, 229, 199, 245, 55, 99, 251, 53, 56, 225, 92,
102 92, 5, 94, 252, 21, 4, 211, 164, 43, 251, 44, 61, 208,
103 ];
104
105 hkdf_sha1(&key, salt, &mut subkey);
106
107 assert_eq!(subkey, expected_subkey);
108 }
109
110 #[test]
111 fn test_derive_key128() {
112 let password = b"hehe";
113 let mut key = [0u8; 16];
114 let expected_key = [
115 82, 156, 168, 5, 10, 0, 24, 7, 144, 207, 136, 182, 52, 104, 130, 106,
116 ];
117
118 derive_key(password, &mut key);
119
120 assert_eq!(key, expected_key);
121 }
122
123 #[test]
124 fn test_derive_key256() {
125 let password = b"hehe";
126 let mut key = [0u8; 32];
127 let expected_key = [
128 82, 156, 168, 5, 10, 0, 24, 7, 144, 207, 136, 182, 52, 104, 130, 106, 109, 81, 225,
129 207, 24, 87, 148, 16, 101, 57, 172, 239, 219, 100, 183, 95,
130 ];
131
132 derive_key(password, &mut key);
133
134 assert_eq!(key, expected_key);
135 }
136}