diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libcrypto/sm4/sm4.c | 108 |
1 files changed, 83 insertions, 25 deletions
diff --git a/src/lib/libcrypto/sm4/sm4.c b/src/lib/libcrypto/sm4/sm4.c index 31acac11f6..6e90fa19dd 100644 --- a/src/lib/libcrypto/sm4/sm4.c +++ b/src/lib/libcrypto/sm4/sm4.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: sm4.c,v 1.5 2025/01/22 09:46:26 jsing Exp $ */ | 1 | /* $OpenBSD: sm4.c,v 1.6 2025/01/22 09:53:16 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2017, 2019 Ribose Inc | 3 | * Copyright (c) 2017, 2019 Ribose Inc |
4 | * | 4 | * |
@@ -177,14 +177,6 @@ SM4_set_key(const uint8_t *key, SM4_KEY *k) | |||
177 | } | 177 | } |
178 | LCRYPTO_ALIAS(SM4_set_key); | 178 | LCRYPTO_ALIAS(SM4_set_key); |
179 | 179 | ||
180 | #define SM4_ROUNDS(k0, k1, k2, k3, F) \ | ||
181 | do { \ | ||
182 | B0 ^= F(B1 ^ B2 ^ B3 ^ ks->rk[k0]); \ | ||
183 | B1 ^= F(B0 ^ B2 ^ B3 ^ ks->rk[k1]); \ | ||
184 | B2 ^= F(B0 ^ B1 ^ B3 ^ ks->rk[k2]); \ | ||
185 | B3 ^= F(B0 ^ B1 ^ B2 ^ ks->rk[k3]); \ | ||
186 | } while(0) | ||
187 | |||
188 | void | 180 | void |
189 | SM4_encrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *k) | 181 | SM4_encrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *k) |
190 | { | 182 | { |
@@ -200,14 +192,45 @@ SM4_encrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *k) | |||
200 | * Uses byte-wise sbox in the first and last rounds to provide some | 192 | * Uses byte-wise sbox in the first and last rounds to provide some |
201 | * protection from cache based side channels. | 193 | * protection from cache based side channels. |
202 | */ | 194 | */ |
203 | SM4_ROUNDS( 0, 1, 2, 3, SM4_T_slow); | 195 | B0 ^= SM4_T_slow(B1 ^ B2 ^ B3 ^ ks->rk[0]); |
204 | SM4_ROUNDS( 4, 5, 6, 7, SM4_T); | 196 | B1 ^= SM4_T_slow(B0 ^ B2 ^ B3 ^ ks->rk[1]); |
205 | SM4_ROUNDS( 8, 9, 10, 11, SM4_T); | 197 | B2 ^= SM4_T_slow(B0 ^ B1 ^ B3 ^ ks->rk[2]); |
206 | SM4_ROUNDS(12, 13, 14, 15, SM4_T); | 198 | B3 ^= SM4_T_slow(B0 ^ B1 ^ B2 ^ ks->rk[3]); |
207 | SM4_ROUNDS(16, 17, 18, 19, SM4_T); | 199 | |
208 | SM4_ROUNDS(20, 21, 22, 23, SM4_T); | 200 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[4]); |
209 | SM4_ROUNDS(24, 25, 26, 27, SM4_T); | 201 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[5]); |
210 | SM4_ROUNDS(28, 29, 30, 31, SM4_T_slow); | 202 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[6]); |
203 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[7]); | ||
204 | |||
205 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[8]); | ||
206 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[9]); | ||
207 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[10]); | ||
208 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[11]); | ||
209 | |||
210 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[12]); | ||
211 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[13]); | ||
212 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[14]); | ||
213 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[15]); | ||
214 | |||
215 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[16]); | ||
216 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[17]); | ||
217 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[18]); | ||
218 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[19]); | ||
219 | |||
220 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[20]); | ||
221 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[21]); | ||
222 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[22]); | ||
223 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[23]); | ||
224 | |||
225 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[24]); | ||
226 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[25]); | ||
227 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[26]); | ||
228 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[27]); | ||
229 | |||
230 | B0 ^= SM4_T_slow(B1 ^ B2 ^ B3 ^ ks->rk[28]); | ||
231 | B1 ^= SM4_T_slow(B0 ^ B2 ^ B3 ^ ks->rk[29]); | ||
232 | B2 ^= SM4_T_slow(B0 ^ B1 ^ B3 ^ ks->rk[30]); | ||
233 | B3 ^= SM4_T_slow(B0 ^ B1 ^ B2 ^ ks->rk[31]); | ||
211 | 234 | ||
212 | crypto_store_htobe32(&out[0 * 4], B3); | 235 | crypto_store_htobe32(&out[0 * 4], B3); |
213 | crypto_store_htobe32(&out[1 * 4], B2); | 236 | crypto_store_htobe32(&out[1 * 4], B2); |
@@ -227,14 +250,49 @@ SM4_decrypt(const uint8_t *in, uint8_t *out, const SM4_KEY *k) | |||
227 | B2 = crypto_load_be32toh(&in[2 * 4]); | 250 | B2 = crypto_load_be32toh(&in[2 * 4]); |
228 | B3 = crypto_load_be32toh(&in[3 * 4]); | 251 | B3 = crypto_load_be32toh(&in[3 * 4]); |
229 | 252 | ||
230 | SM4_ROUNDS(31, 30, 29, 28, SM4_T_slow); | 253 | /* |
231 | SM4_ROUNDS(27, 26, 25, 24, SM4_T); | 254 | * Uses byte-wise sbox in the first and last rounds to provide some |
232 | SM4_ROUNDS(23, 22, 21, 20, SM4_T); | 255 | * protection from cache based side channels. |
233 | SM4_ROUNDS(19, 18, 17, 16, SM4_T); | 256 | */ |
234 | SM4_ROUNDS(15, 14, 13, 12, SM4_T); | 257 | B0 ^= SM4_T_slow(B1 ^ B2 ^ B3 ^ ks->rk[31]); |
235 | SM4_ROUNDS(11, 10, 9, 8, SM4_T); | 258 | B1 ^= SM4_T_slow(B0 ^ B2 ^ B3 ^ ks->rk[30]); |
236 | SM4_ROUNDS( 7, 6, 5, 4, SM4_T); | 259 | B2 ^= SM4_T_slow(B0 ^ B1 ^ B3 ^ ks->rk[29]); |
237 | SM4_ROUNDS( 3, 2, 1, 0, SM4_T_slow); | 260 | B3 ^= SM4_T_slow(B0 ^ B1 ^ B2 ^ ks->rk[28]); |
261 | |||
262 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[27]); | ||
263 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[26]); | ||
264 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[25]); | ||
265 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[24]); | ||
266 | |||
267 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[23]); | ||
268 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[22]); | ||
269 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[21]); | ||
270 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[20]); | ||
271 | |||
272 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[19]); | ||
273 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[18]); | ||
274 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[17]); | ||
275 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[16]); | ||
276 | |||
277 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[15]); | ||
278 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[14]); | ||
279 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[13]); | ||
280 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[12]); | ||
281 | |||
282 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[11]); | ||
283 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[10]); | ||
284 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[9]); | ||
285 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[8]); | ||
286 | |||
287 | B0 ^= SM4_T(B1 ^ B2 ^ B3 ^ ks->rk[7]); | ||
288 | B1 ^= SM4_T(B0 ^ B2 ^ B3 ^ ks->rk[6]); | ||
289 | B2 ^= SM4_T(B0 ^ B1 ^ B3 ^ ks->rk[5]); | ||
290 | B3 ^= SM4_T(B0 ^ B1 ^ B2 ^ ks->rk[4]); | ||
291 | |||
292 | B0 ^= SM4_T_slow(B1 ^ B2 ^ B3 ^ ks->rk[3]); | ||
293 | B1 ^= SM4_T_slow(B0 ^ B2 ^ B3 ^ ks->rk[2]); | ||
294 | B2 ^= SM4_T_slow(B0 ^ B1 ^ B3 ^ ks->rk[1]); | ||
295 | B3 ^= SM4_T_slow(B0 ^ B1 ^ B2 ^ ks->rk[0]); | ||
238 | 296 | ||
239 | crypto_store_htobe32(&out[0 * 4], B3); | 297 | crypto_store_htobe32(&out[0 * 4], B3); |
240 | crypto_store_htobe32(&out[1 * 4], B2); | 298 | crypto_store_htobe32(&out[1 * 4], B2); |