Coverage Report

Created: 2025-07-11 06:47

/src/libsrtp/crypto/cipher/aes.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * aes.c
3
 *
4
 * An implemnetation of the AES block cipher.
5
 *
6
 * David A. McGrew
7
 * Cisco Systems, Inc.
8
 */
9
10
/*
11
 *
12
 * Copyright (c) 2001-2017, Cisco Systems, Inc.
13
 * All rights reserved.
14
 *
15
 * Redistribution and use in source and binary forms, with or without
16
 * modification, are permitted provided that the following conditions
17
 * are met:
18
 *
19
 *   Redistributions of source code must retain the above copyright
20
 *   notice, this list of conditions and the following disclaimer.
21
 *
22
 *   Redistributions in binary form must reproduce the above
23
 *   copyright notice, this list of conditions and the following
24
 *   disclaimer in the documentation and/or other materials provided
25
 *   with the distribution.
26
 *
27
 *   Neither the name of the Cisco Systems, Inc. nor the names of its
28
 *   contributors may be used to endorse or promote products derived
29
 *   from this software without specific prior written permission.
30
 *
31
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
34
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
35
 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
36
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
38
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40
 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
42
 * OF THE POSSIBILITY OF SUCH DAMAGE.
43
 *
44
 */
45
46
#ifdef HAVE_CONFIG_H
47
#include <config.h>
48
#endif
49
50
#include "aes.h"
51
#include "err.h"
52
53
/*
54
 * we use the tables T0, T1, T2, T3, and T4 to compute AES, and
55
 * the tables U0, U1, U2, and U4 to compute its inverse
56
 *
57
 * different tables are used on little-endian (Intel, VMS) and
58
 * big-endian processors (everything else)
59
 *
60
 * these tables are computed using the program tables/aes_tables; use
61
 * this program to generate different tables for porting or
62
 * optimization on a different platform
63
 */
