/src/botan/src/lib/hash/sm3/sm3.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * SM3 |
3 | | * (C) 2017 Ribose Inc. |
4 | | * (C) 2021 Jack Lloyd |
5 | | * |
6 | | * Botan is released under the Simplified BSD License (see license.txt) |
7 | | */ |
8 | | |
9 | | #include <botan/internal/sm3.h> |
10 | | |
11 | | #include <botan/internal/bit_ops.h> |
12 | | #include <botan/internal/loadstor.h> |
13 | | #include <botan/internal/rotate.h> |
14 | | |
15 | | namespace Botan { |
16 | | |
17 | 0 | std::unique_ptr<HashFunction> SM3::copy_state() const { |
18 | 0 | return std::make_unique<SM3>(*this); |
19 | 0 | } |
20 | | |
21 | | namespace { |
22 | | |
23 | | const uint32_t SM3_IV[] = { |
24 | | 0x7380166fUL, 0x4914b2b9UL, 0x172442d7UL, 0xda8a0600UL, 0xa96f30bcUL, 0x163138aaUL, 0xe38dee4dUL, 0xb0fb0e4eUL}; |
25 | | |
26 | 5.41M | inline uint32_t P0(uint32_t X) { |
27 | 5.41M | return X ^ rotl<9>(X) ^ rotl<17>(X); |
28 | 5.41M | } |
29 | | |
30 | | inline void R1(uint32_t A, |
31 | | uint32_t& B, |
32 | | uint32_t C, |
33 | | uint32_t& D, |
34 | | uint32_t E, |
35 | | uint32_t& F, |
36 | | uint32_t G, |
37 | | uint32_t& H, |
38 | | uint32_t TJ, |
39 | | uint32_t Wi, |
40 | 1.35M | uint32_t Wj) { |
41 | 1.35M | const uint32_t A12 = rotl<12>(A); |
42 | 1.35M | const uint32_t SS1 = rotl<7>(A12 + E + TJ); |
43 | 1.35M | const uint32_t TT1 = (A ^ B ^ C) + D + (SS1 ^ A12) + Wj; |
44 | 1.35M | const uint32_t TT2 = (E ^ F ^ G) + H + SS1 + Wi; |
45 | | |
46 | 1.35M | B = rotl<9>(B); |
47 | 1.35M | D = TT1; |
48 | 1.35M | F = rotl<19>(F); |
49 | 1.35M | H = P0(TT2); |
50 | 1.35M | } |
51 | | |
52 | | inline void R2(uint32_t A, |
53 | | uint32_t& B, |
54 | | uint32_t C, |
55 | | uint32_t& D, |
56 | | uint32_t E, |
57 | | uint32_t& F, |
58 | | uint32_t G, |
59 | | uint32_t& H, |
60 | | uint32_t TJ, |
61 | | uint32_t Wi, |
62 | 4.05M | uint32_t Wj) { |
63 | 4.05M | const uint32_t A12 = rotl<12>(A); |
64 | 4.05M | const uint32_t SS1 = rotl<7>(A12 + E + TJ); |
65 | 4.05M | const uint32_t TT1 = majority(A, B, C) + D + (SS1 ^ A12) + Wj; |
66 | 4.05M | const uint32_t TT2 = choose(E, F, G) + H + SS1 + Wi; |
67 | | |
68 | 4.05M | B = rotl<9>(B); |
69 | 4.05M | D = TT1; |
70 | 4.05M | F = rotl<19>(F); |
71 | 4.05M | H = P0(TT2); |
72 | 4.05M | } |
73 | | |
74 | 4.39M | inline uint32_t P1(uint32_t X) { |
75 | 4.39M | return X ^ rotl<15>(X) ^ rotl<23>(X); |
76 | 4.39M | } |
77 | | |
78 | 4.39M | inline uint32_t SM3_E(uint32_t W0, uint32_t W7, uint32_t W13, uint32_t W3, uint32_t W10) { |
79 | 4.39M | return P1(W0 ^ W7 ^ rotl<15>(W13)) ^ rotl<7>(W3) ^ W10; |
80 | 4.39M | } |
81 | | |
82 | | } // namespace |
83 | | |
84 | | /* |
85 | | * SM3 Compression Function |
86 | | */ |
87 | 83.9k | void SM3::compress_n(const uint8_t input[], size_t blocks) { |
88 | 83.9k | uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2], D = m_digest[3], E = m_digest[4], F = m_digest[5], |
89 | 83.9k | G = m_digest[6], H = m_digest[7]; |
90 | | |
91 | 168k | for(size_t i = 0; i != blocks; ++i) { |
92 | 84.5k | uint32_t W00 = load_be<uint32_t>(input, 0); |
93 | 84.5k | uint32_t W01 = load_be<uint32_t>(input, 1); |
94 | 84.5k | uint32_t W02 = load_be<uint32_t>(input, 2); |
95 | 84.5k | uint32_t W03 = load_be<uint32_t>(input, 3); |
96 | 84.5k | uint32_t W04 = load_be<uint32_t>(input, 4); |
97 | 84.5k | uint32_t W05 = load_be<uint32_t>(input, 5); |
98 | 84.5k | uint32_t W06 = load_be<uint32_t>(input, 6); |
99 | 84.5k | uint32_t W07 = load_be<uint32_t>(input, 7); |
100 | 84.5k | uint32_t W08 = load_be<uint32_t>(input, 8); |
101 | 84.5k | uint32_t W09 = load_be<uint32_t>(input, 9); |
102 | 84.5k | uint32_t W10 = load_be<uint32_t>(input, 10); |
103 | 84.5k | uint32_t W11 = load_be<uint32_t>(input, 11); |
104 | 84.5k | uint32_t W12 = load_be<uint32_t>(input, 12); |
105 | 84.5k | uint32_t W13 = load_be<uint32_t>(input, 13); |
106 | 84.5k | uint32_t W14 = load_be<uint32_t>(input, 14); |
107 | 84.5k | uint32_t W15 = load_be<uint32_t>(input, 15); |
108 | | |
109 | 84.5k | R1(A, B, C, D, E, F, G, H, 0x79CC4519, W00, W00 ^ W04); |
110 | 84.5k | W00 = SM3_E(W00, W07, W13, W03, W10); |
111 | 84.5k | R1(D, A, B, C, H, E, F, G, 0xF3988A32, W01, W01 ^ W05); |
112 | 84.5k | W01 = SM3_E(W01, W08, W14, W04, W11); |
113 | 84.5k | R1(C, D, A, B, G, H, E, F, 0xE7311465, W02, W02 ^ W06); |
114 | 84.5k | W02 = SM3_E(W02, W09, W15, W05, W12); |
115 | 84.5k | R1(B, C, D, A, F, G, H, E, 0xCE6228CB, W03, W03 ^ W07); |
116 | 84.5k | W03 = SM3_E(W03, W10, W00, W06, W13); |
117 | 84.5k | R1(A, B, C, D, E, F, G, H, 0x9CC45197, W04, W04 ^ W08); |
118 | 84.5k | W04 = SM3_E(W04, W11, W01, W07, W14); |
119 | 84.5k | R1(D, A, B, C, H, E, F, G, 0x3988A32F, W05, W05 ^ W09); |
120 | 84.5k | W05 = SM3_E(W05, W12, W02, W08, W15); |
121 | 84.5k | R1(C, D, A, B, G, H, E, F, 0x7311465E, W06, W06 ^ W10); |
122 | 84.5k | W06 = SM3_E(W06, W13, W03, W09, W00); |
123 | 84.5k | R1(B, C, D, A, F, G, H, E, 0xE6228CBC, W07, W07 ^ W11); |
124 | 84.5k | W07 = SM3_E(W07, W14, W04, W10, W01); |
125 | 84.5k | R1(A, B, C, D, E, F, G, H, 0xCC451979, W08, W08 ^ W12); |
126 | 84.5k | W08 = SM3_E(W08, W15, W05, W11, W02); |
127 | 84.5k | R1(D, A, B, C, H, E, F, G, 0x988A32F3, W09, W09 ^ W13); |
128 | 84.5k | W09 = SM3_E(W09, W00, W06, W12, W03); |
129 | 84.5k | R1(C, D, A, B, G, H, E, F, 0x311465E7, W10, W10 ^ W14); |
130 | 84.5k | W10 = SM3_E(W10, W01, W07, W13, W04); |
131 | 84.5k | R1(B, C, D, A, F, G, H, E, 0x6228CBCE, W11, W11 ^ W15); |
132 | 84.5k | W11 = SM3_E(W11, W02, W08, W14, W05); |
133 | 84.5k | R1(A, B, C, D, E, F, G, H, 0xC451979C, W12, W12 ^ W00); |
134 | 84.5k | W12 = SM3_E(W12, W03, W09, W15, W06); |
135 | 84.5k | R1(D, A, B, C, H, E, F, G, 0x88A32F39, W13, W13 ^ W01); |
136 | 84.5k | W13 = SM3_E(W13, W04, W10, W00, W07); |
137 | 84.5k | R1(C, D, A, B, G, H, E, F, 0x11465E73, W14, W14 ^ W02); |
138 | 84.5k | W14 = SM3_E(W14, W05, W11, W01, W08); |
139 | 84.5k | R1(B, C, D, A, F, G, H, E, 0x228CBCE6, W15, W15 ^ W03); |
140 | 84.5k | W15 = SM3_E(W15, W06, W12, W02, W09); |
141 | 84.5k | R2(A, B, C, D, E, F, G, H, 0x9D8A7A87, W00, W00 ^ W04); |
142 | 84.5k | W00 = SM3_E(W00, W07, W13, W03, W10); |
143 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x3B14F50F, W01, W01 ^ W05); |
144 | 84.5k | W01 = SM3_E(W01, W08, W14, W04, W11); |
145 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x7629EA1E, W02, W02 ^ W06); |
146 | 84.5k | W02 = SM3_E(W02, W09, W15, W05, W12); |
147 | 84.5k | R2(B, C, D, A, F, G, H, E, 0xEC53D43C, W03, W03 ^ W07); |
148 | 84.5k | W03 = SM3_E(W03, W10, W00, W06, W13); |
149 | 84.5k | R2(A, B, C, D, E, F, G, H, 0xD8A7A879, W04, W04 ^ W08); |
150 | 84.5k | W04 = SM3_E(W04, W11, W01, W07, W14); |
151 | 84.5k | R2(D, A, B, C, H, E, F, G, 0xB14F50F3, W05, W05 ^ W09); |
152 | 84.5k | W05 = SM3_E(W05, W12, W02, W08, W15); |
153 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x629EA1E7, W06, W06 ^ W10); |
154 | 84.5k | W06 = SM3_E(W06, W13, W03, W09, W00); |
155 | 84.5k | R2(B, C, D, A, F, G, H, E, 0xC53D43CE, W07, W07 ^ W11); |
156 | 84.5k | W07 = SM3_E(W07, W14, W04, W10, W01); |
157 | 84.5k | R2(A, B, C, D, E, F, G, H, 0x8A7A879D, W08, W08 ^ W12); |
158 | 84.5k | W08 = SM3_E(W08, W15, W05, W11, W02); |
159 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x14F50F3B, W09, W09 ^ W13); |
160 | 84.5k | W09 = SM3_E(W09, W00, W06, W12, W03); |
161 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x29EA1E76, W10, W10 ^ W14); |
162 | 84.5k | W10 = SM3_E(W10, W01, W07, W13, W04); |
163 | 84.5k | R2(B, C, D, A, F, G, H, E, 0x53D43CEC, W11, W11 ^ W15); |
164 | 84.5k | W11 = SM3_E(W11, W02, W08, W14, W05); |
165 | 84.5k | R2(A, B, C, D, E, F, G, H, 0xA7A879D8, W12, W12 ^ W00); |
166 | 84.5k | W12 = SM3_E(W12, W03, W09, W15, W06); |
167 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x4F50F3B1, W13, W13 ^ W01); |
168 | 84.5k | W13 = SM3_E(W13, W04, W10, W00, W07); |
169 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x9EA1E762, W14, W14 ^ W02); |
170 | 84.5k | W14 = SM3_E(W14, W05, W11, W01, W08); |
171 | 84.5k | R2(B, C, D, A, F, G, H, E, 0x3D43CEC5, W15, W15 ^ W03); |
172 | 84.5k | W15 = SM3_E(W15, W06, W12, W02, W09); |
173 | 84.5k | R2(A, B, C, D, E, F, G, H, 0x7A879D8A, W00, W00 ^ W04); |
174 | 84.5k | W00 = SM3_E(W00, W07, W13, W03, W10); |
175 | 84.5k | R2(D, A, B, C, H, E, F, G, 0xF50F3B14, W01, W01 ^ W05); |
176 | 84.5k | W01 = SM3_E(W01, W08, W14, W04, W11); |
177 | 84.5k | R2(C, D, A, B, G, H, E, F, 0xEA1E7629, W02, W02 ^ W06); |
178 | 84.5k | W02 = SM3_E(W02, W09, W15, W05, W12); |
179 | 84.5k | R2(B, C, D, A, F, G, H, E, 0xD43CEC53, W03, W03 ^ W07); |
180 | 84.5k | W03 = SM3_E(W03, W10, W00, W06, W13); |
181 | 84.5k | R2(A, B, C, D, E, F, G, H, 0xA879D8A7, W04, W04 ^ W08); |
182 | 84.5k | W04 = SM3_E(W04, W11, W01, W07, W14); |
183 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x50F3B14F, W05, W05 ^ W09); |
184 | 84.5k | W05 = SM3_E(W05, W12, W02, W08, W15); |
185 | 84.5k | R2(C, D, A, B, G, H, E, F, 0xA1E7629E, W06, W06 ^ W10); |
186 | 84.5k | W06 = SM3_E(W06, W13, W03, W09, W00); |
187 | 84.5k | R2(B, C, D, A, F, G, H, E, 0x43CEC53D, W07, W07 ^ W11); |
188 | 84.5k | W07 = SM3_E(W07, W14, W04, W10, W01); |
189 | 84.5k | R2(A, B, C, D, E, F, G, H, 0x879D8A7A, W08, W08 ^ W12); |
190 | 84.5k | W08 = SM3_E(W08, W15, W05, W11, W02); |
191 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x0F3B14F5, W09, W09 ^ W13); |
192 | 84.5k | W09 = SM3_E(W09, W00, W06, W12, W03); |
193 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x1E7629EA, W10, W10 ^ W14); |
194 | 84.5k | W10 = SM3_E(W10, W01, W07, W13, W04); |
195 | 84.5k | R2(B, C, D, A, F, G, H, E, 0x3CEC53D4, W11, W11 ^ W15); |
196 | 84.5k | W11 = SM3_E(W11, W02, W08, W14, W05); |
197 | 84.5k | R2(A, B, C, D, E, F, G, H, 0x79D8A7A8, W12, W12 ^ W00); |
198 | 84.5k | W12 = SM3_E(W12, W03, W09, W15, W06); |
199 | 84.5k | R2(D, A, B, C, H, E, F, G, 0xF3B14F50, W13, W13 ^ W01); |
200 | 84.5k | W13 = SM3_E(W13, W04, W10, W00, W07); |
201 | 84.5k | R2(C, D, A, B, G, H, E, F, 0xE7629EA1, W14, W14 ^ W02); |
202 | 84.5k | W14 = SM3_E(W14, W05, W11, W01, W08); |
203 | 84.5k | R2(B, C, D, A, F, G, H, E, 0xCEC53D43, W15, W15 ^ W03); |
204 | 84.5k | W15 = SM3_E(W15, W06, W12, W02, W09); |
205 | 84.5k | R2(A, B, C, D, E, F, G, H, 0x9D8A7A87, W00, W00 ^ W04); |
206 | 84.5k | W00 = SM3_E(W00, W07, W13, W03, W10); |
207 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x3B14F50F, W01, W01 ^ W05); |
208 | 84.5k | W01 = SM3_E(W01, W08, W14, W04, W11); |
209 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x7629EA1E, W02, W02 ^ W06); |
210 | 84.5k | W02 = SM3_E(W02, W09, W15, W05, W12); |
211 | 84.5k | R2(B, C, D, A, F, G, H, E, 0xEC53D43C, W03, W03 ^ W07); |
212 | 84.5k | W03 = SM3_E(W03, W10, W00, W06, W13); |
213 | 84.5k | R2(A, B, C, D, E, F, G, H, 0xD8A7A879, W04, W04 ^ W08); |
214 | 84.5k | R2(D, A, B, C, H, E, F, G, 0xB14F50F3, W05, W05 ^ W09); |
215 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x629EA1E7, W06, W06 ^ W10); |
216 | 84.5k | R2(B, C, D, A, F, G, H, E, 0xC53D43CE, W07, W07 ^ W11); |
217 | 84.5k | R2(A, B, C, D, E, F, G, H, 0x8A7A879D, W08, W08 ^ W12); |
218 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x14F50F3B, W09, W09 ^ W13); |
219 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x29EA1E76, W10, W10 ^ W14); |
220 | 84.5k | R2(B, C, D, A, F, G, H, E, 0x53D43CEC, W11, W11 ^ W15); |
221 | 84.5k | R2(A, B, C, D, E, F, G, H, 0xA7A879D8, W12, W12 ^ W00); |
222 | 84.5k | R2(D, A, B, C, H, E, F, G, 0x4F50F3B1, W13, W13 ^ W01); |
223 | 84.5k | R2(C, D, A, B, G, H, E, F, 0x9EA1E762, W14, W14 ^ W02); |
224 | 84.5k | R2(B, C, D, A, F, G, H, E, 0x3D43CEC5, W15, W15 ^ W03); |
225 | | |
226 | 84.5k | A = (m_digest[0] ^= A); |
227 | 84.5k | B = (m_digest[1] ^= B); |
228 | 84.5k | C = (m_digest[2] ^= C); |
229 | 84.5k | D = (m_digest[3] ^= D); |
230 | 84.5k | E = (m_digest[4] ^= E); |
231 | 84.5k | F = (m_digest[5] ^= F); |
232 | 84.5k | G = (m_digest[6] ^= G); |
233 | 84.5k | H = (m_digest[7] ^= H); |
234 | | |
235 | 84.5k | input += hash_block_size(); |
236 | 84.5k | } |
237 | 83.9k | } |
238 | | |
239 | | /* |
240 | | * Copy out the digest |
241 | | */ |
242 | 40.4k | void SM3::copy_out(uint8_t output[]) { |
243 | 40.4k | copy_out_vec_be(output, output_length(), m_digest); |
244 | 40.4k | } |
245 | | |
246 | | /* |
247 | | * Clear memory of sensitive data |
248 | | */ |
249 | 41.4k | void SM3::clear() { |
250 | 41.4k | MDx_HashFunction::clear(); |
251 | 41.4k | std::copy(std::begin(SM3_IV), std::end(SM3_IV), m_digest.begin()); |
252 | 41.4k | } |
253 | | |
254 | | } // namespace Botan |