master
c 2,275 lines 71.5 KB
Raw
1 /*
2 * SPDX-License-Identifier: GPL-2.0-or-later
3 *
4 * MIPS Octeon crypto emulation helpers.
5 *
6 * Copyright (c) 2026 James Hilliard
7 */
8
9 #include "qemu/osdep.h"
10 #include "cpu.h"
11 #include "internal.h"
12 #include "exec/helper-proto.h"
13 #include "crypto/aes.h"
14 #include "crypto/clmul.h"
15 #include "crypto/sm4.h"
16 #include "qemu/bitops.h"
17 #include "qemu/host-utils.h"
18
19 #define OCTEON_LLM_NARROW_MASK ((1ULL << 36) - 1)
20
21 static uint64_t octeon_llm_pack_narrow(uint64_t value)
22 {
23 value &= OCTEON_LLM_NARROW_MASK;
24 return value | ((uint64_t)(ctpop64(value) & 1) << 36);
25 }
26
27 static void octeon_llm_read(MIPSOcteonCryptoState *crypto, unsigned int set,
28 uint64_t addr, bool wide)
29 {
30 uint64_t value;
31
32 if (wide) {
33 value = mips_octeon_llm_load(crypto->llm64, addr);
34 } else {
35 value = octeon_llm_pack_narrow(
36 mips_octeon_llm_load(crypto->llm36, addr));
37 }
38
39 crypto->llm_data[set] = value;
40 }
41
42 static void octeon_llm_write(MIPSOcteonCryptoState *crypto, unsigned int set,
43 uint64_t addr, bool wide)
44 {
45 uint64_t value = crypto->llm_data[set];
46
47 if (wide) {
48 mips_octeon_llm_store(&crypto->llm64, addr, value);
49 } else {
50 mips_octeon_llm_store(&crypto->llm36, addr,
51 value & OCTEON_LLM_NARROW_MASK);
52 }
53 }
54
55 static uint32_t octeon_crc_reflect32_by_byte(uint32_t v)
56 {
57 return bswap32(revbit32(v));
58 }
59
60 static uint32_t octeon_crc_state_reflect(const MIPSOcteonCryptoState *crypto)
61 {
62 return octeon_crc_reflect32_by_byte(crypto->crc_iv);
63 }
64
65 static void octeon_crc_set_state_reflect(MIPSOcteonCryptoState *crypto,
66 uint32_t state)
67 {
68 crypto->crc_iv = octeon_crc_reflect32_by_byte(state);
69 }
70
71 static void octeon_crc_update_normal(MIPSOcteonCryptoState *crypto,
72 uint64_t value, unsigned int bytes)
73 {
74 uint32_t crc = crypto->crc_iv;
75 uint32_t poly = crypto->crc_poly;
76
77 for (unsigned int i = 0; i < bytes; i++) {
78 uint8_t byte = value >> ((bytes - 1 - i) * 8);
79
80 crc ^= (uint32_t)byte << 24;
81 for (int bit = 0; bit < 8; bit++) {
82 if (crc & 0x80000000U) {
83 crc = (crc << 1) ^ poly;
84 } else {
85 crc <<= 1;
86 }
87 }
88 }
89
90 crypto->crc_iv = crc;
91 }
92
93 static void octeon_crc_update_reflect(MIPSOcteonCryptoState *crypto,
94 uint64_t value, unsigned int bytes)
95 {
96 uint32_t crc = octeon_crc_state_reflect(crypto);
97 uint32_t poly = bswap32(crypto->crc_poly);
98
99 for (unsigned int i = 0; i < bytes; i++) {
100 uint8_t byte = value >> ((bytes - 1 - i) * 8);
101
102 crc ^= byte;
103 for (int bit = 0; bit < 8; bit++) {
104 if (crc & 1U) {
105 crc = (crc >> 1) ^ poly;
106 } else {
107 crc >>= 1;
108 }
109 }
110 }
111
112 octeon_crc_set_state_reflect(crypto, crc);
113 }
114
115 static void octeon_gfm_mul(const uint64_t x[2], const uint64_t y[2],
116 uint16_t poly, uint64_t out[2])
117 {
118 uint64_t zh = 0, zl = 0;
119 uint64_t vh = y[0], vl = y[1];
120 uint64_t rh = (uint64_t)poly << 48;
121 int i;
122
123 /*
124 * Keep the reflected-shift formulation used by Octeon software: the
125 * selector polynomial is already in reflected bit order, and the software
126 * view folds its 16 reduction bits from the top of the high word.
127 */
128 for (i = 0; i < 128; i++) {
129 bool bit;
130 bool lsb;
131
132 if (i < 64) {
133 bit = (x[0] >> (63 - i)) & 1;
134 } else {
135 bit = (x[1] >> (127 - i)) & 1;
136 }
137 if (bit) {
138 zh ^= vh;
139 zl ^= vl;
140 }
141
142 lsb = vl & 1;
143 vl = (vh << 63) | (vl >> 1);
144 vh >>= 1;
145 if (lsb) {
146 vh ^= rh;
147 }
148 }
149
150 out[0] = zh;
151 out[1] = zl;
152 }
153
154 static uint64_t octeon_gfm_reduce64(Int128 product, uint8_t poly)
155 {
156 uint64_t lo = int128_getlo(product);
157 uint64_t hi = int128_gethi(product);
158
159 while (hi) {
160 int bit = 63 - clz64(hi);
161
162 hi ^= 1ULL << bit;
163 lo ^= (uint64_t)poly << bit;
164 if (bit > 56) {
165 hi ^= (uint64_t)poly >> (64 - bit);
166 }
167 }
168
169 return lo;
170 }
171
172 static void octeon_gfm_mul64_uia2(const uint64_t x[2], const uint64_t y[2],
173 uint8_t poly, uint64_t out[2])
174 {
175 /*
176 * SNOW3G UIA2 uses the GFM datapath as a reflected 64-bit multiply in
177 * the low half of the 128-bit register pair. When RESINP[0], MUL[1],
178 * and the high polynomial byte are all zero, octeon_gfm_mul() observes
179 * only x[1], y[0], and the low 8-bit polynomial. Reflect those operands
180 * into normal carryless-multiply order and reflect the reduced result
181 * back into RESINP[1].
182 */
183 uint64_t vx = revbit64(x[1]);
184 uint64_t vy = revbit64(y[0]);
185 Int128 product = clmul_64(vx, vy);
186 uint64_t res = octeon_gfm_reduce64(product, revbit32(poly) >> 24);
187
188 out[0] = 0;
189 out[1] = revbit64(res);
190 }
191
192 static uint32_t octeon_hsh_get32(const uint64_t *regs, unsigned int index)
193 {
194 return regs[index];
195 }
196
197 static void octeon_hsh_set32(uint64_t *regs, unsigned int index, uint32_t value)
198 {
199 regs[index] = (regs[index] & ~(uint64_t)UINT32_MAX) | value;
200 }
201
202 static void octeon_hsh_set_pair(uint64_t *regs, unsigned int index,
203 uint64_t value)
204 {
205 octeon_hsh_set32(regs, index * 2, value >> 32);
206 octeon_hsh_set32(regs, index * 2 + 1, value);
207 }
208
209 static void octeon_md5_transform(MIPSOcteonCryptoState *crypto)
210 {
211 static const uint32_t k[64] = {
212 0xd76aa478U, 0xe8c7b756U, 0x242070dbU, 0xc1bdceeeU,
213 0xf57c0fafU, 0x4787c62aU, 0xa8304613U, 0xfd469501U,
214 0x698098d8U, 0x8b44f7afU, 0xffff5bb1U, 0x895cd7beU,
215 0x6b901122U, 0xfd987193U, 0xa679438eU, 0x49b40821U,
216 0xf61e2562U, 0xc040b340U, 0x265e5a51U, 0xe9b6c7aaU,
217 0xd62f105dU, 0x02441453U, 0xd8a1e681U, 0xe7d3fbc8U,
218 0x21e1cde6U, 0xc33707d6U, 0xf4d50d87U, 0x455a14edU,
219 0xa9e3e905U, 0xfcefa3f8U, 0x676f02d9U, 0x8d2a4c8aU,
220 0xfffa3942U, 0x8771f681U, 0x6d9d6122U, 0xfde5380cU,
221 0xa4beea44U, 0x4bdecfa9U, 0xf6bb4b60U, 0xbebfbc70U,
222 0x289b7ec6U, 0xeaa127faU, 0xd4ef3085U, 0x04881d05U,
223 0xd9d4d039U, 0xe6db99e5U, 0x1fa27cf8U, 0xc4ac5665U,
224 0xf4292244U, 0x432aff97U, 0xab9423a7U, 0xfc93a039U,
225 0x655b59c3U, 0x8f0ccc92U, 0xffeff47dU, 0x85845dd1U,
226 0x6fa87e4fU, 0xfe2ce6e0U, 0xa3014314U, 0x4e0811a1U,
227 0xf7537e82U, 0xbd3af235U, 0x2ad7d2bbU, 0xeb86d391U,
228 };
229 static const uint8_t s[64] = {
230 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
231 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
232 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
233 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,
234 };
235 uint32_t m[16];
236 uint32_t a, b, c, d;
237 uint32_t aa, bb, cc, dd;
238 int i;
239
240 for (i = 0; i < 16; i++) {
241 m[i] = bswap32(octeon_hsh_get32(crypto->hsh_dat, i));
242 }
243
244 a = bswap32(octeon_hsh_get32(crypto->hsh_iv, 0));
245 b = bswap32(octeon_hsh_get32(crypto->hsh_iv, 1));
246 c = bswap32(octeon_hsh_get32(crypto->hsh_iv, 2));
247 d = bswap32(octeon_hsh_get32(crypto->hsh_iv, 3));
248 aa = a;
249 bb = b;
250 cc = c;
251 dd = d;
252
253 for (i = 0; i < 64; i++) {
254 uint32_t f, g, tmp;
255
256 if (i < 16) {
257 f = (b & c) | ((~b) & d);
258 g = i;
259 } else if (i < 32) {
260 f = (d & b) | ((~d) & c);
261 g = (5 * i + 1) & 0xf;
262 } else if (i < 48) {
263 f = b ^ c ^ d;
264 g = (3 * i + 5) & 0xf;
265 } else {
266 f = c ^ (b | (~d));
267 g = (7 * i) & 0xf;
268 }
269
270 tmp = d;
271 d = c;
272 c = b;
273 b = b + rol32(a + f + k[i] + m[g], s[i]);
274 a = tmp;
275 }
276
277 a += aa;
278 b += bb;
279 c += cc;
280 d += dd;
281 octeon_hsh_set32(crypto->hsh_iv, 0, bswap32(a));
282 octeon_hsh_set32(crypto->hsh_iv, 1, bswap32(b));
283 octeon_hsh_set32(crypto->hsh_iv, 2, bswap32(c));
284 octeon_hsh_set32(crypto->hsh_iv, 3, bswap32(d));
285 }
286
287 static void octeon_sha1_transform(MIPSOcteonCryptoState *crypto)
288 {
289 uint32_t w[80];
290 uint32_t a, b, c, d, e;
291 uint32_t orig[5];
292 int i;
293
294 for (i = 0; i < 16; i++) {
295 w[i] = octeon_hsh_get32(crypto->hsh_dat, i);
296 }
297 for (i = 16; i < 80; i++) {
298 w[i] = rol32(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1);
299 }
300
301 for (i = 0; i < 5; i++) {
302 orig[i] = octeon_hsh_get32(crypto->hsh_iv, i);
303 }
304 a = orig[0];
305 b = orig[1];
306 c = orig[2];
307 d = orig[3];
308 e = orig[4];
309
310 for (i = 0; i < 80; i++) {
311 uint32_t f, k, temp;
312
313 if (i < 20) {
314 f = (b & c) | ((~b) & d);
315 k = 0x5a827999;
316 } else if (i < 40) {
317 f = b ^ c ^ d;
318 k = 0x6ed9eba1;
319 } else if (i < 60) {
320 f = (b & c) | (b & d) | (c & d);
321 k = 0x8f1bbcdc;
322 } else {
323 f = b ^ c ^ d;
324 k = 0xca62c1d6;
325 }
326
327 temp = rol32(a, 5) + f + e + k + w[i];
328 e = d;
329 d = c;
330 c = rol32(b, 30);
331 b = a;
332 a = temp;
333 }
334
335 orig[0] += a;
336 orig[1] += b;
337 orig[2] += c;
338 orig[3] += d;
339 orig[4] += e;
340 for (i = 0; i < 5; i++) {
341 octeon_hsh_set32(crypto->hsh_iv, i, orig[i]);
342 }
343 }
344
345 static void octeon_sha256_transform(MIPSOcteonCryptoState *crypto)
346 {
347 static const uint32_t k[64] = {
348 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U,
349 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U,
350 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U,
351 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U,
352 0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU,
353 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU,
354 0x983e5152U, 0xa831c66dU, 0xb00327c8U, 0xbf597fc7U,
355 0xc6e00bf3U, 0xd5a79147U, 0x06ca6351U, 0x14292967U,
356 0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU, 0x53380d13U,
357 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U,
358 0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U,
359 0xd192e819U, 0xd6990624U, 0xf40e3585U, 0x106aa070U,
360 0x19a4c116U, 0x1e376c08U, 0x2748774cU, 0x34b0bcb5U,
361 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU, 0x682e6ff3U,
362 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U,
363 0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U,
364 };
365 uint32_t w[64];
366 uint32_t a, b, c, d, e, f, g, h;
367 uint32_t orig[8];
368 int i;
369
370 for (i = 0; i < 16; i++) {
371 w[i] = octeon_hsh_get32(crypto->hsh_dat, i);
372 }
373 for (i = 16; i < 64; i++) {
374 uint32_t s0 = ror32(w[i - 15], 7) ^
375 ror32(w[i - 15], 18) ^
376 (w[i - 15] >> 3);
377 uint32_t s1 = ror32(w[i - 2], 17) ^
378 ror32(w[i - 2], 19) ^
379 (w[i - 2] >> 10);
380 w[i] = w[i - 16] + s0 + w[i - 7] + s1;
381 }
382
383 for (i = 0; i < 8; i++) {
384 orig[i] = octeon_hsh_get32(crypto->hsh_iv, i);
385 }
386 a = orig[0];
387 b = orig[1];
388 c = orig[2];
389 d = orig[3];
390 e = orig[4];
391 f = orig[5];
392 g = orig[6];
393 h = orig[7];
394
395 for (i = 0; i < 64; i++) {
396 uint32_t s1 = ror32(e, 6) ^
397 ror32(e, 11) ^
398 ror32(e, 25);
399 uint32_t ch = (e & f) ^ ((~e) & g);
400 uint32_t temp1 = h + s1 + ch + k[i] + w[i];
401 uint32_t s0 = ror32(a, 2) ^
402 ror32(a, 13) ^
403 ror32(a, 22);
404 uint32_t maj = (a & b) ^ (a & c) ^ (b & c);
405 uint32_t temp2 = s0 + maj;
406
407 h = g;
408 g = f;
409 f = e;
410 e = d + temp1;
411 d = c;
412 c = b;
413 b = a;
414 a = temp1 + temp2;
415 }
416
417 orig[0] += a;
418 orig[1] += b;
419 orig[2] += c;
420 orig[3] += d;
421 orig[4] += e;
422 orig[5] += f;
423 orig[6] += g;
424 orig[7] += h;
425 for (i = 0; i < 8; i++) {
426 octeon_hsh_set32(crypto->hsh_iv, i, orig[i]);
427 }
428 }
429
430 static void octeon_sha512_transform(MIPSOcteonCryptoState *crypto)
431 {
432 static const uint64_t k[80] = {
433 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
434 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
435 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
436 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
437 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
438 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
439 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
440 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
441 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
442 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
443 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
444 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
445 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
446 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
447 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
448 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
449 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
450 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
451 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
452 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
453 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
454 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
455 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
456 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
457 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
458 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
459 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
460 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
461 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
462 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
463 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
464 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
465 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
466 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
467 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
468 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
469 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
470 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
471 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
472 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
473 };
474 uint64_t w[80];
475 uint64_t a, b, c, d, e, f, g, h;
476 int i;
477
478 for (i = 0; i < 16; i++) {
479 w[i] = crypto->hsh_dat[i];
480 }
481 for (i = 16; i < 80; i++) {
482 uint64_t s0 = ror64(w[i - 15], 1) ^
483 ror64(w[i - 15], 8) ^
484 (w[i - 15] >> 7);
485 uint64_t s1 = ror64(w[i - 2], 19) ^
486 ror64(w[i - 2], 61) ^
487 (w[i - 2] >> 6);
488 w[i] = w[i - 16] + s0 + w[i - 7] + s1;
489 }
490
491 a = crypto->hsh_iv[0];
492 b = crypto->hsh_iv[1];
493 c = crypto->hsh_iv[2];
494 d = crypto->hsh_iv[3];
495 e = crypto->hsh_iv[4];
496 f = crypto->hsh_iv[5];
497 g = crypto->hsh_iv[6];
498 h = crypto->hsh_iv[7];
499
500 for (i = 0; i < 80; i++) {
501 uint64_t s0 = ror64(a, 28) ^
502 ror64(a, 34) ^
503 ror64(a, 39);
504 uint64_t s1 = ror64(e, 14) ^
505 ror64(e, 18) ^
506 ror64(e, 41);
507 uint64_t ch = (e & f) ^ ((~e) & g);
508 uint64_t maj = (a & b) ^ (a & c) ^ (b & c);
509 uint64_t temp1 = h + s1 + ch + k[i] + w[i];
510 uint64_t temp2 = s0 + maj;
511
512 h = g;
513 g = f;
514 f = e;
515 e = d + temp1;
516 d = c;
517 c = b;
518 b = a;
519 a = temp1 + temp2;
520 }
521
522 crypto->hsh_iv[0] += a;
523 crypto->hsh_iv[1] += b;
524 crypto->hsh_iv[2] += c;
525 crypto->hsh_iv[3] += d;
526 crypto->hsh_iv[4] += e;
527 crypto->hsh_iv[5] += f;
528 crypto->hsh_iv[6] += g;
529 crypto->hsh_iv[7] += h;
530 }
531
532 static const uint64_t octeon_sha3_round_constants[24] = {
533 0x0000000000000001ULL, 0x0000000000008082ULL,
534 0x800000000000808aULL, 0x8000000080008000ULL,
535 0x000000000000808bULL, 0x0000000080000001ULL,
536 0x8000000080008081ULL, 0x8000000000008009ULL,
537 0x000000000000008aULL, 0x0000000000000088ULL,
538 0x0000000080008009ULL, 0x000000008000000aULL,
539 0x000000008000808bULL, 0x800000000000008bULL,
540 0x8000000000008089ULL, 0x8000000000008003ULL,
541 0x8000000000008002ULL, 0x8000000000000080ULL,
542 0x000000000000800aULL, 0x800000008000000aULL,
543 0x8000000080008081ULL, 0x8000000000008080ULL,
544 0x0000000080000001ULL, 0x8000000080008008ULL,
545 };
546
547 static const uint8_t octeon_sha3_rotation_constants[24] = {
548 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14,
549 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44,
550 };
551
552 static const uint8_t octeon_sha3_pi_lanes[24] = {
553 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4,
554 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1,
555 };
556
557 static uint64_t octeon_sha3_reg_to_lane(uint64_t value)
558 {
559 /*
560 * The COP2 register interface is consumed by big-endian MIPS code as
561 * 64-bit register values, while Keccak lanes are byte-little-endian.
562 */
563 return bswap64(value);
564 }
565
566 static uint64_t octeon_sha3_lane_to_reg(uint64_t value)
567 {
568 return bswap64(value);
569 }
570
571 static void octeon_sha3_permute(MIPSOcteonCryptoState *crypto)
572 {
573 uint64_t state[25];
574
575 for (int i = 0; i < 25; i++) {
576 state[i] = octeon_sha3_reg_to_lane(crypto->sha3_dat[i]);
577 }
578
579 for (int round = 0; round < 24; round++) {
580 uint64_t bc[5];
581 uint64_t temp;
582
583 for (int x = 0; x < 5; x++) {
584 bc[x] = state[x] ^ state[5 + x] ^ state[10 + x] ^
585 state[15 + x] ^ state[20 + x];
586 }
587 for (int x = 0; x < 5; x++) {
588 temp = bc[(x + 4) % 5] ^ rol64(bc[(x + 1) % 5], 1);
589 for (int y = 0; y < 25; y += 5) {
590 state[y + x] ^= temp;
591 }
592 }
593
594 temp = state[1];
595 for (int i = 0; i < 24; i++) {
596 uint64_t next = state[octeon_sha3_pi_lanes[i]];
597
598 state[octeon_sha3_pi_lanes[i]] =
599 rol64(temp, octeon_sha3_rotation_constants[i]);
600 temp = next;
601 }
602
603 for (int y = 0; y < 25; y += 5) {
604 for (int x = 0; x < 5; x++) {
605 bc[x] = state[y + x];
606 }
607 for (int x = 0; x < 5; x++) {
608 state[y + x] = bc[x] ^ ((~bc[(x + 1) % 5]) & bc[(x + 2) % 5]);
609 }
610 }
611
612 state[0] ^= octeon_sha3_round_constants[round];
613 }
614
615 for (int i = 0; i < 25; i++) {
616 crypto->sha3_dat[i] = octeon_sha3_lane_to_reg(state[i]);
617 }
618 }
619
620 static uint32_t octeon_crypto_hi32(uint64_t value)
621 {
622 return value >> 32;
623 }
624
625 static uint32_t octeon_crypto_lo32(uint64_t value)
626 {
627 return value;
628 }
629
630 static uint64_t octeon_crypto_pack32(uint32_t hi, uint32_t lo)
631 {
632 return ((uint64_t)hi << 32) | lo;
633 }
634
635 static const uint8_t octeon_zuc_s0[256] = {
636 0x3e, 0x72, 0x5b, 0x47, 0xca, 0xe0, 0x00, 0x33,
637 0x04, 0xd1, 0x54, 0x98, 0x09, 0xb9, 0x6d, 0xcb,
638 0x7b, 0x1b, 0xf9, 0x32, 0xaf, 0x9d, 0x6a, 0xa5,
639 0xb8, 0x2d, 0xfc, 0x1d, 0x08, 0x53, 0x03, 0x90,
640 0x4d, 0x4e, 0x84, 0x99, 0xe4, 0xce, 0xd9, 0x91,
641 0xdd, 0xb6, 0x85, 0x48, 0x8b, 0x29, 0x6e, 0xac,
642 0xcd, 0xc1, 0xf8, 0x1e, 0x73, 0x43, 0x69, 0xc6,
643 0xb5, 0xbd, 0xfd, 0x39, 0x63, 0x20, 0xd4, 0x38,
644 0x76, 0x7d, 0xb2, 0xa7, 0xcf, 0xed, 0x57, 0xc5,
645 0xf3, 0x2c, 0xbb, 0x14, 0x21, 0x06, 0x55, 0x9b,
646 0xe3, 0xef, 0x5e, 0x31, 0x4f, 0x7f, 0x5a, 0xa4,
647 0x0d, 0x82, 0x51, 0x49, 0x5f, 0xba, 0x58, 0x1c,
648 0x4a, 0x16, 0xd5, 0x17, 0xa8, 0x92, 0x24, 0x1f,
649 0x8c, 0xff, 0xd8, 0xae, 0x2e, 0x01, 0xd3, 0xad,
650 0x3b, 0x4b, 0xda, 0x46, 0xeb, 0xc9, 0xde, 0x9a,
651 0x8f, 0x87, 0xd7, 0x3a, 0x80, 0x6f, 0x2f, 0xc8,
652 0xb1, 0xb4, 0x37, 0xf7, 0x0a, 0x22, 0x13, 0x28,
653 0x7c, 0xcc, 0x3c, 0x89, 0xc7, 0xc3, 0x96, 0x56,
654 0x07, 0xbf, 0x7e, 0xf0, 0x0b, 0x2b, 0x97, 0x52,
655 0x35, 0x41, 0x79, 0x61, 0xa6, 0x4c, 0x10, 0xfe,
656 0xbc, 0x26, 0x95, 0x88, 0x8a, 0xb0, 0xa3, 0xfb,
657 0xc0, 0x18, 0x94, 0xf2, 0xe1, 0xe5, 0xe9, 0x5d,
658 0xd0, 0xdc, 0x11, 0x66, 0x64, 0x5c, 0xec, 0x59,
659 0x42, 0x75, 0x12, 0xf5, 0x74, 0x9c, 0xaa, 0x23,
660 0x0e, 0x86, 0xab, 0xbe, 0x2a, 0x02, 0xe7, 0x67,
661 0xe6, 0x44, 0xa2, 0x6c, 0xc2, 0x93, 0x9f, 0xf1,
662 0xf6, 0xfa, 0x36, 0xd2, 0x50, 0x68, 0x9e, 0x62,
663 0x71, 0x15, 0x3d, 0xd6, 0x40, 0xc4, 0xe2, 0x0f,
664 0x8e, 0x83, 0x77, 0x6b, 0x25, 0x05, 0x3f, 0x0c,
665 0x30, 0xea, 0x70, 0xb7, 0xa1, 0xe8, 0xa9, 0x65,
666 0x8d, 0x27, 0x1a, 0xdb, 0x81, 0xb3, 0xa0, 0xf4,
667 0x45, 0x7a, 0x19, 0xdf, 0xee, 0x78, 0x34, 0x60,
668 };
669
670 static const uint8_t octeon_zuc_s1[256] = {
671 0x55, 0xc2, 0x63, 0x71, 0x3b, 0xc8, 0x47, 0x86,
672 0x9f, 0x3c, 0xda, 0x5b, 0x29, 0xaa, 0xfd, 0x77,
673 0x8c, 0xc5, 0x94, 0x0c, 0xa6, 0x1a, 0x13, 0x00,
674 0xe3, 0xa8, 0x16, 0x72, 0x40, 0xf9, 0xf8, 0x42,
675 0x44, 0x26, 0x68, 0x96, 0x81, 0xd9, 0x45, 0x3e,
676 0x10, 0x76, 0xc6, 0xa7, 0x8b, 0x39, 0x43, 0xe1,
677 0x3a, 0xb5, 0x56, 0x2a, 0xc0, 0x6d, 0xb3, 0x05,
678 0x22, 0x66, 0xbf, 0xdc, 0x0b, 0xfa, 0x62, 0x48,
679 0xdd, 0x20, 0x11, 0x06, 0x36, 0xc9, 0xc1, 0xcf,
680 0xf6, 0x27, 0x52, 0xbb, 0x69, 0xf5, 0xd4, 0x87,
681 0x7f, 0x84, 0x4c, 0xd2, 0x9c, 0x57, 0xa4, 0xbc,
682 0x4f, 0x9a, 0xdf, 0xfe, 0xd6, 0x8d, 0x7a, 0xeb,
683 0x2b, 0x53, 0xd8, 0x5c, 0xa1, 0x14, 0x17, 0xfb,
684 0x23, 0xd5, 0x7d, 0x30, 0x67, 0x73, 0x08, 0x09,
685 0xee, 0xb7, 0x70, 0x3f, 0x61, 0xb2, 0x19, 0x8e,
686 0x4e, 0xe5, 0x4b, 0x93, 0x8f, 0x5d, 0xdb, 0xa9,
687 0xad, 0xf1, 0xae, 0x2e, 0xcb, 0x0d, 0xfc, 0xf4,
688 0x2d, 0x46, 0x6e, 0x1d, 0x97, 0xe8, 0xd1, 0xe9,
689 0x4d, 0x37, 0xa5, 0x75, 0x5e, 0x83, 0x9e, 0xab,
690 0x82, 0x9d, 0xb9, 0x1c, 0xe0, 0xcd, 0x49, 0x89,
691 0x01, 0xb6, 0xbd, 0x58, 0x24, 0xa2, 0x5f, 0x38,
692 0x78, 0x99, 0x15, 0x90, 0x50, 0xb8, 0x95, 0xe4,
693 0xd0, 0x91, 0xc7, 0xce, 0xed, 0x0f, 0xb4, 0x6f,
694 0xa0, 0xcc, 0xf0, 0x02, 0x4a, 0x79, 0xc3, 0xde,
695 0xa3, 0xef, 0xea, 0x51, 0xe6, 0x6b, 0x18, 0xec,
696 0x1b, 0x2c, 0x80, 0xf7, 0x74, 0xe7, 0xff, 0x21,
697 0x5a, 0x6a, 0x54, 0x1e, 0x41, 0x31, 0x92, 0x35,
698 0xc4, 0x33, 0x07, 0x0a, 0xba, 0x7e, 0x0e, 0x34,
699 0x88, 0xb1, 0x98, 0x7c, 0xf3, 0x3d, 0x60, 0x6c,
700 0x7b, 0xca, 0xd3, 0x1f, 0x32, 0x65, 0x04, 0x28,
701 0x64, 0xbe, 0x85, 0x9b, 0x2f, 0x59, 0x8a, 0xd7,
702 0xb0, 0x25, 0xac, 0xaf, 0x12, 0x03, 0xe2, 0xf2,
703 };
704
705 static uint32_t octeon_zuc_addm(uint32_t a, uint32_t b)
706 {
707 uint32_t c = a + b;
708
709 c = (c & 0x7fffffffU) + (c >> 31);
710 return c ? c : 0x7fffffffU;
711 }
712
713 static uint32_t octeon_zuc_mul_by_pow2(uint32_t v, unsigned int shift)
714 {
715 return ((v << shift) | (v >> (31 - shift))) & 0x7fffffffU;
716 }
717
718 static uint32_t octeon_zuc_make_u32(uint8_t a, uint8_t b, uint8_t c, uint8_t d)
719 {
720 return ((uint32_t)a << 24) | ((uint32_t)b << 16) |
721 ((uint32_t)c << 8) | d;
722 }
723
724 static uint64_t octeon_zuc_pack_pair(uint32_t hi, uint32_t lo)
725 {
726 return ((uint64_t)hi << 32) | lo;
727 }
728
729 static uint32_t octeon_zuc_lfsr(const MIPSOcteonCryptoState *crypto,
730 unsigned int index)
731 {
732 uint64_t pair = crypto->hsh_dat[index / 2];
733
734 return index & 1 ? octeon_crypto_lo32(pair) : octeon_crypto_hi32(pair);
735 }
736
737 static void octeon_zuc_set_lfsr(MIPSOcteonCryptoState *crypto,
738 unsigned int index, uint32_t value)
739 {
740 uint32_t hi = octeon_crypto_hi32(crypto->hsh_dat[index / 2]);
741 uint32_t lo = octeon_crypto_lo32(crypto->hsh_dat[index / 2]);
742
743 value &= 0x7fffffffU;
744 if (index & 1) {
745 lo = value;
746 } else {
747 hi = value;
748 }
749 crypto->hsh_dat[index / 2] = octeon_zuc_pack_pair(hi, lo);
750 }
751
752 static uint32_t octeon_zuc_fsm(const MIPSOcteonCryptoState *crypto,
753 unsigned int index)
754 {
755 g_assert(index < 2);
756 return crypto->hsh_iv[1 + index];
757 }
758
759 static void octeon_zuc_set_fsm(MIPSOcteonCryptoState *crypto,
760 unsigned int index, uint32_t value)
761 {
762 g_assert(index < 2);
763 crypto->hsh_iv[1 + index] = value;
764 }
765
766 static uint32_t octeon_zuc_window(const MIPSOcteonCryptoState *crypto,
767 unsigned int index)
768 {
769 uint64_t pair = crypto->hsh_iv[0];
770
771 switch (index) {
772 case 0:
773 return octeon_crypto_hi32(pair);
774 case 1:
775 return octeon_crypto_lo32(pair);
776 default:
777 g_assert_not_reached();
778 }
779 }
780
781 static void octeon_zuc_set_window_pair(MIPSOcteonCryptoState *crypto,
782 uint32_t hi, uint32_t lo)
783 {
784 crypto->hsh_iv[0] = octeon_zuc_pack_pair(hi, lo);
785 }
786
787 static uint32_t octeon_zuc_tresult(const MIPSOcteonCryptoState *crypto)
788 {
789 return crypto->hsh_iv[3];
790 }
791
792 static void octeon_zuc_set_tresult(MIPSOcteonCryptoState *crypto,
793 uint32_t value)
794 {
795 crypto->hsh_iv[3] = value;
796 }
797
798 static void octeon_zuc_bit_reorganization(const MIPSOcteonCryptoState *crypto,
799 uint32_t x[4])
800 {
801 x[0] = ((octeon_zuc_lfsr(crypto, 15) & 0x7fff8000U) << 1) |
802 (octeon_zuc_lfsr(crypto, 14) & 0xffffU);
803 x[1] = ((octeon_zuc_lfsr(crypto, 11) & 0xffffU) << 16) |
804 (octeon_zuc_lfsr(crypto, 9) >> 15);
805 x[2] = ((octeon_zuc_lfsr(crypto, 7) & 0xffffU) << 16) |
806 (octeon_zuc_lfsr(crypto, 5) >> 15);
807 x[3] = ((octeon_zuc_lfsr(crypto, 2) & 0xffffU) << 16) |
808 (octeon_zuc_lfsr(crypto, 0) >> 15);
809 }
810
811 static uint32_t octeon_zuc_l1(uint32_t x)
812 {
813 return x ^ rol32(x, 2) ^ rol32(x, 10) ^ rol32(x, 18) ^ rol32(x, 24);
814 }
815
816 static uint32_t octeon_zuc_l2(uint32_t x)
817 {
818 return x ^ rol32(x, 8) ^ rol32(x, 14) ^ rol32(x, 22) ^ rol32(x, 30);
819 }
820
821 static uint32_t octeon_zuc_f(MIPSOcteonCryptoState *crypto, const uint32_t x[4])
822 {
823 uint32_t fsm0 = octeon_zuc_fsm(crypto, 0);
824 uint32_t fsm1 = octeon_zuc_fsm(crypto, 1);
825 uint32_t w = (x[0] ^ fsm0) + fsm1;
826 uint32_t w1 = fsm0 + x[1];
827 uint32_t w2 = fsm1 ^ x[2];
828 uint32_t u = octeon_zuc_l1((w1 << 16) | (w2 >> 16));
829 uint32_t v = octeon_zuc_l2((w2 << 16) | (w1 >> 16));
830
831 octeon_zuc_set_fsm(crypto, 0,
832 octeon_zuc_make_u32(octeon_zuc_s0[u >> 24],
833 octeon_zuc_s1[(uint8_t)(u >> 16)],
834 octeon_zuc_s0[(uint8_t)(u >> 8)],
835 octeon_zuc_s1[(uint8_t)u]));
836 octeon_zuc_set_fsm(crypto, 1,
837 octeon_zuc_make_u32(octeon_zuc_s0[v >> 24],
838 octeon_zuc_s1[(uint8_t)(v >> 16)],
839 octeon_zuc_s0[(uint8_t)(v >> 8)],
840 octeon_zuc_s1[(uint8_t)v]));
841 return w;
842 }
843
844 static void octeon_zuc_lfsr_step(MIPSOcteonCryptoState *crypto,
845 bool init_mode, uint32_t u)
846 {
847 uint32_t lfsr[16];
848 uint32_t f;
849
850 for (int i = 0; i < 16; i++) {
851 lfsr[i] = octeon_zuc_lfsr(crypto, i);
852 }
853
854 f = lfsr[0];
855 f = octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(lfsr[0], 8));
856 f = octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(lfsr[4], 20));
857 f = octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(lfsr[10], 21));
858 f = octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(lfsr[13], 17));
859 f = octeon_zuc_addm(f, octeon_zuc_mul_by_pow2(lfsr[15], 15));
860 if (init_mode) {
861 f = octeon_zuc_addm(f, u);
862 }
863
864 for (int i = 0; i < 15; i++) {
865 octeon_zuc_set_lfsr(crypto, i, lfsr[i + 1]);
866 }
867 octeon_zuc_set_lfsr(crypto, 15, f);
868 }
869
870 static uint32_t octeon_zuc_generate_word(MIPSOcteonCryptoState *crypto)
871 {
872 uint32_t x[4];
873 uint32_t z;
874
875 octeon_zuc_bit_reorganization(crypto, x);
876 z = octeon_zuc_f(crypto, x) ^ x[3];
877 octeon_zuc_lfsr_step(crypto, false, 0);
878 return z;
879 }
880
881 static void octeon_zuc_fill_window_pair(MIPSOcteonCryptoState *crypto)
882 {
883 uint32_t z0 = octeon_zuc_generate_word(crypto);
884 uint32_t z1 = octeon_zuc_generate_word(crypto);
885
886 octeon_zuc_set_window_pair(crypto, z0, z1);
887 }
888
889 static uint32_t
890 octeon_zuc_window_word(const MIPSOcteonCryptoState *crypto, unsigned int bit,
891 uint32_t z2)
892 {
893 if (bit == 0) {
894 return octeon_zuc_window(crypto, 0);
895 }
896 if (bit < 32) {
897 return (octeon_zuc_window(crypto, 0) << bit) |
898 (octeon_zuc_window(crypto, 1) >> (32 - bit));
899 }
900 if (bit == 32) {
901 return octeon_zuc_window(crypto, 1);
902 }
903 return (octeon_zuc_window(crypto, 1) << (bit - 32)) |
904 (z2 >> (64 - bit));
905 }
906
907 static void octeon_zuc_advance_window(MIPSOcteonCryptoState *crypto,
908 uint32_t z2)
909 {
910 uint32_t z3 = octeon_zuc_generate_word(crypto);
911
912 octeon_zuc_set_window_pair(crypto, z2, z3);
913 }
914
915 static void octeon_zuc_start(MIPSOcteonCryptoState *crypto, uint64_t data)
916 {
917 uint32_t x[4];
918
919 for (int i = 0; i < 14; i++) {
920 octeon_zuc_set_lfsr(crypto, i, octeon_zuc_lfsr(crypto, i));
921 }
922 octeon_zuc_set_lfsr(crypto, 14, data >> 32);
923 octeon_zuc_set_lfsr(crypto, 15, data);
924 octeon_zuc_set_fsm(crypto, 0, 0);
925 octeon_zuc_set_fsm(crypto, 1, 0);
926 octeon_zuc_set_tresult(crypto, 0);
927
928 for (int i = 0; i < 32; i++) {
929 octeon_zuc_bit_reorganization(crypto, x);
930 octeon_zuc_lfsr_step(crypto, true, octeon_zuc_f(crypto, x) >> 1);
931 }
932
933 octeon_zuc_bit_reorganization(crypto, x);
934 (void)octeon_zuc_f(crypto, x);
935 octeon_zuc_lfsr_step(crypto, false, 0);
936 octeon_zuc_fill_window_pair(crypto);
937 }
938
939 static void octeon_zuc_more(MIPSOcteonCryptoState *crypto, uint64_t data)
940 {
941 uint32_t t = octeon_zuc_tresult(crypto);
942 uint32_t z2 = octeon_zuc_generate_word(crypto);
943
944 for (unsigned int bit = 0; bit < 64; bit++) {
945 if ((data >> (63 - bit)) & 1) {
946 t ^= octeon_zuc_window_word(crypto, bit, z2);
947 }
948 }
949 octeon_zuc_set_tresult(crypto, t);
950 octeon_zuc_advance_window(crypto, z2);
951 }
952
953 static const uint8_t octeon_snow3g_sr[256] = {
954 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
955 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
956 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
957 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
958 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
959 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
960 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
961 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
962 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
963 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
964 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
965 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
966 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
967 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
968 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
969 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
970 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
971 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
972 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
973 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
974 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
975 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
976 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
977 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
978 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
979 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
980 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
981 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
982 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
983 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
984 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
985 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16,
986 };
987
988 static const uint8_t octeon_snow3g_sq[256] = {
989 0x25, 0x24, 0x73, 0x67, 0xd7, 0xae, 0x5c, 0x30,
990 0xa4, 0xee, 0x6e, 0xcb, 0x7d, 0xb5, 0x82, 0xdb,
991 0xe4, 0x8e, 0x48, 0x49, 0x4f, 0x5d, 0x6a, 0x78,
992 0x70, 0x88, 0xe8, 0x5f, 0x5e, 0x84, 0x65, 0xe2,
993 0xd8, 0xe9, 0xcc, 0xed, 0x40, 0x2f, 0x11, 0x28,
994 0x57, 0xd2, 0xac, 0xe3, 0x4a, 0x15, 0x1b, 0xb9,
995 0xb2, 0x80, 0x85, 0xa6, 0x2e, 0x02, 0x47, 0x29,
996 0x07, 0x4b, 0x0e, 0xc1, 0x51, 0xaa, 0x89, 0xd4,
997 0xca, 0x01, 0x46, 0xb3, 0xef, 0xdd, 0x44, 0x7b,
998 0xc2, 0x7f, 0xbe, 0xc3, 0x9f, 0x20, 0x4c, 0x64,
999 0x83, 0xa2, 0x68, 0x42, 0x13, 0xb4, 0x41, 0xcd,
1000 0xba, 0xc6, 0xbb, 0x6d, 0x4d, 0x71, 0x21, 0xf4,
1001 0x8d, 0xb0, 0xe5, 0x93, 0xfe, 0x8f, 0xe6, 0xcf,
1002 0x43, 0x45, 0x31, 0x22, 0x37, 0x36, 0x96, 0xfa,
1003 0xbc, 0x0f, 0x08, 0x52, 0x1d, 0x55, 0x1a, 0xc5,
1004 0x4e, 0x23, 0x69, 0x7a, 0x92, 0xff, 0x5b, 0x5a,
1005 0xeb, 0x9a, 0x1c, 0xa9, 0xd1, 0x7e, 0x0d, 0xfc,
1006 0x50, 0x8a, 0xb6, 0x62, 0xf5, 0x0a, 0xf8, 0xdc,
1007 0x03, 0x3c, 0x0c, 0x39, 0xf1, 0xb8, 0xf3, 0x3d,
1008 0xf2, 0xd5, 0x97, 0x66, 0x81, 0x32, 0xa0, 0x00,
1009 0x06, 0xce, 0xf6, 0xea, 0xb7, 0x17, 0xf7, 0x8c,
1010 0x79, 0xd6, 0xa7, 0xbf, 0x8b, 0x3f, 0x1f, 0x53,
1011 0x63, 0x75, 0x35, 0x2c, 0x60, 0xfd, 0x27, 0xd3,
1012 0x94, 0xa5, 0x7c, 0xa1, 0x05, 0x58, 0x2d, 0xbd,
1013 0xd9, 0xc7, 0xaf, 0x6b, 0x54, 0x0b, 0xe0, 0x38,
1014 0x04, 0xc8, 0x9d, 0xe7, 0x14, 0xb1, 0x87, 0x9c,
1015 0xdf, 0x6f, 0xf9, 0xda, 0x2a, 0xc4, 0x59, 0x16,
1016 0x74, 0x91, 0xab, 0x26, 0x61, 0x76, 0x34, 0x2b,
1017 0xad, 0x99, 0xfb, 0x72, 0xec, 0x33, 0x12, 0xde,
1018 0x98, 0x3b, 0xc0, 0x9b, 0x3e, 0x18, 0x10, 0x3a,
1019 0x56, 0xe1, 0x77, 0xc9, 0x1e, 0x9e, 0x95, 0xa3,
1020 0x90, 0x19, 0xa8, 0x6c, 0x09, 0xd0, 0xf0, 0x86,
1021 };
1022
1023 static uint8_t octeon_snow3g_mulx(uint8_t v, uint8_t c)
1024 {
1025 return (v & 0x80) ? ((v << 1) ^ c) : (v << 1);
1026 }
1027
1028 static uint8_t octeon_snow3g_mulxpow(uint8_t v, unsigned int n, uint8_t c)
1029 {
1030 while (n-- > 0) {
1031 v = octeon_snow3g_mulx(v, c);
1032 }
1033 return v;
1034 }
1035
1036 static uint32_t octeon_snow3g_pack32(uint8_t b0, uint8_t b1,
1037 uint8_t b2, uint8_t b3)
1038 {
1039 return ((uint32_t)b0 << 24)
1040 | ((uint32_t)b1 << 16)
1041 | ((uint32_t)b2 << 8)
1042 | b3;
1043 }
1044
1045 static uint32_t octeon_snow3g_mulalpha(uint8_t c)
1046 {
1047 return octeon_snow3g_pack32(octeon_snow3g_mulxpow(c, 23, 0xa9),
1048 octeon_snow3g_mulxpow(c, 245, 0xa9),
1049 octeon_snow3g_mulxpow(c, 48, 0xa9),
1050 octeon_snow3g_mulxpow(c, 239, 0xa9));
1051 }
1052
1053 static uint32_t octeon_snow3g_divalpha(uint8_t c)
1054 {
1055 return octeon_snow3g_pack32(octeon_snow3g_mulxpow(c, 16, 0xa9),
1056 octeon_snow3g_mulxpow(c, 39, 0xa9),
1057 octeon_snow3g_mulxpow(c, 6, 0xa9),
1058 octeon_snow3g_mulxpow(c, 64, 0xa9));
1059 }
1060
1061 static uint32_t octeon_snow3g_s1(uint32_t w)
1062 {
1063 uint8_t x0 = octeon_snow3g_sr[w >> 24];
1064 uint8_t x1 = octeon_snow3g_sr[(uint8_t)(w >> 16)];
1065 uint8_t x2 = octeon_snow3g_sr[(uint8_t)(w >> 8)];
1066 uint8_t x3 = octeon_snow3g_sr[(uint8_t)w];
1067 uint8_t r0 = octeon_snow3g_mulx(x0, 0x1b) ^ x1 ^ x2 ^
1068 octeon_snow3g_mulx(x3, 0x1b) ^ x3;
1069 uint8_t r1 = octeon_snow3g_mulx(x0, 0x1b) ^ x0 ^
1070 octeon_snow3g_mulx(x1, 0x1b) ^ x2 ^ x3;
1071 uint8_t r2 = x0 ^ octeon_snow3g_mulx(x1, 0x1b) ^ x1 ^
1072 octeon_snow3g_mulx(x2, 0x1b) ^ x3;
1073 uint8_t r3 = x0 ^ x1 ^ octeon_snow3g_mulx(x2, 0x1b) ^ x2 ^
1074 octeon_snow3g_mulx(x3, 0x1b);
1075
1076 return octeon_snow3g_pack32(r0, r1, r2, r3);
1077 }
1078
1079 static uint32_t octeon_snow3g_s2(uint32_t w)
1080 {
1081 uint8_t x0 = octeon_snow3g_sq[w >> 24];
1082 uint8_t x1 = octeon_snow3g_sq[(uint8_t)(w >> 16)];
1083 uint8_t x2 = octeon_snow3g_sq[(uint8_t)(w >> 8)];
1084 uint8_t x3 = octeon_snow3g_sq[(uint8_t)w];
1085 uint8_t r0 = octeon_snow3g_mulx(x0, 0x69) ^ x1 ^ x2 ^
1086 octeon_snow3g_mulx(x3, 0x69) ^ x3;
1087 uint8_t r1 = octeon_snow3g_mulx(x0, 0x69) ^ x0 ^
1088 octeon_snow3g_mulx(x1, 0x69) ^ x2 ^ x3;
1089 uint8_t r2 = x0 ^ octeon_snow3g_mulx(x1, 0x69) ^ x1 ^
1090 octeon_snow3g_mulx(x2, 0x69) ^ x3;
1091 uint8_t r3 = x0 ^ x1 ^ octeon_snow3g_mulx(x2, 0x69) ^ x2 ^
1092 octeon_snow3g_mulx(x3, 0x69);
1093
1094 return octeon_snow3g_pack32(r0, r1, r2, r3);
1095 }
1096
1097 static uint32_t octeon_snow3g_lfsr(const MIPSOcteonCryptoState *crypto,
1098 unsigned int index)
1099 {
1100 uint64_t pair = crypto->hsh_dat[index / 2];
1101
1102 return index & 1 ? octeon_crypto_lo32(pair) : octeon_crypto_hi32(pair);
1103 }
1104
1105 static void octeon_snow3g_set_lfsr(MIPSOcteonCryptoState *crypto,
1106 unsigned int index, uint32_t value)
1107 {
1108 uint32_t hi = octeon_crypto_hi32(crypto->hsh_dat[index / 2]);
1109 uint32_t lo = octeon_crypto_lo32(crypto->hsh_dat[index / 2]);
1110
1111 if (index & 1) {
1112 lo = value;
1113 } else {
1114 hi = value;
1115 }
1116 crypto->hsh_dat[index / 2] = octeon_crypto_pack32(hi, lo);
1117 }
1118
1119 static uint32_t octeon_snow3g_fsm(const MIPSOcteonCryptoState *crypto,
1120 unsigned int index)
1121 {
1122 return crypto->hsh_iv[1 + index];
1123 }
1124
1125 static void octeon_snow3g_set_fsm(MIPSOcteonCryptoState *crypto,
1126 unsigned int index, uint32_t value)
1127 {
1128 crypto->hsh_iv[1 + index] = value;
1129 }
1130
1131 static uint32_t octeon_snow3g_clock_fsm(MIPSOcteonCryptoState *crypto)
1132 {
1133 uint32_t fsm0 = octeon_snow3g_fsm(crypto, 0);
1134 uint32_t fsm1 = octeon_snow3g_fsm(crypto, 1);
1135 uint32_t fsm2 = octeon_snow3g_fsm(crypto, 2);
1136 uint32_t f = (uint32_t)(octeon_snow3g_lfsr(crypto, 15) + fsm0) ^ fsm1;
1137 uint32_t r = (uint32_t)(fsm1 + (fsm2 ^ octeon_snow3g_lfsr(crypto, 5)));
1138
1139 octeon_snow3g_set_fsm(crypto, 2, octeon_snow3g_s2(fsm1));
1140 octeon_snow3g_set_fsm(crypto, 1, octeon_snow3g_s1(fsm0));
1141 octeon_snow3g_set_fsm(crypto, 0, r);
1142 return f;
1143 }
1144
1145 static void octeon_snow3g_clock_lfsr(MIPSOcteonCryptoState *crypto,
1146 bool init_mode, uint32_t f)
1147 {
1148 uint32_t lfsr[16];
1149 uint32_t s0;
1150 uint32_t s11;
1151 uint32_t v;
1152 int i;
1153
1154 for (i = 0; i < 16; i++) {
1155 lfsr[i] = octeon_snow3g_lfsr(crypto, i);
1156 }
1157
1158 s0 = lfsr[0];
1159 s11 = lfsr[11];
1160 v = (s0 << 8) ^ octeon_snow3g_mulalpha(s0 >> 24) ^
1161 lfsr[2] ^ (s11 >> 8) ^ octeon_snow3g_divalpha((uint8_t)s11);
1162
1163 if (init_mode) {
1164 v ^= f;
1165 }
1166
1167 for (i = 0; i < 15; i++) {
1168 octeon_snow3g_set_lfsr(crypto, i, lfsr[i + 1]);
1169 }
1170 octeon_snow3g_set_lfsr(crypto, 15, v);
1171 }
1172
1173 static uint32_t octeon_snow3g_generate_word(MIPSOcteonCryptoState *crypto)
1174 {
1175 uint32_t f = octeon_snow3g_clock_fsm(crypto);
1176 uint32_t z = f ^ octeon_snow3g_lfsr(crypto, 0);
1177
1178 octeon_snow3g_clock_lfsr(crypto, false, 0);
1179 return z;
1180 }
1181
1182 static void octeon_snow3g_queue_result(MIPSOcteonCryptoState *crypto)
1183 {
1184 uint32_t z0 = octeon_snow3g_generate_word(crypto);
1185 uint32_t z1 = octeon_snow3g_generate_word(crypto);
1186
1187 crypto->hsh_iv[0] = octeon_crypto_pack32(z0, z1);
1188 }
1189
1190 static void octeon_snow3g_start(MIPSOcteonCryptoState *crypto, uint64_t data)
1191 {
1192 int i;
1193
1194 for (i = 0; i < 14; i++) {
1195 octeon_snow3g_set_lfsr(crypto, i, octeon_snow3g_lfsr(crypto, i));
1196 }
1197 octeon_snow3g_set_lfsr(crypto, 14, data >> 32);
1198 octeon_snow3g_set_lfsr(crypto, 15, data);
1199 for (i = 0; i < 3; i++) {
1200 octeon_snow3g_set_fsm(crypto, i, 0);
1201 }
1202
1203 for (i = 0; i < 32; i++) {
1204 uint32_t f = octeon_snow3g_clock_fsm(crypto);
1205
1206 octeon_snow3g_clock_lfsr(crypto, true, f);
1207 }
1208
1209 (void)octeon_snow3g_clock_fsm(crypto);
1210 octeon_snow3g_clock_lfsr(crypto, false, 0);
1211 octeon_snow3g_queue_result(crypto);
1212 }
1213
1214 static void octeon_snow3g_more(MIPSOcteonCryptoState *crypto)
1215 {
1216 octeon_snow3g_queue_result(crypto);
1217 }
1218
1219 static int octeon_aes_key_bits(const MIPSOcteonCryptoState *crypto)
1220 {
1221 enum {
1222 OCTEON_AES_KEYLEN_128 = 1,
1223 OCTEON_AES_KEYLEN_192 = 2,
1224 OCTEON_AES_KEYLEN_256 = 3,
1225 };
1226
1227 switch (crypto->aes_keylen) {
1228 case OCTEON_AES_KEYLEN_128:
1229 return 128;
1230 case OCTEON_AES_KEYLEN_192:
1231 return 192;
1232 case OCTEON_AES_KEYLEN_256:
1233 return 256;
1234 default:
1235 return 0;
1236 }
1237 }
1238
1239 static void octeon_aes_load_key(const MIPSOcteonCryptoState *crypto,
1240 uint8_t *key, size_t keylen)
1241 {
1242 stq_be_p(key, crypto->aes_key[0]);
1243 stq_be_p(key + 8, crypto->aes_key[1]);
1244 if (keylen > 16) {
1245 stq_be_p(key + 16, crypto->aes_key[2]);
1246 }
1247 if (keylen > 24) {
1248 stq_be_p(key + 24, crypto->aes_key[3]);
1249 }
1250 }
1251
1252 static void octeon_aes_load_block(const uint64_t regs[2], uint8_t *block)
1253 {
1254 stq_be_p(block, regs[0]);
1255 stq_be_p(block + 8, regs[1]);
1256 }
1257
1258 static void octeon_aes_store_block(uint64_t regs[2], const uint8_t *block)
1259 {
1260 regs[0] = ldq_be_p(block);
1261 regs[1] = ldq_be_p(block + 8);
1262 }
1263
1264 static void octeon_aes_encrypt_common(MIPSOcteonCryptoState *crypto, bool cbc)
1265 {
1266 AES_KEY key;
1267 uint8_t in[16];
1268 uint8_t out[16];
1269 uint8_t iv[16];
1270 uint8_t raw_key[32] = {};
1271 int bits = octeon_aes_key_bits(crypto);
1272
1273 if (!bits) {
1274 return;
1275 }
1276
1277 octeon_aes_load_key(crypto, raw_key, bits / 8);
1278 octeon_aes_load_block(crypto->aes_resinp, in);
1279 if (cbc) {
1280 int i;
1281
1282 octeon_aes_load_block(crypto->aes_iv, iv);
1283 for (i = 0; i < sizeof(in); i++) {
1284 in[i] ^= iv[i];
1285 }
1286 }
1287
1288 AES_set_encrypt_key(raw_key, bits, &key);
1289 AES_encrypt(in, out, &key);
1290 octeon_aes_store_block(crypto->aes_resinp, out);
1291 if (cbc) {
1292 octeon_aes_store_block(crypto->aes_iv, out);
1293 }
1294 }
1295
1296 static void octeon_aes_decrypt_common(MIPSOcteonCryptoState *crypto, bool cbc)
1297 {
1298 AES_KEY key;
1299 uint8_t in[16];
1300 uint8_t out[16];
1301 uint8_t iv[16];
1302 uint8_t next_iv[16];
1303 uint8_t raw_key[32] = {};
1304 int bits = octeon_aes_key_bits(crypto);
1305 int i;
1306
1307 if (!bits) {
1308 return;
1309 }
1310
1311 octeon_aes_load_key(crypto, raw_key, bits / 8);
1312 octeon_aes_load_block(crypto->aes_resinp, in);
1313 if (cbc) {
1314 memcpy(next_iv, in, sizeof(next_iv));
1315 octeon_aes_load_block(crypto->aes_iv, iv);
1316 }
1317
1318 AES_set_decrypt_key(raw_key, bits, &key);
1319 AES_decrypt(in, out, &key);
1320 if (cbc) {
1321 for (i = 0; i < sizeof(out); i++) {
1322 out[i] ^= iv[i];
1323 }
1324 }
1325
1326 octeon_aes_store_block(crypto->aes_resinp, out);
1327 if (cbc) {
1328 octeon_aes_store_block(crypto->aes_iv, next_iv);
1329 }
1330 }
1331
1332 void helper_octeon_cp2_mt_aes_enc_cbc1(CPUMIPSState *env, uint64_t value)
1333 {
1334 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1335
1336 crypto->aes_resinp[1] = value;
1337 octeon_aes_encrypt_common(crypto, true);
1338 }
1339
1340 void helper_octeon_cp2_mt_aes_enc1(CPUMIPSState *env, uint64_t value)
1341 {
1342 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1343
1344 crypto->aes_resinp[1] = value;
1345 octeon_aes_encrypt_common(crypto, false);
1346 }
1347
1348 void helper_octeon_cp2_mt_aes_dec_cbc1(CPUMIPSState *env, uint64_t value)
1349 {
1350 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1351
1352 crypto->aes_resinp[1] = value;
1353 octeon_aes_decrypt_common(crypto, true);
1354 }
1355
1356 void helper_octeon_cp2_mt_aes_dec1(CPUMIPSState *env, uint64_t value)
1357 {
1358 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1359
1360 crypto->aes_resinp[1] = value;
1361 octeon_aes_decrypt_common(crypto, false);
1362 }
1363
1364 static uint32_t octeon_sms4_t(uint32_t x)
1365 {
1366 x = sm4_subword(x);
1367 return x ^ rol32(x, 2) ^ rol32(x, 10) ^ rol32(x, 18) ^ rol32(x, 24);
1368 }
1369
1370 static uint32_t octeon_sms4_t_key(uint32_t x)
1371 {
1372 x = sm4_subword(x);
1373 return x ^ rol32(x, 13) ^ rol32(x, 23);
1374 }
1375
1376 static void octeon_sms4_expand_key(const uint8_t *key, uint32_t round_keys[32])
1377 {
1378 static const uint32_t fk[4] = {
1379 0xa3b1bac6U, 0x56aa3350U, 0x677d9197U, 0xb27022dcU,
1380 };
1381 uint32_t k[36];
1382
1383 for (int i = 0; i < 4; i++) {
1384 k[i] = ldl_be_p(key + i * 4) ^ fk[i];
1385 }
1386 for (int i = 0; i < 32; i++) {
1387 k[i + 4] = k[i] ^ octeon_sms4_t_key(k[i + 1] ^ k[i + 2] ^
1388 k[i + 3] ^ sm4_ck[i]);
1389 round_keys[i] = k[i + 4];
1390 }
1391 }
1392
1393 static void octeon_sms4_crypt_block(const uint8_t *in, uint8_t *out,
1394 const uint32_t round_keys[32],
1395 bool encrypt)
1396 {
1397 uint32_t x[36];
1398
1399 for (int i = 0; i < 4; i++) {
1400 x[i] = ldl_be_p(in + i * 4);
1401 }
1402 for (int i = 0; i < 32; i++) {
1403 uint32_t rk = round_keys[encrypt ? i : 31 - i];
1404
1405 x[i + 4] = x[i] ^ octeon_sms4_t(x[i + 1] ^ x[i + 2] ^
1406 x[i + 3] ^ rk);
1407 }
1408 stl_be_p(out, x[35]);
1409 stl_be_p(out + 4, x[34]);
1410 stl_be_p(out + 8, x[33]);
1411 stl_be_p(out + 12, x[32]);
1412 }
1413
1414 static void octeon_sms4_crypt_common(MIPSOcteonCryptoState *crypto,
1415 bool encrypt, bool cbc)
1416 {
1417 uint8_t key[16];
1418 uint8_t in[16];
1419 uint8_t out[16];
1420 uint8_t iv[16];
1421 uint8_t next_iv[16];
1422 uint32_t round_keys[32];
1423
1424 /*
1425 * SMS4 aliases the AES state onto the RESINP, IV, and KEY banks,
1426 * with only the operation selectors remaining distinct.
1427 */
1428 octeon_aes_load_key(crypto, key, sizeof(key));
1429 octeon_aes_load_block(crypto->aes_resinp, in);
1430 if (cbc) {
1431 octeon_aes_load_block(crypto->aes_iv, iv);
1432 if (encrypt) {
1433 for (int i = 0; i < sizeof(in); i++) {
1434 in[i] ^= iv[i];
1435 }
1436 } else {
1437 memcpy(next_iv, in, sizeof(next_iv));
1438 }
1439 }
1440
1441 octeon_sms4_expand_key(key, round_keys);
1442 octeon_sms4_crypt_block(in, out, round_keys, encrypt);
1443 if (cbc && !encrypt) {
1444 for (int i = 0; i < sizeof(out); i++) {
1445 out[i] ^= iv[i];
1446 }
1447 }
1448
1449 octeon_aes_store_block(crypto->aes_resinp, out);
1450 if (cbc) {
1451 octeon_aes_store_block(crypto->aes_iv, encrypt ? out : next_iv);
1452 }
1453 }
1454
1455 void helper_octeon_cp2_mt_sms4_enc_cbc1(CPUMIPSState *env, uint64_t value)
1456 {
1457 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1458
1459 crypto->aes_resinp[1] = value;
1460 octeon_sms4_crypt_common(crypto, true, true);
1461 }
1462
1463 void helper_octeon_cp2_mt_sms4_enc1(CPUMIPSState *env, uint64_t value)
1464 {
1465 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1466
1467 crypto->aes_resinp[1] = value;
1468 octeon_sms4_crypt_common(crypto, true, false);
1469 }
1470
1471 void helper_octeon_cp2_mt_sms4_dec_cbc1(CPUMIPSState *env, uint64_t value)
1472 {
1473 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1474
1475 crypto->aes_resinp[1] = value;
1476 octeon_sms4_crypt_common(crypto, false, true);
1477 }
1478
1479 void helper_octeon_cp2_mt_sms4_dec1(CPUMIPSState *env, uint64_t value)
1480 {
1481 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
1482
1483 crypto->aes_resinp[1] = value;
1484 octeon_sms4_crypt_common(crypto, false, false);
1485 }
1486
1487 static const uint8_t octeon_des_ip[64] = {
1488 58, 50, 42, 34, 26, 18, 10, 2,
1489 60, 52, 44, 36, 28, 20, 12, 4,
1490 62, 54, 46, 38, 30, 22, 14, 6,
1491 64, 56, 48, 40, 32, 24, 16, 8,
1492 57, 49, 41, 33, 25, 17, 9, 1,
1493 59, 51, 43, 35, 27, 19, 11, 3,
1494 61, 53, 45, 37, 29, 21, 13, 5,
1495 63, 55, 47, 39, 31, 23, 15, 7,
1496 };
1497
1498 static const uint8_t octeon_des_fp[64] = {
1499 40, 8, 48, 16, 56, 24, 64, 32,
1500 39, 7, 47, 15, 55, 23, 63, 31,
1501 38, 6, 46, 14, 54, 22, 62, 30,
1502 37, 5, 45, 13, 53, 21, 61, 29,
1503 36, 4, 44, 12, 52, 20, 60, 28,
1504 35, 3, 43, 11, 51, 19, 59, 27,
1505 34, 2, 42, 10, 50, 18, 58, 26,
1506 33, 1, 41, 9, 49, 17, 57, 25,
1507 };
1508
1509 static const uint8_t octeon_des_e[48] = {
1510 32, 1, 2, 3, 4, 5,
1511 4, 5, 6, 7, 8, 9,
1512 8, 9, 10, 11, 12, 13,
1513 12, 13, 14, 15, 16, 17,
1514 16, 17, 18, 19, 20, 21,
1515 20, 21, 22, 23, 24, 25,
1516 24, 25, 26, 27, 28, 29,
1517 28, 29, 30, 31, 32, 1,
1518 };
1519
1520 static const uint8_t octeon_des_p[32] = {
1521 16, 7, 20, 21, 29, 12, 28, 17,
1522 1, 15, 23, 26, 5, 18, 31, 10,
1523 2, 8, 24, 14, 32, 27, 3, 9,
1524 19, 13, 30, 6, 22, 11, 4, 25,
1525 };
1526
1527 static const uint8_t octeon_des_pc1[56] = {
1528 57, 49, 41, 33, 25, 17, 9,
1529 1, 58, 50, 42, 34, 26, 18,
1530 10, 2, 59, 51, 43, 35, 27,
1531 19, 11, 3, 60, 52, 44, 36,
1532 63, 55, 47, 39, 31, 23, 15,
1533 7, 62, 54, 46, 38, 30, 22,
1534 14, 6, 61, 53, 45, 37, 29,
1535 21, 13, 5, 28, 20, 12, 4,
1536 };
1537
1538 static const uint8_t octeon_des_pc2[48] = {
1539 14, 17, 11, 24, 1, 5,
1540 3, 28, 15, 6, 21, 10,
1541 23, 19, 12, 4, 26, 8,
1542 16, 7, 27, 20, 13, 2,
1543 41, 52, 31, 37, 47, 55,
1544 30, 40, 51, 45, 33, 48,
1545 44, 49, 39, 56, 34, 53,
1546 46, 42, 50, 36, 29, 32,
1547 };
1548
1549 static const uint8_t octeon_des_rotations[16] = {
1550 1, 1, 2, 2, 2, 2, 2, 2,
1551 1, 2, 2, 2, 2, 2, 2, 1,
1552 };
1553
1554 static const uint8_t octeon_des_sboxes[8][64] = {
1555 {
1556 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
1557 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
1558 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
1559 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,
1560 },
1561 {
1562 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
1563 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
1564 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
1565 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,
1566 },
1567 {
1568 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
1569 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
1570 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1571 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,
1572 },
1573 {
1574 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
1575 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
1576 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
1577 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,
1578 },
1579 {
1580 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
1581 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
1582 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
1583 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,
1584 },
1585 {
1586 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
1587 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
1588 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
1589 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,
1590 },
1591 {
1592 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
1593 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1594 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
1595 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,
1596 },
1597 {
1598 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1599 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
1600 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
1601 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11,
1602 },
1603 };
1604
1605 static const uint8_t octeon_kasumi_s7[128] = {
1606 54, 50, 62, 56, 22, 34, 94, 96, 38, 6, 63, 93, 2, 18,
1607 123, 33, 55, 113, 39, 114, 21, 67, 65, 12, 47, 73, 46, 27,
1608 25, 111, 124, 81, 53, 9, 121, 79, 52, 60, 58, 48, 101, 127,
1609 40, 120, 104, 70, 71, 43, 20, 122, 72, 61, 23, 109, 13, 100,
1610 77, 1, 16, 7, 82, 10, 105, 98, 117, 116, 76, 11, 89, 106,
1611 0, 125, 118, 99, 86, 69, 30, 57, 126, 87, 112, 51, 17, 5,
1612 95, 14, 90, 84, 91, 8, 35, 103, 32, 97, 28, 66, 102, 31,
1613 26, 45, 75, 4, 85, 92, 37, 74, 80, 49, 68, 29, 115, 44,
1614 64, 107, 108, 24, 110, 83, 36, 78, 42, 19, 15, 41, 88, 119,
1615 59, 3,
1616 };
1617
1618 static const uint16_t octeon_kasumi_s9[512] = {
1619 167, 239, 161, 379, 391, 334, 9, 338, 38, 226, 48, 358, 452, 385,
1620 90, 397, 183, 253, 147, 331, 415, 340, 51, 362, 306, 500, 262, 82,
1621 216, 159, 356, 177, 175, 241, 489, 37, 206, 17, 0, 333, 44, 254,
1622 378, 58, 143, 220, 81, 400, 95, 3, 315, 245, 54, 235, 218, 405,
1623 472, 264, 172, 494, 371, 290, 399, 76, 165, 197, 395, 121, 257, 480,
1624 423, 212, 240, 28, 462, 176, 406, 507, 288, 223, 501, 407, 249, 265,
1625 89, 186, 221, 428, 164, 74, 440, 196, 458, 421, 350, 163, 232, 158,
1626 134, 354, 13, 250, 491, 142, 191, 69, 193, 425, 152, 227, 366, 135,
1627 344, 300, 276, 242, 437, 320, 113, 278, 11, 243, 87, 317, 36, 93,
1628 496, 27, 487, 446, 482, 41, 68, 156, 457, 131, 326, 403, 339, 20,
1629 39, 115, 442, 124, 475, 384, 508, 53, 112, 170, 479, 151, 126, 169,
1630 73, 268, 279, 321, 168, 364, 363, 292, 46, 499, 393, 327, 324, 24,
1631 456, 267, 157, 460, 488, 426, 309, 229, 439, 506, 208, 271, 349, 401,
1632 434, 236, 16, 209, 359, 52, 56, 120, 199, 277, 465, 416, 252, 287,
1633 246, 6, 83, 305, 420, 345, 153, 502, 65, 61, 244, 282, 173, 222,
1634 418, 67, 386, 368, 261, 101, 476, 291, 195, 430, 49, 79, 166, 330,
1635 280, 383, 373, 128, 382, 408, 155, 495, 367, 388, 274, 107, 459, 417,
1636 62, 454, 132, 225, 203, 316, 234, 14, 301, 91, 503, 286, 424, 211,
1637 347, 307, 140, 374, 35, 103, 125, 427, 19, 214, 453, 146, 498, 314,
1638 444, 230, 256, 329, 198, 285, 50, 116, 78, 410, 10, 205, 510, 171,
1639 231, 45, 139, 467, 29, 86, 505, 32, 72, 26, 342, 150, 313, 490,
1640 431, 238, 411, 325, 149, 473, 40, 119, 174, 355, 185, 233, 389, 71,
1641 448, 273, 372, 55, 110, 178, 322, 12, 469, 392, 369, 190, 1, 109,
1642 375, 137, 181, 88, 75, 308, 260, 484, 98, 272, 370, 275, 412, 111,
1643 336, 318, 4, 504, 492, 259, 304, 77, 337, 435, 21, 357, 303, 332,
1644 483, 18, 47, 85, 25, 497, 474, 289, 100, 269, 296, 478, 270, 106,
1645 31, 104, 433, 84, 414, 486, 394, 96, 99, 154, 511, 148, 413, 361,
1646 409, 255, 162, 215, 302, 201, 266, 351, 343, 144, 441, 365, 108, 298,
1647 251, 34, 182, 509, 138, 210, 335, 133, 311, 352, 328, 141, 396, 346,
1648 123, 319, 450, 281, 429, 228, 443, 481, 92, 404, 485, 422, 248, 297,
1649 23, 213, 130, 466, 22, 217, 283, 70, 294, 360, 419, 127, 312, 377,
1650 7, 468, 194, 2, 117, 295, 463, 258, 224, 447, 247, 187, 80, 398,
1651 284, 353, 105, 390, 299, 471, 470, 184, 57, 200, 348, 63, 204, 188,
1652 33, 451, 97, 30, 310, 219, 94, 160, 129, 493, 64, 179, 263, 102,
1653 189, 207, 114, 402, 438, 477, 387, 122, 192, 42, 381, 5, 145, 118,
1654 180, 449, 293, 323, 136, 380, 43, 66, 60, 455, 341, 445, 202, 432,
1655 8, 237, 15, 376, 436, 464, 59, 461,
1656 };
1657
1658 static const uint16_t octeon_kasumi_constants[8] = {
1659 0x0123, 0x4567, 0x89ab, 0xcdef, 0xfedc, 0xba98, 0x7654, 0x3210,
1660 };
1661
1662 typedef struct OcteonKasumiSubkeys {
1663 uint16_t kli1[8];
1664 uint16_t kli2[8];
1665 uint16_t koi1[8];
1666 uint16_t koi2[8];
1667 uint16_t koi3[8];
1668 uint16_t kii1[8];
1669 uint16_t kii2[8];
1670 uint16_t kii3[8];
1671 } OcteonKasumiSubkeys;
1672
1673 static uint64_t octeon_des_permute(uint64_t input, const uint8_t *table,
1674 size_t output_bits, size_t input_bits)
1675 {
1676 uint64_t out = 0;
1677
1678 for (size_t i = 0; i < output_bits; i++) {
1679 unsigned src = table[i] - 1;
1680
1681 out = (out << 1) | ((input >> (input_bits - 1 - src)) & 1);
1682 }
1683 return out;
1684 }
1685
1686 static uint32_t octeon_des_rotate28(uint32_t v, unsigned shift)
1687 {
1688 return ((v << shift) | (v >> (28 - shift))) & 0x0fffffffU;
1689 }
1690
1691 static void octeon_des_expand_subkeys(uint64_t key, uint64_t subkeys[16])
1692 {
1693 uint64_t permuted = octeon_des_permute(key, octeon_des_pc1,
1694 ARRAY_SIZE(octeon_des_pc1), 64);
1695 uint32_t c = (permuted >> 28) & 0x0fffffffU;
1696 uint32_t d = permuted & 0x0fffffffU;
1697
1698 for (int i = 0; i < 16; i++) {
1699 c = octeon_des_rotate28(c, octeon_des_rotations[i]);
1700 d = octeon_des_rotate28(d, octeon_des_rotations[i]);
1701 subkeys[i] = octeon_des_permute(((uint64_t)c << 28) | d,
1702 octeon_des_pc2,
1703 ARRAY_SIZE(octeon_des_pc2), 56);
1704 }
1705 }
1706
1707 static uint32_t octeon_des_f(uint32_t r, uint64_t subkey)
1708 {
1709 uint64_t expanded = octeon_des_permute(r, octeon_des_e,
1710 ARRAY_SIZE(octeon_des_e), 32);
1711 uint32_t out = 0;
1712
1713 expanded ^= subkey;
1714 for (int i = 0; i < 8; i++) {
1715 uint8_t sextet = (expanded >> (42 - i * 6)) & 0x3f;
1716 uint8_t row = ((sextet & 0x20) >> 4) | (sextet & 0x01);
1717 uint8_t col = (sextet >> 1) & 0x0f;
1718
1719 out = (out << 4) | octeon_des_sboxes[i][row * 16 + col];
1720 }
1721
1722 return octeon_des_permute(out, octeon_des_p, ARRAY_SIZE(octeon_des_p), 32);
1723 }
1724
1725 static uint64_t octeon_des_block_crypt(uint64_t block, uint64_t key,
1726 bool encrypt)
1727 {
1728 uint64_t subkeys[16];
1729 uint64_t permuted = octeon_des_permute(block, octeon_des_ip,
1730 ARRAY_SIZE(octeon_des_ip), 64);
1731 uint32_t l = permuted >> 32;
1732 uint32_t r = permuted;
1733
1734 octeon_des_expand_subkeys(key, subkeys);
1735
1736 for (int i = 0; i < 16; i++) {
1737 uint32_t next = l ^ octeon_des_f(r, subkeys[encrypt ? i : 15 - i]);
1738
1739 l = r;
1740 r = next;
1741 }
1742
1743 return octeon_des_permute(((uint64_t)r << 32) | l,
1744 octeon_des_fp, ARRAY_SIZE(octeon_des_fp), 64);
1745 }
1746
1747 static uint64_t octeon_3des_block_crypt(uint64_t block, const uint64_t keys[3],
1748 bool encrypt)
1749 {
1750 if (encrypt) {
1751 block = octeon_des_block_crypt(block, keys[0], true);
1752 block = octeon_des_block_crypt(block, keys[1], false);
1753 block = octeon_des_block_crypt(block, keys[2], true);
1754 } else {
1755 block = octeon_des_block_crypt(block, keys[2], false);
1756 block = octeon_des_block_crypt(block, keys[1], true);
1757 block = octeon_des_block_crypt(block, keys[0], false);
1758 }
1759 return block;
1760 }
1761
1762 static void octeon_3des_crypt_common(MIPSOcteonCryptoState *crypto,
1763 uint64_t input_reg,
1764 bool encrypt, bool cbc)
1765 {
1766 const uint64_t keys[3] = {
1767 crypto->des3_key[0],
1768 crypto->des3_key[1],
1769 crypto->des3_key[2],
1770 };
1771 uint64_t block = input_reg;
1772
1773 if (cbc) {
1774 if (encrypt) {
1775 block ^= crypto->des3_iv;
1776 block = octeon_3des_block_crypt(block, keys, true);
1777 crypto->des3_iv = block;
1778 } else {
1779 block = octeon_3des_block_crypt(block, keys, false);
1780 block ^= crypto->des3_iv;
1781 crypto->des3_iv = input_reg;
1782 }
1783 } else {
1784 block = octeon_3des_block_crypt(block, keys, encrypt);
1785 }
1786
1787 crypto->des3_result = block;
1788 }
1789
1790 static uint16_t octeon_rol16(uint16_t value, unsigned int bits)
1791 {
1792 return (value << bits) | (value >> (16 - bits));
1793 }
1794
1795 static void octeon_kasumi_key_schedule(const uint64_t key_regs[2],
1796 OcteonKasumiSubkeys *subkeys)
1797 {
1798 uint16_t key[8];
1799 uint16_t key_prime[8];
1800
1801 key[0] = key_regs[0] >> 48;
1802 key[1] = key_regs[0] >> 32;
1803 key[2] = key_regs[0] >> 16;
1804 key[3] = key_regs[0];
1805 key[4] = key_regs[1] >> 48;
1806 key[5] = key_regs[1] >> 32;
1807 key[6] = key_regs[1] >> 16;
1808 key[7] = key_regs[1];
1809
1810 for (int i = 0; i < 8; i++) {
1811 key_prime[i] = key[i] ^ octeon_kasumi_constants[i];
1812 }
1813
1814 for (int i = 0; i < 8; i++) {
1815 subkeys->kli1[i] = octeon_rol16(key[i], 1);
1816 subkeys->kli2[i] = key_prime[(i + 2) & 7];
1817 subkeys->koi1[i] = octeon_rol16(key[(i + 1) & 7], 5);
1818 subkeys->koi2[i] = octeon_rol16(key[(i + 5) & 7], 8);
1819 subkeys->koi3[i] = octeon_rol16(key[(i + 6) & 7], 13);
1820 subkeys->kii1[i] = key_prime[(i + 4) & 7];
1821 subkeys->kii2[i] = key_prime[(i + 3) & 7];
1822 subkeys->kii3[i] = key_prime[(i + 7) & 7];
1823 }
1824 }
1825
1826 static uint16_t octeon_kasumi_fi(uint16_t in, uint16_t subkey)
1827 {
1828 uint16_t nine = in >> 7;
1829 uint16_t seven = in & 0x7f;
1830
1831 nine = octeon_kasumi_s9[nine] ^ seven;
1832 seven = octeon_kasumi_s7[seven] ^ (nine & 0x7f);
1833 seven ^= subkey >> 9;
1834 nine ^= subkey & 0x1ff;
1835 nine = octeon_kasumi_s9[nine] ^ seven;
1836 seven = octeon_kasumi_s7[seven] ^ (nine & 0x7f);
1837 return (seven << 9) | nine;
1838 }
1839
1840 static uint32_t octeon_kasumi_fo(uint32_t in, int index,
1841 const OcteonKasumiSubkeys *subkeys)
1842 {
1843 uint16_t left = in >> 16;
1844 uint16_t right = in;
1845
1846 left ^= subkeys->koi1[index];
1847 left = octeon_kasumi_fi(left, subkeys->kii1[index]);
1848 left ^= right;
1849 right ^= subkeys->koi2[index];
1850 right = octeon_kasumi_fi(right, subkeys->kii2[index]);
1851 right ^= left;
1852 left ^= subkeys->koi3[index];
1853 left = octeon_kasumi_fi(left, subkeys->kii3[index]);
1854 left ^= right;
1855
1856 return ((uint32_t)right << 16) | left;
1857 }
1858
1859 static uint32_t octeon_kasumi_fl(uint32_t in, int index,
1860 const OcteonKasumiSubkeys *subkeys)
1861 {
1862 uint16_t left = in >> 16;
1863 uint16_t right = in;
1864 uint16_t a = left & subkeys->kli1[index];
1865 uint16_t b;
1866
1867 right ^= octeon_rol16(a, 1);
1868 b = right | subkeys->kli2[index];
1869 left ^= octeon_rol16(b, 1);
1870 return ((uint32_t)left << 16) | right;
1871 }
1872
1873 static uint64_t octeon_kasumi_block_encrypt(uint64_t block,
1874 const uint64_t key_regs[2])
1875 {
1876 OcteonKasumiSubkeys subkeys;
1877 uint32_t left = block >> 32;
1878 uint32_t right = block;
1879
1880 octeon_kasumi_key_schedule(key_regs, &subkeys);
1881
1882 for (int i = 0; i < 8; ) {
1883 uint32_t temp = octeon_kasumi_fl(left, i, &subkeys);
1884
1885 temp = octeon_kasumi_fo(temp, i++, &subkeys);
1886 right ^= temp;
1887 temp = octeon_kasumi_fo(right, i, &subkeys);
1888 temp = octeon_kasumi_fl(temp, i++, &subkeys);
1889 left ^= temp;
1890 }
1891
1892 return ((uint64_t)left << 32) | right;
1893 }
1894
1895 static void octeon_kasumi_crypt_common(MIPSOcteonCryptoState *crypto,
1896 uint64_t input_reg, bool cbc)
1897 {
1898 const uint64_t key_regs[2] = {
1899 crypto->des3_key[0],
1900 crypto->des3_key[1],
1901 };
1902 uint64_t block = input_reg;
1903
1904 if (cbc) {
1905 block ^= crypto->des3_iv;
1906 }
1907
1908 block = octeon_kasumi_block_encrypt(block, key_regs);
1909 if (cbc) {
1910 crypto->des3_iv = block;
1911 }
1912 crypto->des3_result = block;
1913 }
1914
1915 void helper_octeon_cp2_mt_des3_enc_cbc(CPUMIPSState *env, uint64_t value)
1916 {
1917 octeon_3des_crypt_common(&env->octeon_crypto, value, true, true);
1918 }
1919
1920 void helper_octeon_cp2_mt_kas_enc_cbc(CPUMIPSState *env, uint64_t value)
1921 {
1922 octeon_kasumi_crypt_common(&env->octeon_crypto, value, true);
1923 }
1924
1925 void helper_octeon_cp2_mt_des3_enc(CPUMIPSState *env, uint64_t value)
1926 {
1927 octeon_3des_crypt_common(&env->octeon_crypto, value, true, false);
1928 }
1929
1930 void helper_octeon_cp2_mt_kas_enc(CPUMIPSState *env, uint64_t value)
1931 {
1932 octeon_kasumi_crypt_common(&env->octeon_crypto, value, false);
1933 }
1934
1935 void helper_octeon_cp2_mt_des3_dec_cbc(CPUMIPSState *env, uint64_t value)
1936 {
1937 octeon_3des_crypt_common(&env->octeon_crypto, value, false, true);
1938 }
1939
1940 void helper_octeon_cp2_mt_des3_dec(CPUMIPSState *env, uint64_t value)
1941 {
1942 octeon_3des_crypt_common(&env->octeon_crypto, value, false, false);
1943 }
1944
1945 static const uint8_t camellia_sbox1[256] = {
1946 112, 130, 44, 236, 179, 39, 192, 229, 228, 133, 87, 53, 234, 12,
1947 174, 65, 35, 239, 107, 147, 69, 25, 165, 33, 237, 14, 79, 78,
1948 29, 101, 146, 189, 134, 184, 175, 143, 124, 235, 31, 206, 62, 48,
1949 220, 95, 94, 197, 11, 26, 166, 225, 57, 202, 213, 71, 93, 61,
1950 217, 1, 90, 214, 81, 86, 108, 77, 139, 13, 154, 102, 251, 204,
1951 176, 45, 116, 18, 43, 32, 240, 177, 132, 153, 223, 76, 203, 194,
1952 52, 126, 118, 5, 109, 183, 169, 49, 209, 23, 4, 215, 20, 88,
1953 58, 97, 222, 27, 17, 28, 50, 15, 156, 22, 83, 24, 242, 34,
1954 254, 68, 207, 178, 195, 181, 122, 145, 36, 8, 232, 168, 96, 252,
1955 105, 80, 170, 208, 160, 125, 161, 137, 98, 151, 84, 91, 30, 149,
1956 224, 255, 100, 210, 16, 196, 0, 72, 163, 247, 117, 219, 138, 3,
1957 230, 218, 9, 63, 221, 148, 135, 92, 131, 2, 205, 74, 144, 51,
1958 115, 103, 246, 243, 157, 127, 191, 226, 82, 155, 216, 38, 200, 55,
1959 198, 59, 129, 150, 111, 75, 19, 190, 99, 46, 233, 121, 167, 140,
1960 159, 110, 188, 142, 41, 245, 249, 182, 47, 253, 180, 89, 120, 152,
1961 6, 106, 231, 70, 113, 186, 212, 37, 171, 66, 136, 162, 141, 250,
1962 114, 7, 185, 85, 248, 238, 172, 10, 54, 73, 42, 104, 60, 56,
1963 241, 164, 64, 40, 211, 123, 187, 201, 67, 193, 21, 227, 173, 244,
1964 119, 199, 128, 158,
1965 };
1966
1967 static uint8_t camellia_rotl8(uint8_t v, unsigned int shift)
1968 {
1969 return (v << shift) | (v >> (8 - shift));
1970 }
1971
1972 static uint8_t camellia_sbox2(uint8_t x)
1973 {
1974 return camellia_rotl8(camellia_sbox1[x], 1);
1975 }
1976
1977 static uint8_t camellia_sbox3(uint8_t x)
1978 {
1979 return camellia_rotl8(camellia_sbox1[x], 7);
1980 }
1981
1982 static uint8_t camellia_sbox4(uint8_t x)
1983 {
1984 return camellia_sbox1[camellia_rotl8(x, 1)];
1985 }
1986
1987 static uint64_t camellia_f(uint64_t input, uint64_t key)
1988 {
1989 uint64_t x = input ^ key;
1990 uint8_t t1 = camellia_sbox1[x >> 56];
1991 uint8_t t2 = camellia_sbox2((x >> 48) & 0xff);
1992 uint8_t t3 = camellia_sbox3((x >> 40) & 0xff);
1993 uint8_t t4 = camellia_sbox4((x >> 32) & 0xff);
1994 uint8_t t5 = camellia_sbox2((x >> 24) & 0xff);
1995 uint8_t t6 = camellia_sbox3((x >> 16) & 0xff);
1996 uint8_t t7 = camellia_sbox4((x >> 8) & 0xff);
1997 uint8_t t8 = camellia_sbox1[x & 0xff];
1998 uint8_t y1 = t1 ^ t3 ^ t4 ^ t6 ^ t7 ^ t8;
1999 uint8_t y2 = t1 ^ t2 ^ t4 ^ t5 ^ t7 ^ t8;
2000 uint8_t y3 = t1 ^ t2 ^ t3 ^ t5 ^ t6 ^ t8;
2001 uint8_t y4 = t2 ^ t3 ^ t4 ^ t5 ^ t6 ^ t7;
2002 uint8_t y5 = t1 ^ t2 ^ t6 ^ t7 ^ t8;
2003 uint8_t y6 = t2 ^ t3 ^ t5 ^ t7 ^ t8;
2004 uint8_t y7 = t3 ^ t4 ^ t5 ^ t6 ^ t8;
2005 uint8_t y8 = t1 ^ t4 ^ t5 ^ t6 ^ t7;
2006
2007 return ((uint64_t)y1 << 56) | ((uint64_t)y2 << 48) |
2008 ((uint64_t)y3 << 40) | ((uint64_t)y4 << 32) |
2009 ((uint64_t)y5 << 24) | ((uint64_t)y6 << 16) |
2010 ((uint64_t)y7 << 8) | y8;
2011 }
2012
2013 static uint64_t camellia_fl(uint64_t input, uint64_t key)
2014 {
2015 uint32_t x1 = input >> 32;
2016 uint32_t x2 = input;
2017 uint32_t k1 = key >> 32;
2018 uint32_t k2 = key;
2019
2020 x2 ^= rol32(x1 & k1, 1);
2021 x1 ^= x2 | k2;
2022 return ((uint64_t)x1 << 32) | x2;
2023 }
2024
2025 static uint64_t camellia_flinv(uint64_t input, uint64_t key)
2026 {
2027 uint32_t y1 = input >> 32;
2028 uint32_t y2 = input;
2029 uint32_t k1 = key >> 32;
2030 uint32_t k2 = key;
2031
2032 y1 ^= y2 | k2;
2033 y2 ^= rol32(y1 & k1, 1);
2034 return ((uint64_t)y1 << 32) | y2;
2035 }
2036
2037 static void octeon_camellia_round(MIPSOcteonCryptoState *crypto, uint64_t key)
2038 {
2039 uint64_t left = crypto->aes_resinp[0];
2040 uint64_t right = crypto->aes_resinp[1];
2041
2042 crypto->aes_resinp[0] = right ^ camellia_f(left, key);
2043 crypto->aes_resinp[1] = left;
2044 }
2045
2046 static void octeon_camellia_fl_layer(MIPSOcteonCryptoState *crypto,
2047 uint64_t key, bool inverse)
2048 {
2049 uint64_t state = crypto->aes_resinp[inverse ? 1 : 0];
2050
2051 crypto->aes_resinp[inverse ? 1 : 0] = inverse ?
2052 camellia_flinv(state, key) :
2053 camellia_fl(state, key);
2054 }
2055
2056 void helper_octeon_cp2_mt_camellia_fl(CPUMIPSState *env, uint64_t value)
2057 {
2058 octeon_camellia_fl_layer(&env->octeon_crypto, value, false);
2059 }
2060
2061 void helper_octeon_cp2_mt_camellia_flinv(CPUMIPSState *env, uint64_t value)
2062 {
2063 octeon_camellia_fl_layer(&env->octeon_crypto, value, true);
2064 }
2065
2066 void helper_octeon_cp2_mt_camellia_round(CPUMIPSState *env, uint64_t value)
2067 {
2068 octeon_camellia_round(&env->octeon_crypto, value);
2069 }
2070
2071 void helper_octeon_cp2_mt_snow3g_start(CPUMIPSState *env, uint64_t value)
2072 {
2073 octeon_snow3g_start(&env->octeon_crypto, value);
2074 }
2075
2076 void helper_octeon_cp2_mt_snow3g_more(CPUMIPSState *env, uint64_t value)
2077 {
2078 (void)value;
2079 octeon_snow3g_more(&env->octeon_crypto);
2080 }
2081
2082 void helper_octeon_cp2_mt_zuc_start(CPUMIPSState *env, uint64_t value)
2083 {
2084 octeon_zuc_start(&env->octeon_crypto, value);
2085 }
2086
2087 void helper_octeon_cp2_mt_zuc_more(CPUMIPSState *env, uint64_t value)
2088 {
2089 octeon_zuc_more(&env->octeon_crypto, value);
2090 }
2091
2092 void helper_octeon_cp2_mt_hsh_startsha1_compat(CPUMIPSState *env,
2093 uint64_t value)
2094 {
2095 octeon_hsh_set_pair(env->octeon_crypto.hsh_dat, 7, value);
2096 octeon_sha1_transform(&env->octeon_crypto);
2097 }
2098
2099 void helper_octeon_cp2_mt_hsh_startmd5(CPUMIPSState *env, uint64_t value)
2100 {
2101 octeon_hsh_set_pair(env->octeon_crypto.hsh_dat, 7, value);
2102 octeon_md5_transform(&env->octeon_crypto);
2103 }
2104
2105 void helper_octeon_cp2_mt_hsh_startsha256(CPUMIPSState *env, uint64_t value)
2106 {
2107 octeon_hsh_set_pair(env->octeon_crypto.hsh_dat, 7, value);
2108 octeon_sha256_transform(&env->octeon_crypto);
2109 }
2110
2111 void helper_octeon_cp2_mt_hsh_startsha(CPUMIPSState *env, uint64_t value)
2112 {
2113 octeon_hsh_set_pair(env->octeon_crypto.hsh_dat, 7, value);
2114 octeon_sha1_transform(&env->octeon_crypto);
2115 }
2116
2117 void helper_octeon_cp2_mt_hsh_startsha512(CPUMIPSState *env, uint64_t value)
2118 {
2119 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
2120
2121 crypto->hsh_dat[15] = value;
2122 octeon_sha512_transform(crypto);
2123 }
2124
2125 uint64_t helper_octeon_cp2_mf_crc_iv_reflect(CPUMIPSState *env)
2126 {
2127 return octeon_crc_reflect32_by_byte(env->octeon_crypto.crc_iv);
2128 }
2129
2130 static void octeon_gfm_xormul1_common(MIPSOcteonCryptoState *crypto,
2131 uint64_t value)
2132 {
2133 crypto->gfm_resinp[1] ^= value;
2134 if (crypto->gfm_poly <= 0xff && crypto->gfm_mul[1] == 0 &&
2135 crypto->gfm_resinp[0] == 0) {
2136 octeon_gfm_mul64_uia2(crypto->gfm_resinp, crypto->gfm_mul,
2137 crypto->gfm_poly, crypto->gfm_resinp);
2138 } else {
2139 octeon_gfm_mul(crypto->gfm_resinp, crypto->gfm_mul, crypto->gfm_poly,
2140 crypto->gfm_resinp);
2141 }
2142 }
2143
2144 void helper_octeon_cp2_mt_gfm_xormul1_reflect(CPUMIPSState *env,
2145 uint64_t value)
2146 {
2147 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
2148
2149 octeon_gfm_xormul1_common(crypto, revbit64(value));
2150 }
2151
2152 void helper_octeon_cp2_mt_gfm_xormul1(CPUMIPSState *env, uint64_t value)
2153 {
2154 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
2155
2156 octeon_gfm_xormul1_common(crypto, value);
2157 }
2158
2159 void helper_octeon_cp2_mt_sha3_startop(CPUMIPSState *env)
2160 {
2161 octeon_sha3_permute(&env->octeon_crypto);
2162 }
2163
2164 void helper_octeon_cp2_mt_crc_write_iv_reflect(CPUMIPSState *env,
2165 uint64_t value)
2166 {
2167 env->octeon_crypto.crc_iv =
2168 octeon_crc_reflect32_by_byte((uint32_t)value);
2169 }
2170
2171 void helper_octeon_cp2_mt_crc_write_polynomial_reflect(CPUMIPSState *env,
2172 uint64_t value)
2173 {
2174 env->octeon_crypto.crc_poly =
2175 octeon_crc_reflect32_by_byte((uint32_t)value);
2176 }
2177
2178 void helper_octeon_cp2_mt_crc_write_byte(CPUMIPSState *env, uint64_t value)
2179 {
2180 octeon_crc_update_normal(&env->octeon_crypto, value, 1);
2181 }
2182
2183 void helper_octeon_cp2_mt_crc_write_half(CPUMIPSState *env, uint64_t value)
2184 {
2185 octeon_crc_update_normal(&env->octeon_crypto, value, 2);
2186 }
2187
2188 void helper_octeon_cp2_mt_crc_write_word(CPUMIPSState *env, uint64_t value)
2189 {
2190 octeon_crc_update_normal(&env->octeon_crypto, value, 4);
2191 }
2192
2193 void helper_octeon_cp2_mt_crc_write_dword(CPUMIPSState *env, uint64_t value)
2194 {
2195 octeon_crc_update_normal(&env->octeon_crypto, value, 8);
2196 }
2197
2198 void helper_octeon_cp2_mt_crc_write_var(CPUMIPSState *env, uint64_t value)
2199 {
2200 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
2201
2202 octeon_crc_update_normal(crypto, value, MIN(8U, crypto->crc_len & 0xf));
2203 }
2204
2205 void helper_octeon_cp2_mt_crc_write_byte_reflect(CPUMIPSState *env,
2206 uint64_t value)
2207 {
2208 octeon_crc_update_reflect(&env->octeon_crypto, value, 1);
2209 }
2210
2211 void helper_octeon_cp2_mt_crc_write_half_reflect(CPUMIPSState *env,
2212 uint64_t value)
2213 {
2214 octeon_crc_update_reflect(&env->octeon_crypto, value, 2);
2215 }
2216
2217 void helper_octeon_cp2_mt_crc_write_word_reflect(CPUMIPSState *env,
2218 uint64_t value)
2219 {
2220 octeon_crc_update_reflect(&env->octeon_crypto, value, 4);
2221 }
2222
2223 void helper_octeon_cp2_mt_crc_write_dword_reflect(CPUMIPSState *env,
2224 uint64_t value)
2225 {
2226 octeon_crc_update_reflect(&env->octeon_crypto, value, 8);
2227 }
2228
2229 void helper_octeon_cp2_mt_crc_write_var_reflect(CPUMIPSState *env,
2230 uint64_t value)
2231 {
2232 MIPSOcteonCryptoState *crypto = &env->octeon_crypto;
2233
2234 octeon_crc_update_reflect(crypto, value, MIN(8U, crypto->crc_len & 0xf));
2235 }
2236
2237 void helper_octeon_cp2_mt_llm_read_addr0(CPUMIPSState *env, uint64_t value)
2238 {
2239 octeon_llm_read(&env->octeon_crypto, 0, value, false);
2240 }
2241
2242 void helper_octeon_cp2_mt_llm_write_addr0(CPUMIPSState *env, uint64_t value)
2243 {
2244 octeon_llm_write(&env->octeon_crypto, 0, value, false);
2245 }
2246
2247 void helper_octeon_cp2_mt_llm_read64_addr0(CPUMIPSState *env, uint64_t value)
2248 {
2249 octeon_llm_read(&env->octeon_crypto, 0, value, true);
2250 }
2251
2252 void helper_octeon_cp2_mt_llm_write64_addr0(CPUMIPSState *env, uint64_t value)
2253 {
2254 octeon_llm_write(&env->octeon_crypto, 0, value, true);
2255 }
2256
2257 void helper_octeon_cp2_mt_llm_read_addr1(CPUMIPSState *env, uint64_t value)
2258 {
2259 octeon_llm_read(&env->octeon_crypto, 1, value, false);
2260 }
2261
2262 void helper_octeon_cp2_mt_llm_write_addr1(CPUMIPSState *env, uint64_t value)
2263 {
2264 octeon_llm_write(&env->octeon_crypto, 1, value, false);
2265 }
2266
2267 void helper_octeon_cp2_mt_llm_read64_addr1(CPUMIPSState *env, uint64_t value)
2268 {
2269 octeon_llm_read(&env->octeon_crypto, 1, value, true);
2270 }
2271
2272 void helper_octeon_cp2_mt_llm_write64_addr1(CPUMIPSState *env, uint64_t value)
2273 {
2274 octeon_llm_write(&env->octeon_crypto, 1, value, true);
2275 }