1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
use crate::algorithm::hash;
use crate::algorithm::hash::HashType;
use crate::constant;
use crate::h::H;
pub struct Hash {
pub iv_c_s: Vec<u8>,
pub iv_s_c: Vec<u8>,
pub ek_c_s: Vec<u8>,
pub ek_s_c: Vec<u8>,
pub ik_c_s: Vec<u8>,
pub ik_s_c: Vec<u8>,
hash_type: HashType,
h: H,
}
impl Hash {
pub fn new(h: H, session_id: &[u8], hash_type: HashType) -> Self {
let k = h.k.as_slice();
let h_ = hash::digest(&h.as_bytes(), hash_type);
let mut keys = vec![];
for v in constant::ALPHABET {
keys.push(Hash::mix(k, &h_, v, session_id, hash_type));
}
Hash {
iv_c_s: keys[0].clone(),
iv_s_c: keys[1].clone(),
ek_c_s: keys[2].clone(),
ek_s_c: keys[3].clone(),
ik_c_s: keys[4].clone(),
ik_s_c: keys[5].clone(),
hash_type,
h,
}
}
fn mix(k: &[u8], h: &[u8], key_char: u8, session_id: &[u8], hash_type: HashType) -> Vec<u8> {
let mut key: Vec<u8> = Vec::new();
key.extend(k);
key.extend(h);
key.push(key_char);
key.extend(session_id);
hash::digest(key.as_slice(), hash_type)
}
pub fn extend_key(&self, key_size: usize) -> (Vec<u8>, Vec<u8>) {
let mut ck = self.ek_c_s.to_vec();
let mut sk = self.ek_s_c.to_vec();
while key_size > ck.len() {
ck.extend(self.extend(ck.as_slice()));
sk.extend(self.extend(sk.as_slice()));
}
(ck, sk)
}
fn extend(&self, key: &[u8]) -> Vec<u8> {
let k = self.h.k.clone();
let h = hash::digest(self.h.as_bytes().as_slice(), self.hash_type);
let mut hash: Vec<u8> = Vec::new();
hash.extend(k);
hash.extend(h);
hash.extend(key);
hash::digest(hash.as_slice(), self.hash_type)
}
}