Skip to main content

rustdom_x/
hash.rs

1use super::m128::m128i;
2
3#[allow(overflowing_literals)]
4fn keys_1rx4() -> (m128i, m128i, m128i, m128i) {
5    (
6        m128i::from_i32(0xb4f44917, 0xdbb5552b, 0x62716609, 0x6daca553),
7        m128i::from_i32(0x0da1dc4e, 0x1725d378, 0x846a710d, 0x6d7caf07),
8        m128i::from_i32(0x3e20e345, 0xf4c0794f, 0x9f947ec6, 0x3f1262f1),
9        m128i::from_i32(0x49169154, 0x16314c88, 0xb1ba317c, 0x6aef8135),
10    )
11}
12
13#[allow(overflowing_literals)]
14pub fn hash_aes_1rx4(input: &[u64]) -> [m128i; 4] {
15    debug_assert!(input.len() % 64 == 0);
16
17    let mut state0 = m128i::from_i32(0xd7983aad, 0xcc82db47, 0x9fa856de, 0x92b52c0d);
18    let mut state1 = m128i::from_i32(0xace78057, 0xf59e125a, 0x15c7b798, 0x338d996e);
19    let mut state2 = m128i::from_i32(0xe8a07ce4, 0x5079506b, 0xae62c7d0, 0x6a770017);
20    let mut state3 = m128i::from_i32(0x7e994948, 0x79a10005, 0x07ad828d, 0x630a240c);
21
22    let mut i = 0;
23    while i < input.len() {
24        let in0 = m128i::from_u64(input[i + 1], input[i]);
25        let in1 = m128i::from_u64(input[i + 3], input[i + 2]);
26        let in2 = m128i::from_u64(input[i + 5], input[i + 4]);
27        let in3 = m128i::from_u64(input[i + 7], input[i + 6]);
28
29        state0 = state0.aesenc(in0);
30        state1 = state1.aesdec(in1);
31        state2 = state2.aesenc(in2);
32        state3 = state3.aesdec(in3);
33
34        i += 8;
35    }
36
37    let x_key_0 = m128i::from_i32(0x06890201, 0x90dc56bf, 0x8b24949f, 0xf6fa8389);
38    let x_key_1 = m128i::from_i32(0xed18f99b, 0xee1043c6, 0x51f4e03c, 0x61b263d1);
39
40    state0 = state0.aesenc(x_key_0);
41    state1 = state1.aesdec(x_key_0);
42    state2 = state2.aesenc(x_key_0);
43    state3 = state3.aesdec(x_key_0);
44
45    state0 = state0.aesenc(x_key_1);
46    state1 = state1.aesdec(x_key_1);
47    state2 = state2.aesenc(x_key_1);
48    state3 = state3.aesdec(x_key_1);
49
50    [state0, state1, state2, state3]
51}
52
53pub fn fill_aes_1rx4_u64(input: &[m128i; 4], into: &mut Vec<u64>) -> [m128i; 4] {
54    let (key0, key1, key2, key3) = keys_1rx4();
55    let mut state0 = input[0];
56    let mut state1 = input[1];
57    let mut state2 = input[2];
58    let mut state3 = input[3];
59
60    let mut out_ix = 0;
61    while out_ix < into.len() {
62        state0 = state0.aesdec(key0);
63        state1 = state1.aesenc(key1);
64        state2 = state2.aesdec(key2);
65        state3 = state3.aesenc(key3);
66        let (s0_1, s0_0) = state0.as_i64();
67        let (s1_1, s1_0) = state1.as_i64();
68        let (s2_1, s2_0) = state2.as_i64();
69        let (s3_1, s3_0) = state3.as_i64();
70        into[out_ix] = s0_0 as u64;
71        into[out_ix + 1] = s0_1 as u64;
72        into[out_ix + 2] = s1_0 as u64;
73        into[out_ix + 3] = s1_1 as u64;
74        into[out_ix + 4] = s2_0 as u64;
75        into[out_ix + 5] = s2_1 as u64;
76        into[out_ix + 6] = s3_0 as u64;
77        into[out_ix + 7] = s3_1 as u64;
78
79        out_ix += 8;
80    }
81    [state0, state1, state2, state3]
82}
83
84fn fill_aes_1rx4_m128i(input: &[m128i; 4], into: &mut Vec<m128i>) -> [m128i; 4] {
85    let (key0, key1, key2, key3) = keys_1rx4();
86    let mut state0 = input[0];
87    let mut state1 = input[1];
88    let mut state2 = input[2];
89    let mut state3 = input[3];
90    let mut out_ix = 0;
91    while out_ix < into.len() {
92        state0 = state0.aesdec(key0);
93        state1 = state1.aesenc(key1);
94        state2 = state2.aesdec(key2);
95        state3 = state3.aesenc(key3);
96        into[out_ix] = state0;
97        into[out_ix + 1] = state1;
98        into[out_ix + 2] = state2;
99        into[out_ix + 3] = state3;
100
101        out_ix += 4;
102    }
103    [state0, state1, state2, state3]
104}
105
106pub fn gen_program_aes_1rx4(input: &[m128i; 4], output_size: usize) -> (Vec<m128i>, [m128i; 4]) {
107    debug_assert!(output_size % 4 == 0);
108
109    let mut result: Vec<m128i> = vec![m128i::zero(); output_size];
110    let new_seed = fill_aes_1rx4_m128i(input, &mut result);
111    (result, new_seed)
112}
113
114#[allow(overflowing_literals)]
115pub fn gen_program_aes_4rx4(input: &[m128i; 4], output_size: usize) -> Vec<m128i> {
116    debug_assert!(output_size % 4 == 0);
117    let mut result = Vec::with_capacity(output_size);
118    let key0 = m128i::from_i32(0x99e5d23f, 0x2f546d2b, 0xd1833ddb, 0x6421aadd);
119    let key1 = m128i::from_i32(0xa5dfcde5, 0x06f79d53, 0xb6913f55, 0xb20e3450);
120    let key2 = m128i::from_i32(0x171c02bf, 0x0aa4679f, 0x515e7baf, 0x5c3ed904);
121    let key3 = m128i::from_i32(0xd8ded291, 0xcd673785, 0xe78f5d08, 0x85623763);
122    let key4 = m128i::from_i32(0x229effb4, 0x3d518b6d, 0xe3d6a7a6, 0xb5826f73);
123    let key5 = m128i::from_i32(0xb272b7d2, 0xe9024d4e, 0x9c10b3d9, 0xc7566bf3);
124    let key6 = m128i::from_i32(0xf63befa7, 0x2ba9660a, 0xf765a38b, 0xf273c9e7);
125    let key7 = m128i::from_i32(0xc0b0762d, 0x0c06d1fd, 0x915839de, 0x7a7cd609);
126
127    let mut state0 = input[0];
128    let mut state1 = input[1];
129    let mut state2 = input[2];
130    let mut state3 = input[3];
131
132    let mut out_ix = 0;
133    while out_ix < output_size {
134        state0 = state0.aesdec(key0);
135        state1 = state1.aesenc(key0);
136        state2 = state2.aesdec(key4);
137        state3 = state3.aesenc(key4);
138        state0 = state0.aesdec(key1);
139        state1 = state1.aesenc(key1);
140        state2 = state2.aesdec(key5);
141        state3 = state3.aesenc(key5);
142
143        state0 = state0.aesdec(key2);
144        state1 = state1.aesenc(key2);
145        state2 = state2.aesdec(key6);
146        state3 = state3.aesenc(key6);
147        state0 = state0.aesdec(key3);
148        state1 = state1.aesenc(key3);
149        state2 = state2.aesdec(key7);
150        state3 = state3.aesenc(key7);
151
152        result.push(state0);
153        result.push(state1);
154        result.push(state2);
155        result.push(state3);
156
157        out_ix += 4;
158    }
159    result
160}