64
65
#ifndef WORDS_BIGENDIAN
66
/* clang-format off */
67
static const uint32_t T0[256] = {
68
    0xa56363c6, 0x847c7cf8,  0x997777ee,  0x8d7b7bf6,
69
    0xdf2f2ff,  0xbd6b6bd6,  0xb16f6fde,  0x54c5c591,
70
    0x50303060, 0x3010102,   0xa96767ce,  0x7d2b2b56,
71
    0x19fefee7, 0x62d7d7b5,  0xe6abab4d,  0x9a7676ec,
72
    0x45caca8f, 0x9d82821f,  0x40c9c989,  0x877d7dfa,
73
    0x15fafaef, 0xeb5959b2,  0xc947478e,  0xbf0f0fb,
74
    0xecadad41, 0x67d4d4b3,  0xfda2a25f,  0xeaafaf45,
75
    0xbf9c9c23, 0xf7a4a453,  0x967272e4,  0x5bc0c09b,
76
    0xc2b7b775, 0x1cfdfde1,  0xae93933d,  0x6a26264c,
77
    0x5a36366c, 0x413f3f7e,  0x2f7f7f5,   0x4fcccc83,
78
    0x5c343468, 0xf4a5a551,  0x34e5e5d1,  0x8f1f1f9,
79
    0x937171e2, 0x73d8d8ab,  0x53313162,  0x3f15152a,
80
    0xc040408,  0x52c7c795,  0x65232346,  0x5ec3c39d,
81
    0x28181830, 0xa1969637,  0xf05050a,   0xb59a9a2f,
82
    0x907070e,  0x36121224,  0x9b80801b,  0x3de2e2df,
83
    0x26ebebcd, 0x6927274e,  0xcdb2b27f,  0x9f7575ea,
84
    0x1b090912, 0x9e83831d,  0x742c2c58,  0x2e1a1a34,
85
    0x2d1b1b36, 0xb26e6edc,  0xee5a5ab4,  0xfba0a05b,
86
    0xf65252a4, 0x4d3b3b76,  0x61d6d6b7,  0xceb3b37d,
87
    0x7b292952, 0x3ee3e3dd,  0x712f2f5e,  0x97848413,
88
    0xf55353a6, 0x68d1d1b9,  0x0,         0x2cededc1,
89
    0x60202040, 0x1ffcfce3,  0xc8b1b179,  0xed5b5bb6,
90
    0xbe6a6ad4, 0x46cbcb8d,  0xd9bebe67,  0x4b393972,
91
    0xde4a4a94, 0xd44c4c98,  0xe85858b0,  0x4acfcf85,
92
    0x6bd0d0bb, 0x2aefefc5,  0xe5aaaa4f,  0x16fbfbed,
93
    0xc5434386, 0xd74d4d9a,  0x55333366,  0x94858511,
94
    0xcf45458a, 0x10f9f9e9,  0x6020204,   0x817f7ffe,
95
    0xf05050a0, 0x443c3c78,  0xba9f9f25,  0xe3a8a84b,
96
    0xf35151a2, 0xfea3a35d,  0xc0404080,  0x8a8f8f05,
97
    0xad92923f, 0xbc9d9d21,  0x48383870,  0x4f5f5f1,
98
    0xdfbcbc63, 0xc1b6b677,  0x75dadaaf,  0x63212142,
99
    0x30101020, 0x1affffe5,  0xef3f3fd,   0x6dd2d2bf,
100
    0x4ccdcd81, 0x140c0c18,  0x35131326,  0x2fececc3,
101
    0xe15f5fbe, 0xa2979735,  0xcc444488,  0x3917172e,
102
    0x57c4c493, 0xf2a7a755,  0x827e7efc,  0x473d3d7a,
103
    0xac6464c8, 0xe75d5dba,  0x2b191932,  0x957373e6,
104
    0xa06060c0, 0x98818119,  0xd14f4f9e,  0x7fdcdca3,
105
    0x66222244, 0x7e2a2a54,  0xab90903b,  0x8388880b,
106
    0xca46468c, 0x29eeeec7,  0xd3b8b86b,  0x3c141428,
107
    0x79dedea7, 0xe25e5ebc,  0x1d0b0b16,  0x76dbdbad,
108
    0x3be0e0db, 0x56323264,  0x4e3a3a74,  0x1e0a0a14,
109
    0xdb494992, 0xa06060c,   0x6c242448,  0xe45c5cb8,
110
    0x5dc2c29f, 0x6ed3d3bd,  0xefacac43,  0xa66262c4,
111
    0xa8919139, 0xa4959531,  0x37e4e4d3,  0x8b7979f2,
112
    0x32e7e7d5, 0x43c8c88b,  0x5937376e,  0xb76d6dda,
113
    0x8c8d8d01, 0x64d5d5b1,  0xd24e4e9c,  0xe0a9a949,
114
    0xb46c6cd8, 0xfa5656ac,  0x7f4f4f3,   0x25eaeacf,
115
    0xaf6565ca, 0x8e7a7af4,  0xe9aeae47,  0x18080810,
116
    0xd5baba6f, 0x887878f0,  0x6f25254a,  0x722e2e5c,
117
    0x241c1c38, 0xf1a6a657,  0xc7b4b473,  0x51c6c697,
118
    0x23e8e8cb, 0x7cdddda1,  0x9c7474e8,  0x211f1f3e,
119
    0xdd4b4b96, 0xdcbdbd61,  0x868b8b0d,  0x858a8a0f,
120
    0x907070e0, 0x423e3e7c,  0xc4b5b571,  0xaa6666cc,
121
    0xd8484890, 0x5030306,   0x1f6f6f7,   0x120e0e1c,
122
    0xa36161c2, 0x5f35356a,  0xf95757ae,  0xd0b9b969,
123
    0x91868617, 0x58c1c199,  0x271d1d3a,  0xb99e9e27,
124
    0x38e1e1d9, 0x13f8f8eb,  0xb398982b,  0x33111122,
125
    0xbb6969d2, 0x70d9d9a9,  0x898e8e07,  0xa7949433,
126
    0xb69b9b2d, 0x221e1e3c,  0x92878715,  0x20e9e9c9,
127
    0x49cece87, 0xff5555aa,  0x78282850,  0x7adfdfa5,
128
    0x8f8c8c03, 0xf8a1a159,  0x80898909,  0x170d0d1a,
129
    0xdabfbf65, 0x31e6e6d7,  0xc6424284,  0xb86868d0,
130
    0xc3414182, 0xb0999929,  0x772d2d5a,  0x110f0f1e,
131
    0xcbb0b07b, 0xfc5454a8,  0xd6bbbb6d,  0x3a16162c,
132
};
133
/* clang-format on */
134
135
/* clang-format off */
136
static const uint32_t T1[256] = {
137
    0x6363c6a5, 0x7c7cf884,  0x7777ee99,  0x7b7bf68d,
138
    0xf2f2ff0d, 0x6b6bd6bd,  0x6f6fdeb1,  0xc5c59154,
139
    0x30306050, 0x1010203,   0x6767cea9,  0x2b2b567d,
140
    0xfefee719, 0xd7d7b562,  0xabab4de6,  0x7676ec9a,
141
    0xcaca8f45, 0x82821f9d,  0xc9c98940,  0x7d7dfa87,
142
    0xfafaef15, 0x5959b2eb,  0x47478ec9,  0xf0f0fb0b,
143
    0xadad41ec, 0xd4d4b367,  0xa2a25ffd,  0xafaf45ea,
144
    0x9c9c23bf, 0xa4a453f7,  0x7272e496,  0xc0c09b5b,
145
    0xb7b775c2, 0xfdfde11c,  0x93933dae,  0x26264c6a,
146
    0x36366c5a, 0x3f3f7e41,  0xf7f7f502,  0xcccc834f,
147
    0x3434685c, 0xa5a551f4,  0xe5e5d134,  0xf1f1f908,
148
    0x7171e293, 0xd8d8ab73,  0x31316253,  0x15152a3f,
149
    0x404080c,  0xc7c79552,  0x23234665,  0xc3c39d5e,
150
    0x18183028, 0x969637a1,  0x5050a0f,   0x9a9a2fb5,
151
    0x7070e09,  0x12122436,  0x80801b9b,  0xe2e2df3d,
152
    0xebebcd26, 0x27274e69,  0xb2b27fcd,  0x7575ea9f,
153
    0x909121b,  0x83831d9e,  0x2c2c5874,  0x1a1a342e,
154
    0x1b1b362d, 0x6e6edcb2,  0x5a5ab4ee,  0xa0a05bfb,
155
    0x5252a4f6, 0x3b3b764d,  0xd6d6b761,  0xb3b37dce,
156
    0x2929527b, 0xe3e3dd3e,  0x2f2f5e71,  0x84841397,
157
    0x5353a6f5, 0xd1d1b968,  0x00000000,  0xededc12c,
158
    0x20204060, 0xfcfce31f,  0xb1b179c8,  0x5b5bb6ed,
159
    0x6a6ad4be, 0xcbcb8d46,  0xbebe67d9,  0x3939724b,
160
    0x4a4a94de, 0x4c4c98d4,  0x5858b0e8,  0xcfcf854a,
161
    0xd0d0bb6b, 0xefefc52a,  0xaaaa4fe5,  0xfbfbed16,
162
    0x434386c5, 0x4d4d9ad7,  0x33336655,  0x85851194,
163
    0x45458acf, 0xf9f9e910,  0x2020406,   0x7f7ffe81,
164
    0x5050a0f0, 0x3c3c7844,  0x9f9f25ba,  0xa8a84be3,
165
    0x5151a2f3, 0xa3a35dfe,  0x404080c0,  0x8f8f058a,
166
    0x92923fad, 0x9d9d21bc,  0x38387048,  0xf5f5f104,
167
    0xbcbc63df, 0xb6b677c1,  0xdadaaf75,  0x21214263,
168
    0x10102030, 0xffffe51a,  0xf3f3fd0e,  0xd2d2bf6d,
169
    0xcdcd814c, 0xc0c1814,   0x13132635,  0xececc32f,
170
    0x5f5fbee1, 0x979735a2,  0x444488cc,  0x17172e39,
171
    0xc4c49357, 0xa7a755f2,  0x7e7efc82,  0x3d3d7a47,
172
    0x6464c8ac, 0x5d5dbae7,  0x1919322b,  0x7373e695,
173
    0x6060c0a0, 0x81811998,  0x4f4f9ed1,  0xdcdca37f,
174
    0x22224466, 0x2a2a547e,  0x90903bab,  0x88880b83,
175
    0x46468cca, 0xeeeec729,  0xb8b86bd3,  0x1414283c,
176
    0xdedea779, 0x5e5ebce2,  0xb0b161d,   0xdbdbad76,
177
    0xe0e0db3b, 0x32326456,  0x3a3a744e,  0xa0a141e,
178
    0x494992db, 0x6060c0a,   0x2424486c,  0x5c5cb8e4,
179
    0xc2c29f5d, 0xd3d3bd6e,  0xacac43ef,  0x6262c4a6,
180
    0x919139a8, 0x959531a4,  0xe4e4d337,  0x7979f28b,
181
    0xe7e7d532, 0xc8c88b43,  0x37376e59,  0x6d6ddab7,
182
    0x8d8d018c, 0xd5d5b164,  0x4e4e9cd2,  0xa9a949e0,
183
    0x6c6cd8b4, 0x5656acfa,  0xf4f4f307,  0xeaeacf25,
184
    0x6565caaf, 0x7a7af48e,  0xaeae47e9,  0x8081018,
185
    0xbaba6fd5, 0x7878f088,  0x25254a6f,  0x2e2e5c72,
186
    0x1c1c3824, 0xa6a657f1,  0xb4b473c7,  0xc6c69751,
187
    0xe8e8cb23, 0xdddda17c,  0x7474e89c,  0x1f1f3e21,
188
    0x4b4b96dd, 0xbdbd61dc,  0x8b8b0d86,  0x8a8a0f85,
189
    0x7070e090, 0x3e3e7c42,  0xb5b571c4,  0x6666ccaa,
190
    0x484890d8, 0x3030605,   0xf6f6f701,  0xe0e1c12,
191
    0x6161c2a3, 0x35356a5f,  0x5757aef9,  0xb9b969d0,
192
    0x86861791, 0xc1c19958,  0x1d1d3a27,  0x9e9e27b9,
193
    0xe1e1d938, 0xf8f8eb13,  0x98982bb3,  0x11112233,
194
    0x6969d2bb, 0xd9d9a970,  0x8e8e0789,  0x949433a7,
195
    0x9b9b2db6, 0x1e1e3c22,  0x87871592,  0xe9e9c920,
196
    0xcece8749, 0x5555aaff,  0x28285078,  0xdfdfa57a,
197
    0x8c8c038f, 0xa1a159f8,  0x89890980,  0xd0d1a17,
198
    0xbfbf65da, 0xe6e6d731,  0x424284c6,  0x6868d0b8,
199
    0x414182c3, 0x999929b0,  0x2d2d5a77,  0xf0f1e11,
200
    0xb0b07bcb, 0x5454a8fc,  0xbbbb6dd6,  0x16162c3a,
201
};
202
/* clang-format on */
203
204
/* clang-format off */
205
static const uint32_t T2[256] = {
206
    0x63c6a563, 0x7cf8847c,  0x77ee9977,  0x7bf68d7b,
207
    0xf2ff0df2, 0x6bd6bd6b,  0x6fdeb16f,  0xc59154c5,
208
    0x30605030, 0x1020301,   0x67cea967,  0x2b567d2b,
209
    0xfee719fe, 0xd7b562d7,  0xab4de6ab,  0x76ec9a76,
210
    0xca8f45ca, 0x821f9d82,  0xc98940c9,  0x7dfa877d,
211
    0xfaef15fa, 0x59b2eb59,  0x478ec947,  0xf0fb0bf0,
212
    0xad41ecad, 0xd4b367d4,  0xa25ffda2,  0xaf45eaaf,
213
    0x9c23bf9c, 0xa453f7a4,  0x72e49672,  0xc09b5bc0,
214
    0xb775c2b7, 0xfde11cfd,  0x933dae93,  0x264c6a26,
215
    0x366c5a36, 0x3f7e413f,  0xf7f502f7,  0xcc834fcc,
216
    0x34685c34, 0xa551f4a5,  0xe5d134e5,  0xf1f908f1,
217
    0x71e29371, 0xd8ab73d8,  0x31625331,  0x152a3f15,
218
    0x4080c04,  0xc79552c7,  0x23466523,  0xc39d5ec3,
219
    0x18302818, 0x9637a196,  0x50a0f05,   0x9a2fb59a,
220
    0x70e0907,  0x12243612,  0x801b9b80,  0xe2df3de2,
221
    0xebcd26eb, 0x274e6927,  0xb27fcdb2,  0x75ea9f75,
222
    0x9121b09,  0x831d9e83,  0x2c58742c,  0x1a342e1a,
223
    0x1b362d1b, 0x6edcb26e,  0x5ab4ee5a,  0xa05bfba0,
224
    0x52a4f652, 0x3b764d3b,  0xd6b761d6,  0xb37dceb3,
225
    0x29527b29, 0xe3dd3ee3,  0x2f5e712f,  0x84139784,
226
    0x53a6f553, 0xd1b968d1,  0x0,         0xedc12ced,
227
    0x20406020, 0xfce31ffc,  0xb179c8b1,  0x5bb6ed5b,
228
    0x6ad4be6a, 0xcb8d46cb,  0xbe67d9be,  0x39724b39,
229
    0x4a94de4a, 0x4c98d44c,  0x58b0e858,  0xcf854acf,
230
    0xd0bb6bd0, 0xefc52aef,  0xaa4fe5aa,  0xfbed16fb,
231
    0x4386c543, 0x4d9ad74d,  0x33665533,  0x85119485,
232
    0x458acf45, 0xf9e910f9,  0x2040602,   0x7ffe817f,
233
    0x50a0f050, 0x3c78443c,  0x9f25ba9f,  0xa84be3a8,
234
    0x51a2f351, 0xa35dfea3,  0x4080c040,  0x8f058a8f,
235
    0x923fad92, 0x9d21bc9d,  0x38704838,  0xf5f104f5,
236
    0xbc63dfbc, 0xb677c1b6,  0xdaaf75da,  0x21426321,
237
    0x10203010, 0xffe51aff,  0xf3fd0ef3,  0xd2bf6dd2,
238
    0xcd814ccd, 0xc18140c,   0x13263513,  0xecc32fec,
239
    0x5fbee15f, 0x9735a297,  0x4488cc44,  0x172e3917,
240
    0xc49357c4, 0xa755f2a7,  0x7efc827e,  0x3d7a473d,
241
    0x64c8ac64, 0x5dbae75d,  0x19322b19,  0x73e69573,
242
    0x60c0a060, 0x81199881,  0x4f9ed14f,  0xdca37fdc,
243
    0x22446622, 0x2a547e2a,  0x903bab90,  0x880b8388,
244
    0x468cca46, 0xeec729ee,  0xb86bd3b8,  0x14283c14,
245
    0xdea779de, 0x5ebce25e,  0xb161d0b,   0xdbad76db,
246
    0xe0db3be0, 0x32645632,  0x3a744e3a,  0xa141e0a,
247
    0x4992db49, 0x60c0a06,   0x24486c24,  0x5cb8e45c,
248
    0xc29f5dc2, 0xd3bd6ed3,  0xac43efac,  0x62c4a662,
249
    0x9139a891, 0x9531a495,  0xe4d337e4,  0x79f28b79,
250
    0xe7d532e7, 0xc88b43c8,  0x376e5937,  0x6ddab76d,
251
    0x8d018c8d, 0xd5b164d5,  0x4e9cd24e,  0xa949e0a9,
252
    0x6cd8b46c, 0x56acfa56,  0xf4f307f4,  0xeacf25ea,
253
    0x65caaf65, 0x7af48e7a,  0xae47e9ae,  0x8101808,
254
    0xba6fd5ba, 0x78f08878,  0x254a6f25,  0x2e5c722e,
255
    0x1c38241c, 0xa657f1a6,  0xb473c7b4,  0xc69751c6,
256
    0xe8cb23e8, 0xdda17cdd,  0x74e89c74,  0x1f3e211f,
257
    0x4b96dd4b, 0xbd61dcbd,  0x8b0d868b,  0x8a0f858a,
258
    0x70e09070, 0x3e7c423e,  0xb571c4b5,  0x66ccaa66,
259
    0x4890d848, 0x3060503,   0xf6f701f6,  0xe1c120e,
260
    0x61c2a361, 0x356a5f35,  0x57aef957,  0xb969d0b9,
261
    0x86179186, 0xc19958c1,  0x1d3a271d,  0x9e27b99e,
262
    0xe1d938e1, 0xf8eb13f8,  0x982bb398,  0x11223311,
263
    0x69d2bb69, 0xd9a970d9,  0x8e07898e,  0x9433a794,
264
    0x9b2db69b, 0x1e3c221e,  0x87159287,  0xe9c920e9,
265
    0xce8749ce, 0x55aaff55,  0x28507828,  0xdfa57adf,
266
    0x8c038f8c, 0xa159f8a1,  0x89098089,  0xd1a170d,
267
    0xbf65dabf, 0xe6d731e6,  0x4284c642,  0x68d0b868,
268
    0x4182c341, 0x9929b099,  0x2d5a772d,  0xf1e110f,
269
    0xb07bcbb0, 0x54a8fc54,  0xbb6dd6bb,  0x162c3a16,
270
};
271
/* clang-format on */
272
273
/* clang-format off */
274
static const uint32_t T3[256] = {
275
    0xc6a56363, 0xf8847c7c,  0xee997777,  0xf68d7b7b,
276
    0xff0df2f2, 0xd6bd6b6b,  0xdeb16f6f,  0x9154c5c5,
277
    0x60503030, 0x2030101,   0xcea96767,  0x567d2b2b,
278
    0xe719fefe, 0xb562d7d7,  0x4de6abab,  0xec9a7676,
279
    0x8f45caca, 0x1f9d8282,  0x8940c9c9,  0xfa877d7d,
280
    0xef15fafa, 0xb2eb5959,  0x8ec94747,  0xfb0bf0f0,
281
    0x41ecadad, 0xb367d4d4,  0x5ffda2a2,  0x45eaafaf,
282
    0x23bf9c9c, 0x53f7a4a4,  0xe4967272,  0x9b5bc0c0,
283
    0x75c2b7b7, 0xe11cfdfd,  0x3dae9393,  0x4c6a2626,
284
    0x6c5a3636, 0x7e413f3f,  0xf502f7f7,  0x834fcccc,
285
    0x685c3434, 0x51f4a5a5,  0xd134e5e5,  0xf908f1f1,
286
    0xe2937171, 0xab73d8d8,  0x62533131,  0x2a3f1515,
287
    0x80c0404,  0x9552c7c7,  0x46652323,  0x9d5ec3c3,
288
    0x30281818, 0x37a19696,  0xa0f0505,   0x2fb59a9a,
289
    0xe090707,  0x24361212,  0x1b9b8080,  0xdf3de2e2,
290
    0xcd26ebeb, 0x4e692727,  0x7fcdb2b2,  0xea9f7575,
291
    0x121b0909, 0x1d9e8383,  0x58742c2c,  0x342e1a1a,
292
    0x362d1b1b, 0xdcb26e6e,  0xb4ee5a5a,  0x5bfba0a0,
293
    0xa4f65252, 0x764d3b3b,  0xb761d6d6,  0x7dceb3b3,
294
    0x527b2929, 0xdd3ee3e3,  0x5e712f2f,  0x13978484,
295
    0xa6f55353, 0xb968d1d1,  0x0,         0xc12ceded,
296
    0x40602020, 0xe31ffcfc,  0x79c8b1b1,  0xb6ed5b5b,
297
    0xd4be6a6a, 0x8d46cbcb,  0x67d9bebe,  0x724b3939,
298
    0x94de4a4a, 0x98d44c4c,  0xb0e85858,  0x854acfcf,
299
    0xbb6bd0d0, 0xc52aefef,  0x4fe5aaaa,  0xed16fbfb,
300
    0x86c54343, 0x9ad74d4d,  0x66553333,  0x11948585,
301
    0x8acf4545, 0xe910f9f9,  0x4060202,   0xfe817f7f,
302
    0xa0f05050, 0x78443c3c,  0x25ba9f9f,  0x4be3a8a8,
303
    0xa2f35151, 0x5dfea3a3,  0x80c04040,  0x58a8f8f,
304
    0x3fad9292, 0x21bc9d9d,  0x70483838,  0xf104f5f5,
305
    0x63dfbcbc, 0x77c1b6b6,  0xaf75dada,  0x42632121,
306
    0x20301010, 0xe51affff,  0xfd0ef3f3,  0xbf6dd2d2,
307
    0x814ccdcd, 0x18140c0c,  0x26351313,  0xc32fecec,
308
    0xbee15f5f, 0x35a29797,  0x88cc4444,  0x2e391717,
309
    0x9357c4c4, 0x55f2a7a7,  0xfc827e7e,  0x7a473d3d,
310
    0xc8ac6464, 0xbae75d5d,  0x322b1919,  0xe6957373,
311
    0xc0a06060, 0x19988181,  0x9ed14f4f,  0xa37fdcdc,
312
    0x44662222, 0x547e2a2a,  0x3bab9090,  0xb838888,
313
    0x8cca4646, 0xc729eeee,  0x6bd3b8b8,  0x283c1414,
314
    0xa779dede, 0xbce25e5e,  0x161d0b0b,  0xad76dbdb,
315
    0xdb3be0e0, 0x64563232,  0x744e3a3a,  0x141e0a0a,
316
    0x92db4949, 0xc0a0606,   0x486c2424,  0xb8e45c5c,
317
    0x9f5dc2c2, 0xbd6ed3d3,  0x43efacac,  0xc4a66262,
318
    0x39a89191, 0x31a49595,  0xd337e4e4,  0xf28b7979,
319
    0xd532e7e7, 0x8b43c8c8,  0x6e593737,  0xdab76d6d,
320
    0x18c8d8d,  0xb164d5d5,  0x9cd24e4e,  0x49e0a9a9,
321
    0xd8b46c6c, 0xacfa5656,  0xf307f4f4,  0xcf25eaea,
322
    0xcaaf6565, 0xf48e7a7a,  0x47e9aeae,  0x10180808,
323
    0x6fd5baba, 0xf0887878,  0x4a6f2525,  0x5c722e2e,
324
    0x38241c1c, 0x57f1a6a6,  0x73c7b4b4,  0x9751c6c6,
325
    0xcb23e8e8, 0xa17cdddd,  0xe89c7474,  0x3e211f1f,
326
    0x96dd4b4b, 0x61dcbdbd,  0xd868b8b,   0xf858a8a,
327
    0xe0907070, 0x7c423e3e,  0x71c4b5b5,  0xccaa6666,
328
    0x90d84848, 0x6050303,   0xf701f6f6,  0x1c120e0e,
329
    0xc2a36161, 0x6a5f3535,  0xaef95757,  0x69d0b9b9,
330
    0x17918686, 0x9958c1c1,  0x3a271d1d,  0x27b99e9e,
331
    0xd938e1e1, 0xeb13f8f8,  0x2bb39898,  0x22331111,
332
    0xd2bb6969, 0xa970d9d9,  0x7898e8e,   0x33a79494,
333
    0x2db69b9b, 0x3c221e1e,  0x15928787,  0xc920e9e9,
334
    0x8749cece, 0xaaff5555,  0x50782828,  0xa57adfdf,
335
    0x38f8c8c,  0x59f8a1a1,  0x9808989,   0x1a170d0d,
336
    0x65dabfbf, 0xd731e6e6,  0x84c64242,  0xd0b86868,
337
    0x82c34141, 0x29b09999,  0x5a772d2d,  0x1e110f0f,
338
    0x7bcbb0b0, 0xa8fc5454,  0x6dd6bbbb,  0x2c3a1616,
339
};
340
/* clang-format on */
341
342
/* clang-format off */
343
static const uint32_t U0[256] = {
344
    0x50a7f451, 0x5365417e,  0xc3a4171a,  0x965e273a,
345
    0xcb6bab3b, 0xf1459d1f,  0xab58faac,  0x9303e34b,
346
    0x55fa3020, 0xf66d76ad,  0x9176cc88,  0x254c02f5,
347
    0xfcd7e54f, 0xd7cb2ac5,  0x80443526,  0x8fa362b5,
348
    0x495ab1de, 0x671bba25,  0x980eea45,  0xe1c0fe5d,
349
    0x2752fc3,  0x12f04c81,  0xa397468d,  0xc6f9d36b,
350
    0xe75f8f03, 0x959c9215,  0xeb7a6dbf,  0xda595295,
351
    0x2d83bed4, 0xd3217458,  0x2969e049,  0x44c8c98e,
352
    0x6a89c275, 0x78798ef4,  0x6b3e5899,  0xdd71b927,
353
    0xb64fe1be, 0x17ad88f0,  0x66ac20c9,  0xb43ace7d,
354
    0x184adf63, 0x82311ae5,  0x60335197,  0x457f5362,
355
    0xe07764b1, 0x84ae6bbb,  0x1ca081fe,  0x942b08f9,
356
    0x58684870, 0x19fd458f,  0x876cde94,  0xb7f87b52,
357
    0x23d373ab, 0xe2024b72,  0x578f1fe3,  0x2aab5566,
358
    0x728ebb2,  0x3c2b52f,   0x9a7bc586,  0xa50837d3,
359
    0xf2872830, 0xb2a5bf23,  0xba6a0302,  0x5c8216ed,
360
    0x2b1ccf8a, 0x92b479a7,  0xf0f207f3,  0xa1e2694e,
361
    0xcdf4da65, 0xd5be0506,  0x1f6234d1,  0x8afea6c4,
362
    0x9d532e34, 0xa055f3a2,  0x32e18a05,  0x75ebf6a4,
363
    0x39ec830b, 0xaaef6040,  0x69f715e,   0x51106ebd,
364
    0xf98a213e, 0x3d06dd96,  0xae053edd,  0x46bde64d,
365
    0xb58d5491, 0x55dc471,   0x6fd40604,  0xff155060,
366
    0x24fb9819, 0x97e9bdd6,  0xcc434089,  0x779ed967,
367
    0xbd42e8b0, 0x888b8907,  0x385b19e7,  0xdbeec879,
368
    0x470a7ca1, 0xe90f427c,  0xc91e84f8,  0x0,
369
    0x83868009, 0x48ed2b32,  0xac70111e,  0x4e725a6c,
370
    0xfbff0efd, 0x5638850f,  0x1ed5ae3d,  0x27392d36,
371
    0x64d90f0a, 0x21a65c68,  0xd1545b9b,  0x3a2e3624,
372
    0xb1670a0c, 0xfe75793,   0xd296eeb4,  0x9e919b1b,
373
    0x4fc5c080, 0xa220dc61,  0x694b775a,  0x161a121c,
374
    0xaba93e2,  0xe52aa0c0,  0x43e0223c,  0x1d171b12,
375
    0xb0d090e,  0xadc78bf2,  0xb9a8b62d,  0xc8a91e14,
376
    0x8519f157, 0x4c0775af,  0xbbdd99ee,  0xfd607fa3,
377
    0x9f2601f7, 0xbcf5725c,  0xc53b6644,  0x347efb5b,
378
    0x7629438b, 0xdcc623cb,  0x68fcedb6,  0x63f1e4b8,
379
    0xcadc31d7, 0x10856342,  0x40229713,  0x2011c684,
380
    0x7d244a85, 0xf83dbbd2,  0x1132f9ae,  0x6da129c7,
381
    0x4b2f9e1d, 0xf330b2dc,  0xec52860d,  0xd0e3c177,
382
    0x6c16b32b, 0x99b970a9,  0xfa489411,  0x2264e947,
383
    0xc48cfca8, 0x1a3ff0a0,  0xd82c7d56,  0xef903322,
384
    0xc74e4987, 0xc1d138d9,  0xfea2ca8c,  0x360bd498,
385
    0xcf81f5a6, 0x28de7aa5,  0x268eb7da,  0xa4bfad3f,
386
    0xe49d3a2c, 0xd927850,   0x9bcc5f6a,  0x62467e54,
387
    0xc2138df6, 0xe8b8d890,  0x5ef7392e,  0xf5afc382,
388
    0xbe805d9f, 0x7c93d069,  0xa92dd56f,  0xb31225cf,
389
    0x3b99acc8, 0xa77d1810,  0x6e639ce8,  0x7bbb3bdb,
390
    0x97826cd,  0xf418596e,  0x1b79aec,   0xa89a4f83,
391
    0x656e95e6, 0x7ee6ffaa,  0x8cfbc21,   0xe6e815ef,
392
    0xd99be7ba, 0xce366f4a,  0xd4099fea,  0xd67cb029,
393
    0xafb2a431, 0x31233f2a,  0x3094a5c6,  0xc066a235,
394
    0x37bc4e74, 0xa6ca82fc,  0xb0d090e0,  0x15d8a733,
395
    0x4a9804f1, 0xf7daec41,  0xe50cd7f,   0x2ff69117,
396
    0x8dd64d76, 0x4db0ef43,  0x544daacc,  0xdf0496e4,
397
    0xe3b5d19e, 0x1b886a4c,  0xb81f2cc1,  0x7f516546,
398
    0x4ea5e9d,  0x5d358c01,  0x737487fa,  0x2e410bfb,
399
    0x5a1d67b3, 0x52d2db92,  0x335610e9,  0x1347d66d,
400
    0x8c61d79a, 0x7a0ca137,  0x8e14f859,  0x893c13eb,
401
    0xee27a9ce, 0x35c961b7,  0xede51ce1,  0x3cb1477a,
402
    0x59dfd29c, 0x3f73f255,  0x79ce1418,  0xbf37c773,
403
    0xeacdf753, 0x5baafd5f,  0x146f3ddf,  0x86db4478,
404
    0x81f3afca, 0x3ec468b9,  0x2c342438,  0x5f40a3c2,
405
    0x72c31d16, 0xc25e2bc,   0x8b493c28,  0x41950dff,
406
    0x7101a839, 0xdeb30c08,  0x9ce4b4d8,  0x90c15664,
407
    0x6184cb7b, 0x70b632d5,  0x745c6c48,  0x4257b8d0,
408
};
409
/* clang-format on */
410
411
/* clang-format off */
412
static const uint32_t U1[256] = {
413
    0xa7f45150, 0x65417e53,  0xa4171ac3,  0x5e273a96,
414
    0x6bab3bcb, 0x459d1ff1,  0x58faacab,  0x3e34b93,
415
    0xfa302055, 0x6d76adf6,  0x76cc8891,  0x4c02f525,
416
    0xd7e54ffc, 0xcb2ac5d7,  0x44352680,  0xa362b58f,
417
    0x5ab1de49, 0x1bba2567,  0xeea4598,   0xc0fe5de1,
418
    0x752fc302, 0xf04c8112,  0x97468da3,  0xf9d36bc6,
419
    0x5f8f03e7, 0x9c921595,  0x7a6dbfeb,  0x595295da,
420
    0x83bed42d, 0x217458d3,  0x69e04929,  0xc8c98e44,
421
    0x89c2756a, 0x798ef478,  0x3e58996b,  0x71b927dd,
422
    0x4fe1beb6, 0xad88f017,  0xac20c966,  0x3ace7db4,
423
    0x4adf6318, 0x311ae582,  0x33519760,  0x7f536245,
424
    0x7764b1e0, 0xae6bbb84,  0xa081fe1c,  0x2b08f994,
425
    0x68487058, 0xfd458f19,  0x6cde9487,  0xf87b52b7,
426
    0xd373ab23, 0x24b72e2,   0x8f1fe357,  0xab55662a,
427
    0x28ebb207, 0xc2b52f03,  0x7bc5869a,  0x837d3a5,
428
    0x872830f2, 0xa5bf23b2,  0x6a0302ba,  0x8216ed5c,
429
    0x1ccf8a2b, 0xb479a792,  0xf207f3f0,  0xe2694ea1,
430
    0xf4da65cd, 0xbe0506d5,  0x6234d11f,  0xfea6c48a,
431
    0x532e349d, 0x55f3a2a0,  0xe18a0532,  0xebf6a475,
432
    0xec830b39, 0xef6040aa,  0x9f715e06,  0x106ebd51,
433
    0x8a213ef9, 0x6dd963d,   0x53eddae,   0xbde64d46,
434
    0x8d5491b5, 0x5dc47105,  0xd406046f,  0x155060ff,
435
    0xfb981924, 0xe9bdd697,  0x434089cc,  0x9ed96777,
436
    0x42e8b0bd, 0x8b890788,  0x5b19e738,  0xeec879db,
437
    0xa7ca147,  0xf427ce9,   0x1e84f8c9,  0x0,
438
    0x86800983, 0xed2b3248,  0x70111eac,  0x725a6c4e,
439
    0xff0efdfb, 0x38850f56,  0xd5ae3d1e,  0x392d3627,
440
    0xd90f0a64, 0xa65c6821,  0x545b9bd1,  0x2e36243a,
441
    0x670a0cb1, 0xe757930f,  0x96eeb4d2,  0x919b1b9e,
442
    0xc5c0804f, 0x20dc61a2,  0x4b775a69,  0x1a121c16,
443
    0xba93e20a, 0x2aa0c0e5,  0xe0223c43,  0x171b121d,
444
    0xd090e0b,  0xc78bf2ad,  0xa8b62db9,  0xa91e14c8,
445
    0x19f15785, 0x775af4c,   0xdd99eebb,  0x607fa3fd,
446
    0x2601f79f, 0xf5725cbc,  0x3b6644c5,  0x7efb5b34,
447
    0x29438b76, 0xc623cbdc,  0xfcedb668,  0xf1e4b863,
448
    0xdc31d7ca, 0x85634210,  0x22971340,  0x11c68420,
449
    0x244a857d, 0x3dbbd2f8,  0x32f9ae11,  0xa129c76d,
450
    0x2f9e1d4b, 0x30b2dcf3,  0x52860dec,  0xe3c177d0,
451
    0x16b32b6c, 0xb970a999,  0x489411fa,  0x64e94722,
452
    0x8cfca8c4, 0x3ff0a01a,  0x2c7d56d8,  0x903322ef,
453
    0x4e4987c7, 0xd138d9c1,  0xa2ca8cfe,  0xbd49836,
454
    0x81f5a6cf, 0xde7aa528,  0x8eb7da26,  0xbfad3fa4,
455
    0x9d3a2ce4, 0x9278500d,  0xcc5f6a9b,  0x467e5462,
456
    0x138df6c2, 0xb8d890e8,  0xf7392e5e,  0xafc382f5,
457
    0x805d9fbe, 0x93d0697c,  0x2dd56fa9,  0x1225cfb3,
458
    0x99acc83b, 0x7d1810a7,  0x639ce86e,  0xbb3bdb7b,
459
    0x7826cd09, 0x18596ef4,  0xb79aec01,  0x9a4f83a8,
460
    0x6e95e665, 0xe6ffaa7e,  0xcfbc2108,  0xe815efe6,
461
    0x9be7bad9, 0x366f4ace,  0x99fead4,   0x7cb029d6,
462
    0xb2a431af, 0x233f2a31,  0x94a5c630,  0x66a235c0,
463
    0xbc4e7437, 0xca82fca6,  0xd090e0b0,  0xd8a73315,
464
    0x9804f14a, 0xdaec41f7,  0x50cd7f0e,  0xf691172f,
465
    0xd64d768d, 0xb0ef434d,  0x4daacc54,  0x496e4df,
466
    0xb5d19ee3, 0x886a4c1b,  0x1f2cc1b8,  0x5165467f,
467
    0xea5e9d04, 0x358c015d,  0x7487fa73,  0x410bfb2e,
468
    0x1d67b35a, 0xd2db9252,  0x5610e933,  0x47d66d13,
469
    0x61d79a8c, 0xca1377a,   0x14f8598e,  0x3c13eb89,
470
    0x27a9ceee, 0xc961b735,  0xe51ce1ed,  0xb1477a3c,
471
    0xdfd29c59, 0x73f2553f,  0xce141879,  0x37c773bf,
472
    0xcdf753ea, 0xaafd5f5b,  0x6f3ddf14,  0xdb447886,
473
    0xf3afca81, 0xc468b93e,  0x3424382c,  0x40a3c25f,
474
    0xc31d1672, 0x25e2bc0c,  0x493c288b,  0x950dff41,
475
    0x1a83971,  0xb30c08de,  0xe4b4d89c,  0xc1566490,
476
    0x84cb7b61, 0xb632d570,  0x5c6c4874,  0x57b8d042,
477
};
478
/* clang-format on */
479
480
/* clang-format off */
481
static const uint32_t U2[256] = {
482
    0xf45150a7, 0x417e5365,  0x171ac3a4,  0x273a965e,
483
    0xab3bcb6b, 0x9d1ff145,  0xfaacab58,  0xe34b9303,
484
    0x302055fa, 0x76adf66d,  0xcc889176,  0x2f5254c,
485
    0xe54ffcd7, 0x2ac5d7cb,  0x35268044,  0x62b58fa3,
486
    0xb1de495a, 0xba25671b,  0xea45980e,  0xfe5de1c0,
487
    0x2fc30275, 0x4c8112f0,  0x468da397,  0xd36bc6f9,
488
    0x8f03e75f, 0x9215959c,  0x6dbfeb7a,  0x5295da59,
489
    0xbed42d83, 0x7458d321,  0xe0492969,  0xc98e44c8,
490
    0xc2756a89, 0x8ef47879,  0x58996b3e,  0xb927dd71,
491
    0xe1beb64f, 0x88f017ad,  0x20c966ac,  0xce7db43a,
492
    0xdf63184a, 0x1ae58231,  0x51976033,  0x5362457f,
493
    0x64b1e077, 0x6bbb84ae,  0x81fe1ca0,  0x8f9942b,
494
    0x48705868, 0x458f19fd,  0xde94876c,  0x7b52b7f8,
495
    0x73ab23d3, 0x4b72e202,  0x1fe3578f,  0x55662aab,
496
    0xebb20728, 0xb52f03c2,  0xc5869a7b,  0x37d3a508,
497
    0x2830f287, 0xbf23b2a5,  0x302ba6a,   0x16ed5c82,
498
    0xcf8a2b1c, 0x79a792b4,  0x7f3f0f2,   0x694ea1e2,
499
    0xda65cdf4, 0x506d5be,   0x34d11f62,  0xa6c48afe,
500
    0x2e349d53, 0xf3a2a055,  0x8a0532e1,  0xf6a475eb,
501
    0x830b39ec, 0x6040aaef,  0x715e069f,  0x6ebd5110,
502
    0x213ef98a, 0xdd963d06,  0x3eddae05,  0xe64d46bd,
503
    0x5491b58d, 0xc471055d,  0x6046fd4,   0x5060ff15,
504
    0x981924fb, 0xbdd697e9,  0x4089cc43,  0xd967779e,
505
    0xe8b0bd42, 0x8907888b,  0x19e7385b,  0xc879dbee,
506
    0x7ca1470a, 0x427ce90f,  0x84f8c91e,  0x0,
507
    0x80098386, 0x2b3248ed,  0x111eac70,  0x5a6c4e72,
508
    0xefdfbff,  0x850f5638,  0xae3d1ed5,  0x2d362739,
509
    0xf0a64d9,  0x5c6821a6,  0x5b9bd154,  0x36243a2e,
510
    0xa0cb167,  0x57930fe7,  0xeeb4d296,  0x9b1b9e91,
511
    0xc0804fc5, 0xdc61a220,  0x775a694b,  0x121c161a,
512
    0x93e20aba, 0xa0c0e52a,  0x223c43e0,  0x1b121d17,
513
    0x90e0b0d,  0x8bf2adc7,  0xb62db9a8,  0x1e14c8a9,
514
    0xf1578519, 0x75af4c07,  0x99eebbdd,  0x7fa3fd60,
515
    0x1f79f26,  0x725cbcf5,  0x6644c53b,  0xfb5b347e,
516
    0x438b7629, 0x23cbdcc6,  0xedb668fc,  0xe4b863f1,
517
    0x31d7cadc, 0x63421085,  0x97134022,  0xc6842011,
518
    0x4a857d24, 0xbbd2f83d,  0xf9ae1132,  0x29c76da1,
519
    0x9e1d4b2f, 0xb2dcf330,  0x860dec52,  0xc177d0e3,
520
    0xb32b6c16, 0x70a999b9,  0x9411fa48,  0xe9472264,
521
    0xfca8c48c, 0xf0a01a3f,  0x7d56d82c,  0x3322ef90,
522
    0x4987c74e, 0x38d9c1d1,  0xca8cfea2,  0xd498360b,
523
    0xf5a6cf81, 0x7aa528de,  0xb7da268e,  0xad3fa4bf,
524
    0x3a2ce49d, 0x78500d92,  0x5f6a9bcc,  0x7e546246,
525
    0x8df6c213, 0xd890e8b8,  0x392e5ef7,  0xc382f5af,
526
    0x5d9fbe80, 0xd0697c93,  0xd56fa92d,  0x25cfb312,
527
    0xacc83b99, 0x1810a77d,  0x9ce86e63,  0x3bdb7bbb,
528
    0x26cd0978, 0x596ef418,  0x9aec01b7,  0x4f83a89a,
529
    0x95e6656e, 0xffaa7ee6,  0xbc2108cf,  0x15efe6e8,
530
    0xe7bad99b, 0x6f4ace36,  0x9fead409,  0xb029d67c,
531
    0xa431afb2, 0x3f2a3123,  0xa5c63094,  0xa235c066,
532
    0x4e7437bc, 0x82fca6ca,  0x90e0b0d0,  0xa73315d8,
533
    0x4f14a98,  0xec41f7da,  0xcd7f0e50,  0x91172ff6,
534
    0x4d768dd6, 0xef434db0,  0xaacc544d,  0x96e4df04,
535
    0xd19ee3b5, 0x6a4c1b88,  0x2cc1b81f,  0x65467f51,
536
    0x5e9d04ea, 0x8c015d35,  0x87fa7374,  0xbfb2e41,
537
    0x67b35a1d, 0xdb9252d2,  0x10e93356,  0xd66d1347,
538
    0xd79a8c61, 0xa1377a0c,  0xf8598e14,  0x13eb893c,
539
    0xa9ceee27, 0x61b735c9,  0x1ce1ede5,  0x477a3cb1,
540
    0xd29c59df, 0xf2553f73,  0x141879ce,  0xc773bf37,
541
    0xf753eacd, 0xfd5f5baa,  0x3ddf146f,  0x447886db,
542
    0xafca81f3, 0x68b93ec4,  0x24382c34,  0xa3c25f40,
543
    0x1d1672c3, 0xe2bc0c25,  0x3c288b49,  0xdff4195,
544
    0xa8397101, 0xc08deb3,   0xb4d89ce4,  0x566490c1,
545
    0xcb7b6184, 0x32d570b6,  0x6c48745c,  0xb8d04257,
546
};
547
/* clang-format on */
548
549
/* clang-format off */
550
static const uint32_t U3[256] = {
551
    0x5150a7f4, 0x7e536541,  0x1ac3a417,  0x3a965e27,
552
    0x3bcb6bab, 0x1ff1459d,  0xacab58fa,  0x4b9303e3,
553
    0x2055fa30, 0xadf66d76,  0x889176cc,  0xf5254c02,
554
    0x4ffcd7e5, 0xc5d7cb2a,  0x26804435,  0xb58fa362,
555
    0xde495ab1, 0x25671bba,  0x45980eea,  0x5de1c0fe,
556
    0xc302752f, 0x8112f04c,  0x8da39746,  0x6bc6f9d3,
557
    0x3e75f8f,  0x15959c92,  0xbfeb7a6d,  0x95da5952,
558
    0xd42d83be, 0x58d32174,  0x492969e0,  0x8e44c8c9,
559
    0x756a89c2, 0xf478798e,  0x996b3e58,  0x27dd71b9,
560
    0xbeb64fe1, 0xf017ad88,  0xc966ac20,  0x7db43ace,
561
    0x63184adf, 0xe582311a,  0x97603351,  0x62457f53,
562
    0xb1e07764, 0xbb84ae6b,  0xfe1ca081,  0xf9942b08,
563
    0x70586848, 0x8f19fd45,  0x94876cde,  0x52b7f87b,
564
    0xab23d373, 0x72e2024b,  0xe3578f1f,  0x662aab55,
565
    0xb20728eb, 0x2f03c2b5,  0x869a7bc5,  0xd3a50837,
566
    0x30f28728, 0x23b2a5bf,  0x2ba6a03,   0xed5c8216,
567
    0x8a2b1ccf, 0xa792b479,  0xf3f0f207,  0x4ea1e269,
568
    0x65cdf4da, 0x6d5be05,   0xd11f6234,  0xc48afea6,
569
    0x349d532e, 0xa2a055f3,  0x532e18a,   0xa475ebf6,
570
    0xb39ec83,  0x40aaef60,  0x5e069f71,  0xbd51106e,
571
    0x3ef98a21, 0x963d06dd,  0xddae053e,  0x4d46bde6,
572
    0x91b58d54, 0x71055dc4,  0x46fd406,   0x60ff1550,
573
    0x1924fb98, 0xd697e9bd,  0x89cc4340,  0x67779ed9,
574
    0xb0bd42e8, 0x7888b89,   0xe7385b19,  0x79dbeec8,
575
    0xa1470a7c, 0x7ce90f42,  0xf8c91e84,  0x0,
576
    0x9838680,  0x3248ed2b,  0x1eac7011,  0x6c4e725a,
577
    0xfdfbff0e, 0xf563885,   0x3d1ed5ae,  0x3627392d,
578
    0xa64d90f,  0x6821a65c,  0x9bd1545b,  0x243a2e36,
579
    0xcb1670a,  0x930fe757,  0xb4d296ee,  0x1b9e919b,
580
    0x804fc5c0, 0x61a220dc,  0x5a694b77,  0x1c161a12,
581
    0xe20aba93, 0xc0e52aa0,  0x3c43e022,  0x121d171b,
582
    0xe0b0d09,  0xf2adc78b,  0x2db9a8b6,  0x14c8a91e,
583
    0x578519f1, 0xaf4c0775,  0xeebbdd99,  0xa3fd607f,
584
    0xf79f2601, 0x5cbcf572,  0x44c53b66,  0x5b347efb,
585
    0x8b762943, 0xcbdcc623,  0xb668fced,  0xb863f1e4,
586
    0xd7cadc31, 0x42108563,  0x13402297,  0x842011c6,
587
    0x857d244a, 0xd2f83dbb,  0xae1132f9,  0xc76da129,
588
    0x1d4b2f9e, 0xdcf330b2,  0xdec5286,   0x77d0e3c1,
589
    0x2b6c16b3, 0xa999b970,  0x11fa4894,  0x472264e9,
590
    0xa8c48cfc, 0xa01a3ff0,  0x56d82c7d,  0x22ef9033,
591
    0x87c74e49, 0xd9c1d138,  0x8cfea2ca,  0x98360bd4,
592
    0xa6cf81f5, 0xa528de7a,  0xda268eb7,  0x3fa4bfad,
593
    0x2ce49d3a, 0x500d9278,  0x6a9bcc5f,  0x5462467e,
594
    0xf6c2138d, 0x90e8b8d8,  0x2e5ef739,  0x82f5afc3,
595
    0x9fbe805d, 0x697c93d0,  0x6fa92dd5,  0xcfb31225,
596
    0xc83b99ac, 0x10a77d18,  0xe86e639c,  0xdb7bbb3b,
597
    0xcd097826, 0x6ef41859,  0xec01b79a,  0x83a89a4f,
598
    0xe6656e95, 0xaa7ee6ff,  0x2108cfbc,  0xefe6e815,
599
    0xbad99be7, 0x4ace366f,  0xead4099f,  0x29d67cb0,
600
    0x31afb2a4, 0x2a31233f,  0xc63094a5,  0x35c066a2,
601
    0x7437bc4e, 0xfca6ca82,  0xe0b0d090,  0x3315d8a7,
602
    0xf14a9804, 0x41f7daec,  0x7f0e50cd,  0x172ff691,
603
    0x768dd64d, 0x434db0ef,  0xcc544daa,  0xe4df0496,
604
    0x9ee3b5d1, 0x4c1b886a,  0xc1b81f2c,  0x467f5165,
605
    0x9d04ea5e, 0x15d358c,   0xfa737487,  0xfb2e410b,
606
    0xb35a1d67, 0x9252d2db,  0xe9335610,  0x6d1347d6,
607
    0x9a8c61d7, 0x377a0ca1,  0x598e14f8,  0xeb893c13,
608
    0xceee27a9, 0xb735c961,  0xe1ede51c,  0x7a3cb147,
609
    0x9c59dfd2, 0x553f73f2,  0x1879ce14,  0x73bf37c7,
610
    0x53eacdf7, 0x5f5baafd,  0xdf146f3d,  0x7886db44,
611
    0xca81f3af, 0xb93ec468,  0x382c3424,  0xc25f40a3,
612
    0x1672c31d, 0xbc0c25e2,  0x288b493c,  0xff41950d,
613
    0x397101a8, 0x8deb30c,   0xd89ce4b4,  0x6490c156,
614
    0x7b6184cb, 0xd570b632,  0x48745c6c,  0xd04257b8,
615
};
616
/* clang-format on */
617
618
#else /* assume big endian */
619
/* clang-format off */
620
static const uint32_t T0[256] = {
621
    0xc66363a5, 0xf87c7c84,  0xee777799,  0xf67b7b8d,
622
    0xfff2f20d, 0xd66b6bbd,  0xde6f6fb1,  0x91c5c554,
623
    0x60303050, 0x2010103,   0xce6767a9,  0x562b2b7d,
624
    0xe7fefe19, 0xb5d7d762,  0x4dababe6,  0xec76769a,
625
    0x8fcaca45, 0x1f82829d,  0x89c9c940,  0xfa7d7d87,
626
    0xeffafa15, 0xb25959eb,  0x8e4747c9,  0xfbf0f00b,
627
    0x41adadec, 0xb3d4d467,  0x5fa2a2fd,  0x45afafea,
628
    0x239c9cbf, 0x53a4a4f7,  0xe4727296,  0x9bc0c05b,
629
    0x75b7b7c2, 0xe1fdfd1c,  0x3d9393ae,  0x4c26266a,
630
    0x6c36365a, 0x7e3f3f41,  0xf5f7f702,  0x83cccc4f,
631
    0x6834345c, 0x51a5a5f4,  0xd1e5e534,  0xf9f1f108,
632
    0xe2717193, 0xabd8d873,  0x62313153,  0x2a15153f,
633
    0x804040c,  0x95c7c752,  0x46232365,  0x9dc3c35e,
634
    0x30181828, 0x379696a1,  0xa05050f,   0x2f9a9ab5,
635
    0xe070709,  0x24121236,  0x1b80809b,  0xdfe2e23d,
636
    0xcdebeb26, 0x4e272769,  0x7fb2b2cd,  0xea75759f,
637
    0x1209091b, 0x1d83839e,  0x582c2c74,  0x341a1a2e,
638
    0x361b1b2d, 0xdc6e6eb2,  0xb45a5aee,  0x5ba0a0fb,
639
    0xa45252f6, 0x763b3b4d,  0xb7d6d661,  0x7db3b3ce,
640
    0x5229297b, 0xdde3e33e,  0x5e2f2f71,  0x13848497,
641
    0xa65353f5, 0xb9d1d168,  0x0,         0xc1eded2c,
642
    0x40202060, 0xe3fcfc1f,  0x79b1b1c8,  0xb65b5bed,
643
    0xd46a6abe, 0x8dcbcb46,  0x67bebed9,  0x7239394b,
644
    0x944a4ade, 0x984c4cd4,  0xb05858e8,  0x85cfcf4a,
645
    0xbbd0d06b, 0xc5efef2a,  0x4faaaae5,  0xedfbfb16,
646
    0x864343c5, 0x9a4d4dd7,  0x66333355,  0x11858594,
647
    0x8a4545cf, 0xe9f9f910,  0x4020206,   0xfe7f7f81,
648
    0xa05050f0, 0x783c3c44,  0x259f9fba,  0x4ba8a8e3,
649
    0xa25151f3, 0x5da3a3fe,  0x804040c0,  0x58f8f8a,
650
    0x3f9292ad, 0x219d9dbc,  0x70383848,  0xf1f5f504,
651
    0x63bcbcdf, 0x77b6b6c1,  0xafdada75,  0x42212163,
652
    0x20101030, 0xe5ffff1a,  0xfdf3f30e,  0xbfd2d26d,
653
    0x81cdcd4c, 0x180c0c14,  0x26131335,  0xc3ecec2f,
654
    0xbe5f5fe1, 0x359797a2,  0x884444cc,  0x2e171739,
655
    0x93c4c457, 0x55a7a7f2,  0xfc7e7e82,  0x7a3d3d47,
656
    0xc86464ac, 0xba5d5de7,  0x3219192b,  0xe6737395,
657
    0xc06060a0, 0x19818198,  0x9e4f4fd1,  0xa3dcdc7f,
658
    0x44222266, 0x542a2a7e,  0x3b9090ab,  0xb888883,
659
    0x8c4646ca, 0xc7eeee29,  0x6bb8b8d3,  0x2814143c,
660
    0xa7dede79, 0xbc5e5ee2,  0x160b0b1d,  0xaddbdb76,
661
    0xdbe0e03b, 0x64323256,  0x743a3a4e,  0x140a0a1e,
662
    0x924949db, 0xc06060a,   0x4824246c,  0xb85c5ce4,
663
    0x9fc2c25d, 0xbdd3d36e,  0x43acacef,  0xc46262a6,
664
    0x399191a8, 0x319595a4,  0xd3e4e437,  0xf279798b,
665
    0xd5e7e732, 0x8bc8c843,  0x6e373759,  0xda6d6db7,
666
    0x18d8d8c,  0xb1d5d564,  0x9c4e4ed2,  0x49a9a9e0,
667
    0xd86c6cb4, 0xac5656fa,  0xf3f4f407,  0xcfeaea25,
668
    0xca6565af, 0xf47a7a8e,  0x47aeaee9,  0x10080818,
669
    0x6fbabad5, 0xf0787888,  0x4a25256f,  0x5c2e2e72,
670
    0x381c1c24, 0x57a6a6f1,  0x73b4b4c7,  0x97c6c651,
671
    0xcbe8e823, 0xa1dddd7c,  0xe874749c,  0x3e1f1f21,
672
    0x964b4bdd, 0x61bdbddc,  0xd8b8b86,   0xf8a8a85,
673
    0xe0707090, 0x7c3e3e42,  0x71b5b5c4,  0xcc6666aa,
674
    0x904848d8, 0x6030305,   0xf7f6f601,  0x1c0e0e12,
675
    0xc26161a3, 0x6a35355f,  0xae5757f9,  0x69b9b9d0,
676
    0x17868691, 0x99c1c158,  0x3a1d1d27,  0x279e9eb9,
677
    0xd9e1e138, 0xebf8f813,  0x2b9898b3,  0x22111133,
678
    0xd26969bb, 0xa9d9d970,  0x78e8e89,   0x339494a7,
679
    0x2d9b9bb6, 0x3c1e1e22,  0x15878792,  0xc9e9e920,
680
    0x87cece49, 0xaa5555ff,  0x50282878,  0xa5dfdf7a,
681
    0x38c8c8f,  0x59a1a1f8,  0x9898980,   0x1a0d0d17,
682
    0x65bfbfda, 0xd7e6e631,  0x844242c6,  0xd06868b8,
683
    0x824141c3, 0x299999b0,  0x5a2d2d77,  0x1e0f0f11,
684
    0x7bb0b0cb, 0xa85454fc,  0x6dbbbbd6,  0x2c16163a,
685
};
686
/* clang-format on */
687
688
/* clang-format off */
689
static const uint32_t T1[256] = {
690
    0xa5c66363, 0x84f87c7c,  0x99ee7777,  0x8df67b7b,
691
    0xdfff2f2,  0xbdd66b6b,  0xb1de6f6f,  0x5491c5c5,
692
    0x50603030, 0x3020101,   0xa9ce6767,  0x7d562b2b,
693
    0x19e7fefe, 0x62b5d7d7,  0xe64dabab,  0x9aec7676,
694
    0x458fcaca, 0x9d1f8282,  0x4089c9c9,  0x87fa7d7d,
695
    0x15effafa, 0xebb25959,  0xc98e4747,  0xbfbf0f0,
696
    0xec41adad, 0x67b3d4d4,  0xfd5fa2a2,  0xea45afaf,
697
    0xbf239c9c, 0xf753a4a4,  0x96e47272,  0x5b9bc0c0,
698
    0xc275b7b7, 0x1ce1fdfd,  0xae3d9393,  0x6a4c2626,
699
    0x5a6c3636, 0x417e3f3f,  0x2f5f7f7,   0x4f83cccc,
700
    0x5c683434, 0xf451a5a5,  0x34d1e5e5,  0x8f9f1f1,
701
    0x93e27171, 0x73abd8d8,  0x53623131,  0x3f2a1515,
702
    0xc080404,  0x5295c7c7,  0x65462323,  0x5e9dc3c3,
703
    0x28301818, 0xa1379696,  0xf0a0505,   0xb52f9a9a,
704
    0x90e0707,  0x36241212,  0x9b1b8080,  0x3ddfe2e2,
705
    0x26cdebeb, 0x694e2727,  0xcd7fb2b2,  0x9fea7575,
706
    0x1b120909, 0x9e1d8383,  0x74582c2c,  0x2e341a1a,
707
    0x2d361b1b, 0xb2dc6e6e,  0xeeb45a5a,  0xfb5ba0a0,
708
    0xf6a45252, 0x4d763b3b,  0x61b7d6d6,  0xce7db3b3,
709
    0x7b522929, 0x3edde3e3,  0x715e2f2f,  0x97138484,
710
    0xf5a65353, 0x68b9d1d1,  0x0,         0x2cc1eded,
711
    0x60402020, 0x1fe3fcfc,  0xc879b1b1,  0xedb65b5b,
712
    0xbed46a6a, 0x468dcbcb,  0xd967bebe,  0x4b723939,
713
    0xde944a4a, 0xd4984c4c,  0xe8b05858,  0x4a85cfcf,
714
    0x6bbbd0d0, 0x2ac5efef,  0xe54faaaa,  0x16edfbfb,
715
    0xc5864343, 0xd79a4d4d,  0x55663333,  0x94118585,
716
    0xcf8a4545, 0x10e9f9f9,  0x6040202,   0x81fe7f7f,
717
    0xf0a05050, 0x44783c3c,  0xba259f9f,  0xe34ba8a8,
718
    0xf3a25151, 0xfe5da3a3,  0xc0804040,  0x8a058f8f,
719
    0xad3f9292, 0xbc219d9d,  0x48703838,  0x4f1f5f5,
720
    0xdf63bcbc, 0xc177b6b6,  0x75afdada,  0x63422121,
721
    0x30201010, 0x1ae5ffff,  0xefdf3f3,   0x6dbfd2d2,
722
    0x4c81cdcd, 0x14180c0c,  0x35261313,  0x2fc3ecec,
723
    0xe1be5f5f, 0xa2359797,  0xcc884444,  0x392e1717,
724
    0x5793c4c4, 0xf255a7a7,  0x82fc7e7e,  0x477a3d3d,
725
    0xacc86464, 0xe7ba5d5d,  0x2b321919,  0x95e67373,
726
    0xa0c06060, 0x98198181,  0xd19e4f4f,  0x7fa3dcdc,
727
    0x66442222, 0x7e542a2a,  0xab3b9090,  0x830b8888,
728
    0xca8c4646, 0x29c7eeee,  0xd36bb8b8,  0x3c281414,
729
    0x79a7dede, 0xe2bc5e5e,  0x1d160b0b,  0x76addbdb,
730
    0x3bdbe0e0, 0x56643232,  0x4e743a3a,  0x1e140a0a,
731
    0xdb924949, 0xa0c0606,   0x6c482424,  0xe4b85c5c,
732
    0x5d9fc2c2, 0x6ebdd3d3,  0xef43acac,  0xa6c46262,
733
    0xa8399191, 0xa4319595,  0x37d3e4e4,  0x8bf27979,
734
    0x32d5e7e7, 0x438bc8c8,  0x596e3737,  0xb7da6d6d,
735
    0x8c018d8d, 0x64b1d5d5,  0xd29c4e4e,  0xe049a9a9,
736
    0xb4d86c6c, 0xfaac5656,  0x7f3f4f4,   0x25cfeaea,
737
    0xafca6565, 0x8ef47a7a,  0xe947aeae,  0x18100808,
738
    0xd56fbaba, 0x88f07878,  0x6f4a2525,  0x725c2e2e,
739
    0x24381c1c, 0xf157a6a6,  0xc773b4b4,  0x5197c6c6,
740
    0x23cbe8e8, 0x7ca1dddd,  0x9ce87474,  0x213e1f1f,
741
    0xdd964b4b, 0xdc61bdbd,  0x860d8b8b,  0x850f8a8a,
742
    0x90e07070, 0x427c3e3e,  0xc471b5b5,  0xaacc6666,
743
    0xd8904848, 0x5060303,   0x1f7f6f6,   0x121c0e0e,
744
    0xa3c26161, 0x5f6a3535,  0xf9ae5757,  0xd069b9b9,
745
    0x91178686, 0x5899c1c1,  0x273a1d1d,  0xb9279e9e,
746
    0x38d9e1e1, 0x13ebf8f8,  0xb32b9898,  0x33221111,
747
    0xbbd26969, 0x70a9d9d9,  0x89078e8e,  0xa7339494,
748
    0xb62d9b9b, 0x223c1e1e,  0x92158787,  0x20c9e9e9,
749
    0x4987cece, 0xffaa5555,  0x78502828,  0x7aa5dfdf,
750
    0x8f038c8c, 0xf859a1a1,  0x80098989,  0x171a0d0d,
751
    0xda65bfbf, 0x31d7e6e6,  0xc6844242,  0xb8d06868,
752
    0xc3824141, 0xb0299999,  0x775a2d2d,  0x111e0f0f,
753
    0xcb7bb0b0, 0xfca85454,  0xd66dbbbb,  0x3a2c1616,
754
};
755
/* clang-format on */
756
757
/* clang-format off */
758
static const uint32_t T2[256] = {
759
    0x63a5c663, 0x7c84f87c,  0x7799ee77,  0x7b8df67b,
760
    0xf20dfff2, 0x6bbdd66b,  0x6fb1de6f,  0xc55491c5,
761
    0x30506030, 0x1030201,   0x67a9ce67,  0x2b7d562b,
762
    0xfe19e7fe, 0xd762b5d7,  0xabe64dab,  0x769aec76,
763
    0xca458fca, 0x829d1f82,  0xc94089c9,  0x7d87fa7d,
764
    0xfa15effa, 0x59ebb259,  0x47c98e47,  0xf00bfbf0,
765
    0xadec41ad, 0xd467b3d4,  0xa2fd5fa2,  0xafea45af,
766
    0x9cbf239c, 0xa4f753a4,  0x7296e472,  0xc05b9bc0,
767
    0xb7c275b7, 0xfd1ce1fd,  0x93ae3d93,  0x266a4c26,
768
    0x365a6c36, 0x3f417e3f,  0xf702f5f7,  0xcc4f83cc,
769
    0x345c6834, 0xa5f451a5,  0xe534d1e5,  0xf108f9f1,
770
    0x7193e271, 0xd873abd8,  0x31536231,  0x153f2a15,
771
    0x40c0804,  0xc75295c7,  0x23654623,  0xc35e9dc3,
772
    0x18283018, 0x96a13796,  0x50f0a05,   0x9ab52f9a,
773
    0x7090e07,  0x12362412,  0x809b1b80,  0xe23ddfe2,
774
    0xeb26cdeb, 0x27694e27,  0xb2cd7fb2,  0x759fea75,
775
    0x91b1209,  0x839e1d83,  0x2c74582c,  0x1a2e341a,
776
    0x1b2d361b, 0x6eb2dc6e,  0x5aeeb45a,  0xa0fb5ba0,
777
    0x52f6a452, 0x3b4d763b,  0xd661b7d6,  0xb3ce7db3,
778
    0x297b5229, 0xe33edde3,  0x2f715e2f,  0x84971384,
779
    0x53f5a653, 0xd168b9d1,  0x0,         0xed2cc1ed,
780
    0x20604020, 0xfc1fe3fc,  0xb1c879b1,  0x5bedb65b,
781
    0x6abed46a, 0xcb468dcb,  0xbed967be,  0x394b7239,
782
    0x4ade944a, 0x4cd4984c,  0x58e8b058,  0xcf4a85cf,
783
    0xd06bbbd0, 0xef2ac5ef,  0xaae54faa,  0xfb16edfb,
784
    0x43c58643, 0x4dd79a4d,  0x33556633,  0x85941185,
785
    0x45cf8a45, 0xf910e9f9,  0x2060402,   0x7f81fe7f,
786
    0x50f0a050, 0x3c44783c,  0x9fba259f,  0xa8e34ba8,
787
    0x51f3a251, 0xa3fe5da3,  0x40c08040,  0x8f8a058f,
788
    0x92ad3f92, 0x9dbc219d,  0x38487038,  0xf504f1f5,
789
    0xbcdf63bc, 0xb6c177b6,  0xda75afda,  0x21634221,
790
    0x10302010, 0xff1ae5ff,  0xf30efdf3,  0xd26dbfd2,
791
    0xcd4c81cd, 0xc14180c,   0x13352613,  0xec2fc3ec,
792
    0x5fe1be5f, 0x97a23597,  0x44cc8844,  0x17392e17,
793
    0xc45793c4, 0xa7f255a7,  0x7e82fc7e,  0x3d477a3d,
794
    0x64acc864, 0x5de7ba5d,  0x192b3219,  0x7395e673,
795
    0x60a0c060, 0x81981981,  0x4fd19e4f,  0xdc7fa3dc,
796
    0x22664422, 0x2a7e542a,  0x90ab3b90,  0x88830b88,
797
    0x46ca8c46, 0xee29c7ee,  0xb8d36bb8,  0x143c2814,
798
    0xde79a7de, 0x5ee2bc5e,  0xb1d160b,   0xdb76addb,
799
    0xe03bdbe0, 0x32566432,  0x3a4e743a,  0xa1e140a,
800
    0x49db9249, 0x60a0c06,   0x246c4824,  0x5ce4b85c,
801
    0xc25d9fc2, 0xd36ebdd3,  0xacef43ac,  0x62a6c462,
802
    0x91a83991, 0x95a43195,  0xe437d3e4,  0x798bf279,
803
    0xe732d5e7, 0xc8438bc8,  0x37596e37,  0x6db7da6d,
804
    0x8d8c018d, 0xd564b1d5,  0x4ed29c4e,  0xa9e049a9,
805
    0x6cb4d86c, 0x56faac56,  0xf407f3f4,  0xea25cfea,
806
    0x65afca65, 0x7a8ef47a,  0xaee947ae,  0x8181008,
807
    0xbad56fba, 0x7888f078,  0x256f4a25,  0x2e725c2e,
808
    0x1c24381c, 0xa6f157a6,  0xb4c773b4,  0xc65197c6,
809
    0xe823cbe8, 0xdd7ca1dd,  0x749ce874,  0x1f213e1f,
810
    0x4bdd964b, 0xbddc61bd,  0x8b860d8b,  0x8a850f8a,
811
    0x7090e070, 0x3e427c3e,  0xb5c471b5,  0x66aacc66,
812
    0x48d89048, 0x3050603,   0xf601f7f6,  0xe121c0e,
813
    0x61a3c261, 0x355f6a35,  0x57f9ae57,  0xb9d069b9,
814
    0x86911786, 0xc15899c1,  0x1d273a1d,  0x9eb9279e,
815
    0xe138d9e1, 0xf813ebf8,  0x98b32b98,  0x11332211,
816
    0x69bbd269, 0xd970a9d9,  0x8e89078e,  0x94a73394,
817
    0x9bb62d9b, 0x1e223c1e,  0x87921587,  0xe920c9e9,
818
    0xce4987ce, 0x55ffaa55,  0x28785028,  0xdf7aa5df,
819
    0x8c8f038c, 0xa1f859a1,  0x89800989,  0xd171a0d,
820
    0xbfda65bf, 0xe631d7e6,  0x42c68442,  0x68b8d068,
821
    0x41c38241, 0x99b02999,  0x2d775a2d,  0xf111e0f,
822
    0xb0cb7bb0, 0x54fca854,  0xbbd66dbb,  0x163a2c16,
823
};
824
/* clang-format on */
825
826
/* clang-format off */
827
static const uint32_t T3[256] = {
828
    0x6363a5c6, 0x7c7c84f8,  0x777799ee,  0x7b7b8df6,
829
    0xf2f20dff, 0x6b6bbdd6,  0x6f6fb1de,  0xc5c55491,
830
    0x30305060, 0x1010302,   0x6767a9ce,  0x2b2b7d56,
831
    0xfefe19e7, 0xd7d762b5,  0xababe64d,  0x76769aec,
832
    0xcaca458f, 0x82829d1f,  0xc9c94089,  0x7d7d87fa,
833
    0xfafa15ef, 0x5959ebb2,  0x4747c98e,  0xf0f00bfb,
834
    0xadadec41, 0xd4d467b3,  0xa2a2fd5f,  0xafafea45,
835
    0x9c9cbf23, 0xa4a4f753,  0x727296e4,  0xc0c05b9b,
836
    0xb7b7c275, 0xfdfd1ce1,  0x9393ae3d,  0x26266a4c,
837
    0x36365a6c, 0x3f3f417e,  0xf7f702f5,  0xcccc4f83,
838
    0x34345c68, 0xa5a5f451,  0xe5e534d1,  0xf1f108f9,
839
    0x717193e2, 0xd8d873ab,  0x31315362,  0x15153f2a,
840
    0x4040c08,  0xc7c75295,  0x23236546,  0xc3c35e9d,
841
    0x18182830, 0x9696a137,  0x5050f0a,   0x9a9ab52f,
842
    0x707090e,  0x12123624,  0x80809b1b,  0xe2e23ddf,
843
    0xebeb26cd, 0x2727694e,  0xb2b2cd7f,  0x75759fea,
844
    0x9091b12,  0x83839e1d,  0x2c2c7458,  0x1a1a2e34,
845
    0x1b1b2d36, 0x6e6eb2dc,  0x5a5aeeb4,  0xa0a0fb5b,
846
    0x5252f6a4, 0x3b3b4d76,  0xd6d661b7,  0xb3b3ce7d,
847
    0x29297b52, 0xe3e33edd,  0x2f2f715e,  0x84849713,
848
    0x5353f5a6, 0xd1d168b9,  0x0,         0xeded2cc1,
849
    0x20206040, 0xfcfc1fe3,  0xb1b1c879,  0x5b5bedb6,
850
    0x6a6abed4, 0xcbcb468d,  0xbebed967,  0x39394b72,
851
    0x4a4ade94, 0x4c4cd498,  0x5858e8b0,  0xcfcf4a85,
852
    0xd0d06bbb, 0xefef2ac5,  0xaaaae54f,  0xfbfb16ed,
853
    0x4343c586, 0x4d4dd79a,  0x33335566,  0x85859411,
854
    0x4545cf8a, 0xf9f910e9,  0x2020604,   0x7f7f81fe,
855
    0x5050f0a0, 0x3c3c4478,  0x9f9fba25,  0xa8a8e34b,
856
    0x5151f3a2, 0xa3a3fe5d,  0x4040c080,  0x8f8f8a05,
857
    0x9292ad3f, 0x9d9dbc21,  0x38384870,  0xf5f504f1,
858
    0xbcbcdf63, 0xb6b6c177,  0xdada75af,  0x21216342,
859
    0x10103020, 0xffff1ae5,  0xf3f30efd,  0xd2d26dbf,
860
    0xcdcd4c81, 0xc0c1418,   0x13133526,  0xecec2fc3,
861
    0x5f5fe1be, 0x9797a235,  0x4444cc88,  0x1717392e,
862
    0xc4c45793, 0xa7a7f255,  0x7e7e82fc,  0x3d3d477a,
863
    0x6464acc8, 0x5d5de7ba,  0x19192b32,  0x737395e6,
864
    0x6060a0c0, 0x81819819,  0x4f4fd19e,  0xdcdc7fa3,
865
    0x22226644, 0x2a2a7e54,  0x9090ab3b,  0x8888830b,
866
    0x4646ca8c, 0xeeee29c7,  0xb8b8d36b,  0x14143c28,
867
    0xdede79a7, 0x5e5ee2bc,  0xb0b1d16,   0xdbdb76ad,
868
    0xe0e03bdb, 0x32325664,  0x3a3a4e74,  0xa0a1e14,
869
    0x4949db92, 0x6060a0c,   0x24246c48,  0x5c5ce4b8,
870
    0xc2c25d9f, 0xd3d36ebd,  0xacacef43,  0x6262a6c4,
871
    0x9191a839, 0x9595a431,  0xe4e437d3,  0x79798bf2,
872
    0xe7e732d5, 0xc8c8438b,  0x3737596e,  0x6d6db7da,
873
    0x8d8d8c01, 0xd5d564b1,  0x4e4ed29c,  0xa9a9e049,
874
    0x6c6cb4d8, 0x5656faac,  0xf4f407f3,  0xeaea25cf,
875
    0x6565afca, 0x7a7a8ef4,  0xaeaee947,  0x8081810,
876
    0xbabad56f, 0x787888f0,  0x25256f4a,  0x2e2e725c,
877
    0x1c1c2438, 0xa6a6f157,  0xb4b4c773,  0xc6c65197,
878
    0xe8e823cb, 0xdddd7ca1,  0x74749ce8,  0x1f1f213e,
879
    0x4b4bdd96, 0xbdbddc61,  0x8b8b860d,  0x8a8a850f,
880
    0x707090e0, 0x3e3e427c,  0xb5b5c471,  0x6666aacc,
881
    0x4848d890, 0x3030506,   0xf6f601f7,  0xe0e121c,
882
    0x6161a3c2, 0x35355f6a,  0x5757f9ae,  0xb9b9d069,
883
    0x86869117, 0xc1c15899,  0x1d1d273a,  0x9e9eb927,
884
    0xe1e138d9, 0xf8f813eb,  0x9898b32b,  0x11113322,
885
    0x6969bbd2, 0xd9d970a9,  0x8e8e8907,  0x9494a733,
886
    0x9b9bb62d, 0x1e1e223c,  0x87879215,  0xe9e920c9,
887
    0xcece4987, 0x5555ffaa,  0x28287850,  0xdfdf7aa5,
888
    0x8c8c8f03, 0xa1a1f859,  0x89898009,  0xd0d171a,
889
    0xbfbfda65, 0xe6e631d7,  0x4242c684,  0x6868b8d0,
890
    0x4141c382, 0x9999b029,  0x2d2d775a,  0xf0f111e,
891
    0xb0b0cb7b, 0x5454fca8,  0xbbbbd66d,  0x16163a2c,
892
};
893
/* clang-format on */
894
895
/* clang-format off */
896
static const uint32_t U0[256] = {
897
    0x51f4a750, 0x7e416553,  0x1a17a4c3,  0x3a275e96,
898
    0x3bab6bcb, 0x1f9d45f1,  0xacfa58ab,  0x4be30393,
899
    0x2030fa55, 0xad766df6,  0x88cc7691,  0xf5024c25,
900
    0x4fe5d7fc, 0xc52acbd7,  0x26354480,  0xb562a38f,
901
    0xdeb15a49, 0x25ba1b67,  0x45ea0e98,  0x5dfec0e1,
902
    0xc32f7502, 0x814cf012,  0x8d4697a3,  0x6bd3f9c6,
903
    0x38f5fe7,  0x15929c95,  0xbf6d7aeb,  0x955259da,
904
    0xd4be832d, 0x587421d3,  0x49e06929,  0x8ec9c844,
905
    0x75c2896a, 0xf48e7978,  0x99583e6b,  0x27b971dd,
906
    0xbee14fb6, 0xf088ad17,  0xc920ac66,  0x7dce3ab4,
907
    0x63df4a18, 0xe51a3182,  0x97513360,  0x62537f45,
908
    0xb16477e0, 0xbb6bae84,  0xfe81a01c,  0xf9082b94,
909
    0x70486858, 0x8f45fd19,  0x94de6c87,  0x527bf8b7,
910
    0xab73d323, 0x724b02e2,  0xe31f8f57,  0x6655ab2a,
911
    0xb2eb2807, 0x2fb5c203,  0x86c57b9a,  0xd33708a5,
912
    0x302887f2, 0x23bfa5b2,  0x2036aba,   0xed16825c,
913
    0x8acf1c2b, 0xa779b492,  0xf307f2f0,  0x4e69e2a1,
914
    0x65daf4cd, 0x605bed5,   0xd134621f,  0xc4a6fe8a,
915
    0x342e539d, 0xa2f355a0,  0x58ae132,   0xa4f6eb75,
916
    0xb83ec39,  0x4060efaa,  0x5e719f06,  0xbd6e1051,
917
    0x3e218af9, 0x96dd063d,  0xdd3e05ae,  0x4de6bd46,
918
    0x91548db5, 0x71c45d05,  0x406d46f,   0x605015ff,
919
    0x1998fb24, 0xd6bde997,  0x894043cc,  0x67d99e77,
920
    0xb0e842bd, 0x7898b88,   0xe7195b38,  0x79c8eedb,
921
    0xa17c0a47, 0x7c420fe9,  0xf8841ec9,  0x0,
922
    0x9808683,  0x322bed48,  0x1e1170ac,  0x6c5a724e,
923
    0xfd0efffb, 0xf853856,   0x3daed51e,  0x362d3927,
924
    0xa0fd964,  0x685ca621,  0x9b5b54d1,  0x24362e3a,
925
    0xc0a67b1,  0x9357e70f,  0xb4ee96d2,  0x1b9b919e,
926
    0x80c0c54f, 0x61dc20a2,  0x5a774b69,  0x1c121a16,
927
    0xe293ba0a, 0xc0a02ae5,  0x3c22e043,  0x121b171d,
928
    0xe090d0b,  0xf28bc7ad,  0x2db6a8b9,  0x141ea9c8,
929
    0x57f11985, 0xaf75074c,  0xee99ddbb,  0xa37f60fd,
930
    0xf701269f, 0x5c72f5bc,  0x44663bc5,  0x5bfb7e34,
931
    0x8b432976, 0xcb23c6dc,  0xb6edfc68,  0xb8e4f163,
932
    0xd731dcca, 0x42638510,  0x13972240,  0x84c61120,
933
    0x854a247d, 0xd2bb3df8,  0xaef93211,  0xc729a16d,
934
    0x1d9e2f4b, 0xdcb230f3,  0xd8652ec,   0x77c1e3d0,
935
    0x2bb3166c, 0xa970b999,  0x119448fa,  0x47e96422,
936
    0xa8fc8cc4, 0xa0f03f1a,  0x567d2cd8,  0x223390ef,
937
    0x87494ec7, 0xd938d1c1,  0x8ccaa2fe,  0x98d40b36,
938
    0xa6f581cf, 0xa57ade28,  0xdab78e26,  0x3fadbfa4,
939
    0x2c3a9de4, 0x5078920d,  0x6a5fcc9b,  0x547e4662,
940
    0xf68d13c2, 0x90d8b8e8,  0x2e39f75e,  0x82c3aff5,
941
    0x9f5d80be, 0x69d0937c,  0x6fd52da9,  0xcf2512b3,
942
    0xc8ac993b, 0x10187da7,  0xe89c636e,  0xdb3bbb7b,
943
    0xcd267809, 0x6e5918f4,  0xec9ab701,  0x834f9aa8,
944
    0xe6956e65, 0xaaffe67e,  0x21bccf08,  0xef15e8e6,
945
    0xbae79bd9, 0x4a6f36ce,  0xea9f09d4,  0x29b07cd6,
946
    0x31a4b2af, 0x2a3f2331,  0xc6a59430,  0x35a266c0,
947
    0x744ebc37, 0xfc82caa6,  0xe090d0b0,  0x33a7d815,
948
    0xf104984a, 0x41ecdaf7,  0x7fcd500e,  0x1791f62f,
949
    0x764dd68d, 0x43efb04d,  0xccaa4d54,  0xe49604df,
950
    0x9ed1b5e3, 0x4c6a881b,  0xc12c1fb8,  0x4665517f,
951
    0x9d5eea04, 0x18c355d,   0xfa877473,  0xfb0b412e,
952
    0xb3671d5a, 0x92dbd252,  0xe9105633,  0x6dd64713,
953
    0x9ad7618c, 0x37a10c7a,  0x59f8148e,  0xeb133c89,
954
    0xcea927ee, 0xb761c935,  0xe11ce5ed,  0x7a47b13c,
955
    0x9cd2df59, 0x55f2733f,  0x1814ce79,  0x73c737bf,
956
    0x53f7cdea, 0x5ffdaa5b,  0xdf3d6f14,  0x7844db86,
957
    0xcaaff381, 0xb968c43e,  0x3824342c,  0xc2a3405f,
958
    0x161dc372, 0xbce2250c,  0x283c498b,  0xff0d9541,
959
    0x39a80171, 0x80cb3de,   0xd8b4e49c,  0x6456c190,
960
    0x7bcb8461, 0xd532b670,  0x486c5c74,  0xd0b85742
961
};
962
/* clang-format on */
963
964
/* clang-format off */
965
static const uint32_t U1[256] = {
966
    0x5051f4a7, 0x537e4165,  0xc31a17a4,  0x963a275e,
967
    0xcb3bab6b, 0xf11f9d45,  0xabacfa58,  0x934be303,
968
    0x552030fa, 0xf6ad766d,  0x9188cc76,  0x25f5024c,
969
    0xfc4fe5d7, 0xd7c52acb,  0x80263544,  0x8fb562a3,
970
    0x49deb15a, 0x6725ba1b,  0x9845ea0e,  0xe15dfec0,
971
    0x2c32f75,  0x12814cf0,  0xa38d4697,  0xc66bd3f9,
972
    0xe7038f5f, 0x9515929c,  0xebbf6d7a,  0xda955259,
973
    0x2dd4be83, 0xd3587421,  0x2949e069,  0x448ec9c8,
974
    0x6a75c289, 0x78f48e79,  0x6b99583e,  0xdd27b971,
975
    0xb6bee14f, 0x17f088ad,  0x66c920ac,  0xb47dce3a,
976
    0x1863df4a, 0x82e51a31,  0x60975133,  0x4562537f,
977
    0xe0b16477, 0x84bb6bae,  0x1cfe81a0,  0x94f9082b,
978
    0x58704868, 0x198f45fd,  0x8794de6c,  0xb7527bf8,
979
    0x23ab73d3, 0xe2724b02,  0x57e31f8f,  0x2a6655ab,
980
    0x7b2eb28,  0x32fb5c2,   0x9a86c57b,  0xa5d33708,
981
    0xf2302887, 0xb223bfa5,  0xba02036a,  0x5ced1682,
982
    0x2b8acf1c, 0x92a779b4,  0xf0f307f2,  0xa14e69e2,
983
    0xcd65daf4, 0xd50605be,  0x1fd13462,  0x8ac4a6fe,
984
    0x9d342e53, 0xa0a2f355,  0x32058ae1,  0x75a4f6eb,
985
    0x390b83ec, 0xaa4060ef,  0x65e719f,   0x51bd6e10,
986
    0xf93e218a, 0x3d96dd06,  0xaedd3e05,  0x464de6bd,
987
    0xb591548d, 0x571c45d,   0x6f0406d4,  0xff605015,
988
    0x241998fb, 0x97d6bde9,  0xcc894043,  0x7767d99e,
989
    0xbdb0e842, 0x8807898b,  0x38e7195b,  0xdb79c8ee,
990
    0x47a17c0a, 0xe97c420f,  0xc9f8841e,  0x0,
991
    0x83098086, 0x48322bed,  0xac1e1170,  0x4e6c5a72,
992
    0xfbfd0eff, 0x560f8538,  0x1e3daed5,  0x27362d39,
993
    0x640a0fd9, 0x21685ca6,  0xd19b5b54,  0x3a24362e,
994
    0xb10c0a67, 0xf9357e7,   0xd2b4ee96,  0x9e1b9b91,
995
    0x4f80c0c5, 0xa261dc20,  0x695a774b,  0x161c121a,
996
    0xae293ba,  0xe5c0a02a,  0x433c22e0,  0x1d121b17,
997
    0xb0e090d,  0xadf28bc7,  0xb92db6a8,  0xc8141ea9,
998
    0x8557f119, 0x4caf7507,  0xbbee99dd,  0xfda37f60,
999
    0x9ff70126, 0xbc5c72f5,  0xc544663b,  0x345bfb7e,
1000
    0x768b4329, 0xdccb23c6,  0x68b6edfc,  0x63b8e4f1,
1001
    0xcad731dc, 0x10426385,  0x40139722,  0x2084c611,
1002
    0x7d854a24, 0xf8d2bb3d,  0x11aef932,  0x6dc729a1,
1003
    0x4b1d9e2f, 0xf3dcb230,  0xec0d8652,  0xd077c1e3,
1004
    0x6c2bb316, 0x99a970b9,  0xfa119448,  0x2247e964,
1005
    0xc4a8fc8c, 0x1aa0f03f,  0xd8567d2c,  0xef223390,
1006
    0xc787494e, 0xc1d938d1,  0xfe8ccaa2,  0x3698d40b,
1007
    0xcfa6f581, 0x28a57ade,  0x26dab78e,  0xa43fadbf,
1008
    0xe42c3a9d, 0xd507892,   0x9b6a5fcc,  0x62547e46,
1009
    0xc2f68d13, 0xe890d8b8,  0x5e2e39f7,  0xf582c3af,
1010
    0xbe9f5d80, 0x7c69d093,  0xa96fd52d,  0xb3cf2512,
1011
    0x3bc8ac99, 0xa710187d,  0x6ee89c63,  0x7bdb3bbb,
1012
    0x9cd2678,  0xf46e5918,  0x1ec9ab7,   0xa8834f9a,
1013
    0x65e6956e, 0x7eaaffe6,  0x821bccf,   0xe6ef15e8,
1014
    0xd9bae79b, 0xce4a6f36,  0xd4ea9f09,  0xd629b07c,
1015
    0xaf31a4b2, 0x312a3f23,  0x30c6a594,  0xc035a266,
1016
    0x37744ebc, 0xa6fc82ca,  0xb0e090d0,  0x1533a7d8,
1017
    0x4af10498, 0xf741ecda,  0xe7fcd50,   0x2f1791f6,
1018
    0x8d764dd6, 0x4d43efb0,  0x54ccaa4d,  0xdfe49604,
1019
    0xe39ed1b5, 0x1b4c6a88,  0xb8c12c1f,  0x7f466551,
1020
    0x49d5eea,  0x5d018c35,  0x73fa8774,  0x2efb0b41,
1021
    0x5ab3671d, 0x5292dbd2,  0x33e91056,  0x136dd647,
1022
    0x8c9ad761, 0x7a37a10c,  0x8e59f814,  0x89eb133c,
1023
    0xeecea927, 0x35b761c9,  0xede11ce5,  0x3c7a47b1,
1024
    0x599cd2df, 0x3f55f273,  0x791814ce,  0xbf73c737,
1025
    0xea53f7cd, 0x5b5ffdaa,  0x14df3d6f,  0x867844db,
1026
    0x81caaff3, 0x3eb968c4,  0x2c382434,  0x5fc2a340,
1027
    0x72161dc3, 0xcbce225,   0x8b283c49,  0x41ff0d95,
1028
    0x7139a801, 0xde080cb3,  0x9cd8b4e4,  0x906456c1,
1029
    0x617bcb84, 0x70d532b6,  0x74486c5c,  0x42d0b857
1030
};
1031
/* clang-format on */
1032
1033
/* clang-format off */
1034
static const uint32_t U2[256] = {
1035
    0xa75051f4, 0x65537e41,  0xa4c31a17,  0x5e963a27,
1036
    0x6bcb3bab, 0x45f11f9d,  0x58abacfa,  0x3934be3,
1037
    0xfa552030, 0x6df6ad76,  0x769188cc,  0x4c25f502,
1038
    0xd7fc4fe5, 0xcbd7c52a,  0x44802635,  0xa38fb562,
1039
    0x5a49deb1, 0x1b6725ba,  0xe9845ea,   0xc0e15dfe,
1040
    0x7502c32f, 0xf012814c,  0x97a38d46,  0xf9c66bd3,
1041
    0x5fe7038f, 0x9c951592,  0x7aebbf6d,  0x59da9552,
1042
    0x832dd4be, 0x21d35874,  0x692949e0,  0xc8448ec9,
1043
    0x896a75c2, 0x7978f48e,  0x3e6b9958,  0x71dd27b9,
1044
    0x4fb6bee1, 0xad17f088,  0xac66c920,  0x3ab47dce,
1045
    0x4a1863df, 0x3182e51a,  0x33609751,  0x7f456253,
1046
    0x77e0b164, 0xae84bb6b,  0xa01cfe81,  0x2b94f908,
1047
    0x68587048, 0xfd198f45,  0x6c8794de,  0xf8b7527b,
1048
    0xd323ab73, 0x2e2724b,   0x8f57e31f,  0xab2a6655,
1049
    0x2807b2eb, 0xc2032fb5,  0x7b9a86c5,  0x8a5d337,
1050
    0x87f23028, 0xa5b223bf,  0x6aba0203,  0x825ced16,
1051
    0x1c2b8acf, 0xb492a779,  0xf2f0f307,  0xe2a14e69,
1052
    0xf4cd65da, 0xbed50605,  0x621fd134,  0xfe8ac4a6,
1053
    0x539d342e, 0x55a0a2f3,  0xe132058a,  0xeb75a4f6,
1054
    0xec390b83, 0xefaa4060,  0x9f065e71,  0x1051bd6e,
1055
    0x8af93e21, 0x63d96dd,   0x5aedd3e,   0xbd464de6,
1056
    0x8db59154, 0x5d0571c4,  0xd46f0406,  0x15ff6050,
1057
    0xfb241998, 0xe997d6bd,  0x43cc8940,  0x9e7767d9,
1058
    0x42bdb0e8, 0x8b880789,  0x5b38e719,  0xeedb79c8,
1059
    0xa47a17c,  0xfe97c42,   0x1ec9f884,  0x0,
1060
    0x86830980, 0xed48322b,  0x70ac1e11,  0x724e6c5a,
1061
    0xfffbfd0e, 0x38560f85,  0xd51e3dae,  0x3927362d,
1062
    0xd9640a0f, 0xa621685c,  0x54d19b5b,  0x2e3a2436,
1063
    0x67b10c0a, 0xe70f9357,  0x96d2b4ee,  0x919e1b9b,
1064
    0xc54f80c0, 0x20a261dc,  0x4b695a77,  0x1a161c12,
1065
    0xba0ae293, 0x2ae5c0a0,  0xe0433c22,  0x171d121b,
1066
    0xd0b0e09,  0xc7adf28b,  0xa8b92db6,  0xa9c8141e,
1067
    0x198557f1, 0x74caf75,   0xddbbee99,  0x60fda37f,
1068
    0x269ff701, 0xf5bc5c72,  0x3bc54466,  0x7e345bfb,
1069
    0x29768b43, 0xc6dccb23,  0xfc68b6ed,  0xf163b8e4,
1070
    0xdccad731, 0x85104263,  0x22401397,  0x112084c6,
1071
    0x247d854a, 0x3df8d2bb,  0x3211aef9,  0xa16dc729,
1072
    0x2f4b1d9e, 0x30f3dcb2,  0x52ec0d86,  0xe3d077c1,
1073
    0x166c2bb3, 0xb999a970,  0x48fa1194,  0x642247e9,
1074
    0x8cc4a8fc, 0x3f1aa0f0,  0x2cd8567d,  0x90ef2233,
1075
    0x4ec78749, 0xd1c1d938,  0xa2fe8cca,  0xb3698d4,
1076
    0x81cfa6f5, 0xde28a57a,  0x8e26dab7,  0xbfa43fad,
1077
    0x9de42c3a, 0x920d5078,  0xcc9b6a5f,  0x4662547e,
1078
    0x13c2f68d, 0xb8e890d8,  0xf75e2e39,  0xaff582c3,
1079
    0x80be9f5d, 0x937c69d0,  0x2da96fd5,  0x12b3cf25,
1080
    0x993bc8ac, 0x7da71018,  0x636ee89c,  0xbb7bdb3b,
1081
    0x7809cd26, 0x18f46e59,  0xb701ec9a,  0x9aa8834f,
1082
    0x6e65e695, 0xe67eaaff,  0xcf0821bc,  0xe8e6ef15,
1083
    0x9bd9bae7, 0x36ce4a6f,  0x9d4ea9f,   0x7cd629b0,
1084
    0xb2af31a4, 0x23312a3f,  0x9430c6a5,  0x66c035a2,
1085
    0xbc37744e, 0xcaa6fc82,  0xd0b0e090,  0xd81533a7,
1086
    0x984af104, 0xdaf741ec,  0x500e7fcd,  0xf62f1791,
1087
    0xd68d764d, 0xb04d43ef,  0x4d54ccaa,  0x4dfe496,
1088
    0xb5e39ed1, 0x881b4c6a,  0x1fb8c12c,  0x517f4665,
1089
    0xea049d5e, 0x355d018c,  0x7473fa87,  0x412efb0b,
1090
    0x1d5ab367, 0xd25292db,  0x5633e910,  0x47136dd6,
1091
    0x618c9ad7, 0xc7a37a1,   0x148e59f8,  0x3c89eb13,
1092
    0x27eecea9, 0xc935b761,  0xe5ede11c,  0xb13c7a47,
1093
    0xdf599cd2, 0x733f55f2,  0xce791814,  0x37bf73c7,
1094
    0xcdea53f7, 0xaa5b5ffd,  0x6f14df3d,  0xdb867844,
1095
    0xf381caaf, 0xc43eb968,  0x342c3824,  0x405fc2a3,
1096
    0xc372161d, 0x250cbce2,  0x498b283c,  0x9541ff0d,
1097
    0x17139a8,  0xb3de080c,  0xe49cd8b4,  0xc1906456,
1098
    0x84617bcb, 0xb670d532,  0x5c74486c,  0x5742d0b8
1099
};
1100
/* clang-format on */
1101
1102
/* clang-format off */
1103
static const uint32_t U3[256] = {
1104
    0xf4a75051, 0x4165537e,  0x17a4c31a,  0x275e963a,
1105
    0xab6bcb3b, 0x9d45f11f,  0xfa58abac,  0xe303934b,
1106
    0x30fa5520, 0x766df6ad,  0xcc769188,  0x24c25f5,
1107
    0xe5d7fc4f, 0x2acbd7c5,  0x35448026,  0x62a38fb5,
1108
    0xb15a49de, 0xba1b6725,  0xea0e9845,  0xfec0e15d,
1109
    0x2f7502c3, 0x4cf01281,  0x4697a38d,  0xd3f9c66b,
1110
    0x8f5fe703, 0x929c9515,  0x6d7aebbf,  0x5259da95,
1111
    0xbe832dd4, 0x7421d358,  0xe0692949,  0xc9c8448e,
1112
    0xc2896a75, 0x8e7978f4,  0x583e6b99,  0xb971dd27,
1113
    0xe14fb6be, 0x88ad17f0,  0x20ac66c9,  0xce3ab47d,
1114
    0xdf4a1863, 0x1a3182e5,  0x51336097,  0x537f4562,
1115
    0x6477e0b1, 0x6bae84bb,  0x81a01cfe,  0x82b94f9,
1116
    0x48685870, 0x45fd198f,  0xde6c8794,  0x7bf8b752,
1117
    0x73d323ab, 0x4b02e272,  0x1f8f57e3,  0x55ab2a66,
1118
    0xeb2807b2, 0xb5c2032f,  0xc57b9a86,  0x3708a5d3,
1119
    0x2887f230, 0xbfa5b223,  0x36aba02,   0x16825ced,
1120
    0xcf1c2b8a, 0x79b492a7,  0x7f2f0f3,   0x69e2a14e,
1121
    0xdaf4cd65, 0x5bed506,   0x34621fd1,  0xa6fe8ac4,
1122
    0x2e539d34, 0xf355a0a2,  0x8ae13205,  0xf6eb75a4,
1123
    0x83ec390b, 0x60efaa40,  0x719f065e,  0x6e1051bd,
1124
    0x218af93e, 0xdd063d96,  0x3e05aedd,  0xe6bd464d,
1125
    0x548db591, 0xc45d0571,  0x6d46f04,   0x5015ff60,
1126
    0x98fb2419, 0xbde997d6,  0x4043cc89,  0xd99e7767,
1127
    0xe842bdb0, 0x898b8807,  0x195b38e7,  0xc8eedb79,
1128
    0x7c0a47a1, 0x420fe97c,  0x841ec9f8,  0x0,
1129
    0x80868309, 0x2bed4832,  0x1170ac1e,  0x5a724e6c,
1130
    0xefffbfd,  0x8538560f,  0xaed51e3d,  0x2d392736,
1131
    0xfd9640a,  0x5ca62168,  0x5b54d19b,  0x362e3a24,
1132
    0xa67b10c,  0x57e70f93,  0xee96d2b4,  0x9b919e1b,
1133
    0xc0c54f80, 0xdc20a261,  0x774b695a,  0x121a161c,
1134
    0x93ba0ae2, 0xa02ae5c0,  0x22e0433c,  0x1b171d12,
1135
    0x90d0b0e,  0x8bc7adf2,  0xb6a8b92d,  0x1ea9c814,
1136
    0xf1198557, 0x75074caf,  0x99ddbbee,  0x7f60fda3,
1137
    0x1269ff7,  0x72f5bc5c,  0x663bc544,  0xfb7e345b,
1138
    0x4329768b, 0x23c6dccb,  0xedfc68b6,  0xe4f163b8,
1139
    0x31dccad7, 0x63851042,  0x97224013,  0xc6112084,
1140
    0x4a247d85, 0xbb3df8d2,  0xf93211ae,  0x29a16dc7,
1141
    0x9e2f4b1d, 0xb230f3dc,  0x8652ec0d,  0xc1e3d077,
1142
    0xb3166c2b, 0x70b999a9,  0x9448fa11,  0xe9642247,
1143
    0xfc8cc4a8, 0xf03f1aa0,  0x7d2cd856,  0x3390ef22,
1144
    0x494ec787, 0x38d1c1d9,  0xcaa2fe8c,  0xd40b3698,
1145
    0xf581cfa6, 0x7ade28a5,  0xb78e26da,  0xadbfa43f,
1146
    0x3a9de42c, 0x78920d50,  0x5fcc9b6a,  0x7e466254,
1147
    0x8d13c2f6, 0xd8b8e890,  0x39f75e2e,  0xc3aff582,
1148
    0x5d80be9f, 0xd0937c69,  0xd52da96f,  0x2512b3cf,
1149
    0xac993bc8, 0x187da710,  0x9c636ee8,  0x3bbb7bdb,
1150
    0x267809cd, 0x5918f46e,  0x9ab701ec,  0x4f9aa883,
1151
    0x956e65e6, 0xffe67eaa,  0xbccf0821,  0x15e8e6ef,
1152
    0xe79bd9ba, 0x6f36ce4a,  0x9f09d4ea,  0xb07cd629,
1153
    0xa4b2af31, 0x3f23312a,  0xa59430c6,  0xa266c035,
1154
    0x4ebc3774, 0x82caa6fc,  0x90d0b0e0,  0xa7d81533,
1155
    0x4984af1,  0xecdaf741,  0xcd500e7f,  0x91f62f17,
1156
    0x4dd68d76, 0xefb04d43,  0xaa4d54cc,  0x9604dfe4,
1157
    0xd1b5e39e, 0x6a881b4c,  0x2c1fb8c1,  0x65517f46,
1158
    0x5eea049d, 0x8c355d01,  0x877473fa,  0xb412efb,
1159
    0x671d5ab3, 0xdbd25292,  0x105633e9,  0xd647136d,
1160
    0xd7618c9a, 0xa10c7a37,  0xf8148e59,  0x133c89eb,
1161
    0xa927eece, 0x61c935b7,  0x1ce5ede1,  0x47b13c7a,
1162
    0xd2df599c, 0xf2733f55,  0x14ce7918,  0xc737bf73,
1163
    0xf7cdea53, 0xfdaa5b5f,  0x3d6f14df,  0x44db8678,
1164
    0xaff381ca, 0x68c43eb9,  0x24342c38,  0xa3405fc2,
1165
    0x1dc37216, 0xe2250cbc,  0x3c498b28,  0xd9541ff,
1166
    0xa8017139, 0xcb3de08,   0xb4e49cd8,  0x56c19064,
1167
    0xcb84617b, 0x32b670d5,  0x6c5c7448,  0xb85742d0
1168
};
1169
/* clang-format on */
1170
#endif
1171
1172
/*
1173
 * the following tables (aes_sbox, aes_inv_sbox, T4, U4) are
1174
 * endian-neutral
1175
 */
