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}