1176
/* clang-format off */
1177
static const uint8_t aes_sbox[256] = {
1178
    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
1179
    0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
1180
    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
1181
    0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
1182
    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
1183
    0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
1184
    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
1185
    0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
1186
    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
1187
    0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
1188
    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
1189
    0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
1190
    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
1191
    0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
1192
    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
1193
    0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
1194
    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
1195
    0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
1196
    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
1197
    0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
1198
    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
1199
    0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
1200
    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
1201
    0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
1202
    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
1203
    0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
1204
    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
1205
    0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
1206
    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
1207
    0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
1208
    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
1209
    0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
1210
};
1211
/* clang-format on */
1212
1213
#ifndef CPU_RISC
1214
/* clang-format off */
1215
static const uint8_t aes_inv_sbox[256] = {
1216
    0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
1217
    0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
1218
    0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
1219
    0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
1220
    0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
1221
    0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
1222
    0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
1223
    0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
1224
    0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
1225
    0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
1226
    0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
1227
    0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
1228
    0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
1229
    0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
1230
    0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
1231
    0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
1232
    0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
1233
    0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
1234
    0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
1235
    0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
1236
    0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
1237
    0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
1238
    0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
1239
    0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
1240
    0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
1241
    0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
1242
    0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
1243
    0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
1244
    0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
1245
    0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
1246
    0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
1247
    0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
1248
};
1249
/* clang-format on */
1250
#endif /* ! CPU_RISC */
1251
1252
#ifdef CPU_RISC
1253
/* clang-format off */
1254
static const uint32_t T4[256] = {
1255
    0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
1256
    0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
1257
    0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
1258
    0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
1259
    0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
1260
    0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
1261
    0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
1262
    0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
1263
    0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
1264
    0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
1265
    0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
1266
    0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
1267
    0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
1268
    0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
1269
    0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
1270
    0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
1271
    0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
1272
    0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
1273
    0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
1274
    0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
1275
    0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
1276
    0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
1277
    0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
1278
    0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
1279
    0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
1280
    0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
1281
    0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
1282
    0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
1283
    0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
1284
    0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
1285
    0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
1286
    0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
1287
    0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
1288
    0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
1289
    0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
1290
    0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
1291
    0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
1292
    0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
1293
    0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
1294
    0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
1295
    0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
1296
    0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
1297
    0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
1298
    0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
1299
    0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
1300
    0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
1301
    0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
1302
    0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
1303
    0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
1304
    0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
1305
    0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
1306
    0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
1307
    0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
1308
    0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
1309
    0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
1310
    0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
1311
    0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
1312
    0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
1313
    0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
1314
    0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
1315
    0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
1316
    0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
1317
    0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
1318
    0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616
1319
};
1320
/* clang-format on */
1321
1322
/* clang-format off */
1323
static const uint32_t U4[256] = {
1324
    0x52525252, 0x9090909,   0x6a6a6a6a,  0xd5d5d5d5,
1325
    0x30303030, 0x36363636,  0xa5a5a5a5,  0x38383838,
1326
    0xbfbfbfbf, 0x40404040,  0xa3a3a3a3,  0x9e9e9e9e,
1327
    0x81818181, 0xf3f3f3f3,  0xd7d7d7d7,  0xfbfbfbfb,
1328
    0x7c7c7c7c, 0xe3e3e3e3,  0x39393939,  0x82828282,
1329
    0x9b9b9b9b, 0x2f2f2f2f,  0xffffffff,  0x87878787,
1330
    0x34343434, 0x8e8e8e8e,  0x43434343,  0x44444444,
1331
    0xc4c4c4c4, 0xdededede,  0xe9e9e9e9,  0xcbcbcbcb,
1332
    0x54545454, 0x7b7b7b7b,  0x94949494,  0x32323232,
1333
    0xa6a6a6a6, 0xc2c2c2c2,  0x23232323,  0x3d3d3d3d,
1334
    0xeeeeeeee, 0x4c4c4c4c,  0x95959595,  0xb0b0b0b,
1335
    0x42424242, 0xfafafafa,  0xc3c3c3c3,  0x4e4e4e4e,
1336
    0x8080808,  0x2e2e2e2e,  0xa1a1a1a1,  0x66666666,
1337
    0x28282828, 0xd9d9d9d9,  0x24242424,  0xb2b2b2b2,
1338
    0x76767676, 0x5b5b5b5b,  0xa2a2a2a2,  0x49494949,
1339
    0x6d6d6d6d, 0x8b8b8b8b,  0xd1d1d1d1,  0x25252525,
1340
    0x72727272, 0xf8f8f8f8,  0xf6f6f6f6,  0x64646464,
1341
    0x86868686, 0x68686868,  0x98989898,  0x16161616,
1342
    0xd4d4d4d4, 0xa4a4a4a4,  0x5c5c5c5c,  0xcccccccc,
1343
    0x5d5d5d5d, 0x65656565,  0xb6b6b6b6,  0x92929292,
1344
    0x6c6c6c6c, 0x70707070,  0x48484848,  0x50505050,
1345
    0xfdfdfdfd, 0xedededed,  0xb9b9b9b9,  0xdadadada,
1346
    0x5e5e5e5e, 0x15151515,  0x46464646,  0x57575757,
1347
    0xa7a7a7a7, 0x8d8d8d8d,  0x9d9d9d9d,  0x84848484,
1348
    0x90909090, 0xd8d8d8d8,  0xabababab,  0x0,
1349
    0x8c8c8c8c, 0xbcbcbcbc,  0xd3d3d3d3,  0xa0a0a0a,
1350
    0xf7f7f7f7, 0xe4e4e4e4,  0x58585858,  0x5050505,
1351
    0xb8b8b8b8, 0xb3b3b3b3,  0x45454545,  0x6060606,
1352
    0xd0d0d0d0, 0x2c2c2c2c,  0x1e1e1e1e,  0x8f8f8f8f,
1353
    0xcacacaca, 0x3f3f3f3f,  0xf0f0f0f,   0x2020202,
1354
    0xc1c1c1c1, 0xafafafaf,  0xbdbdbdbd,  0x3030303,
1355
    0x1010101,  0x13131313,  0x8a8a8a8a,  0x6b6b6b6b,
1356
    0x3a3a3a3a, 0x91919191,  0x11111111,  0x41414141,
1357
    0x4f4f4f4f, 0x67676767,  0xdcdcdcdc,  0xeaeaeaea,
1358
    0x97979797, 0xf2f2f2f2,  0xcfcfcfcf,  0xcececece,
1359
    0xf0f0f0f0, 0xb4b4b4b4,  0xe6e6e6e6,  0x73737373,
1360
    0x96969696, 0xacacacac,  0x74747474,  0x22222222,
1361
    0xe7e7e7e7, 0xadadadad,  0x35353535,  0x85858585,
1362
    0xe2e2e2e2, 0xf9f9f9f9,  0x37373737,  0xe8e8e8e8,
1363
    0x1c1c1c1c, 0x75757575,  0xdfdfdfdf,  0x6e6e6e6e,
1364
    0x47474747, 0xf1f1f1f1,  0x1a1a1a1a,  0x71717171,
1365
    0x1d1d1d1d, 0x29292929,  0xc5c5c5c5,  0x89898989,
1366
    0x6f6f6f6f, 0xb7b7b7b7,  0x62626262,  0xe0e0e0e,
1367
    0xaaaaaaaa, 0x18181818,  0xbebebebe,  0x1b1b1b1b,
1368
    0xfcfcfcfc, 0x56565656,  0x3e3e3e3e,  0x4b4b4b4b,
1369
    0xc6c6c6c6, 0xd2d2d2d2,  0x79797979,  0x20202020,
1370
    0x9a9a9a9a, 0xdbdbdbdb,  0xc0c0c0c0,  0xfefefefe,
1371
    0x78787878, 0xcdcdcdcd,  0x5a5a5a5a,  0xf4f4f4f4,
1372
    0x1f1f1f1f, 0xdddddddd,  0xa8a8a8a8,  0x33333333,
1373
    0x88888888, 0x7070707,   0xc7c7c7c7,  0x31313131,
1374
    0xb1b1b1b1, 0x12121212,  0x10101010,  0x59595959,
1375
    0x27272727, 0x80808080,  0xecececec,  0x5f5f5f5f,
1376
    0x60606060, 0x51515151,  0x7f7f7f7f,  0xa9a9a9a9,
1377
    0x19191919, 0xb5b5b5b5,  0x4a4a4a4a,  0xd0d0d0d,
1378
    0x2d2d2d2d, 0xe5e5e5e5,  0x7a7a7a7a,  0x9f9f9f9f,
1379
    0x93939393, 0xc9c9c9c9,  0x9c9c9c9c,  0xefefefef,
1380
    0xa0a0a0a0, 0xe0e0e0e0,  0x3b3b3b3b,  0x4d4d4d4d,
1381
    0xaeaeaeae, 0x2a2a2a2a,  0xf5f5f5f5,  0xb0b0b0b0,
1382
    0xc8c8c8c8, 0xebebebeb,  0xbbbbbbbb,  0x3c3c3c3c,
1383
    0x83838383, 0x53535353,  0x99999999,  0x61616161,
1384
    0x17171717, 0x2b2b2b2b,  0x4040404,   0x7e7e7e7e,
1385
    0xbabababa, 0x77777777,  0xd6d6d6d6,  0x26262626,
1386
    0xe1e1e1e1, 0x69696969,  0x14141414,  0x63636363,
1387
    0x55555555, 0x21212121,  0xc0c0c0c,   0x7d7d7d7d
1388
};
1389
/* clang-format on */
1390
#endif /* CPU_RISC */
1391
1392
23.1k
#define gf2_8_field_polynomial 0x1B
1393
/*
1394
 * gf2_8_shift(z) returns the result of the GF(2^8) 'multiply by x'
1395
 * operation, using the field representation from AES; that is, the
1396
 * next gf2_8 value in the cyclic representation of that field.  The
1397
 * value z should be an uint8_t.
1398
 */
1399
#define gf2_8_shift(z)                                                         \
1400
252k
    (((z)&128) ? (((z) << 1) ^ gf2_8_field_polynomial) : ((z) << 1))
1401
1402
/* aes internals */
1403
1404
static void aes_128_expand_encryption_key(const uint8_t *key,
1405
                                          srtp_aes_expanded_key_t *expanded_key)
1406
23.1k
{
1407
    /* initialize round constant */
1408
23.1k
    uint8_t rc = 1;
1409
1410
23.1k
    expanded_key->num_rounds = 10;
1411
1412
23.1k
    v128_copy_octet_string(&expanded_key->round[0], key);
1413
1414
    /* loop over round keys */
1415
254k
    for (size_t i = 1; i < 11; i++) {
1416
        /* munge first word of round key */
1417
231k
        expanded_key->round[i].v8[0] =
1418
231k
            aes_sbox[expanded_key->round[i - 1].v8[13]] ^ rc;
1419
231k
        expanded_key->round[i].v8[1] =
1420
231k
            aes_sbox[expanded_key->round[i - 1].v8[14]];
1421
231k
        expanded_key->round[i].v8[2] =
1422
231k
            aes_sbox[expanded_key->round[i - 1].v8[15]];
1423
231k
        expanded_key->round[i].v8[3] =
1424
231k
            aes_sbox[expanded_key->round[i - 1].v8[12]];
1425
1426
231k
        expanded_key->round[i].v32[0] ^= expanded_key->round[i - 1].v32[0];
1427
1428
        /* set remaining 32 bit words to the exor of the one previous with
1429
         * the one four words previous */
1430
1431
231k
        expanded_key->round[i].v32[1] =
1432
231k
            expanded_key->round[i].v32[0] ^ expanded_key->round[i - 1].v32[1];
1433
1434
231k
        expanded_key->round[i].v32[2] =
1435
231k
            expanded_key->round[i].v32[1] ^ expanded_key->round[i - 1].v32[2];
1436
1437
231k
        expanded_key->round[i].v32[3] =
1438
231k
            expanded_key->round[i].v32[2] ^ expanded_key->round[i - 1].v32[3];
1439
1440
        /* modify round constant */
1441
231k
        rc = gf2_8_shift(rc);
1442
231k
    }
1443
23.1k
}
1444
1445
static void aes_256_expand_encryption_key(const uint8_t *key,
1446
                                          srtp_aes_expanded_key_t *expanded_key)
1447
3.02k
{
1448
    /* initialize round constant */
1449
3.02k
    uint8_t rc = 1;
1450
1451
3.02k
    expanded_key->num_rounds = 14;
1452
1453
3.02k
    v128_copy_octet_string(&expanded_key->round[0], key);
1454
3.02k
    v128_copy_octet_string(&expanded_key->round[1], key + 16);
1455
1456
    /* loop over rest of round keys */
1457
42.4k
    for (size_t i = 2; i < 15; i++) {
1458
        /* munge first word of round key */
1459
39.3k
        if ((i & 1) == 0) {
1460
21.2k
            expanded_key->round[i].v8[0] =
1461
21.2k
                aes_sbox[expanded_key->round[i - 1].v8[13]] ^ rc;
1462
21.2k
            expanded_key->round[i].v8[1] =
1463
21.2k
                aes_sbox[expanded_key->round[i - 1].v8[14]];
1464
21.2k
            expanded_key->round[i].v8[2] =
1465
21.2k
                aes_sbox[expanded_key->round[i - 1].v8[15]];
1466
21.2k
            expanded_key->round[i].v8[3] =
1467
21.2k
                aes_sbox[expanded_key->round[i - 1].v8[12]];
1468
1469
            /* modify round constant */
1470
21.2k
            rc = gf2_8_shift(rc);
1471
21.2k
        } else {
1472
18.1k
            expanded_key->round[i].v8[0] =
1473
18.1k
                aes_sbox[expanded_key->round[i - 1].v8[12]];
1474
18.1k
            expanded_key->round[i].v8[1] =
1475
18.1k
                aes_sbox[expanded_key->round[i - 1].v8[13]];
1476
18.1k
            expanded_key->round[i].v8[2] =
1477
18.1k
                aes_sbox[expanded_key->round[i - 1].v8[14]];
1478
18.1k
            expanded_key->round[i].v8[3] =
1479
18.1k
                aes_sbox[expanded_key->round[i - 1].v8[15]];
1480
18.1k
        }
1481
1482
39.3k
        expanded_key->round[i].v32[0] ^= expanded_key->round[i - 2].v32[0];
1483
1484
        /* set remaining 32 bit words to the exor of the one previous with
1485
         * the one eight words previous */
1486
1487
39.3k
        expanded_key->round[i].v32[1] =
1488
39.3k
            expanded_key->round[i].v32[0] ^ expanded_key->round[i - 2].v32[1];
1489
1490
39.3k
        expanded_key->round[i].v32[2] =
1491
39.3k
            expanded_key->round[i].v32[1] ^ expanded_key->round[i - 2].v32[2];
1492
1493
39.3k
        expanded_key->round[i].v32[3] =
1494
39.3k
            expanded_key->round[i].v32[2] ^ expanded_key->round[i - 2].v32[3];
1495
39.3k
    }
1496
3.02k
}
1497
1498
srtp_err_status_t srtp_aes_expand_encryption_key(
1499
    const uint8_t *key,
1500
    size_t key_len,
1501
    srtp_aes_expanded_key_t *expanded_key)
1502
26.1k
{
1503
26.1k
    if (key_len == 16) {
1504
23.1k
        aes_128_expand_encryption_key(key, expanded_key);
1505
23.1k
        return srtp_err_status_ok;
1506
23.1k
    } else if (key_len == 24) {
1507
        /* AES-192 not yet supported */
1508
0
        return srtp_err_status_bad_param;
1509
3.02k
    } else if (key_len == 32) {
1510
3.02k
        aes_256_expand_encryption_key(key, expanded_key);
1511
3.02k
        return srtp_err_status_ok;
1512
3.02k
    } else {
1513
0
        return srtp_err_status_bad_param;
1514
0
    }
1515
26.1k
}
1516
1517
srtp_err_status_t srtp_aes_expand_decryption_key(
1518
    const uint8_t *key,
1519
    size_t key_len,
1520
    srtp_aes_expanded_key_t *expanded_key)
1521
0
{
1522
0
    srtp_err_status_t status;
1523
0
    size_t num_rounds = expanded_key->num_rounds;
1524
1525
0
    status = srtp_aes_expand_encryption_key(key, key_len, expanded_key);
1526
0
    if (status) {
1527
0
        return status;
1528
0
    }
1529
1530
    /* invert the order of the round keys */
1531
0
    for (size_t i = 0; i < num_rounds / 2; i++) {
1532
0
        v128_t tmp;
1533
0
        v128_copy(&tmp, &expanded_key->round[num_rounds - i]);
1534
0
        v128_copy(&expanded_key->round[num_rounds - i],
1535
0
                  &expanded_key->round[i]);
1536
0
        v128_copy(&expanded_key->round[i], &tmp);
1537
0
    }
1538
1539
    /*
1540
     * apply the inverse mixColumn transform to the round keys (except
1541
     * for the first and the last)
1542
     *
1543
     * mixColumn is implemented by using the tables U0, U1, U2, U3,
1544
     * followed by the T4 table (which cancels out the use of the sbox
1545
     * in the U-tables)
1546
     */
1547
0
    for (size_t i = 1; i < num_rounds; i++) {
1548
#ifdef CPU_RISC
1549
        uint32_t tmp;
1550
1551
#ifdef WORDS_BIGENDIAN
1552
        /* clang-format off */
1553
        tmp = expanded_key->round[i].v32[0];
1554
        expanded_key->round[i].v32[0] =
1555
            U0[T4[(tmp >> 24)       ] & 0xff] ^
1556
            U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
1557
            U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1558
            U3[T4[(tmp)       & 0xff] & 0xff];
1559
1560
        tmp = expanded_key->round[i].v32[1];
1561
        expanded_key->round[i].v32[1] =
1562
            U0[T4[(tmp >> 24)       ] & 0xff] ^
1563
            U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
1564
            U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1565
            U3[T4[(tmp)       & 0xff] & 0xff];
1566
1567
        tmp = expanded_key->round[i].v32[2];
1568
        expanded_key->round[i].v32[2] =
1569
            U0[T4[(tmp >> 24)       ] & 0xff] ^
1570
            U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
1571
            U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1572
            U3[T4[(tmp)       & 0xff] & 0xff];
1573
1574
        tmp = expanded_key->round[i].v32[3];
1575
        expanded_key->round[i].v32[3] =
1576
            U0[T4[(tmp >> 24)       ] & 0xff] ^
1577
            U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
1578
            U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1579
            U3[T4[(tmp)       & 0xff] & 0xff];
1580
#else
1581
        tmp = expanded_key->round[i].v32[0];
1582
        expanded_key->round[i].v32[0] =
1583
            U3[T4[(tmp >> 24)       ] & 0xff] ^
1584
            U2[T4[(tmp >> 16) & 0xff] & 0xff] ^
1585
            U1[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1586
            U0[T4[(tmp)       & 0xff] & 0xff];
1587
1588
        tmp = expanded_key->round[i].v32[1];
1589
        expanded_key->round[i].v32[1] =
1590
            U3[T4[(tmp >> 24)       ] & 0xff] ^
1591
            U2[T4[(tmp >> 16) & 0xff] & 0xff] ^
1592
            U1[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1593
            U0[T4[(tmp)       & 0xff] & 0xff];
1594
1595
        tmp = expanded_key->round[i].v32[2];
1596
        expanded_key->round[i].v32[2] =
1597
            U3[T4[(tmp >> 24)       ] & 0xff] ^
1598
            U2[T4[(tmp >> 16) & 0xff] & 0xff] ^
1599
            U1[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1600
            U0[T4[(tmp)       & 0xff] & 0xff];
1601
1602
        tmp = expanded_key->round[i].v32[3];
1603
        expanded_key->round[i].v32[3] =
1604
            U3[T4[(tmp >> 24)       ] & 0xff] ^
1605
            U2[T4[(tmp >> 16) & 0xff] & 0xff] ^
1606
            U1[T4[(tmp >> 8)  & 0xff] & 0xff] ^
1607
            U0[T4[(tmp)       & 0xff] & 0xff];
1608
/* clang-format on */
1609
#endif /* WORDS_BIGENDIAN */
1610
1611
#else /* assume CPU_CISC */
1612
1613
0
        uint32_t c0, c1, c2, c3;
1614
1615
0
        c0 = U0[aes_sbox[expanded_key->round[i].v8[0]]] ^
1616
0
             U1[aes_sbox[expanded_key->round[i].v8[1]]] ^
1617
0
             U2[aes_sbox[expanded_key->round[i].v8[2]]] ^
1618
0
             U3[aes_sbox[expanded_key->round[i].v8[3]]];
1619
1620
0
        c1 = U0[aes_sbox[expanded_key->round[i].v8[4]]] ^
1621
0
             U1[aes_sbox[expanded_key->round[i].v8[5]]] ^
1622
0
             U2[aes_sbox[expanded_key->round[i].v8[6]]] ^
1623
0
             U3[aes_sbox[expanded_key->round[i].v8[7]]];
1624
1625
0
        c2 = U0[aes_sbox[expanded_key->round[i].v8[8]]] ^
1626
0
             U1[aes_sbox[expanded_key->round[i].v8[9]]] ^
1627
0
             U2[aes_sbox[expanded_key->round[i].v8[10]]] ^
1628
0
             U3[aes_sbox[expanded_key->round[i].v8[11]]];
1629
1630
0
        c3 = U0[aes_sbox[expanded_key->round[i].v8[12]]] ^
1631
0
             U1[aes_sbox[expanded_key->round[i].v8[13]]] ^
1632
0
             U2[aes_sbox[expanded_key->round[i].v8[14]]] ^
1633
0
             U3[aes_sbox[expanded_key->round[i].v8[15]]];
1634
1635
0
        expanded_key->round[i].v32[0] = c0;
1636
0
        expanded_key->round[i].v32[1] = c1;
1637
0
        expanded_key->round[i].v32[2] = c2;
1638
0
        expanded_key->round[i].v32[3] = c3;
1639
1640
0
#endif
1641
0
    }
1642
1643
0
    return srtp_err_status_ok;
1644
0
}
1645
1646
#ifdef CPU_CISC
1647
1648
static inline void aes_round(v128_t *state, const v128_t *round_key)
1649
3.32M
{
1650
3.32M
    uint32_t column0, column1, column2, column3;
1651
1652
    /* compute the columns of the output square in terms of the octets
1653
       of state, using the tables T0, T1, T2, T3 */
1654
1655
3.32M
    column0 = T0[state->v8[0]] ^ T1[state->v8[5]] ^ T2[state->v8[10]] ^
1656
3.32M
              T3[state->v8[15]];
1657
1658
3.32M
    column1 = T0[state->v8[4]] ^ T1[state->v8[9]] ^ T2[state->v8[14]] ^
1659
3.32M
              T3[state->v8[3]];
1660
1661
3.32M
    column2 = T0[state->v8[8]] ^ T1[state->v8[13]] ^ T2[state->v8[2]] ^
1662
3.32M
              T3[state->v8[7]];
1663
1664
3.32M
    column3 = T0[state->v8[12]] ^ T1[state->v8[1]] ^ T2[state->v8[6]] ^
1665
3.32M
              T3[state->v8[11]];
1666
1667
3.32M
    state->v32[0] = column0 ^ round_key->v32[0];
1668
3.32M
    state->v32[1] = column1 ^ round_key->v32[1];
1669
3.32M
    state->v32[2] = column2 ^ round_key->v32[2];
1670
3.32M
    state->v32[3] = column3 ^ round_key->v32[3];
1671
3.32M
}
1672
1673
static inline void aes_inv_round(v128_t *state, const v128_t *round_key)
1674
0
{
1675
0
    uint32_t column0, column1, column2, column3;
1676
1677
    /* compute the columns of the output square in terms of the octets
1678
       of state, using the tables U0, U1, U2, U3 */
1679
1680
0
    column0 = U0[state->v8[0]] ^ U1[state->v8[13]] ^ U2[state->v8[10]] ^
1681
0
              U3[state->v8[7]];
1682
1683
0
    column1 = U0[state->v8[4]] ^ U1[state->v8[1]] ^ U2[state->v8[14]] ^
1684
0
              U3[state->v8[11]];
1685
1686
0
    column2 = U0[state->v8[8]] ^ U1[state->v8[5]] ^ U2[state->v8[2]] ^
1687
0
              U3[state->v8[15]];
1688
1689
0
    column3 = U0[state->v8[12]] ^ U1[state->v8[9]] ^ U2[state->v8[6]] ^
1690
0
              U3[state->v8[3]];
1691
1692
0
    state->v32[0] = column0 ^ round_key->v32[0];
1693
0
    state->v32[1] = column1 ^ round_key->v32[1];
1694
0
    state->v32[2] = column2 ^ round_key->v32[2];
1695
0
    state->v32[3] = column3 ^ round_key->v32[3];
1696
0
}
1697
1698
static inline void aes_final_round(v128_t *state, const v128_t *round_key)
1699
353k
{
1700
353k
    uint8_t tmp;
1701
1702
    /* byte substitutions and row shifts */
1703
    /* first row - no shift */
1704
353k
    state->v8[0] = aes_sbox[state->v8[0]];
1705
353k
    state->v8[4] = aes_sbox[state->v8[4]];
1706
353k
    state->v8[8] = aes_sbox[state->v8[8]];
1707
353k
    state->v8[12] = aes_sbox[state->v8[12]];
1708
1709
    /* second row - shift one left */
1710
353k
    tmp = aes_sbox[state->v8[1]];
1711
353k
    state->v8[1] = aes_sbox[state->v8[5]];
1712
353k
    state->v8[5] = aes_sbox[state->v8[9]];
1713
353k
    state->v8[9] = aes_sbox[state->v8[13]];
1714
353k
    state->v8[13] = tmp;
1715
1716
    /* third row - shift two left */
1717
353k
    tmp = aes_sbox[state->v8[10]];
1718
353k
    state->v8[10] = aes_sbox[state->v8[2]];
1719
353k
    state->v8[2] = tmp;
1720
353k
    tmp = aes_sbox[state->v8[14]];
1721
353k
    state->v8[14] = aes_sbox[state->v8[6]];
1722
353k
    state->v8[6] = tmp;
1723
1724
    /* fourth row - shift three left */
1725
353k
    tmp = aes_sbox[state->v8[15]];
1726
353k
    state->v8[15] = aes_sbox[state->v8[11]];
1727
353k
    state->v8[11] = aes_sbox[state->v8[7]];
1728
353k
    state->v8[7] = aes_sbox[state->v8[3]];
1729
353k
    state->v8[3] = tmp;
1730
1731
353k
    v128_xor_eq(state, round_key);
1732
353k
}
1733
1734
static inline void aes_inv_final_round(v128_t *state, const v128_t *round_key)
1735
0
{
1736
0
    uint8_t tmp;
1737
1738
    /* byte substitutions and row shifts */
1739
    /* first row - no shift */
1740
0
    state->v8[0] = aes_inv_sbox[state->v8[0]];
1741
0
    state->v8[4] = aes_inv_sbox[state->v8[4]];
1742
0
    state->v8[8] = aes_inv_sbox[state->v8[8]];
1743
0
    state->v8[12] = aes_inv_sbox[state->v8[12]];
1744
1745
    /* second row - shift one right */
1746
0
    tmp = aes_inv_sbox[state->v8[13]];
1747
0
    state->v8[13] = aes_inv_sbox[state->v8[9]];
1748
0
    state->v8[9] = aes_inv_sbox[state->v8[5]];
1749
0
    state->v8[5] = aes_inv_sbox[state->v8[1]];
1750
0
    state->v8[1] = tmp;
1751
1752
    /* third row - shift two right */
1753
0
    tmp = aes_inv_sbox[state->v8[2]];
1754
0
    state->v8[2] = aes_inv_sbox[state->v8[10]];
1755
0
    state->v8[10] = tmp;
1756
0
    tmp = aes_inv_sbox[state->v8[6]];
1757
0
    state->v8[6] = aes_inv_sbox[state->v8[14]];
1758
0
    state->v8[14] = tmp;
1759
1760
    /* fourth row - shift three right */
1761
0
    tmp = aes_inv_sbox[state->v8[3]];
1762
0
    state->v8[3] = aes_inv_sbox[state->v8[7]];
1763
0
    state->v8[7] = aes_inv_sbox[state->v8[11]];
1764
0
    state->v8[11] = aes_inv_sbox[state->v8[15]];
1765
0
    state->v8[15] = tmp;
1766
1767
0
    v128_xor_eq(state, round_key);
1768
0
}
1769
1770
#elif defined(CPU_RISC)
1771
1772
static inline void aes_round(v128_t *state, const v128_t *round_key)
1773
{
1774
    uint32_t column0, column1, column2, column3;
1775
1776
/* compute the columns of the output square in terms of the octets
1777
   of state, using the tables T0, T1, T2, T3 */
1778
#ifdef WORDS_BIGENDIAN
1779
    column0 = T0[state->v32[0] >> 24] ^ T1[(state->v32[1] >> 16) & 0xff] ^
1780
              T2[(state->v32[2] >> 8) & 0xff] ^ T3[state->v32[3] & 0xff];
1781
1782
    column1 = T0[state->v32[1] >> 24] ^ T1[(state->v32[2] >> 16) & 0xff] ^
1783
              T2[(state->v32[3] >> 8) & 0xff] ^ T3[state->v32[0] & 0xff];
1784
1785
    column2 = T0[state->v32[2] >> 24] ^ T1[(state->v32[3] >> 16) & 0xff] ^
1786
              T2[(state->v32[0] >> 8) & 0xff] ^ T3[state->v32[1] & 0xff];
1787
1788
    column3 = T0[state->v32[3] >> 24] ^ T1[(state->v32[0] >> 16) & 0xff] ^
1789
              T2[(state->v32[1] >> 8) & 0xff] ^ T3[state->v32[2] & 0xff];
1790
#else
1791
    column0 = T0[state->v32[0] & 0xff] ^ T1[(state->v32[1] >> 8) & 0xff] ^
1792
              T2[(state->v32[2] >> 16) & 0xff] ^ T3[state->v32[3] >> 24];
1793
1794
    column1 = T0[state->v32[1] & 0xff] ^ T1[(state->v32[2] >> 8) & 0xff] ^
1795
              T2[(state->v32[3] >> 16) & 0xff] ^ T3[state->v32[0] >> 24];
1796
1797
    column2 = T0[state->v32[2] & 0xff] ^ T1[(state->v32[3] >> 8) & 0xff] ^
1798
              T2[(state->v32[0] >> 16) & 0xff] ^ T3[state->v32[1] >> 24];
1799
1800
    column3 = T0[state->v32[3] & 0xff] ^ T1[(state->v32[0] >> 8) & 0xff] ^
1801
              T2[(state->v32[1] >> 16) & 0xff] ^ T3[state->v32[2] >> 24];
1802
#endif /* WORDS_BIGENDIAN */
1803
1804
    state->v32[0] = column0 ^ round_key->v32[0];
1805
    state->v32[1] = column1 ^ round_key->v32[1];
1806
    state->v32[2] = column2 ^ round_key->v32[2];
1807
    state->v32[3] = column3 ^ round_key->v32[3];
1808
}
1809
1810
static inline void aes_inv_round(v128_t *state, const v128_t *round_key)
1811
{
1812
    uint32_t column0, column1, column2, column3;
1813
1814
    /* compute the columns of the output square in terms of the octets
1815
       of state, using the tables U0, U1, U2, U3 */
1816
1817
#ifdef WORDS_BIGENDIAN
1818
    column0 = U0[state->v32[0] >> 24] ^ U1[(state->v32[3] >> 16) & 0xff] ^
1819
              U2[(state->v32[2] >> 8) & 0xff] ^ U3[state->v32[1] & 0xff];
1820
1821
    column1 = U0[state->v32[1] >> 24] ^ U1[(state->v32[0] >> 16) & 0xff] ^
1822
              U2[(state->v32[3] >> 8) & 0xff] ^ U3[state->v32[2] & 0xff];
1823
1824
    column2 = U0[state->v32[2] >> 24] ^ U1[(state->v32[1] >> 16) & 0xff] ^
1825
              U2[(state->v32[0] >> 8) & 0xff] ^ U3[state->v32[3] & 0xff];
1826
1827
    column3 = U0[state->v32[3] >> 24] ^ U1[(state->v32[2] >> 16) & 0xff] ^
1828
              U2[(state->v32[1] >> 8) & 0xff] ^ U3[state->v32[0] & 0xff];
1829
#else
1830
    column0 = U0[state->v32[0] & 0xff] ^ U1[(state->v32[3] >> 8) & 0xff] ^
1831
              U2[(state->v32[2] >> 16) & 0xff] ^
1832
              U3[(state->v32[1] >> 24) & 0xff];
1833
1834
    column1 = U0[state->v32[1] & 0xff] ^ U1[(state->v32[0] >> 8) & 0xff] ^
1835
              U2[(state->v32[3] >> 16) & 0xff] ^
1836
              U3[(state->v32[2] >> 24) & 0xff];
1837
1838
    column2 = U0[state->v32[2] & 0xff] ^ U1[(state->v32[1] >> 8) & 0xff] ^
1839
              U2[(state->v32[0] >> 16) & 0xff] ^
1840
              U3[(state->v32[3] >> 24) & 0xff];
1841
1842
    column3 = U0[state->v32[3] & 0xff] ^ U1[(state->v32[2] >> 8) & 0xff] ^
1843
              U2[(state->v32[1] >> 16) & 0xff] ^
1844
              U3[(state->v32[0] >> 24) & 0xff];
1845
#endif /* WORDS_BIGENDIAN */
1846
1847
    state->v32[0] = column0 ^ round_key->v32[0];
1848
    state->v32[1] = column1 ^ round_key->v32[1];
1849
    state->v32[2] = column2 ^ round_key->v32[2];
1850
    state->v32[3] = column3 ^ round_key->v32[3];
1851
}
1852
1853
static inline void aes_final_round(v128_t *state, const v128_t *round_key)
1854
{
1855
    uint32_t tmp0, tmp1, tmp2, tmp3;
1856
1857
#ifdef WORDS_BIGENDIAN
1858
    /* clang-format off */
1859
    tmp0 = (T4[(state->v32[0] >> 24)]        & 0xff000000) ^
1860
           (T4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000) ^
1861
           (T4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00) ^
1862
           (T4[(state->v32[3]      ) & 0xff] & 0x000000ff) ^
1863
           round_key->v32[0];
1864
1865
    tmp1 = (T4[(state->v32[1] >> 24)]        & 0xff000000) ^
1866
           (T4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000) ^
1867
           (T4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00) ^
1868
           (T4[(state->v32[0]      ) & 0xff] & 0x000000ff) ^
1869
           round_key->v32[1];
1870
1871
    tmp2 = (T4[(state->v32[2] >> 24)]        & 0xff000000) ^
1872
           (T4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000) ^
1873
           (T4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00) ^
1874
           (T4[(state->v32[1]      ) & 0xff] & 0x000000ff) ^
1875
           round_key->v32[2];
1876
1877
    tmp3 = (T4[(state->v32[3] >> 24)]        & 0xff000000) ^
1878
           (T4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000) ^
1879
           (T4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00) ^
1880
           (T4[(state->v32[2]      ) & 0xff] & 0x000000ff) ^
1881
           round_key->v32[3];
1882
#else
1883
    tmp0 = (T4[(state->v32[3] >> 24)]        & 0xff000000) ^
1884
           (T4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000) ^
1885
           (T4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00) ^
1886
           (T4[(state->v32[0]      ) & 0xff] & 0x000000ff) ^
1887
           round_key->v32[0];
1888
1889
    tmp1 = (T4[(state->v32[0] >> 24)]        & 0xff000000) ^
1890
           (T4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000) ^
1891
           (T4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00) ^
1892
           (T4[(state->v32[1]      ) & 0xff] & 0x000000ff) ^
1893
           round_key->v32[1];
1894
1895
    tmp2 = (T4[(state->v32[1] >> 24)]        & 0xff000000) ^
1896
           (T4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000) ^
1897
           (T4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00) ^
1898
           (T4[(state->v32[2]      ) & 0xff] & 0x000000ff) ^
1899
           round_key->v32[2];
1900
1901
    tmp3 = (T4[(state->v32[2] >> 24)]        & 0xff000000) ^
1902
           (T4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000) ^
1903
           (T4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00) ^
1904
           (T4[(state->v32[3]      ) & 0xff] & 0x000000ff) ^
1905
           round_key->v32[3];
1906
/* clang-format on */
1907
#endif /* WORDS_BIGENDIAN */
1908
1909
    state->v32[0] = tmp0;
1910
    state->v32[1] = tmp1;
1911
    state->v32[2] = tmp2;
1912
    state->v32[3] = tmp3;
1913
}
1914
1915
static inline void aes_inv_final_round(v128_t *state, const v128_t *round_key)
1916
{
1917
    uint32_t tmp0, tmp1, tmp2, tmp3;
1918
1919
#ifdef WORDS_BIGENDIAN
1920
    /* clang-format off */
1921
    tmp0 = (U4[(state->v32[0] >> 24)]        & 0xff000000) ^
1922
           (U4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000) ^
1923
           (U4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00) ^
1924
           (U4[(state->v32[1]      ) & 0xff] & 0x000000ff) ^
1925
           round_key->v32[0];
1926
1927
    tmp1 = (U4[(state->v32[1] >> 24)]        & 0xff000000) ^
1928
           (U4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000) ^
1929
           (U4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00) ^
1930
           (U4[(state->v32[2]      ) & 0xff] & 0x000000ff) ^
1931
           round_key->v32[1];
1932
1933
    tmp2 = (U4[(state->v32[2] >> 24)]        & 0xff000000) ^
1934
           (U4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000) ^
1935
           (U4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00) ^
1936
           (U4[(state->v32[3]      ) & 0xff] & 0x000000ff) ^
1937
           round_key->v32[2];
1938
1939
    tmp3 = (U4[(state->v32[3] >> 24)]        & 0xff000000) ^
1940
           (U4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000) ^
1941
           (U4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00) ^
1942
           (U4[(state->v32[0]      ) & 0xff] & 0x000000ff) ^
1943
           round_key->v32[3];
1944
#else
1945
    tmp0 = (U4[(state->v32[1] >> 24)]        & 0xff000000) ^
1946
           (U4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000) ^
1947
           (U4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00) ^
1948
           (U4[(state->v32[0]      ) & 0xff] & 0x000000ff) ^
1949
           round_key->v32[0];
1950
1951
    tmp1 = (U4[(state->v32[2] >> 24)]        & 0xff000000) ^
1952
           (U4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000) ^
1953
           (U4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00) ^
1954
           (U4[(state->v32[1]      ) & 0xff] & 0x000000ff) ^
1955
           round_key->v32[1];
1956
1957
    tmp2 = (U4[(state->v32[3] >> 24)]        & 0xff000000) ^
1958
           (U4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000) ^
1959
           (U4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00) ^
1960
           (U4[(state->v32[2]      ) & 0xff] & 0x000000ff) ^
1961
           round_key->v32[2];
1962
1963
    tmp3 = (U4[(state->v32[0] >> 24)]        & 0xff000000) ^
1964
           (U4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000) ^
1965
           (U4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00) ^
1966
           (U4[(state->v32[3]      ) & 0xff] & 0x000000ff) ^
1967
           round_key->v32[3];
1968
/* clang-format on */
1969
#endif /* WORDS_BIGENDIAN */
1970
1971
    state->v32[0] = tmp0;
1972
    state->v32[1] = tmp1;
1973
    state->v32[2] = tmp2;
1974
    state->v32[3] = tmp3;
1975
}
1976
1977
#elif CPU_16 /* assume 16-bit word size on processor */
1978
1979
static inline void aes_round(v128_t *state, const v128_t *round_key)
1980
{
1981
    uint32_t column0, column1, column2, column3;
1982
    /* compute the columns of the output square in terms of the octets
1983
       of state, using the tables T0, T1, T2, T3 */
1984
1985
    column0 = T0[state->v8[0]] ^ T1[state->v8[5]] ^ T2[state->v8[10]] ^
1986
              T3[state->v8[15]];
1987
1988
    column1 = T0[state->v8[4]] ^ T1[state->v8[9]] ^ T2[state->v8[14]] ^
1989
              T3[state->v8[3]];
1990
1991
    column2 = T0[state->v8[8]] ^ T1[state->v8[13]] ^ T2[state->v8[2]] ^
1992
              T3[state->v8[7]];
1993
1994
    column3 = T0[state->v8[12]] ^ T1[state->v8[1]] ^ T2[state->v8[6]] ^
1995
              T3[state->v8[11]];
1996
1997
    state->v32[0] = column0 ^ round_key->v32[0];
1998
    state->v32[1] = column1 ^ round_key->v32[1];
1999
    state->v32[2] = column2 ^ round_key->v32[2];
2000
    state->v32[3] = column3 ^ round_key->v32[3];
2001
}
2002
2003
static inline void aes_inv_round(v128_t *state, const v128_t *round_key)
2004
{
2005
    uint32_t column0, column1, column2, column3;
2006
2007
    /* compute the columns of the output square in terms of the octets
2008
       of state, using the tables U0, U1, U2, U3 */
2009
2010
    column0 = U0[state->v8[0]] ^ U1[state->v8[5]] ^ U2[state->v8[10]] ^
2011
              U3[state->v8[15]];
2012
2013
    column1 = U0[state->v8[4]] ^ U1[state->v8[9]] ^ U2[state->v8[14]] ^
2014
              U3[state->v8[3]];
2015
2016
    column2 = U0[state->v8[8]] ^ U1[state->v8[13]] ^ U2[state->v8[2]] ^
2017
              U3[state->v8[7]];
2018
2019
    column3 = U0[state->v8[12]] ^ U1[state->v8[1]] ^ U2[state->v8[6]] ^
2020
              U3[state->v8[11]];
2021
2022
    state->v32[0] = column0 ^ round_key->v32[0];
2023
    state->v32[1] = column1 ^ round_key->v32[1];
2024
    state->v32[2] = column2 ^ round_key->v32[2];
2025
    state->v32[3] = column3 ^ round_key->v32[3];
2026
}
2027
2028
static inline void aes_final_round(v128_t *state, const v128_t *round_key)
2029
{
2030
    uint8_t tmp;
2031
2032
    /* byte substitutions and row shifts */
2033
    /* first row - no shift */
2034
    state->v8[0] = aes_sbox[state->v8[0]];
2035
    state->v8[4] = aes_sbox[state->v8[4]];
2036
    state->v8[8] = aes_sbox[state->v8[8]];
2037
    state->v8[12] = aes_sbox[state->v8[12]];
2038
2039
    /* second row - shift one left */
2040
    tmp = aes_sbox[state->v8[1]];
2041
    state->v8[1] = aes_sbox[state->v8[5]];
2042
    state->v8[5] = aes_sbox[state->v8[9]];
2043
    state->v8[9] = aes_sbox[state->v8[13]];
2044
    state->v8[13] = tmp;
2045
2046
    /* third row - shift two left */
2047
    tmp = aes_sbox[state->v8[10]];
2048
    state->v8[10] = aes_sbox[state->v8[2]];
2049
    state->v8[2] = tmp;
2050
    tmp = aes_sbox[state->v8[14]];
2051
    state->v8[14] = aes_sbox[state->v8[6]];
2052
    state->v8[6] = tmp;
2053
2054
    /* fourth row - shift three left */
2055
    tmp = aes_sbox[state->v8[15]];
2056
    state->v8[15] = aes_sbox[state->v8[11]];
2057
    state->v8[11] = aes_sbox[state->v8[7]];
2058
    state->v8[7] = aes_sbox[state->v8[3]];
2059
    state->v8[3] = tmp;
2060
2061
    v128_xor_eq(state, round_key);
2062
}
2063
2064
static inline void aes_inv_final_round(v128_t *state, const v128_t *round_key)
2065
{
2066
    uint8_t tmp;
2067
2068
    /* byte substitutions and row shifts */
2069
    /* first row - no shift */
2070
    state->v8[0] = aes_inv_sbox[state->v8[0]];
2071
    state->v8[4] = aes_inv_sbox[state->v8[4]];
2072
    state->v8[8] = aes_inv_sbox[state->v8[8]];
2073
    state->v8[12] = aes_inv_sbox[state->v8[12]];
2074
2075
    /* second row - shift one left */
2076
    tmp = aes_inv_sbox[state->v8[1]];
2077
    state->v8[1] = aes_inv_sbox[state->v8[5]];
2078
    state->v8[5] = aes_inv_sbox[state->v8[9]];
2079
    state->v8[9] = aes_inv_sbox[state->v8[13]];
2080
    state->v8[13] = tmp;
2081
2082
    /* third row - shift two left */
2083
    tmp = aes_inv_sbox[state->v8[10]];
2084
    state->v8[10] = aes_inv_sbox[state->v8[2]];
2085
    state->v8[2] = tmp;
2086
    tmp = aes_inv_sbox[state->v8[14]];
2087
    state->v8[14] = aes_inv_sbox[state->v8[6]];
2088
    state->v8[6] = tmp;
2089
2090
    /* fourth row - shift three left */
2091
    tmp = aes_inv_sbox[state->v8[15]];
2092
    state->v8[15] = aes_inv_sbox[state->v8[11]];
2093
    state->v8[11] = aes_inv_sbox[state->v8[7]];
2094
    state->v8[7] = aes_inv_sbox[state->v8[3]];
2095
    state->v8[3] = tmp;
2096
2097
    v128_xor_eq(state, round_key);
2098
}
2099
2100
#endif /* CPU type */
2101
2102
void srtp_aes_encrypt(v128_t *plaintext, const srtp_aes_expanded_key_t *exp_key)
2103
353k
{
2104
    /* add in the subkey */
2105
353k
    v128_xor_eq(plaintext, &exp_key->round[0]);
2106
2107
    /* now do the rounds */
2108
353k
    aes_round(plaintext, &exp_key->round[1]);
2109
353k
    aes_round(plaintext, &exp_key->round[2]);
2110
353k
    aes_round(plaintext, &exp_key->round[3]);
2111
353k
    aes_round(plaintext, &exp_key->round[4]);
2112
353k
    aes_round(plaintext, &exp_key->round[5]);
2113
353k
    aes_round(plaintext, &exp_key->round[6]);
2114
353k
    aes_round(plaintext, &exp_key->round[7]);
2115
353k
    aes_round(plaintext, &exp_key->round[8]);
2116
353k
    aes_round(plaintext, &exp_key->round[9]);
2117
353k
    if (exp_key->num_rounds == 10) {
2118
317k
        aes_final_round(plaintext, &exp_key->round[10]);
2119
317k
    } else if (exp_key->num_rounds == 12) {
2120
0
        aes_round(plaintext, &exp_key->round[10]);
2121
0
        aes_round(plaintext, &exp_key->round[11]);
2122
0
        aes_final_round(plaintext, &exp_key->round[12]);
2123
36.3k
    } else if (exp_key->num_rounds == 14) {
2124
36.3k
        aes_round(plaintext, &exp_key->round[10]);
2125
36.3k
        aes_round(plaintext, &exp_key->round[11]);
2126
36.3k
        aes_round(plaintext, &exp_key->round[12]);
2127
36.3k
        aes_round(plaintext, &exp_key->round[13]);
2128
36.3k
        aes_final_round(plaintext, &exp_key->round[14]);
2129
36.3k
    }
2130
353k
}
2131
2132
void srtp_aes_decrypt(v128_t *plaintext, const srtp_aes_expanded_key_t *exp_key)
2133
0
{
2134
    /* add in the subkey */
2135
0
    v128_xor_eq(plaintext, &exp_key->round[0]);
2136
2137
    /* now do the rounds */
2138
0
    aes_inv_round(plaintext, &exp_key->round[1]);
2139
0
    aes_inv_round(plaintext, &exp_key->round[2]);
2140
0
    aes_inv_round(plaintext, &exp_key->round[3]);
2141
0
    aes_inv_round(plaintext, &exp_key->round[4]);
2142
0
    aes_inv_round(plaintext, &exp_key->round[5]);
2143
0
    aes_inv_round(plaintext, &exp_key->round[6]);
2144
0
    aes_inv_round(plaintext, &exp_key->round[7]);
2145
0
    aes_inv_round(plaintext, &exp_key->round[8]);
2146
0
    aes_inv_round(plaintext, &exp_key->round[9]);
2147
0
    if (exp_key->num_rounds == 10) {
2148
0
        aes_inv_final_round(plaintext, &exp_key->round[10]);
2149
0
    } else if (exp_key->num_rounds == 12) {
2150
0
        aes_inv_round(plaintext, &exp_key->round[10]);
2151
0
        aes_inv_round(plaintext, &exp_key->round[11]);
2152
0
        aes_inv_final_round(plaintext, &exp_key->round[12]);
2153
0
    } else if (exp_key->num_rounds == 14) {
2154
0
        aes_inv_round(plaintext, &exp_key->round[10]);
2155
0
        aes_inv_round(plaintext, &exp_key->round[11]);
2156
0
        aes_inv_round(plaintext, &exp_key->round[12]);
2157
0
        aes_inv_round(plaintext, &exp_key->round[13]);
2158
0
        aes_inv_final_round(plaintext, &exp_key->round[14]);
2159
0
    }
2160
0
}