• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

xlnt-community / xlnt / aa719a12-330c-47b2-9460-5b2d61336ff6

03 Feb 2025 05:39PM UTC coverage: 81.978% (-1.5%) from 83.482%
aa719a12-330c-47b2-9460-5b2d61336ff6

push

circleci

web-flow
Use C++23 for generating coverage report. (#57)

Using C++23 for coverage reporting, prepares the library for coverage
testing of future post-C++11 features.

This PR makes as few changes as possible to ensure all coverage changes
are due to the changed C++/compiler version used for generating the
coverage report.

Temporarily disable warnings as errors for coverage reporting until
better C++20/23 support is added in PR #55.

11395 of 13900 relevant lines covered (81.98%)

1202684.1 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.55
./source/detail/cryptography/aes.cpp
1
// Copyright (c) 2017-2022 Thomas Fussell
2
// Copyright (c) 2024-2025 xlnt-community
3
//
4
// Permission is hereby granted, free of charge, to any person obtaining a copy
5
// of this software and associated documentation files (the "Software"), to deal
6
// in the Software without restriction, including without limitation the rights
7
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
// copies of the Software, and to permit persons to whom the Software is
9
// furnished to do so, subject to the following conditions:
10
//
11
// The above copyright notice and this permission notice shall be included in
12
// all copies or substantial portions of the Software.
13
//
14
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
// THE SOFTWARE
21
//
22
// @license: http://www.opensource.org/licenses/mit-license.php
23
// @author: see AUTHORS file
24

25
// Adapted from LibTomCrypt AES implementation
26
// https://github.com/libtom/libtomcrypt/blob/develop/src/ciphers/aes/aes_tab.c
27
// https://github.com/libtom/libtomcrypt/blob/develop/src/ciphers/aes/aes.c
28

29
#include <algorithm>
30
#include <array>
31
#include <assert.h>
32
#include <stdio.h>
33
#include <stdlib.h>
34

35
#include <xlnt/utils/exceptions.hpp>
36
#include <detail/cryptography/aes.hpp>
37

38
namespace {
39

40
static const std::uint32_t TE0[256] = {
41
    0xc66363a5UL,
42
    0xf87c7c84UL,
43
    0xee777799UL,
44
    0xf67b7b8dUL,
45
    0xfff2f20dUL,
46
    0xd66b6bbdUL,
47
    0xde6f6fb1UL,
48
    0x91c5c554UL,
49
    0x60303050UL,
50
    0x02010103UL,
51
    0xce6767a9UL,
52
    0x562b2b7dUL,
53
    0xe7fefe19UL,
54
    0xb5d7d762UL,
55
    0x4dababe6UL,
56
    0xec76769aUL,
57
    0x8fcaca45UL,
58
    0x1f82829dUL,
59
    0x89c9c940UL,
60
    0xfa7d7d87UL,
61
    0xeffafa15UL,
62
    0xb25959ebUL,
63
    0x8e4747c9UL,
64
    0xfbf0f00bUL,
65
    0x41adadecUL,
66
    0xb3d4d467UL,
67
    0x5fa2a2fdUL,
68
    0x45afafeaUL,
69
    0x239c9cbfUL,
70
    0x53a4a4f7UL,
71
    0xe4727296UL,
72
    0x9bc0c05bUL,
73
    0x75b7b7c2UL,
74
    0xe1fdfd1cUL,
75
    0x3d9393aeUL,
76
    0x4c26266aUL,
77
    0x6c36365aUL,
78
    0x7e3f3f41UL,
79
    0xf5f7f702UL,
80
    0x83cccc4fUL,
81
    0x6834345cUL,
82
    0x51a5a5f4UL,
83
    0xd1e5e534UL,
84
    0xf9f1f108UL,
85
    0xe2717193UL,
86
    0xabd8d873UL,
87
    0x62313153UL,
88
    0x2a15153fUL,
89
    0x0804040cUL,
90
    0x95c7c752UL,
91
    0x46232365UL,
92
    0x9dc3c35eUL,
93
    0x30181828UL,
94
    0x379696a1UL,
95
    0x0a05050fUL,
96
    0x2f9a9ab5UL,
97
    0x0e070709UL,
98
    0x24121236UL,
99
    0x1b80809bUL,
100
    0xdfe2e23dUL,
101
    0xcdebeb26UL,
102
    0x4e272769UL,
103
    0x7fb2b2cdUL,
104
    0xea75759fUL,
105
    0x1209091bUL,
106
    0x1d83839eUL,
107
    0x582c2c74UL,
108
    0x341a1a2eUL,
109
    0x361b1b2dUL,
110
    0xdc6e6eb2UL,
111
    0xb45a5aeeUL,
112
    0x5ba0a0fbUL,
113
    0xa45252f6UL,
114
    0x763b3b4dUL,
115
    0xb7d6d661UL,
116
    0x7db3b3ceUL,
117
    0x5229297bUL,
118
    0xdde3e33eUL,
119
    0x5e2f2f71UL,
120
    0x13848497UL,
121
    0xa65353f5UL,
122
    0xb9d1d168UL,
123
    0x00000000UL,
124
    0xc1eded2cUL,
125
    0x40202060UL,
126
    0xe3fcfc1fUL,
127
    0x79b1b1c8UL,
128
    0xb65b5bedUL,
129
    0xd46a6abeUL,
130
    0x8dcbcb46UL,
131
    0x67bebed9UL,
132
    0x7239394bUL,
133
    0x944a4adeUL,
134
    0x984c4cd4UL,
135
    0xb05858e8UL,
136
    0x85cfcf4aUL,
137
    0xbbd0d06bUL,
138
    0xc5efef2aUL,
139
    0x4faaaae5UL,
140
    0xedfbfb16UL,
141
    0x864343c5UL,
142
    0x9a4d4dd7UL,
143
    0x66333355UL,
144
    0x11858594UL,
145
    0x8a4545cfUL,
146
    0xe9f9f910UL,
147
    0x04020206UL,
148
    0xfe7f7f81UL,
149
    0xa05050f0UL,
150
    0x783c3c44UL,
151
    0x259f9fbaUL,
152
    0x4ba8a8e3UL,
153
    0xa25151f3UL,
154
    0x5da3a3feUL,
155
    0x804040c0UL,
156
    0x058f8f8aUL,
157
    0x3f9292adUL,
158
    0x219d9dbcUL,
159
    0x70383848UL,
160
    0xf1f5f504UL,
161
    0x63bcbcdfUL,
162
    0x77b6b6c1UL,
163
    0xafdada75UL,
164
    0x42212163UL,
165
    0x20101030UL,
166
    0xe5ffff1aUL,
167
    0xfdf3f30eUL,
168
    0xbfd2d26dUL,
169
    0x81cdcd4cUL,
170
    0x180c0c14UL,
171
    0x26131335UL,
172
    0xc3ecec2fUL,
173
    0xbe5f5fe1UL,
174
    0x359797a2UL,
175
    0x884444ccUL,
176
    0x2e171739UL,
177
    0x93c4c457UL,
178
    0x55a7a7f2UL,
179
    0xfc7e7e82UL,
180
    0x7a3d3d47UL,
181
    0xc86464acUL,
182
    0xba5d5de7UL,
183
    0x3219192bUL,
184
    0xe6737395UL,
185
    0xc06060a0UL,
186
    0x19818198UL,
187
    0x9e4f4fd1UL,
188
    0xa3dcdc7fUL,
189
    0x44222266UL,
190
    0x542a2a7eUL,
191
    0x3b9090abUL,
192
    0x0b888883UL,
193
    0x8c4646caUL,
194
    0xc7eeee29UL,
195
    0x6bb8b8d3UL,
196
    0x2814143cUL,
197
    0xa7dede79UL,
198
    0xbc5e5ee2UL,
199
    0x160b0b1dUL,
200
    0xaddbdb76UL,
201
    0xdbe0e03bUL,
202
    0x64323256UL,
203
    0x743a3a4eUL,
204
    0x140a0a1eUL,
205
    0x924949dbUL,
206
    0x0c06060aUL,
207
    0x4824246cUL,
208
    0xb85c5ce4UL,
209
    0x9fc2c25dUL,
210
    0xbdd3d36eUL,
211
    0x43acacefUL,
212
    0xc46262a6UL,
213
    0x399191a8UL,
214
    0x319595a4UL,
215
    0xd3e4e437UL,
216
    0xf279798bUL,
217
    0xd5e7e732UL,
218
    0x8bc8c843UL,
219
    0x6e373759UL,
220
    0xda6d6db7UL,
221
    0x018d8d8cUL,
222
    0xb1d5d564UL,
223
    0x9c4e4ed2UL,
224
    0x49a9a9e0UL,
225
    0xd86c6cb4UL,
226
    0xac5656faUL,
227
    0xf3f4f407UL,
228
    0xcfeaea25UL,
229
    0xca6565afUL,
230
    0xf47a7a8eUL,
231
    0x47aeaee9UL,
232
    0x10080818UL,
233
    0x6fbabad5UL,
234
    0xf0787888UL,
235
    0x4a25256fUL,
236
    0x5c2e2e72UL,
237
    0x381c1c24UL,
238
    0x57a6a6f1UL,
239
    0x73b4b4c7UL,
240
    0x97c6c651UL,
241
    0xcbe8e823UL,
242
    0xa1dddd7cUL,
243
    0xe874749cUL,
244
    0x3e1f1f21UL,
245
    0x964b4bddUL,
246
    0x61bdbddcUL,
247
    0x0d8b8b86UL,
248
    0x0f8a8a85UL,
249
    0xe0707090UL,
250
    0x7c3e3e42UL,
251
    0x71b5b5c4UL,
252
    0xcc6666aaUL,
253
    0x904848d8UL,
254
    0x06030305UL,
255
    0xf7f6f601UL,
256
    0x1c0e0e12UL,
257
    0xc26161a3UL,
258
    0x6a35355fUL,
259
    0xae5757f9UL,
260
    0x69b9b9d0UL,
261
    0x17868691UL,
262
    0x99c1c158UL,
263
    0x3a1d1d27UL,
264
    0x279e9eb9UL,
265
    0xd9e1e138UL,
266
    0xebf8f813UL,
267
    0x2b9898b3UL,
268
    0x22111133UL,
269
    0xd26969bbUL,
270
    0xa9d9d970UL,
271
    0x078e8e89UL,
272
    0x339494a7UL,
273
    0x2d9b9bb6UL,
274
    0x3c1e1e22UL,
275
    0x15878792UL,
276
    0xc9e9e920UL,
277
    0x87cece49UL,
278
    0xaa5555ffUL,
279
    0x50282878UL,
280
    0xa5dfdf7aUL,
281
    0x038c8c8fUL,
282
    0x59a1a1f8UL,
283
    0x09898980UL,
284
    0x1a0d0d17UL,
285
    0x65bfbfdaUL,
286
    0xd7e6e631UL,
287
    0x844242c6UL,
288
    0xd06868b8UL,
289
    0x824141c3UL,
290
    0x299999b0UL,
291
    0x5a2d2d77UL,
292
    0x1e0f0f11UL,
293
    0x7bb0b0cbUL,
294
    0xa85454fcUL,
295
    0x6dbbbbd6UL,
296
    0x2c16163aUL,
297
};
298

299
static const std::uint32_t TD0[256] = {
300
    0x51f4a750UL,
301
    0x7e416553UL,
302
    0x1a17a4c3UL,
303
    0x3a275e96UL,
304
    0x3bab6bcbUL,
305
    0x1f9d45f1UL,
306
    0xacfa58abUL,
307
    0x4be30393UL,
308
    0x2030fa55UL,
309
    0xad766df6UL,
310
    0x88cc7691UL,
311
    0xf5024c25UL,
312
    0x4fe5d7fcUL,
313
    0xc52acbd7UL,
314
    0x26354480UL,
315
    0xb562a38fUL,
316
    0xdeb15a49UL,
317
    0x25ba1b67UL,
318
    0x45ea0e98UL,
319
    0x5dfec0e1UL,
320
    0xc32f7502UL,
321
    0x814cf012UL,
322
    0x8d4697a3UL,
323
    0x6bd3f9c6UL,
324
    0x038f5fe7UL,
325
    0x15929c95UL,
326
    0xbf6d7aebUL,
327
    0x955259daUL,
328
    0xd4be832dUL,
329
    0x587421d3UL,
330
    0x49e06929UL,
331
    0x8ec9c844UL,
332
    0x75c2896aUL,
333
    0xf48e7978UL,
334
    0x99583e6bUL,
335
    0x27b971ddUL,
336
    0xbee14fb6UL,
337
    0xf088ad17UL,
338
    0xc920ac66UL,
339
    0x7dce3ab4UL,
340
    0x63df4a18UL,
341
    0xe51a3182UL,
342
    0x97513360UL,
343
    0x62537f45UL,
344
    0xb16477e0UL,
345
    0xbb6bae84UL,
346
    0xfe81a01cUL,
347
    0xf9082b94UL,
348
    0x70486858UL,
349
    0x8f45fd19UL,
350
    0x94de6c87UL,
351
    0x527bf8b7UL,
352
    0xab73d323UL,
353
    0x724b02e2UL,
354
    0xe31f8f57UL,
355
    0x6655ab2aUL,
356
    0xb2eb2807UL,
357
    0x2fb5c203UL,
358
    0x86c57b9aUL,
359
    0xd33708a5UL,
360
    0x302887f2UL,
361
    0x23bfa5b2UL,
362
    0x02036abaUL,
363
    0xed16825cUL,
364
    0x8acf1c2bUL,
365
    0xa779b492UL,
366
    0xf307f2f0UL,
367
    0x4e69e2a1UL,
368
    0x65daf4cdUL,
369
    0x0605bed5UL,
370
    0xd134621fUL,
371
    0xc4a6fe8aUL,
372
    0x342e539dUL,
373
    0xa2f355a0UL,
374
    0x058ae132UL,
375
    0xa4f6eb75UL,
376
    0x0b83ec39UL,
377
    0x4060efaaUL,
378
    0x5e719f06UL,
379
    0xbd6e1051UL,
380
    0x3e218af9UL,
381
    0x96dd063dUL,
382
    0xdd3e05aeUL,
383
    0x4de6bd46UL,
384
    0x91548db5UL,
385
    0x71c45d05UL,
386
    0x0406d46fUL,
387
    0x605015ffUL,
388
    0x1998fb24UL,
389
    0xd6bde997UL,
390
    0x894043ccUL,
391
    0x67d99e77UL,
392
    0xb0e842bdUL,
393
    0x07898b88UL,
394
    0xe7195b38UL,
395
    0x79c8eedbUL,
396
    0xa17c0a47UL,
397
    0x7c420fe9UL,
398
    0xf8841ec9UL,
399
    0x00000000UL,
400
    0x09808683UL,
401
    0x322bed48UL,
402
    0x1e1170acUL,
403
    0x6c5a724eUL,
404
    0xfd0efffbUL,
405
    0x0f853856UL,
406
    0x3daed51eUL,
407
    0x362d3927UL,
408
    0x0a0fd964UL,
409
    0x685ca621UL,
410
    0x9b5b54d1UL,
411
    0x24362e3aUL,
412
    0x0c0a67b1UL,
413
    0x9357e70fUL,
414
    0xb4ee96d2UL,
415
    0x1b9b919eUL,
416
    0x80c0c54fUL,
417
    0x61dc20a2UL,
418
    0x5a774b69UL,
419
    0x1c121a16UL,
420
    0xe293ba0aUL,
421
    0xc0a02ae5UL,
422
    0x3c22e043UL,
423
    0x121b171dUL,
424
    0x0e090d0bUL,
425
    0xf28bc7adUL,
426
    0x2db6a8b9UL,
427
    0x141ea9c8UL,
428
    0x57f11985UL,
429
    0xaf75074cUL,
430
    0xee99ddbbUL,
431
    0xa37f60fdUL,
432
    0xf701269fUL,
433
    0x5c72f5bcUL,
434
    0x44663bc5UL,
435
    0x5bfb7e34UL,
436
    0x8b432976UL,
437
    0xcb23c6dcUL,
438
    0xb6edfc68UL,
439
    0xb8e4f163UL,
440
    0xd731dccaUL,
441
    0x42638510UL,
442
    0x13972240UL,
443
    0x84c61120UL,
444
    0x854a247dUL,
445
    0xd2bb3df8UL,
446
    0xaef93211UL,
447
    0xc729a16dUL,
448
    0x1d9e2f4bUL,
449
    0xdcb230f3UL,
450
    0x0d8652ecUL,
451
    0x77c1e3d0UL,
452
    0x2bb3166cUL,
453
    0xa970b999UL,
454
    0x119448faUL,
455
    0x47e96422UL,
456
    0xa8fc8cc4UL,
457
    0xa0f03f1aUL,
458
    0x567d2cd8UL,
459
    0x223390efUL,
460
    0x87494ec7UL,
461
    0xd938d1c1UL,
462
    0x8ccaa2feUL,
463
    0x98d40b36UL,
464
    0xa6f581cfUL,
465
    0xa57ade28UL,
466
    0xdab78e26UL,
467
    0x3fadbfa4UL,
468
    0x2c3a9de4UL,
469
    0x5078920dUL,
470
    0x6a5fcc9bUL,
471
    0x547e4662UL,
472
    0xf68d13c2UL,
473
    0x90d8b8e8UL,
474
    0x2e39f75eUL,
475
    0x82c3aff5UL,
476
    0x9f5d80beUL,
477
    0x69d0937cUL,
478
    0x6fd52da9UL,
479
    0xcf2512b3UL,
480
    0xc8ac993bUL,
481
    0x10187da7UL,
482
    0xe89c636eUL,
483
    0xdb3bbb7bUL,
484
    0xcd267809UL,
485
    0x6e5918f4UL,
486
    0xec9ab701UL,
487
    0x834f9aa8UL,
488
    0xe6956e65UL,
489
    0xaaffe67eUL,
490
    0x21bccf08UL,
491
    0xef15e8e6UL,
492
    0xbae79bd9UL,
493
    0x4a6f36ceUL,
494
    0xea9f09d4UL,
495
    0x29b07cd6UL,
496
    0x31a4b2afUL,
497
    0x2a3f2331UL,
498
    0xc6a59430UL,
499
    0x35a266c0UL,
500
    0x744ebc37UL,
501
    0xfc82caa6UL,
502
    0xe090d0b0UL,
503
    0x33a7d815UL,
504
    0xf104984aUL,
505
    0x41ecdaf7UL,
506
    0x7fcd500eUL,
507
    0x1791f62fUL,
508
    0x764dd68dUL,
509
    0x43efb04dUL,
510
    0xccaa4d54UL,
511
    0xe49604dfUL,
512
    0x9ed1b5e3UL,
513
    0x4c6a881bUL,
514
    0xc12c1fb8UL,
515
    0x4665517fUL,
516
    0x9d5eea04UL,
517
    0x018c355dUL,
518
    0xfa877473UL,
519
    0xfb0b412eUL,
520
    0xb3671d5aUL,
521
    0x92dbd252UL,
522
    0xe9105633UL,
523
    0x6dd64713UL,
524
    0x9ad7618cUL,
525
    0x37a10c7aUL,
526
    0x59f8148eUL,
527
    0xeb133c89UL,
528
    0xcea927eeUL,
529
    0xb761c935UL,
530
    0xe11ce5edUL,
531
    0x7a47b13cUL,
532
    0x9cd2df59UL,
533
    0x55f2733fUL,
534
    0x1814ce79UL,
535
    0x73c737bfUL,
536
    0x53f7cdeaUL,
537
    0x5ffdaa5bUL,
538
    0xdf3d6f14UL,
539
    0x7844db86UL,
540
    0xcaaff381UL,
541
    0xb968c43eUL,
542
    0x3824342cUL,
543
    0xc2a3405fUL,
544
    0x161dc372UL,
545
    0xbce2250cUL,
546
    0x283c498bUL,
547
    0xff0d9541UL,
548
    0x39a80171UL,
549
    0x080cb3deUL,
550
    0xd8b4e49cUL,
551
    0x6456c190UL,
552
    0x7bcb8461UL,
553
    0xd532b670UL,
554
    0x486c5c74UL,
555
    0xd0b85742UL,
556
};
557

558
static const std::uint32_t Td4[256] = {
559
    0x52525252UL,
560
    0x09090909UL,
561
    0x6a6a6a6aUL,
562
    0xd5d5d5d5UL,
563
    0x30303030UL,
564
    0x36363636UL,
565
    0xa5a5a5a5UL,
566
    0x38383838UL,
567
    0xbfbfbfbfUL,
568
    0x40404040UL,
569
    0xa3a3a3a3UL,
570
    0x9e9e9e9eUL,
571
    0x81818181UL,
572
    0xf3f3f3f3UL,
573
    0xd7d7d7d7UL,
574
    0xfbfbfbfbUL,
575
    0x7c7c7c7cUL,
576
    0xe3e3e3e3UL,
577
    0x39393939UL,
578
    0x82828282UL,
579
    0x9b9b9b9bUL,
580
    0x2f2f2f2fUL,
581
    0xffffffffUL,
582
    0x87878787UL,
583
    0x34343434UL,
584
    0x8e8e8e8eUL,
585
    0x43434343UL,
586
    0x44444444UL,
587
    0xc4c4c4c4UL,
588
    0xdedededeUL,
589
    0xe9e9e9e9UL,
590
    0xcbcbcbcbUL,
591
    0x54545454UL,
592
    0x7b7b7b7bUL,
593
    0x94949494UL,
594
    0x32323232UL,
595
    0xa6a6a6a6UL,
596
    0xc2c2c2c2UL,
597
    0x23232323UL,
598
    0x3d3d3d3dUL,
599
    0xeeeeeeeeUL,
600
    0x4c4c4c4cUL,
601
    0x95959595UL,
602
    0x0b0b0b0bUL,
603
    0x42424242UL,
604
    0xfafafafaUL,
605
    0xc3c3c3c3UL,
606
    0x4e4e4e4eUL,
607
    0x08080808UL,
608
    0x2e2e2e2eUL,
609
    0xa1a1a1a1UL,
610
    0x66666666UL,
611
    0x28282828UL,
612
    0xd9d9d9d9UL,
613
    0x24242424UL,
614
    0xb2b2b2b2UL,
615
    0x76767676UL,
616
    0x5b5b5b5bUL,
617
    0xa2a2a2a2UL,
618
    0x49494949UL,
619
    0x6d6d6d6dUL,
620
    0x8b8b8b8bUL,
621
    0xd1d1d1d1UL,
622
    0x25252525UL,
623
    0x72727272UL,
624
    0xf8f8f8f8UL,
625
    0xf6f6f6f6UL,
626
    0x64646464UL,
627
    0x86868686UL,
628
    0x68686868UL,
629
    0x98989898UL,
630
    0x16161616UL,
631
    0xd4d4d4d4UL,
632
    0xa4a4a4a4UL,
633
    0x5c5c5c5cUL,
634
    0xccccccccUL,
635
    0x5d5d5d5dUL,
636
    0x65656565UL,
637
    0xb6b6b6b6UL,
638
    0x92929292UL,
639
    0x6c6c6c6cUL,
640
    0x70707070UL,
641
    0x48484848UL,
642
    0x50505050UL,
643
    0xfdfdfdfdUL,
644
    0xededededUL,
645
    0xb9b9b9b9UL,
646
    0xdadadadaUL,
647
    0x5e5e5e5eUL,
648
    0x15151515UL,
649
    0x46464646UL,
650
    0x57575757UL,
651
    0xa7a7a7a7UL,
652
    0x8d8d8d8dUL,
653
    0x9d9d9d9dUL,
654
    0x84848484UL,
655
    0x90909090UL,
656
    0xd8d8d8d8UL,
657
    0xababababUL,
658
    0x00000000UL,
659
    0x8c8c8c8cUL,
660
    0xbcbcbcbcUL,
661
    0xd3d3d3d3UL,
662
    0x0a0a0a0aUL,
663
    0xf7f7f7f7UL,
664
    0xe4e4e4e4UL,
665
    0x58585858UL,
666
    0x05050505UL,
667
    0xb8b8b8b8UL,
668
    0xb3b3b3b3UL,
669
    0x45454545UL,
670
    0x06060606UL,
671
    0xd0d0d0d0UL,
672
    0x2c2c2c2cUL,
673
    0x1e1e1e1eUL,
674
    0x8f8f8f8fUL,
675
    0xcacacacaUL,
676
    0x3f3f3f3fUL,
677
    0x0f0f0f0fUL,
678
    0x02020202UL,
679
    0xc1c1c1c1UL,
680
    0xafafafafUL,
681
    0xbdbdbdbdUL,
682
    0x03030303UL,
683
    0x01010101UL,
684
    0x13131313UL,
685
    0x8a8a8a8aUL,
686
    0x6b6b6b6bUL,
687
    0x3a3a3a3aUL,
688
    0x91919191UL,
689
    0x11111111UL,
690
    0x41414141UL,
691
    0x4f4f4f4fUL,
692
    0x67676767UL,
693
    0xdcdcdcdcUL,
694
    0xeaeaeaeaUL,
695
    0x97979797UL,
696
    0xf2f2f2f2UL,
697
    0xcfcfcfcfUL,
698
    0xcecececeUL,
699
    0xf0f0f0f0UL,
700
    0xb4b4b4b4UL,
701
    0xe6e6e6e6UL,
702
    0x73737373UL,
703
    0x96969696UL,
704
    0xacacacacUL,
705
    0x74747474UL,
706
    0x22222222UL,
707
    0xe7e7e7e7UL,
708
    0xadadadadUL,
709
    0x35353535UL,
710
    0x85858585UL,
711
    0xe2e2e2e2UL,
712
    0xf9f9f9f9UL,
713
    0x37373737UL,
714
    0xe8e8e8e8UL,
715
    0x1c1c1c1cUL,
716
    0x75757575UL,
717
    0xdfdfdfdfUL,
718
    0x6e6e6e6eUL,
719
    0x47474747UL,
720
    0xf1f1f1f1UL,
721
    0x1a1a1a1aUL,
722
    0x71717171UL,
723
    0x1d1d1d1dUL,
724
    0x29292929UL,
725
    0xc5c5c5c5UL,
726
    0x89898989UL,
727
    0x6f6f6f6fUL,
728
    0xb7b7b7b7UL,
729
    0x62626262UL,
730
    0x0e0e0e0eUL,
731
    0xaaaaaaaaUL,
732
    0x18181818UL,
733
    0xbebebebeUL,
734
    0x1b1b1b1bUL,
735
    0xfcfcfcfcUL,
736
    0x56565656UL,
737
    0x3e3e3e3eUL,
738
    0x4b4b4b4bUL,
739
    0xc6c6c6c6UL,
740
    0xd2d2d2d2UL,
741
    0x79797979UL,
742
    0x20202020UL,
743
    0x9a9a9a9aUL,
744
    0xdbdbdbdbUL,
745
    0xc0c0c0c0UL,
746
    0xfefefefeUL,
747
    0x78787878UL,
748
    0xcdcdcdcdUL,
749
    0x5a5a5a5aUL,
750
    0xf4f4f4f4UL,
751
    0x1f1f1f1fUL,
752
    0xddddddddUL,
753
    0xa8a8a8a8UL,
754
    0x33333333UL,
755
    0x88888888UL,
756
    0x07070707UL,
757
    0xc7c7c7c7UL,
758
    0x31313131UL,
759
    0xb1b1b1b1UL,
760
    0x12121212UL,
761
    0x10101010UL,
762
    0x59595959UL,
763
    0x27272727UL,
764
    0x80808080UL,
765
    0xececececUL,
766
    0x5f5f5f5fUL,
767
    0x60606060UL,
768
    0x51515151UL,
769
    0x7f7f7f7fUL,
770
    0xa9a9a9a9UL,
771
    0x19191919UL,
772
    0xb5b5b5b5UL,
773
    0x4a4a4a4aUL,
774
    0x0d0d0d0dUL,
775
    0x2d2d2d2dUL,
776
    0xe5e5e5e5UL,
777
    0x7a7a7a7aUL,
778
    0x9f9f9f9fUL,
779
    0x93939393UL,
780
    0xc9c9c9c9UL,
781
    0x9c9c9c9cUL,
782
    0xefefefefUL,
783
    0xa0a0a0a0UL,
784
    0xe0e0e0e0UL,
785
    0x3b3b3b3bUL,
786
    0x4d4d4d4dUL,
787
    0xaeaeaeaeUL,
788
    0x2a2a2a2aUL,
789
    0xf5f5f5f5UL,
790
    0xb0b0b0b0UL,
791
    0xc8c8c8c8UL,
792
    0xebebebebUL,
793
    0xbbbbbbbbUL,
794
    0x3c3c3c3cUL,
795
    0x83838383UL,
796
    0x53535353UL,
797
    0x99999999UL,
798
    0x61616161UL,
799
    0x17171717UL,
800
    0x2b2b2b2bUL,
801
    0x04040404UL,
802
    0x7e7e7e7eUL,
803
    0xbabababaUL,
804
    0x77777777UL,
805
    0xd6d6d6d6UL,
806
    0x26262626UL,
807
    0xe1e1e1e1UL,
808
    0x69696969UL,
809
    0x14141414UL,
810
    0x63636363UL,
811
    0x55555555UL,
812
    0x21212121UL,
813
    0x0c0c0c0cUL,
814
    0x7d7d7d7dUL,
815
};
816

817
static const std::uint32_t TE1[256] = {
818
    0xa5c66363UL,
819
    0x84f87c7cUL,
820
    0x99ee7777UL,
821
    0x8df67b7bUL,
822
    0x0dfff2f2UL,
823
    0xbdd66b6bUL,
824
    0xb1de6f6fUL,
825
    0x5491c5c5UL,
826
    0x50603030UL,
827
    0x03020101UL,
828
    0xa9ce6767UL,
829
    0x7d562b2bUL,
830
    0x19e7fefeUL,
831
    0x62b5d7d7UL,
832
    0xe64dababUL,
833
    0x9aec7676UL,
834
    0x458fcacaUL,
835
    0x9d1f8282UL,
836
    0x4089c9c9UL,
837
    0x87fa7d7dUL,
838
    0x15effafaUL,
839
    0xebb25959UL,
840
    0xc98e4747UL,
841
    0x0bfbf0f0UL,
842
    0xec41adadUL,
843
    0x67b3d4d4UL,
844
    0xfd5fa2a2UL,
845
    0xea45afafUL,
846
    0xbf239c9cUL,
847
    0xf753a4a4UL,
848
    0x96e47272UL,
849
    0x5b9bc0c0UL,
850
    0xc275b7b7UL,
851
    0x1ce1fdfdUL,
852
    0xae3d9393UL,
853
    0x6a4c2626UL,
854
    0x5a6c3636UL,
855
    0x417e3f3fUL,
856
    0x02f5f7f7UL,
857
    0x4f83ccccUL,
858
    0x5c683434UL,
859
    0xf451a5a5UL,
860
    0x34d1e5e5UL,
861
    0x08f9f1f1UL,
862
    0x93e27171UL,
863
    0x73abd8d8UL,
864
    0x53623131UL,
865
    0x3f2a1515UL,
866
    0x0c080404UL,
867
    0x5295c7c7UL,
868
    0x65462323UL,
869
    0x5e9dc3c3UL,
870
    0x28301818UL,
871
    0xa1379696UL,
872
    0x0f0a0505UL,
873
    0xb52f9a9aUL,
874
    0x090e0707UL,
875
    0x36241212UL,
876
    0x9b1b8080UL,
877
    0x3ddfe2e2UL,
878
    0x26cdebebUL,
879
    0x694e2727UL,
880
    0xcd7fb2b2UL,
881
    0x9fea7575UL,
882
    0x1b120909UL,
883
    0x9e1d8383UL,
884
    0x74582c2cUL,
885
    0x2e341a1aUL,
886
    0x2d361b1bUL,
887
    0xb2dc6e6eUL,
888
    0xeeb45a5aUL,
889
    0xfb5ba0a0UL,
890
    0xf6a45252UL,
891
    0x4d763b3bUL,
892
    0x61b7d6d6UL,
893
    0xce7db3b3UL,
894
    0x7b522929UL,
895
    0x3edde3e3UL,
896
    0x715e2f2fUL,
897
    0x97138484UL,
898
    0xf5a65353UL,
899
    0x68b9d1d1UL,
900
    0x00000000UL,
901
    0x2cc1ededUL,
902
    0x60402020UL,
903
    0x1fe3fcfcUL,
904
    0xc879b1b1UL,
905
    0xedb65b5bUL,
906
    0xbed46a6aUL,
907
    0x468dcbcbUL,
908
    0xd967bebeUL,
909
    0x4b723939UL,
910
    0xde944a4aUL,
911
    0xd4984c4cUL,
912
    0xe8b05858UL,
913
    0x4a85cfcfUL,
914
    0x6bbbd0d0UL,
915
    0x2ac5efefUL,
916
    0xe54faaaaUL,
917
    0x16edfbfbUL,
918
    0xc5864343UL,
919
    0xd79a4d4dUL,
920
    0x55663333UL,
921
    0x94118585UL,
922
    0xcf8a4545UL,
923
    0x10e9f9f9UL,
924
    0x06040202UL,
925
    0x81fe7f7fUL,
926
    0xf0a05050UL,
927
    0x44783c3cUL,
928
    0xba259f9fUL,
929
    0xe34ba8a8UL,
930
    0xf3a25151UL,
931
    0xfe5da3a3UL,
932
    0xc0804040UL,
933
    0x8a058f8fUL,
934
    0xad3f9292UL,
935
    0xbc219d9dUL,
936
    0x48703838UL,
937
    0x04f1f5f5UL,
938
    0xdf63bcbcUL,
939
    0xc177b6b6UL,
940
    0x75afdadaUL,
941
    0x63422121UL,
942
    0x30201010UL,
943
    0x1ae5ffffUL,
944
    0x0efdf3f3UL,
945
    0x6dbfd2d2UL,
946
    0x4c81cdcdUL,
947
    0x14180c0cUL,
948
    0x35261313UL,
949
    0x2fc3ececUL,
950
    0xe1be5f5fUL,
951
    0xa2359797UL,
952
    0xcc884444UL,
953
    0x392e1717UL,
954
    0x5793c4c4UL,
955
    0xf255a7a7UL,
956
    0x82fc7e7eUL,
957
    0x477a3d3dUL,
958
    0xacc86464UL,
959
    0xe7ba5d5dUL,
960
    0x2b321919UL,
961
    0x95e67373UL,
962
    0xa0c06060UL,
963
    0x98198181UL,
964
    0xd19e4f4fUL,
965
    0x7fa3dcdcUL,
966
    0x66442222UL,
967
    0x7e542a2aUL,
968
    0xab3b9090UL,
969
    0x830b8888UL,
970
    0xca8c4646UL,
971
    0x29c7eeeeUL,
972
    0xd36bb8b8UL,
973
    0x3c281414UL,
974
    0x79a7dedeUL,
975
    0xe2bc5e5eUL,
976
    0x1d160b0bUL,
977
    0x76addbdbUL,
978
    0x3bdbe0e0UL,
979
    0x56643232UL,
980
    0x4e743a3aUL,
981
    0x1e140a0aUL,
982
    0xdb924949UL,
983
    0x0a0c0606UL,
984
    0x6c482424UL,
985
    0xe4b85c5cUL,
986
    0x5d9fc2c2UL,
987
    0x6ebdd3d3UL,
988
    0xef43acacUL,
989
    0xa6c46262UL,
990
    0xa8399191UL,
991
    0xa4319595UL,
992
    0x37d3e4e4UL,
993
    0x8bf27979UL,
994
    0x32d5e7e7UL,
995
    0x438bc8c8UL,
996
    0x596e3737UL,
997
    0xb7da6d6dUL,
998
    0x8c018d8dUL,
999
    0x64b1d5d5UL,
1000
    0xd29c4e4eUL,
1001
    0xe049a9a9UL,
1002
    0xb4d86c6cUL,
1003
    0xfaac5656UL,
1004
    0x07f3f4f4UL,
1005
    0x25cfeaeaUL,
1006
    0xafca6565UL,
1007
    0x8ef47a7aUL,
1008
    0xe947aeaeUL,
1009
    0x18100808UL,
1010
    0xd56fbabaUL,
1011
    0x88f07878UL,
1012
    0x6f4a2525UL,
1013
    0x725c2e2eUL,
1014
    0x24381c1cUL,
1015
    0xf157a6a6UL,
1016
    0xc773b4b4UL,
1017
    0x5197c6c6UL,
1018
    0x23cbe8e8UL,
1019
    0x7ca1ddddUL,
1020
    0x9ce87474UL,
1021
    0x213e1f1fUL,
1022
    0xdd964b4bUL,
1023
    0xdc61bdbdUL,
1024
    0x860d8b8bUL,
1025
    0x850f8a8aUL,
1026
    0x90e07070UL,
1027
    0x427c3e3eUL,
1028
    0xc471b5b5UL,
1029
    0xaacc6666UL,
1030
    0xd8904848UL,
1031
    0x05060303UL,
1032
    0x01f7f6f6UL,
1033
    0x121c0e0eUL,
1034
    0xa3c26161UL,
1035
    0x5f6a3535UL,
1036
    0xf9ae5757UL,
1037
    0xd069b9b9UL,
1038
    0x91178686UL,
1039
    0x5899c1c1UL,
1040
    0x273a1d1dUL,
1041
    0xb9279e9eUL,
1042
    0x38d9e1e1UL,
1043
    0x13ebf8f8UL,
1044
    0xb32b9898UL,
1045
    0x33221111UL,
1046
    0xbbd26969UL,
1047
    0x70a9d9d9UL,
1048
    0x89078e8eUL,
1049
    0xa7339494UL,
1050
    0xb62d9b9bUL,
1051
    0x223c1e1eUL,
1052
    0x92158787UL,
1053
    0x20c9e9e9UL,
1054
    0x4987ceceUL,
1055
    0xffaa5555UL,
1056
    0x78502828UL,
1057
    0x7aa5dfdfUL,
1058
    0x8f038c8cUL,
1059
    0xf859a1a1UL,
1060
    0x80098989UL,
1061
    0x171a0d0dUL,
1062
    0xda65bfbfUL,
1063
    0x31d7e6e6UL,
1064
    0xc6844242UL,
1065
    0xb8d06868UL,
1066
    0xc3824141UL,
1067
    0xb0299999UL,
1068
    0x775a2d2dUL,
1069
    0x111e0f0fUL,
1070
    0xcb7bb0b0UL,
1071
    0xfca85454UL,
1072
    0xd66dbbbbUL,
1073
    0x3a2c1616UL,
1074
};
1075
static const std::uint32_t TE2[256] = {
1076
    0x63a5c663UL,
1077
    0x7c84f87cUL,
1078
    0x7799ee77UL,
1079
    0x7b8df67bUL,
1080
    0xf20dfff2UL,
1081
    0x6bbdd66bUL,
1082
    0x6fb1de6fUL,
1083
    0xc55491c5UL,
1084
    0x30506030UL,
1085
    0x01030201UL,
1086
    0x67a9ce67UL,
1087
    0x2b7d562bUL,
1088
    0xfe19e7feUL,
1089
    0xd762b5d7UL,
1090
    0xabe64dabUL,
1091
    0x769aec76UL,
1092
    0xca458fcaUL,
1093
    0x829d1f82UL,
1094
    0xc94089c9UL,
1095
    0x7d87fa7dUL,
1096
    0xfa15effaUL,
1097
    0x59ebb259UL,
1098
    0x47c98e47UL,
1099
    0xf00bfbf0UL,
1100
    0xadec41adUL,
1101
    0xd467b3d4UL,
1102
    0xa2fd5fa2UL,
1103
    0xafea45afUL,
1104
    0x9cbf239cUL,
1105
    0xa4f753a4UL,
1106
    0x7296e472UL,
1107
    0xc05b9bc0UL,
1108
    0xb7c275b7UL,
1109
    0xfd1ce1fdUL,
1110
    0x93ae3d93UL,
1111
    0x266a4c26UL,
1112
    0x365a6c36UL,
1113
    0x3f417e3fUL,
1114
    0xf702f5f7UL,
1115
    0xcc4f83ccUL,
1116
    0x345c6834UL,
1117
    0xa5f451a5UL,
1118
    0xe534d1e5UL,
1119
    0xf108f9f1UL,
1120
    0x7193e271UL,
1121
    0xd873abd8UL,
1122
    0x31536231UL,
1123
    0x153f2a15UL,
1124
    0x040c0804UL,
1125
    0xc75295c7UL,
1126
    0x23654623UL,
1127
    0xc35e9dc3UL,
1128
    0x18283018UL,
1129
    0x96a13796UL,
1130
    0x050f0a05UL,
1131
    0x9ab52f9aUL,
1132
    0x07090e07UL,
1133
    0x12362412UL,
1134
    0x809b1b80UL,
1135
    0xe23ddfe2UL,
1136
    0xeb26cdebUL,
1137
    0x27694e27UL,
1138
    0xb2cd7fb2UL,
1139
    0x759fea75UL,
1140
    0x091b1209UL,
1141
    0x839e1d83UL,
1142
    0x2c74582cUL,
1143
    0x1a2e341aUL,
1144
    0x1b2d361bUL,
1145
    0x6eb2dc6eUL,
1146
    0x5aeeb45aUL,
1147
    0xa0fb5ba0UL,
1148
    0x52f6a452UL,
1149
    0x3b4d763bUL,
1150
    0xd661b7d6UL,
1151
    0xb3ce7db3UL,
1152
    0x297b5229UL,
1153
    0xe33edde3UL,
1154
    0x2f715e2fUL,
1155
    0x84971384UL,
1156
    0x53f5a653UL,
1157
    0xd168b9d1UL,
1158
    0x00000000UL,
1159
    0xed2cc1edUL,
1160
    0x20604020UL,
1161
    0xfc1fe3fcUL,
1162
    0xb1c879b1UL,
1163
    0x5bedb65bUL,
1164
    0x6abed46aUL,
1165
    0xcb468dcbUL,
1166
    0xbed967beUL,
1167
    0x394b7239UL,
1168
    0x4ade944aUL,
1169
    0x4cd4984cUL,
1170
    0x58e8b058UL,
1171
    0xcf4a85cfUL,
1172
    0xd06bbbd0UL,
1173
    0xef2ac5efUL,
1174
    0xaae54faaUL,
1175
    0xfb16edfbUL,
1176
    0x43c58643UL,
1177
    0x4dd79a4dUL,
1178
    0x33556633UL,
1179
    0x85941185UL,
1180
    0x45cf8a45UL,
1181
    0xf910e9f9UL,
1182
    0x02060402UL,
1183
    0x7f81fe7fUL,
1184
    0x50f0a050UL,
1185
    0x3c44783cUL,
1186
    0x9fba259fUL,
1187
    0xa8e34ba8UL,
1188
    0x51f3a251UL,
1189
    0xa3fe5da3UL,
1190
    0x40c08040UL,
1191
    0x8f8a058fUL,
1192
    0x92ad3f92UL,
1193
    0x9dbc219dUL,
1194
    0x38487038UL,
1195
    0xf504f1f5UL,
1196
    0xbcdf63bcUL,
1197
    0xb6c177b6UL,
1198
    0xda75afdaUL,
1199
    0x21634221UL,
1200
    0x10302010UL,
1201
    0xff1ae5ffUL,
1202
    0xf30efdf3UL,
1203
    0xd26dbfd2UL,
1204
    0xcd4c81cdUL,
1205
    0x0c14180cUL,
1206
    0x13352613UL,
1207
    0xec2fc3ecUL,
1208
    0x5fe1be5fUL,
1209
    0x97a23597UL,
1210
    0x44cc8844UL,
1211
    0x17392e17UL,
1212
    0xc45793c4UL,
1213
    0xa7f255a7UL,
1214
    0x7e82fc7eUL,
1215
    0x3d477a3dUL,
1216
    0x64acc864UL,
1217
    0x5de7ba5dUL,
1218
    0x192b3219UL,
1219
    0x7395e673UL,
1220
    0x60a0c060UL,
1221
    0x81981981UL,
1222
    0x4fd19e4fUL,
1223
    0xdc7fa3dcUL,
1224
    0x22664422UL,
1225
    0x2a7e542aUL,
1226
    0x90ab3b90UL,
1227
    0x88830b88UL,
1228
    0x46ca8c46UL,
1229
    0xee29c7eeUL,
1230
    0xb8d36bb8UL,
1231
    0x143c2814UL,
1232
    0xde79a7deUL,
1233
    0x5ee2bc5eUL,
1234
    0x0b1d160bUL,
1235
    0xdb76addbUL,
1236
    0xe03bdbe0UL,
1237
    0x32566432UL,
1238
    0x3a4e743aUL,
1239
    0x0a1e140aUL,
1240
    0x49db9249UL,
1241
    0x060a0c06UL,
1242
    0x246c4824UL,
1243
    0x5ce4b85cUL,
1244
    0xc25d9fc2UL,
1245
    0xd36ebdd3UL,
1246
    0xacef43acUL,
1247
    0x62a6c462UL,
1248
    0x91a83991UL,
1249
    0x95a43195UL,
1250
    0xe437d3e4UL,
1251
    0x798bf279UL,
1252
    0xe732d5e7UL,
1253
    0xc8438bc8UL,
1254
    0x37596e37UL,
1255
    0x6db7da6dUL,
1256
    0x8d8c018dUL,
1257
    0xd564b1d5UL,
1258
    0x4ed29c4eUL,
1259
    0xa9e049a9UL,
1260
    0x6cb4d86cUL,
1261
    0x56faac56UL,
1262
    0xf407f3f4UL,
1263
    0xea25cfeaUL,
1264
    0x65afca65UL,
1265
    0x7a8ef47aUL,
1266
    0xaee947aeUL,
1267
    0x08181008UL,
1268
    0xbad56fbaUL,
1269
    0x7888f078UL,
1270
    0x256f4a25UL,
1271
    0x2e725c2eUL,
1272
    0x1c24381cUL,
1273
    0xa6f157a6UL,
1274
    0xb4c773b4UL,
1275
    0xc65197c6UL,
1276
    0xe823cbe8UL,
1277
    0xdd7ca1ddUL,
1278
    0x749ce874UL,
1279
    0x1f213e1fUL,
1280
    0x4bdd964bUL,
1281
    0xbddc61bdUL,
1282
    0x8b860d8bUL,
1283
    0x8a850f8aUL,
1284
    0x7090e070UL,
1285
    0x3e427c3eUL,
1286
    0xb5c471b5UL,
1287
    0x66aacc66UL,
1288
    0x48d89048UL,
1289
    0x03050603UL,
1290
    0xf601f7f6UL,
1291
    0x0e121c0eUL,
1292
    0x61a3c261UL,
1293
    0x355f6a35UL,
1294
    0x57f9ae57UL,
1295
    0xb9d069b9UL,
1296
    0x86911786UL,
1297
    0xc15899c1UL,
1298
    0x1d273a1dUL,
1299
    0x9eb9279eUL,
1300
    0xe138d9e1UL,
1301
    0xf813ebf8UL,
1302
    0x98b32b98UL,
1303
    0x11332211UL,
1304
    0x69bbd269UL,
1305
    0xd970a9d9UL,
1306
    0x8e89078eUL,
1307
    0x94a73394UL,
1308
    0x9bb62d9bUL,
1309
    0x1e223c1eUL,
1310
    0x87921587UL,
1311
    0xe920c9e9UL,
1312
    0xce4987ceUL,
1313
    0x55ffaa55UL,
1314
    0x28785028UL,
1315
    0xdf7aa5dfUL,
1316
    0x8c8f038cUL,
1317
    0xa1f859a1UL,
1318
    0x89800989UL,
1319
    0x0d171a0dUL,
1320
    0xbfda65bfUL,
1321
    0xe631d7e6UL,
1322
    0x42c68442UL,
1323
    0x68b8d068UL,
1324
    0x41c38241UL,
1325
    0x99b02999UL,
1326
    0x2d775a2dUL,
1327
    0x0f111e0fUL,
1328
    0xb0cb7bb0UL,
1329
    0x54fca854UL,
1330
    0xbbd66dbbUL,
1331
    0x163a2c16UL,
1332
};
1333
static const std::uint32_t TE3[256] = {
1334

1335
    0x6363a5c6UL,
1336
    0x7c7c84f8UL,
1337
    0x777799eeUL,
1338
    0x7b7b8df6UL,
1339
    0xf2f20dffUL,
1340
    0x6b6bbdd6UL,
1341
    0x6f6fb1deUL,
1342
    0xc5c55491UL,
1343
    0x30305060UL,
1344
    0x01010302UL,
1345
    0x6767a9ceUL,
1346
    0x2b2b7d56UL,
1347
    0xfefe19e7UL,
1348
    0xd7d762b5UL,
1349
    0xababe64dUL,
1350
    0x76769aecUL,
1351
    0xcaca458fUL,
1352
    0x82829d1fUL,
1353
    0xc9c94089UL,
1354
    0x7d7d87faUL,
1355
    0xfafa15efUL,
1356
    0x5959ebb2UL,
1357
    0x4747c98eUL,
1358
    0xf0f00bfbUL,
1359
    0xadadec41UL,
1360
    0xd4d467b3UL,
1361
    0xa2a2fd5fUL,
1362
    0xafafea45UL,
1363
    0x9c9cbf23UL,
1364
    0xa4a4f753UL,
1365
    0x727296e4UL,
1366
    0xc0c05b9bUL,
1367
    0xb7b7c275UL,
1368
    0xfdfd1ce1UL,
1369
    0x9393ae3dUL,
1370
    0x26266a4cUL,
1371
    0x36365a6cUL,
1372
    0x3f3f417eUL,
1373
    0xf7f702f5UL,
1374
    0xcccc4f83UL,
1375
    0x34345c68UL,
1376
    0xa5a5f451UL,
1377
    0xe5e534d1UL,
1378
    0xf1f108f9UL,
1379
    0x717193e2UL,
1380
    0xd8d873abUL,
1381
    0x31315362UL,
1382
    0x15153f2aUL,
1383
    0x04040c08UL,
1384
    0xc7c75295UL,
1385
    0x23236546UL,
1386
    0xc3c35e9dUL,
1387
    0x18182830UL,
1388
    0x9696a137UL,
1389
    0x05050f0aUL,
1390
    0x9a9ab52fUL,
1391
    0x0707090eUL,
1392
    0x12123624UL,
1393
    0x80809b1bUL,
1394
    0xe2e23ddfUL,
1395
    0xebeb26cdUL,
1396
    0x2727694eUL,
1397
    0xb2b2cd7fUL,
1398
    0x75759feaUL,
1399
    0x09091b12UL,
1400
    0x83839e1dUL,
1401
    0x2c2c7458UL,
1402
    0x1a1a2e34UL,
1403
    0x1b1b2d36UL,
1404
    0x6e6eb2dcUL,
1405
    0x5a5aeeb4UL,
1406
    0xa0a0fb5bUL,
1407
    0x5252f6a4UL,
1408
    0x3b3b4d76UL,
1409
    0xd6d661b7UL,
1410
    0xb3b3ce7dUL,
1411
    0x29297b52UL,
1412
    0xe3e33eddUL,
1413
    0x2f2f715eUL,
1414
    0x84849713UL,
1415
    0x5353f5a6UL,
1416
    0xd1d168b9UL,
1417
    0x00000000UL,
1418
    0xeded2cc1UL,
1419
    0x20206040UL,
1420
    0xfcfc1fe3UL,
1421
    0xb1b1c879UL,
1422
    0x5b5bedb6UL,
1423
    0x6a6abed4UL,
1424
    0xcbcb468dUL,
1425
    0xbebed967UL,
1426
    0x39394b72UL,
1427
    0x4a4ade94UL,
1428
    0x4c4cd498UL,
1429
    0x5858e8b0UL,
1430
    0xcfcf4a85UL,
1431
    0xd0d06bbbUL,
1432
    0xefef2ac5UL,
1433
    0xaaaae54fUL,
1434
    0xfbfb16edUL,
1435
    0x4343c586UL,
1436
    0x4d4dd79aUL,
1437
    0x33335566UL,
1438
    0x85859411UL,
1439
    0x4545cf8aUL,
1440
    0xf9f910e9UL,
1441
    0x02020604UL,
1442
    0x7f7f81feUL,
1443
    0x5050f0a0UL,
1444
    0x3c3c4478UL,
1445
    0x9f9fba25UL,
1446
    0xa8a8e34bUL,
1447
    0x5151f3a2UL,
1448
    0xa3a3fe5dUL,
1449
    0x4040c080UL,
1450
    0x8f8f8a05UL,
1451
    0x9292ad3fUL,
1452
    0x9d9dbc21UL,
1453
    0x38384870UL,
1454
    0xf5f504f1UL,
1455
    0xbcbcdf63UL,
1456
    0xb6b6c177UL,
1457
    0xdada75afUL,
1458
    0x21216342UL,
1459
    0x10103020UL,
1460
    0xffff1ae5UL,
1461
    0xf3f30efdUL,
1462
    0xd2d26dbfUL,
1463
    0xcdcd4c81UL,
1464
    0x0c0c1418UL,
1465
    0x13133526UL,
1466
    0xecec2fc3UL,
1467
    0x5f5fe1beUL,
1468
    0x9797a235UL,
1469
    0x4444cc88UL,
1470
    0x1717392eUL,
1471
    0xc4c45793UL,
1472
    0xa7a7f255UL,
1473
    0x7e7e82fcUL,
1474
    0x3d3d477aUL,
1475
    0x6464acc8UL,
1476
    0x5d5de7baUL,
1477
    0x19192b32UL,
1478
    0x737395e6UL,
1479
    0x6060a0c0UL,
1480
    0x81819819UL,
1481
    0x4f4fd19eUL,
1482
    0xdcdc7fa3UL,
1483
    0x22226644UL,
1484
    0x2a2a7e54UL,
1485
    0x9090ab3bUL,
1486
    0x8888830bUL,
1487
    0x4646ca8cUL,
1488
    0xeeee29c7UL,
1489
    0xb8b8d36bUL,
1490
    0x14143c28UL,
1491
    0xdede79a7UL,
1492
    0x5e5ee2bcUL,
1493
    0x0b0b1d16UL,
1494
    0xdbdb76adUL,
1495
    0xe0e03bdbUL,
1496
    0x32325664UL,
1497
    0x3a3a4e74UL,
1498
    0x0a0a1e14UL,
1499
    0x4949db92UL,
1500
    0x06060a0cUL,
1501
    0x24246c48UL,
1502
    0x5c5ce4b8UL,
1503
    0xc2c25d9fUL,
1504
    0xd3d36ebdUL,
1505
    0xacacef43UL,
1506
    0x6262a6c4UL,
1507
    0x9191a839UL,
1508
    0x9595a431UL,
1509
    0xe4e437d3UL,
1510
    0x79798bf2UL,
1511
    0xe7e732d5UL,
1512
    0xc8c8438bUL,
1513
    0x3737596eUL,
1514
    0x6d6db7daUL,
1515
    0x8d8d8c01UL,
1516
    0xd5d564b1UL,
1517
    0x4e4ed29cUL,
1518
    0xa9a9e049UL,
1519
    0x6c6cb4d8UL,
1520
    0x5656faacUL,
1521
    0xf4f407f3UL,
1522
    0xeaea25cfUL,
1523
    0x6565afcaUL,
1524
    0x7a7a8ef4UL,
1525
    0xaeaee947UL,
1526
    0x08081810UL,
1527
    0xbabad56fUL,
1528
    0x787888f0UL,
1529
    0x25256f4aUL,
1530
    0x2e2e725cUL,
1531
    0x1c1c2438UL,
1532
    0xa6a6f157UL,
1533
    0xb4b4c773UL,
1534
    0xc6c65197UL,
1535
    0xe8e823cbUL,
1536
    0xdddd7ca1UL,
1537
    0x74749ce8UL,
1538
    0x1f1f213eUL,
1539
    0x4b4bdd96UL,
1540
    0xbdbddc61UL,
1541
    0x8b8b860dUL,
1542
    0x8a8a850fUL,
1543
    0x707090e0UL,
1544
    0x3e3e427cUL,
1545
    0xb5b5c471UL,
1546
    0x6666aaccUL,
1547
    0x4848d890UL,
1548
    0x03030506UL,
1549
    0xf6f601f7UL,
1550
    0x0e0e121cUL,
1551
    0x6161a3c2UL,
1552
    0x35355f6aUL,
1553
    0x5757f9aeUL,
1554
    0xb9b9d069UL,
1555
    0x86869117UL,
1556
    0xc1c15899UL,
1557
    0x1d1d273aUL,
1558
    0x9e9eb927UL,
1559
    0xe1e138d9UL,
1560
    0xf8f813ebUL,
1561
    0x9898b32bUL,
1562
    0x11113322UL,
1563
    0x6969bbd2UL,
1564
    0xd9d970a9UL,
1565
    0x8e8e8907UL,
1566
    0x9494a733UL,
1567
    0x9b9bb62dUL,
1568
    0x1e1e223cUL,
1569
    0x87879215UL,
1570
    0xe9e920c9UL,
1571
    0xcece4987UL,
1572
    0x5555ffaaUL,
1573
    0x28287850UL,
1574
    0xdfdf7aa5UL,
1575
    0x8c8c8f03UL,
1576
    0xa1a1f859UL,
1577
    0x89898009UL,
1578
    0x0d0d171aUL,
1579
    0xbfbfda65UL,
1580
    0xe6e631d7UL,
1581
    0x4242c684UL,
1582
    0x6868b8d0UL,
1583
    0x4141c382UL,
1584
    0x9999b029UL,
1585
    0x2d2d775aUL,
1586
    0x0f0f111eUL,
1587
    0xb0b0cb7bUL,
1588
    0x5454fca8UL,
1589
    0xbbbbd66dUL,
1590
    0x16163a2cUL,
1591
};
1592

1593
static const std::uint32_t Te4_0[] = {
1594
    0x00000063UL, 0x0000007cUL, 0x00000077UL, 0x0000007bUL, 0x000000f2UL, 0x0000006bUL, 0x0000006fUL, 0x000000c5UL,
1595
    0x00000030UL, 0x00000001UL, 0x00000067UL, 0x0000002bUL, 0x000000feUL, 0x000000d7UL, 0x000000abUL, 0x00000076UL,
1596
    0x000000caUL, 0x00000082UL, 0x000000c9UL, 0x0000007dUL, 0x000000faUL, 0x00000059UL, 0x00000047UL, 0x000000f0UL,
1597
    0x000000adUL, 0x000000d4UL, 0x000000a2UL, 0x000000afUL, 0x0000009cUL, 0x000000a4UL, 0x00000072UL, 0x000000c0UL,
1598
    0x000000b7UL, 0x000000fdUL, 0x00000093UL, 0x00000026UL, 0x00000036UL, 0x0000003fUL, 0x000000f7UL, 0x000000ccUL,
1599
    0x00000034UL, 0x000000a5UL, 0x000000e5UL, 0x000000f1UL, 0x00000071UL, 0x000000d8UL, 0x00000031UL, 0x00000015UL,
1600
    0x00000004UL, 0x000000c7UL, 0x00000023UL, 0x000000c3UL, 0x00000018UL, 0x00000096UL, 0x00000005UL, 0x0000009aUL,
1601
    0x00000007UL, 0x00000012UL, 0x00000080UL, 0x000000e2UL, 0x000000ebUL, 0x00000027UL, 0x000000b2UL, 0x00000075UL,
1602
    0x00000009UL, 0x00000083UL, 0x0000002cUL, 0x0000001aUL, 0x0000001bUL, 0x0000006eUL, 0x0000005aUL, 0x000000a0UL,
1603
    0x00000052UL, 0x0000003bUL, 0x000000d6UL, 0x000000b3UL, 0x00000029UL, 0x000000e3UL, 0x0000002fUL, 0x00000084UL,
1604
    0x00000053UL, 0x000000d1UL, 0x00000000UL, 0x000000edUL, 0x00000020UL, 0x000000fcUL, 0x000000b1UL, 0x0000005bUL,
1605
    0x0000006aUL, 0x000000cbUL, 0x000000beUL, 0x00000039UL, 0x0000004aUL, 0x0000004cUL, 0x00000058UL, 0x000000cfUL,
1606
    0x000000d0UL, 0x000000efUL, 0x000000aaUL, 0x000000fbUL, 0x00000043UL, 0x0000004dUL, 0x00000033UL, 0x00000085UL,
1607
    0x00000045UL, 0x000000f9UL, 0x00000002UL, 0x0000007fUL, 0x00000050UL, 0x0000003cUL, 0x0000009fUL, 0x000000a8UL,
1608
    0x00000051UL, 0x000000a3UL, 0x00000040UL, 0x0000008fUL, 0x00000092UL, 0x0000009dUL, 0x00000038UL, 0x000000f5UL,
1609
    0x000000bcUL, 0x000000b6UL, 0x000000daUL, 0x00000021UL, 0x00000010UL, 0x000000ffUL, 0x000000f3UL, 0x000000d2UL,
1610
    0x000000cdUL, 0x0000000cUL, 0x00000013UL, 0x000000ecUL, 0x0000005fUL, 0x00000097UL, 0x00000044UL, 0x00000017UL,
1611
    0x000000c4UL, 0x000000a7UL, 0x0000007eUL, 0x0000003dUL, 0x00000064UL, 0x0000005dUL, 0x00000019UL, 0x00000073UL,
1612
    0x00000060UL, 0x00000081UL, 0x0000004fUL, 0x000000dcUL, 0x00000022UL, 0x0000002aUL, 0x00000090UL, 0x00000088UL,
1613
    0x00000046UL, 0x000000eeUL, 0x000000b8UL, 0x00000014UL, 0x000000deUL, 0x0000005eUL, 0x0000000bUL, 0x000000dbUL,
1614
    0x000000e0UL, 0x00000032UL, 0x0000003aUL, 0x0000000aUL, 0x00000049UL, 0x00000006UL, 0x00000024UL, 0x0000005cUL,
1615
    0x000000c2UL, 0x000000d3UL, 0x000000acUL, 0x00000062UL, 0x00000091UL, 0x00000095UL, 0x000000e4UL, 0x00000079UL,
1616
    0x000000e7UL, 0x000000c8UL, 0x00000037UL, 0x0000006dUL, 0x0000008dUL, 0x000000d5UL, 0x0000004eUL, 0x000000a9UL,
1617
    0x0000006cUL, 0x00000056UL, 0x000000f4UL, 0x000000eaUL, 0x00000065UL, 0x0000007aUL, 0x000000aeUL, 0x00000008UL,
1618
    0x000000baUL, 0x00000078UL, 0x00000025UL, 0x0000002eUL, 0x0000001cUL, 0x000000a6UL, 0x000000b4UL, 0x000000c6UL,
1619
    0x000000e8UL, 0x000000ddUL, 0x00000074UL, 0x0000001fUL, 0x0000004bUL, 0x000000bdUL, 0x0000008bUL, 0x0000008aUL,
1620
    0x00000070UL, 0x0000003eUL, 0x000000b5UL, 0x00000066UL, 0x00000048UL, 0x00000003UL, 0x000000f6UL, 0x0000000eUL,
1621
    0x00000061UL, 0x00000035UL, 0x00000057UL, 0x000000b9UL, 0x00000086UL, 0x000000c1UL, 0x0000001dUL, 0x0000009eUL,
1622
    0x000000e1UL, 0x000000f8UL, 0x00000098UL, 0x00000011UL, 0x00000069UL, 0x000000d9UL, 0x0000008eUL, 0x00000094UL,
1623
    0x0000009bUL, 0x0000001eUL, 0x00000087UL, 0x000000e9UL, 0x000000ceUL, 0x00000055UL, 0x00000028UL, 0x000000dfUL,
1624
    0x0000008cUL, 0x000000a1UL, 0x00000089UL, 0x0000000dUL, 0x000000bfUL, 0x000000e6UL, 0x00000042UL, 0x00000068UL,
1625
    0x00000041UL, 0x00000099UL, 0x0000002dUL, 0x0000000fUL, 0x000000b0UL, 0x00000054UL, 0x000000bbUL, 0x00000016UL};
1626

1627
static const std::uint32_t Te4_1[] = {
1628
    0x00006300UL, 0x00007c00UL, 0x00007700UL, 0x00007b00UL, 0x0000f200UL, 0x00006b00UL, 0x00006f00UL, 0x0000c500UL,
1629
    0x00003000UL, 0x00000100UL, 0x00006700UL, 0x00002b00UL, 0x0000fe00UL, 0x0000d700UL, 0x0000ab00UL, 0x00007600UL,
1630
    0x0000ca00UL, 0x00008200UL, 0x0000c900UL, 0x00007d00UL, 0x0000fa00UL, 0x00005900UL, 0x00004700UL, 0x0000f000UL,
1631
    0x0000ad00UL, 0x0000d400UL, 0x0000a200UL, 0x0000af00UL, 0x00009c00UL, 0x0000a400UL, 0x00007200UL, 0x0000c000UL,
1632
    0x0000b700UL, 0x0000fd00UL, 0x00009300UL, 0x00002600UL, 0x00003600UL, 0x00003f00UL, 0x0000f700UL, 0x0000cc00UL,
1633
    0x00003400UL, 0x0000a500UL, 0x0000e500UL, 0x0000f100UL, 0x00007100UL, 0x0000d800UL, 0x00003100UL, 0x00001500UL,
1634
    0x00000400UL, 0x0000c700UL, 0x00002300UL, 0x0000c300UL, 0x00001800UL, 0x00009600UL, 0x00000500UL, 0x00009a00UL,
1635
    0x00000700UL, 0x00001200UL, 0x00008000UL, 0x0000e200UL, 0x0000eb00UL, 0x00002700UL, 0x0000b200UL, 0x00007500UL,
1636
    0x00000900UL, 0x00008300UL, 0x00002c00UL, 0x00001a00UL, 0x00001b00UL, 0x00006e00UL, 0x00005a00UL, 0x0000a000UL,
1637
    0x00005200UL, 0x00003b00UL, 0x0000d600UL, 0x0000b300UL, 0x00002900UL, 0x0000e300UL, 0x00002f00UL, 0x00008400UL,
1638
    0x00005300UL, 0x0000d100UL, 0x00000000UL, 0x0000ed00UL, 0x00002000UL, 0x0000fc00UL, 0x0000b100UL, 0x00005b00UL,
1639
    0x00006a00UL, 0x0000cb00UL, 0x0000be00UL, 0x00003900UL, 0x00004a00UL, 0x00004c00UL, 0x00005800UL, 0x0000cf00UL,
1640
    0x0000d000UL, 0x0000ef00UL, 0x0000aa00UL, 0x0000fb00UL, 0x00004300UL, 0x00004d00UL, 0x00003300UL, 0x00008500UL,
1641
    0x00004500UL, 0x0000f900UL, 0x00000200UL, 0x00007f00UL, 0x00005000UL, 0x00003c00UL, 0x00009f00UL, 0x0000a800UL,
1642
    0x00005100UL, 0x0000a300UL, 0x00004000UL, 0x00008f00UL, 0x00009200UL, 0x00009d00UL, 0x00003800UL, 0x0000f500UL,
1643
    0x0000bc00UL, 0x0000b600UL, 0x0000da00UL, 0x00002100UL, 0x00001000UL, 0x0000ff00UL, 0x0000f300UL, 0x0000d200UL,
1644
    0x0000cd00UL, 0x00000c00UL, 0x00001300UL, 0x0000ec00UL, 0x00005f00UL, 0x00009700UL, 0x00004400UL, 0x00001700UL,
1645
    0x0000c400UL, 0x0000a700UL, 0x00007e00UL, 0x00003d00UL, 0x00006400UL, 0x00005d00UL, 0x00001900UL, 0x00007300UL,
1646
    0x00006000UL, 0x00008100UL, 0x00004f00UL, 0x0000dc00UL, 0x00002200UL, 0x00002a00UL, 0x00009000UL, 0x00008800UL,
1647
    0x00004600UL, 0x0000ee00UL, 0x0000b800UL, 0x00001400UL, 0x0000de00UL, 0x00005e00UL, 0x00000b00UL, 0x0000db00UL,
1648
    0x0000e000UL, 0x00003200UL, 0x00003a00UL, 0x00000a00UL, 0x00004900UL, 0x00000600UL, 0x00002400UL, 0x00005c00UL,
1649
    0x0000c200UL, 0x0000d300UL, 0x0000ac00UL, 0x00006200UL, 0x00009100UL, 0x00009500UL, 0x0000e400UL, 0x00007900UL,
1650
    0x0000e700UL, 0x0000c800UL, 0x00003700UL, 0x00006d00UL, 0x00008d00UL, 0x0000d500UL, 0x00004e00UL, 0x0000a900UL,
1651
    0x00006c00UL, 0x00005600UL, 0x0000f400UL, 0x0000ea00UL, 0x00006500UL, 0x00007a00UL, 0x0000ae00UL, 0x00000800UL,
1652
    0x0000ba00UL, 0x00007800UL, 0x00002500UL, 0x00002e00UL, 0x00001c00UL, 0x0000a600UL, 0x0000b400UL, 0x0000c600UL,
1653
    0x0000e800UL, 0x0000dd00UL, 0x00007400UL, 0x00001f00UL, 0x00004b00UL, 0x0000bd00UL, 0x00008b00UL, 0x00008a00UL,
1654
    0x00007000UL, 0x00003e00UL, 0x0000b500UL, 0x00006600UL, 0x00004800UL, 0x00000300UL, 0x0000f600UL, 0x00000e00UL,
1655
    0x00006100UL, 0x00003500UL, 0x00005700UL, 0x0000b900UL, 0x00008600UL, 0x0000c100UL, 0x00001d00UL, 0x00009e00UL,
1656
    0x0000e100UL, 0x0000f800UL, 0x00009800UL, 0x00001100UL, 0x00006900UL, 0x0000d900UL, 0x00008e00UL, 0x00009400UL,
1657
    0x00009b00UL, 0x00001e00UL, 0x00008700UL, 0x0000e900UL, 0x0000ce00UL, 0x00005500UL, 0x00002800UL, 0x0000df00UL,
1658
    0x00008c00UL, 0x0000a100UL, 0x00008900UL, 0x00000d00UL, 0x0000bf00UL, 0x0000e600UL, 0x00004200UL, 0x00006800UL,
1659
    0x00004100UL, 0x00009900UL, 0x00002d00UL, 0x00000f00UL, 0x0000b000UL, 0x00005400UL, 0x0000bb00UL, 0x00001600UL};
1660

1661
static const std::uint32_t Te4_2[] = {
1662
    0x00630000UL, 0x007c0000UL, 0x00770000UL, 0x007b0000UL, 0x00f20000UL, 0x006b0000UL, 0x006f0000UL, 0x00c50000UL,
1663
    0x00300000UL, 0x00010000UL, 0x00670000UL, 0x002b0000UL, 0x00fe0000UL, 0x00d70000UL, 0x00ab0000UL, 0x00760000UL,
1664
    0x00ca0000UL, 0x00820000UL, 0x00c90000UL, 0x007d0000UL, 0x00fa0000UL, 0x00590000UL, 0x00470000UL, 0x00f00000UL,
1665
    0x00ad0000UL, 0x00d40000UL, 0x00a20000UL, 0x00af0000UL, 0x009c0000UL, 0x00a40000UL, 0x00720000UL, 0x00c00000UL,
1666
    0x00b70000UL, 0x00fd0000UL, 0x00930000UL, 0x00260000UL, 0x00360000UL, 0x003f0000UL, 0x00f70000UL, 0x00cc0000UL,
1667
    0x00340000UL, 0x00a50000UL, 0x00e50000UL, 0x00f10000UL, 0x00710000UL, 0x00d80000UL, 0x00310000UL, 0x00150000UL,
1668
    0x00040000UL, 0x00c70000UL, 0x00230000UL, 0x00c30000UL, 0x00180000UL, 0x00960000UL, 0x00050000UL, 0x009a0000UL,
1669
    0x00070000UL, 0x00120000UL, 0x00800000UL, 0x00e20000UL, 0x00eb0000UL, 0x00270000UL, 0x00b20000UL, 0x00750000UL,
1670
    0x00090000UL, 0x00830000UL, 0x002c0000UL, 0x001a0000UL, 0x001b0000UL, 0x006e0000UL, 0x005a0000UL, 0x00a00000UL,
1671
    0x00520000UL, 0x003b0000UL, 0x00d60000UL, 0x00b30000UL, 0x00290000UL, 0x00e30000UL, 0x002f0000UL, 0x00840000UL,
1672
    0x00530000UL, 0x00d10000UL, 0x00000000UL, 0x00ed0000UL, 0x00200000UL, 0x00fc0000UL, 0x00b10000UL, 0x005b0000UL,
1673
    0x006a0000UL, 0x00cb0000UL, 0x00be0000UL, 0x00390000UL, 0x004a0000UL, 0x004c0000UL, 0x00580000UL, 0x00cf0000UL,
1674
    0x00d00000UL, 0x00ef0000UL, 0x00aa0000UL, 0x00fb0000UL, 0x00430000UL, 0x004d0000UL, 0x00330000UL, 0x00850000UL,
1675
    0x00450000UL, 0x00f90000UL, 0x00020000UL, 0x007f0000UL, 0x00500000UL, 0x003c0000UL, 0x009f0000UL, 0x00a80000UL,
1676
    0x00510000UL, 0x00a30000UL, 0x00400000UL, 0x008f0000UL, 0x00920000UL, 0x009d0000UL, 0x00380000UL, 0x00f50000UL,
1677
    0x00bc0000UL, 0x00b60000UL, 0x00da0000UL, 0x00210000UL, 0x00100000UL, 0x00ff0000UL, 0x00f30000UL, 0x00d20000UL,
1678
    0x00cd0000UL, 0x000c0000UL, 0x00130000UL, 0x00ec0000UL, 0x005f0000UL, 0x00970000UL, 0x00440000UL, 0x00170000UL,
1679
    0x00c40000UL, 0x00a70000UL, 0x007e0000UL, 0x003d0000UL, 0x00640000UL, 0x005d0000UL, 0x00190000UL, 0x00730000UL,
1680
    0x00600000UL, 0x00810000UL, 0x004f0000UL, 0x00dc0000UL, 0x00220000UL, 0x002a0000UL, 0x00900000UL, 0x00880000UL,
1681
    0x00460000UL, 0x00ee0000UL, 0x00b80000UL, 0x00140000UL, 0x00de0000UL, 0x005e0000UL, 0x000b0000UL, 0x00db0000UL,
1682
    0x00e00000UL, 0x00320000UL, 0x003a0000UL, 0x000a0000UL, 0x00490000UL, 0x00060000UL, 0x00240000UL, 0x005c0000UL,
1683
    0x00c20000UL, 0x00d30000UL, 0x00ac0000UL, 0x00620000UL, 0x00910000UL, 0x00950000UL, 0x00e40000UL, 0x00790000UL,
1684
    0x00e70000UL, 0x00c80000UL, 0x00370000UL, 0x006d0000UL, 0x008d0000UL, 0x00d50000UL, 0x004e0000UL, 0x00a90000UL,
1685
    0x006c0000UL, 0x00560000UL, 0x00f40000UL, 0x00ea0000UL, 0x00650000UL, 0x007a0000UL, 0x00ae0000UL, 0x00080000UL,
1686
    0x00ba0000UL, 0x00780000UL, 0x00250000UL, 0x002e0000UL, 0x001c0000UL, 0x00a60000UL, 0x00b40000UL, 0x00c60000UL,
1687
    0x00e80000UL, 0x00dd0000UL, 0x00740000UL, 0x001f0000UL, 0x004b0000UL, 0x00bd0000UL, 0x008b0000UL, 0x008a0000UL,
1688
    0x00700000UL, 0x003e0000UL, 0x00b50000UL, 0x00660000UL, 0x00480000UL, 0x00030000UL, 0x00f60000UL, 0x000e0000UL,
1689
    0x00610000UL, 0x00350000UL, 0x00570000UL, 0x00b90000UL, 0x00860000UL, 0x00c10000UL, 0x001d0000UL, 0x009e0000UL,
1690
    0x00e10000UL, 0x00f80000UL, 0x00980000UL, 0x00110000UL, 0x00690000UL, 0x00d90000UL, 0x008e0000UL, 0x00940000UL,
1691
    0x009b0000UL, 0x001e0000UL, 0x00870000UL, 0x00e90000UL, 0x00ce0000UL, 0x00550000UL, 0x00280000UL, 0x00df0000UL,
1692
    0x008c0000UL, 0x00a10000UL, 0x00890000UL, 0x000d0000UL, 0x00bf0000UL, 0x00e60000UL, 0x00420000UL, 0x00680000UL,
1693
    0x00410000UL, 0x00990000UL, 0x002d0000UL, 0x000f0000UL, 0x00b00000UL, 0x00540000UL, 0x00bb0000UL, 0x00160000UL};
1694

1695
static const std::uint32_t Te4_3[] = {
1696
    0x63000000UL, 0x7c000000UL, 0x77000000UL, 0x7b000000UL, 0xf2000000UL, 0x6b000000UL, 0x6f000000UL, 0xc5000000UL,
1697
    0x30000000UL, 0x01000000UL, 0x67000000UL, 0x2b000000UL, 0xfe000000UL, 0xd7000000UL, 0xab000000UL, 0x76000000UL,
1698
    0xca000000UL, 0x82000000UL, 0xc9000000UL, 0x7d000000UL, 0xfa000000UL, 0x59000000UL, 0x47000000UL, 0xf0000000UL,
1699
    0xad000000UL, 0xd4000000UL, 0xa2000000UL, 0xaf000000UL, 0x9c000000UL, 0xa4000000UL, 0x72000000UL, 0xc0000000UL,
1700
    0xb7000000UL, 0xfd000000UL, 0x93000000UL, 0x26000000UL, 0x36000000UL, 0x3f000000UL, 0xf7000000UL, 0xcc000000UL,
1701
    0x34000000UL, 0xa5000000UL, 0xe5000000UL, 0xf1000000UL, 0x71000000UL, 0xd8000000UL, 0x31000000UL, 0x15000000UL,
1702
    0x04000000UL, 0xc7000000UL, 0x23000000UL, 0xc3000000UL, 0x18000000UL, 0x96000000UL, 0x05000000UL, 0x9a000000UL,
1703
    0x07000000UL, 0x12000000UL, 0x80000000UL, 0xe2000000UL, 0xeb000000UL, 0x27000000UL, 0xb2000000UL, 0x75000000UL,
1704
    0x09000000UL, 0x83000000UL, 0x2c000000UL, 0x1a000000UL, 0x1b000000UL, 0x6e000000UL, 0x5a000000UL, 0xa0000000UL,
1705
    0x52000000UL, 0x3b000000UL, 0xd6000000UL, 0xb3000000UL, 0x29000000UL, 0xe3000000UL, 0x2f000000UL, 0x84000000UL,
1706
    0x53000000UL, 0xd1000000UL, 0x00000000UL, 0xed000000UL, 0x20000000UL, 0xfc000000UL, 0xb1000000UL, 0x5b000000UL,
1707
    0x6a000000UL, 0xcb000000UL, 0xbe000000UL, 0x39000000UL, 0x4a000000UL, 0x4c000000UL, 0x58000000UL, 0xcf000000UL,
1708
    0xd0000000UL, 0xef000000UL, 0xaa000000UL, 0xfb000000UL, 0x43000000UL, 0x4d000000UL, 0x33000000UL, 0x85000000UL,
1709
    0x45000000UL, 0xf9000000UL, 0x02000000UL, 0x7f000000UL, 0x50000000UL, 0x3c000000UL, 0x9f000000UL, 0xa8000000UL,
1710
    0x51000000UL, 0xa3000000UL, 0x40000000UL, 0x8f000000UL, 0x92000000UL, 0x9d000000UL, 0x38000000UL, 0xf5000000UL,
1711
    0xbc000000UL, 0xb6000000UL, 0xda000000UL, 0x21000000UL, 0x10000000UL, 0xff000000UL, 0xf3000000UL, 0xd2000000UL,
1712
    0xcd000000UL, 0x0c000000UL, 0x13000000UL, 0xec000000UL, 0x5f000000UL, 0x97000000UL, 0x44000000UL, 0x17000000UL,
1713
    0xc4000000UL, 0xa7000000UL, 0x7e000000UL, 0x3d000000UL, 0x64000000UL, 0x5d000000UL, 0x19000000UL, 0x73000000UL,
1714
    0x60000000UL, 0x81000000UL, 0x4f000000UL, 0xdc000000UL, 0x22000000UL, 0x2a000000UL, 0x90000000UL, 0x88000000UL,
1715
    0x46000000UL, 0xee000000UL, 0xb8000000UL, 0x14000000UL, 0xde000000UL, 0x5e000000UL, 0x0b000000UL, 0xdb000000UL,
1716
    0xe0000000UL, 0x32000000UL, 0x3a000000UL, 0x0a000000UL, 0x49000000UL, 0x06000000UL, 0x24000000UL, 0x5c000000UL,
1717
    0xc2000000UL, 0xd3000000UL, 0xac000000UL, 0x62000000UL, 0x91000000UL, 0x95000000UL, 0xe4000000UL, 0x79000000UL,
1718
    0xe7000000UL, 0xc8000000UL, 0x37000000UL, 0x6d000000UL, 0x8d000000UL, 0xd5000000UL, 0x4e000000UL, 0xa9000000UL,
1719
    0x6c000000UL, 0x56000000UL, 0xf4000000UL, 0xea000000UL, 0x65000000UL, 0x7a000000UL, 0xae000000UL, 0x08000000UL,
1720
    0xba000000UL, 0x78000000UL, 0x25000000UL, 0x2e000000UL, 0x1c000000UL, 0xa6000000UL, 0xb4000000UL, 0xc6000000UL,
1721
    0xe8000000UL, 0xdd000000UL, 0x74000000UL, 0x1f000000UL, 0x4b000000UL, 0xbd000000UL, 0x8b000000UL, 0x8a000000UL,
1722
    0x70000000UL, 0x3e000000UL, 0xb5000000UL, 0x66000000UL, 0x48000000UL, 0x03000000UL, 0xf6000000UL, 0x0e000000UL,
1723
    0x61000000UL, 0x35000000UL, 0x57000000UL, 0xb9000000UL, 0x86000000UL, 0xc1000000UL, 0x1d000000UL, 0x9e000000UL,
1724
    0xe1000000UL, 0xf8000000UL, 0x98000000UL, 0x11000000UL, 0x69000000UL, 0xd9000000UL, 0x8e000000UL, 0x94000000UL,
1725
    0x9b000000UL, 0x1e000000UL, 0x87000000UL, 0xe9000000UL, 0xce000000UL, 0x55000000UL, 0x28000000UL, 0xdf000000UL,
1726
    0x8c000000UL, 0xa1000000UL, 0x89000000UL, 0x0d000000UL, 0xbf000000UL, 0xe6000000UL, 0x42000000UL, 0x68000000UL,
1727
    0x41000000UL, 0x99000000UL, 0x2d000000UL, 0x0f000000UL, 0xb0000000UL, 0x54000000UL, 0xbb000000UL, 0x16000000UL};
1728

1729
static const std::uint32_t TD1[256] = {
1730
    0x5051f4a7UL,
1731
    0x537e4165UL,
1732
    0xc31a17a4UL,
1733
    0x963a275eUL,
1734
    0xcb3bab6bUL,
1735
    0xf11f9d45UL,
1736
    0xabacfa58UL,
1737
    0x934be303UL,
1738
    0x552030faUL,
1739
    0xf6ad766dUL,
1740
    0x9188cc76UL,
1741
    0x25f5024cUL,
1742
    0xfc4fe5d7UL,
1743
    0xd7c52acbUL,
1744
    0x80263544UL,
1745
    0x8fb562a3UL,
1746
    0x49deb15aUL,
1747
    0x6725ba1bUL,
1748
    0x9845ea0eUL,
1749
    0xe15dfec0UL,
1750
    0x02c32f75UL,
1751
    0x12814cf0UL,
1752
    0xa38d4697UL,
1753
    0xc66bd3f9UL,
1754
    0xe7038f5fUL,
1755
    0x9515929cUL,
1756
    0xebbf6d7aUL,
1757
    0xda955259UL,
1758
    0x2dd4be83UL,
1759
    0xd3587421UL,
1760
    0x2949e069UL,
1761
    0x448ec9c8UL,
1762
    0x6a75c289UL,
1763
    0x78f48e79UL,
1764
    0x6b99583eUL,
1765
    0xdd27b971UL,
1766
    0xb6bee14fUL,
1767
    0x17f088adUL,
1768
    0x66c920acUL,
1769
    0xb47dce3aUL,
1770
    0x1863df4aUL,
1771
    0x82e51a31UL,
1772
    0x60975133UL,
1773
    0x4562537fUL,
1774
    0xe0b16477UL,
1775
    0x84bb6baeUL,
1776
    0x1cfe81a0UL,
1777
    0x94f9082bUL,
1778
    0x58704868UL,
1779
    0x198f45fdUL,
1780
    0x8794de6cUL,
1781
    0xb7527bf8UL,
1782
    0x23ab73d3UL,
1783
    0xe2724b02UL,
1784
    0x57e31f8fUL,
1785
    0x2a6655abUL,
1786
    0x07b2eb28UL,
1787
    0x032fb5c2UL,
1788
    0x9a86c57bUL,
1789
    0xa5d33708UL,
1790
    0xf2302887UL,
1791
    0xb223bfa5UL,
1792
    0xba02036aUL,
1793
    0x5ced1682UL,
1794
    0x2b8acf1cUL,
1795
    0x92a779b4UL,
1796
    0xf0f307f2UL,
1797
    0xa14e69e2UL,
1798
    0xcd65daf4UL,
1799
    0xd50605beUL,
1800
    0x1fd13462UL,
1801
    0x8ac4a6feUL,
1802
    0x9d342e53UL,
1803
    0xa0a2f355UL,
1804
    0x32058ae1UL,
1805
    0x75a4f6ebUL,
1806
    0x390b83ecUL,
1807
    0xaa4060efUL,
1808
    0x065e719fUL,
1809
    0x51bd6e10UL,
1810
    0xf93e218aUL,
1811
    0x3d96dd06UL,
1812
    0xaedd3e05UL,
1813
    0x464de6bdUL,
1814
    0xb591548dUL,
1815
    0x0571c45dUL,
1816
    0x6f0406d4UL,
1817
    0xff605015UL,
1818
    0x241998fbUL,
1819
    0x97d6bde9UL,
1820
    0xcc894043UL,
1821
    0x7767d99eUL,
1822
    0xbdb0e842UL,
1823
    0x8807898bUL,
1824
    0x38e7195bUL,
1825
    0xdb79c8eeUL,
1826
    0x47a17c0aUL,
1827
    0xe97c420fUL,
1828
    0xc9f8841eUL,
1829
    0x00000000UL,
1830
    0x83098086UL,
1831
    0x48322bedUL,
1832
    0xac1e1170UL,
1833
    0x4e6c5a72UL,
1834
    0xfbfd0effUL,
1835
    0x560f8538UL,
1836
    0x1e3daed5UL,
1837
    0x27362d39UL,
1838
    0x640a0fd9UL,
1839
    0x21685ca6UL,
1840
    0xd19b5b54UL,
1841
    0x3a24362eUL,
1842
    0xb10c0a67UL,
1843
    0x0f9357e7UL,
1844
    0xd2b4ee96UL,
1845
    0x9e1b9b91UL,
1846
    0x4f80c0c5UL,
1847
    0xa261dc20UL,
1848
    0x695a774bUL,
1849
    0x161c121aUL,
1850
    0x0ae293baUL,
1851
    0xe5c0a02aUL,
1852
    0x433c22e0UL,
1853
    0x1d121b17UL,
1854
    0x0b0e090dUL,
1855
    0xadf28bc7UL,
1856
    0xb92db6a8UL,
1857
    0xc8141ea9UL,
1858
    0x8557f119UL,
1859
    0x4caf7507UL,
1860
    0xbbee99ddUL,
1861
    0xfda37f60UL,
1862
    0x9ff70126UL,
1863
    0xbc5c72f5UL,
1864
    0xc544663bUL,
1865
    0x345bfb7eUL,
1866
    0x768b4329UL,
1867
    0xdccb23c6UL,
1868
    0x68b6edfcUL,
1869
    0x63b8e4f1UL,
1870
    0xcad731dcUL,
1871
    0x10426385UL,
1872
    0x40139722UL,
1873
    0x2084c611UL,
1874
    0x7d854a24UL,
1875
    0xf8d2bb3dUL,
1876
    0x11aef932UL,
1877
    0x6dc729a1UL,
1878
    0x4b1d9e2fUL,
1879
    0xf3dcb230UL,
1880
    0xec0d8652UL,
1881
    0xd077c1e3UL,
1882
    0x6c2bb316UL,
1883
    0x99a970b9UL,
1884
    0xfa119448UL,
1885
    0x2247e964UL,
1886
    0xc4a8fc8cUL,
1887
    0x1aa0f03fUL,
1888
    0xd8567d2cUL,
1889
    0xef223390UL,
1890
    0xc787494eUL,
1891
    0xc1d938d1UL,
1892
    0xfe8ccaa2UL,
1893
    0x3698d40bUL,
1894
    0xcfa6f581UL,
1895
    0x28a57adeUL,
1896
    0x26dab78eUL,
1897
    0xa43fadbfUL,
1898
    0xe42c3a9dUL,
1899
    0x0d507892UL,
1900
    0x9b6a5fccUL,
1901
    0x62547e46UL,
1902
    0xc2f68d13UL,
1903
    0xe890d8b8UL,
1904
    0x5e2e39f7UL,
1905
    0xf582c3afUL,
1906
    0xbe9f5d80UL,
1907
    0x7c69d093UL,
1908
    0xa96fd52dUL,
1909
    0xb3cf2512UL,
1910
    0x3bc8ac99UL,
1911
    0xa710187dUL,
1912
    0x6ee89c63UL,
1913
    0x7bdb3bbbUL,
1914
    0x09cd2678UL,
1915
    0xf46e5918UL,
1916
    0x01ec9ab7UL,
1917
    0xa8834f9aUL,
1918
    0x65e6956eUL,
1919
    0x7eaaffe6UL,
1920
    0x0821bccfUL,
1921
    0xe6ef15e8UL,
1922
    0xd9bae79bUL,
1923
    0xce4a6f36UL,
1924
    0xd4ea9f09UL,
1925
    0xd629b07cUL,
1926
    0xaf31a4b2UL,
1927
    0x312a3f23UL,
1928
    0x30c6a594UL,
1929
    0xc035a266UL,
1930
    0x37744ebcUL,
1931
    0xa6fc82caUL,
1932
    0xb0e090d0UL,
1933
    0x1533a7d8UL,
1934
    0x4af10498UL,
1935
    0xf741ecdaUL,
1936
    0x0e7fcd50UL,
1937
    0x2f1791f6UL,
1938
    0x8d764dd6UL,
1939
    0x4d43efb0UL,
1940
    0x54ccaa4dUL,
1941
    0xdfe49604UL,
1942
    0xe39ed1b5UL,
1943
    0x1b4c6a88UL,
1944
    0xb8c12c1fUL,
1945
    0x7f466551UL,
1946
    0x049d5eeaUL,
1947
    0x5d018c35UL,
1948
    0x73fa8774UL,
1949
    0x2efb0b41UL,
1950
    0x5ab3671dUL,
1951
    0x5292dbd2UL,
1952
    0x33e91056UL,
1953
    0x136dd647UL,
1954
    0x8c9ad761UL,
1955
    0x7a37a10cUL,
1956
    0x8e59f814UL,
1957
    0x89eb133cUL,
1958
    0xeecea927UL,
1959
    0x35b761c9UL,
1960
    0xede11ce5UL,
1961
    0x3c7a47b1UL,
1962
    0x599cd2dfUL,
1963
    0x3f55f273UL,
1964
    0x791814ceUL,
1965
    0xbf73c737UL,
1966
    0xea53f7cdUL,
1967
    0x5b5ffdaaUL,
1968
    0x14df3d6fUL,
1969
    0x867844dbUL,
1970
    0x81caaff3UL,
1971
    0x3eb968c4UL,
1972
    0x2c382434UL,
1973
    0x5fc2a340UL,
1974
    0x72161dc3UL,
1975
    0x0cbce225UL,
1976
    0x8b283c49UL,
1977
    0x41ff0d95UL,
1978
    0x7139a801UL,
1979
    0xde080cb3UL,
1980
    0x9cd8b4e4UL,
1981
    0x906456c1UL,
1982
    0x617bcb84UL,
1983
    0x70d532b6UL,
1984
    0x74486c5cUL,
1985
    0x42d0b857UL,
1986
};
1987
static const std::uint32_t TD2[256] = {
1988
    0xa75051f4UL,
1989
    0x65537e41UL,
1990
    0xa4c31a17UL,
1991
    0x5e963a27UL,
1992
    0x6bcb3babUL,
1993
    0x45f11f9dUL,
1994
    0x58abacfaUL,
1995
    0x03934be3UL,
1996
    0xfa552030UL,
1997
    0x6df6ad76UL,
1998
    0x769188ccUL,
1999
    0x4c25f502UL,
2000
    0xd7fc4fe5UL,
2001
    0xcbd7c52aUL,
2002
    0x44802635UL,
2003
    0xa38fb562UL,
2004
    0x5a49deb1UL,
2005
    0x1b6725baUL,
2006
    0x0e9845eaUL,
2007
    0xc0e15dfeUL,
2008
    0x7502c32fUL,
2009
    0xf012814cUL,
2010
    0x97a38d46UL,
2011
    0xf9c66bd3UL,
2012
    0x5fe7038fUL,
2013
    0x9c951592UL,
2014
    0x7aebbf6dUL,
2015
    0x59da9552UL,
2016
    0x832dd4beUL,
2017
    0x21d35874UL,
2018
    0x692949e0UL,
2019
    0xc8448ec9UL,
2020
    0x896a75c2UL,
2021
    0x7978f48eUL,
2022
    0x3e6b9958UL,
2023
    0x71dd27b9UL,
2024
    0x4fb6bee1UL,
2025
    0xad17f088UL,
2026
    0xac66c920UL,
2027
    0x3ab47dceUL,
2028
    0x4a1863dfUL,
2029
    0x3182e51aUL,
2030
    0x33609751UL,
2031
    0x7f456253UL,
2032
    0x77e0b164UL,
2033
    0xae84bb6bUL,
2034
    0xa01cfe81UL,
2035
    0x2b94f908UL,
2036
    0x68587048UL,
2037
    0xfd198f45UL,
2038
    0x6c8794deUL,
2039
    0xf8b7527bUL,
2040
    0xd323ab73UL,
2041
    0x02e2724bUL,
2042
    0x8f57e31fUL,
2043
    0xab2a6655UL,
2044
    0x2807b2ebUL,
2045
    0xc2032fb5UL,
2046
    0x7b9a86c5UL,
2047
    0x08a5d337UL,
2048
    0x87f23028UL,
2049
    0xa5b223bfUL,
2050
    0x6aba0203UL,
2051
    0x825ced16UL,
2052
    0x1c2b8acfUL,
2053
    0xb492a779UL,
2054
    0xf2f0f307UL,
2055
    0xe2a14e69UL,
2056
    0xf4cd65daUL,
2057
    0xbed50605UL,
2058
    0x621fd134UL,
2059
    0xfe8ac4a6UL,
2060
    0x539d342eUL,
2061
    0x55a0a2f3UL,
2062
    0xe132058aUL,
2063
    0xeb75a4f6UL,
2064
    0xec390b83UL,
2065
    0xefaa4060UL,
2066
    0x9f065e71UL,
2067
    0x1051bd6eUL,
2068
    0x8af93e21UL,
2069
    0x063d96ddUL,
2070
    0x05aedd3eUL,
2071
    0xbd464de6UL,
2072
    0x8db59154UL,
2073
    0x5d0571c4UL,
2074
    0xd46f0406UL,
2075
    0x15ff6050UL,
2076
    0xfb241998UL,
2077
    0xe997d6bdUL,
2078
    0x43cc8940UL,
2079
    0x9e7767d9UL,
2080
    0x42bdb0e8UL,
2081
    0x8b880789UL,
2082
    0x5b38e719UL,
2083
    0xeedb79c8UL,
2084
    0x0a47a17cUL,
2085
    0x0fe97c42UL,
2086
    0x1ec9f884UL,
2087
    0x00000000UL,
2088
    0x86830980UL,
2089
    0xed48322bUL,
2090
    0x70ac1e11UL,
2091
    0x724e6c5aUL,
2092
    0xfffbfd0eUL,
2093
    0x38560f85UL,
2094
    0xd51e3daeUL,
2095
    0x3927362dUL,
2096
    0xd9640a0fUL,
2097
    0xa621685cUL,
2098
    0x54d19b5bUL,
2099
    0x2e3a2436UL,
2100
    0x67b10c0aUL,
2101
    0xe70f9357UL,
2102
    0x96d2b4eeUL,
2103
    0x919e1b9bUL,
2104
    0xc54f80c0UL,
2105
    0x20a261dcUL,
2106
    0x4b695a77UL,
2107
    0x1a161c12UL,
2108
    0xba0ae293UL,
2109
    0x2ae5c0a0UL,
2110
    0xe0433c22UL,
2111
    0x171d121bUL,
2112
    0x0d0b0e09UL,
2113
    0xc7adf28bUL,
2114
    0xa8b92db6UL,
2115
    0xa9c8141eUL,
2116
    0x198557f1UL,
2117
    0x074caf75UL,
2118
    0xddbbee99UL,
2119
    0x60fda37fUL,
2120
    0x269ff701UL,
2121
    0xf5bc5c72UL,
2122
    0x3bc54466UL,
2123
    0x7e345bfbUL,
2124
    0x29768b43UL,
2125
    0xc6dccb23UL,
2126
    0xfc68b6edUL,
2127
    0xf163b8e4UL,
2128
    0xdccad731UL,
2129
    0x85104263UL,
2130
    0x22401397UL,
2131
    0x112084c6UL,
2132
    0x247d854aUL,
2133
    0x3df8d2bbUL,
2134
    0x3211aef9UL,
2135
    0xa16dc729UL,
2136
    0x2f4b1d9eUL,
2137
    0x30f3dcb2UL,
2138
    0x52ec0d86UL,
2139
    0xe3d077c1UL,
2140
    0x166c2bb3UL,
2141
    0xb999a970UL,
2142
    0x48fa1194UL,
2143
    0x642247e9UL,
2144
    0x8cc4a8fcUL,
2145
    0x3f1aa0f0UL,
2146
    0x2cd8567dUL,
2147
    0x90ef2233UL,
2148
    0x4ec78749UL,
2149
    0xd1c1d938UL,
2150
    0xa2fe8ccaUL,
2151
    0x0b3698d4UL,
2152
    0x81cfa6f5UL,
2153
    0xde28a57aUL,
2154
    0x8e26dab7UL,
2155
    0xbfa43fadUL,
2156
    0x9de42c3aUL,
2157
    0x920d5078UL,
2158
    0xcc9b6a5fUL,
2159
    0x4662547eUL,
2160
    0x13c2f68dUL,
2161
    0xb8e890d8UL,
2162
    0xf75e2e39UL,
2163
    0xaff582c3UL,
2164
    0x80be9f5dUL,
2165
    0x937c69d0UL,
2166
    0x2da96fd5UL,
2167
    0x12b3cf25UL,
2168
    0x993bc8acUL,
2169
    0x7da71018UL,
2170
    0x636ee89cUL,
2171
    0xbb7bdb3bUL,
2172
    0x7809cd26UL,
2173
    0x18f46e59UL,
2174
    0xb701ec9aUL,
2175
    0x9aa8834fUL,
2176
    0x6e65e695UL,
2177
    0xe67eaaffUL,
2178
    0xcf0821bcUL,
2179
    0xe8e6ef15UL,
2180
    0x9bd9bae7UL,
2181
    0x36ce4a6fUL,
2182
    0x09d4ea9fUL,
2183
    0x7cd629b0UL,
2184
    0xb2af31a4UL,
2185
    0x23312a3fUL,
2186
    0x9430c6a5UL,
2187
    0x66c035a2UL,
2188
    0xbc37744eUL,
2189
    0xcaa6fc82UL,
2190
    0xd0b0e090UL,
2191
    0xd81533a7UL,
2192
    0x984af104UL,
2193
    0xdaf741ecUL,
2194
    0x500e7fcdUL,
2195
    0xf62f1791UL,
2196
    0xd68d764dUL,
2197
    0xb04d43efUL,
2198
    0x4d54ccaaUL,
2199
    0x04dfe496UL,
2200
    0xb5e39ed1UL,
2201
    0x881b4c6aUL,
2202
    0x1fb8c12cUL,
2203
    0x517f4665UL,
2204
    0xea049d5eUL,
2205
    0x355d018cUL,
2206
    0x7473fa87UL,
2207
    0x412efb0bUL,
2208
    0x1d5ab367UL,
2209
    0xd25292dbUL,
2210
    0x5633e910UL,
2211
    0x47136dd6UL,
2212
    0x618c9ad7UL,
2213
    0x0c7a37a1UL,
2214
    0x148e59f8UL,
2215
    0x3c89eb13UL,
2216
    0x27eecea9UL,
2217
    0xc935b761UL,
2218
    0xe5ede11cUL,
2219
    0xb13c7a47UL,
2220
    0xdf599cd2UL,
2221
    0x733f55f2UL,
2222
    0xce791814UL,
2223
    0x37bf73c7UL,
2224
    0xcdea53f7UL,
2225
    0xaa5b5ffdUL,
2226
    0x6f14df3dUL,
2227
    0xdb867844UL,
2228
    0xf381caafUL,
2229
    0xc43eb968UL,
2230
    0x342c3824UL,
2231
    0x405fc2a3UL,
2232
    0xc372161dUL,
2233
    0x250cbce2UL,
2234
    0x498b283cUL,
2235
    0x9541ff0dUL,
2236
    0x017139a8UL,
2237
    0xb3de080cUL,
2238
    0xe49cd8b4UL,
2239
    0xc1906456UL,
2240
    0x84617bcbUL,
2241
    0xb670d532UL,
2242
    0x5c74486cUL,
2243
    0x5742d0b8UL,
2244
};
2245
static const std::uint32_t TD3[256] = {
2246
    0xf4a75051UL,
2247
    0x4165537eUL,
2248
    0x17a4c31aUL,
2249
    0x275e963aUL,
2250
    0xab6bcb3bUL,
2251
    0x9d45f11fUL,
2252
    0xfa58abacUL,
2253
    0xe303934bUL,
2254
    0x30fa5520UL,
2255
    0x766df6adUL,
2256
    0xcc769188UL,
2257
    0x024c25f5UL,
2258
    0xe5d7fc4fUL,
2259
    0x2acbd7c5UL,
2260
    0x35448026UL,
2261
    0x62a38fb5UL,
2262
    0xb15a49deUL,
2263
    0xba1b6725UL,
2264
    0xea0e9845UL,
2265
    0xfec0e15dUL,
2266
    0x2f7502c3UL,
2267
    0x4cf01281UL,
2268
    0x4697a38dUL,
2269
    0xd3f9c66bUL,
2270
    0x8f5fe703UL,
2271
    0x929c9515UL,
2272
    0x6d7aebbfUL,
2273
    0x5259da95UL,
2274
    0xbe832dd4UL,
2275
    0x7421d358UL,
2276
    0xe0692949UL,
2277
    0xc9c8448eUL,
2278
    0xc2896a75UL,
2279
    0x8e7978f4UL,
2280
    0x583e6b99UL,
2281
    0xb971dd27UL,
2282
    0xe14fb6beUL,
2283
    0x88ad17f0UL,
2284
    0x20ac66c9UL,
2285
    0xce3ab47dUL,
2286
    0xdf4a1863UL,
2287
    0x1a3182e5UL,
2288
    0x51336097UL,
2289
    0x537f4562UL,
2290
    0x6477e0b1UL,
2291
    0x6bae84bbUL,
2292
    0x81a01cfeUL,
2293
    0x082b94f9UL,
2294
    0x48685870UL,
2295
    0x45fd198fUL,
2296
    0xde6c8794UL,
2297
    0x7bf8b752UL,
2298
    0x73d323abUL,
2299
    0x4b02e272UL,
2300
    0x1f8f57e3UL,
2301
    0x55ab2a66UL,
2302
    0xeb2807b2UL,
2303
    0xb5c2032fUL,
2304
    0xc57b9a86UL,
2305
    0x3708a5d3UL,
2306
    0x2887f230UL,
2307
    0xbfa5b223UL,
2308
    0x036aba02UL,
2309
    0x16825cedUL,
2310
    0xcf1c2b8aUL,
2311
    0x79b492a7UL,
2312
    0x07f2f0f3UL,
2313
    0x69e2a14eUL,
2314
    0xdaf4cd65UL,
2315
    0x05bed506UL,
2316
    0x34621fd1UL,
2317
    0xa6fe8ac4UL,
2318
    0x2e539d34UL,
2319
    0xf355a0a2UL,
2320
    0x8ae13205UL,
2321
    0xf6eb75a4UL,
2322
    0x83ec390bUL,
2323
    0x60efaa40UL,
2324
    0x719f065eUL,
2325
    0x6e1051bdUL,
2326
    0x218af93eUL,
2327
    0xdd063d96UL,
2328
    0x3e05aeddUL,
2329
    0xe6bd464dUL,
2330
    0x548db591UL,
2331
    0xc45d0571UL,
2332
    0x06d46f04UL,
2333
    0x5015ff60UL,
2334
    0x98fb2419UL,
2335
    0xbde997d6UL,
2336
    0x4043cc89UL,
2337
    0xd99e7767UL,
2338
    0xe842bdb0UL,
2339
    0x898b8807UL,
2340
    0x195b38e7UL,
2341
    0xc8eedb79UL,
2342
    0x7c0a47a1UL,
2343
    0x420fe97cUL,
2344
    0x841ec9f8UL,
2345
    0x00000000UL,
2346
    0x80868309UL,
2347
    0x2bed4832UL,
2348
    0x1170ac1eUL,
2349
    0x5a724e6cUL,
2350
    0x0efffbfdUL,
2351
    0x8538560fUL,
2352
    0xaed51e3dUL,
2353
    0x2d392736UL,
2354
    0x0fd9640aUL,
2355
    0x5ca62168UL,
2356
    0x5b54d19bUL,
2357
    0x362e3a24UL,
2358
    0x0a67b10cUL,
2359
    0x57e70f93UL,
2360
    0xee96d2b4UL,
2361
    0x9b919e1bUL,
2362
    0xc0c54f80UL,
2363
    0xdc20a261UL,
2364
    0x774b695aUL,
2365
    0x121a161cUL,
2366
    0x93ba0ae2UL,
2367
    0xa02ae5c0UL,
2368
    0x22e0433cUL,
2369
    0x1b171d12UL,
2370
    0x090d0b0eUL,
2371
    0x8bc7adf2UL,
2372
    0xb6a8b92dUL,
2373
    0x1ea9c814UL,
2374
    0xf1198557UL,
2375
    0x75074cafUL,
2376
    0x99ddbbeeUL,
2377
    0x7f60fda3UL,
2378
    0x01269ff7UL,
2379
    0x72f5bc5cUL,
2380
    0x663bc544UL,
2381
    0xfb7e345bUL,
2382
    0x4329768bUL,
2383
    0x23c6dccbUL,
2384
    0xedfc68b6UL,
2385
    0xe4f163b8UL,
2386
    0x31dccad7UL,
2387
    0x63851042UL,
2388
    0x97224013UL,
2389
    0xc6112084UL,
2390
    0x4a247d85UL,
2391
    0xbb3df8d2UL,
2392
    0xf93211aeUL,
2393
    0x29a16dc7UL,
2394
    0x9e2f4b1dUL,
2395
    0xb230f3dcUL,
2396
    0x8652ec0dUL,
2397
    0xc1e3d077UL,
2398
    0xb3166c2bUL,
2399
    0x70b999a9UL,
2400
    0x9448fa11UL,
2401
    0xe9642247UL,
2402
    0xfc8cc4a8UL,
2403
    0xf03f1aa0UL,
2404
    0x7d2cd856UL,
2405
    0x3390ef22UL,
2406
    0x494ec787UL,
2407
    0x38d1c1d9UL,
2408
    0xcaa2fe8cUL,
2409
    0xd40b3698UL,
2410
    0xf581cfa6UL,
2411
    0x7ade28a5UL,
2412
    0xb78e26daUL,
2413
    0xadbfa43fUL,
2414
    0x3a9de42cUL,
2415
    0x78920d50UL,
2416
    0x5fcc9b6aUL,
2417
    0x7e466254UL,
2418
    0x8d13c2f6UL,
2419
    0xd8b8e890UL,
2420
    0x39f75e2eUL,
2421
    0xc3aff582UL,
2422
    0x5d80be9fUL,
2423
    0xd0937c69UL,
2424
    0xd52da96fUL,
2425
    0x2512b3cfUL,
2426
    0xac993bc8UL,
2427
    0x187da710UL,
2428
    0x9c636ee8UL,
2429
    0x3bbb7bdbUL,
2430
    0x267809cdUL,
2431
    0x5918f46eUL,
2432
    0x9ab701ecUL,
2433
    0x4f9aa883UL,
2434
    0x956e65e6UL,
2435
    0xffe67eaaUL,
2436
    0xbccf0821UL,
2437
    0x15e8e6efUL,
2438
    0xe79bd9baUL,
2439
    0x6f36ce4aUL,
2440
    0x9f09d4eaUL,
2441
    0xb07cd629UL,
2442
    0xa4b2af31UL,
2443
    0x3f23312aUL,
2444
    0xa59430c6UL,
2445
    0xa266c035UL,
2446
    0x4ebc3774UL,
2447
    0x82caa6fcUL,
2448
    0x90d0b0e0UL,
2449
    0xa7d81533UL,
2450
    0x04984af1UL,
2451
    0xecdaf741UL,
2452
    0xcd500e7fUL,
2453
    0x91f62f17UL,
2454
    0x4dd68d76UL,
2455
    0xefb04d43UL,
2456
    0xaa4d54ccUL,
2457
    0x9604dfe4UL,
2458
    0xd1b5e39eUL,
2459
    0x6a881b4cUL,
2460
    0x2c1fb8c1UL,
2461
    0x65517f46UL,
2462
    0x5eea049dUL,
2463
    0x8c355d01UL,
2464
    0x877473faUL,
2465
    0x0b412efbUL,
2466
    0x671d5ab3UL,
2467
    0xdbd25292UL,
2468
    0x105633e9UL,
2469
    0xd647136dUL,
2470
    0xd7618c9aUL,
2471
    0xa10c7a37UL,
2472
    0xf8148e59UL,
2473
    0x133c89ebUL,
2474
    0xa927eeceUL,
2475
    0x61c935b7UL,
2476
    0x1ce5ede1UL,
2477
    0x47b13c7aUL,
2478
    0xd2df599cUL,
2479
    0xf2733f55UL,
2480
    0x14ce7918UL,
2481
    0xc737bf73UL,
2482
    0xf7cdea53UL,
2483
    0xfdaa5b5fUL,
2484
    0x3d6f14dfUL,
2485
    0x44db8678UL,
2486
    0xaff381caUL,
2487
    0x68c43eb9UL,
2488
    0x24342c38UL,
2489
    0xa3405fc2UL,
2490
    0x1dc37216UL,
2491
    0xe2250cbcUL,
2492
    0x3c498b28UL,
2493
    0x0d9541ffUL,
2494
    0xa8017139UL,
2495
    0x0cb3de08UL,
2496
    0xb4e49cd8UL,
2497
    0x56c19064UL,
2498
    0xcb84617bUL,
2499
    0x32b670d5UL,
2500
    0x6c5c7448UL,
2501
    0xb85742d0UL,
2502
};
2503

2504
static const std::uint32_t Tks0[] = {
2505
    0x00000000UL, 0x0e090d0bUL, 0x1c121a16UL, 0x121b171dUL, 0x3824342cUL, 0x362d3927UL, 0x24362e3aUL, 0x2a3f2331UL,
2506
    0x70486858UL, 0x7e416553UL, 0x6c5a724eUL, 0x62537f45UL, 0x486c5c74UL, 0x4665517fUL, 0x547e4662UL, 0x5a774b69UL,
2507
    0xe090d0b0UL, 0xee99ddbbUL, 0xfc82caa6UL, 0xf28bc7adUL, 0xd8b4e49cUL, 0xd6bde997UL, 0xc4a6fe8aUL, 0xcaaff381UL,
2508
    0x90d8b8e8UL, 0x9ed1b5e3UL, 0x8ccaa2feUL, 0x82c3aff5UL, 0xa8fc8cc4UL, 0xa6f581cfUL, 0xb4ee96d2UL, 0xbae79bd9UL,
2509
    0xdb3bbb7bUL, 0xd532b670UL, 0xc729a16dUL, 0xc920ac66UL, 0xe31f8f57UL, 0xed16825cUL, 0xff0d9541UL, 0xf104984aUL,
2510
    0xab73d323UL, 0xa57ade28UL, 0xb761c935UL, 0xb968c43eUL, 0x9357e70fUL, 0x9d5eea04UL, 0x8f45fd19UL, 0x814cf012UL,
2511
    0x3bab6bcbUL, 0x35a266c0UL, 0x27b971ddUL, 0x29b07cd6UL, 0x038f5fe7UL, 0x0d8652ecUL, 0x1f9d45f1UL, 0x119448faUL,
2512
    0x4be30393UL, 0x45ea0e98UL, 0x57f11985UL, 0x59f8148eUL, 0x73c737bfUL, 0x7dce3ab4UL, 0x6fd52da9UL, 0x61dc20a2UL,
2513
    0xad766df6UL, 0xa37f60fdUL, 0xb16477e0UL, 0xbf6d7aebUL, 0x955259daUL, 0x9b5b54d1UL, 0x894043ccUL, 0x87494ec7UL,
2514
    0xdd3e05aeUL, 0xd33708a5UL, 0xc12c1fb8UL, 0xcf2512b3UL, 0xe51a3182UL, 0xeb133c89UL, 0xf9082b94UL, 0xf701269fUL,
2515
    0x4de6bd46UL, 0x43efb04dUL, 0x51f4a750UL, 0x5ffdaa5bUL, 0x75c2896aUL, 0x7bcb8461UL, 0x69d0937cUL, 0x67d99e77UL,
2516
    0x3daed51eUL, 0x33a7d815UL, 0x21bccf08UL, 0x2fb5c203UL, 0x058ae132UL, 0x0b83ec39UL, 0x1998fb24UL, 0x1791f62fUL,
2517
    0x764dd68dUL, 0x7844db86UL, 0x6a5fcc9bUL, 0x6456c190UL, 0x4e69e2a1UL, 0x4060efaaUL, 0x527bf8b7UL, 0x5c72f5bcUL,
2518
    0x0605bed5UL, 0x080cb3deUL, 0x1a17a4c3UL, 0x141ea9c8UL, 0x3e218af9UL, 0x302887f2UL, 0x223390efUL, 0x2c3a9de4UL,
2519
    0x96dd063dUL, 0x98d40b36UL, 0x8acf1c2bUL, 0x84c61120UL, 0xaef93211UL, 0xa0f03f1aUL, 0xb2eb2807UL, 0xbce2250cUL,
2520
    0xe6956e65UL, 0xe89c636eUL, 0xfa877473UL, 0xf48e7978UL, 0xdeb15a49UL, 0xd0b85742UL, 0xc2a3405fUL, 0xccaa4d54UL,
2521
    0x41ecdaf7UL, 0x4fe5d7fcUL, 0x5dfec0e1UL, 0x53f7cdeaUL, 0x79c8eedbUL, 0x77c1e3d0UL, 0x65daf4cdUL, 0x6bd3f9c6UL,
2522
    0x31a4b2afUL, 0x3fadbfa4UL, 0x2db6a8b9UL, 0x23bfa5b2UL, 0x09808683UL, 0x07898b88UL, 0x15929c95UL, 0x1b9b919eUL,
2523
    0xa17c0a47UL, 0xaf75074cUL, 0xbd6e1051UL, 0xb3671d5aUL, 0x99583e6bUL, 0x97513360UL, 0x854a247dUL, 0x8b432976UL,
2524
    0xd134621fUL, 0xdf3d6f14UL, 0xcd267809UL, 0xc32f7502UL, 0xe9105633UL, 0xe7195b38UL, 0xf5024c25UL, 0xfb0b412eUL,
2525
    0x9ad7618cUL, 0x94de6c87UL, 0x86c57b9aUL, 0x88cc7691UL, 0xa2f355a0UL, 0xacfa58abUL, 0xbee14fb6UL, 0xb0e842bdUL,
2526
    0xea9f09d4UL, 0xe49604dfUL, 0xf68d13c2UL, 0xf8841ec9UL, 0xd2bb3df8UL, 0xdcb230f3UL, 0xcea927eeUL, 0xc0a02ae5UL,
2527
    0x7a47b13cUL, 0x744ebc37UL, 0x6655ab2aUL, 0x685ca621UL, 0x42638510UL, 0x4c6a881bUL, 0x5e719f06UL, 0x5078920dUL,
2528
    0x0a0fd964UL, 0x0406d46fUL, 0x161dc372UL, 0x1814ce79UL, 0x322bed48UL, 0x3c22e043UL, 0x2e39f75eUL, 0x2030fa55UL,
2529
    0xec9ab701UL, 0xe293ba0aUL, 0xf088ad17UL, 0xfe81a01cUL, 0xd4be832dUL, 0xdab78e26UL, 0xc8ac993bUL, 0xc6a59430UL,
2530
    0x9cd2df59UL, 0x92dbd252UL, 0x80c0c54fUL, 0x8ec9c844UL, 0xa4f6eb75UL, 0xaaffe67eUL, 0xb8e4f163UL, 0xb6edfc68UL,
2531
    0x0c0a67b1UL, 0x02036abaUL, 0x10187da7UL, 0x1e1170acUL, 0x342e539dUL, 0x3a275e96UL, 0x283c498bUL, 0x26354480UL,
2532
    0x7c420fe9UL, 0x724b02e2UL, 0x605015ffUL, 0x6e5918f4UL, 0x44663bc5UL, 0x4a6f36ceUL, 0x587421d3UL, 0x567d2cd8UL,
2533
    0x37a10c7aUL, 0x39a80171UL, 0x2bb3166cUL, 0x25ba1b67UL, 0x0f853856UL, 0x018c355dUL, 0x13972240UL, 0x1d9e2f4bUL,
2534
    0x47e96422UL, 0x49e06929UL, 0x5bfb7e34UL, 0x55f2733fUL, 0x7fcd500eUL, 0x71c45d05UL, 0x63df4a18UL, 0x6dd64713UL,
2535
    0xd731dccaUL, 0xd938d1c1UL, 0xcb23c6dcUL, 0xc52acbd7UL, 0xef15e8e6UL, 0xe11ce5edUL, 0xf307f2f0UL, 0xfd0efffbUL,
2536
    0xa779b492UL, 0xa970b999UL, 0xbb6bae84UL, 0xb562a38fUL, 0x9f5d80beUL, 0x91548db5UL, 0x834f9aa8UL, 0x8d4697a3UL};
2537

2538
static const std::uint32_t Tks1[] = {
2539
    0x00000000UL, 0x0b0e090dUL, 0x161c121aUL, 0x1d121b17UL, 0x2c382434UL, 0x27362d39UL, 0x3a24362eUL, 0x312a3f23UL,
2540
    0x58704868UL, 0x537e4165UL, 0x4e6c5a72UL, 0x4562537fUL, 0x74486c5cUL, 0x7f466551UL, 0x62547e46UL, 0x695a774bUL,
2541
    0xb0e090d0UL, 0xbbee99ddUL, 0xa6fc82caUL, 0xadf28bc7UL, 0x9cd8b4e4UL, 0x97d6bde9UL, 0x8ac4a6feUL, 0x81caaff3UL,
2542
    0xe890d8b8UL, 0xe39ed1b5UL, 0xfe8ccaa2UL, 0xf582c3afUL, 0xc4a8fc8cUL, 0xcfa6f581UL, 0xd2b4ee96UL, 0xd9bae79bUL,
2543
    0x7bdb3bbbUL, 0x70d532b6UL, 0x6dc729a1UL, 0x66c920acUL, 0x57e31f8fUL, 0x5ced1682UL, 0x41ff0d95UL, 0x4af10498UL,
2544
    0x23ab73d3UL, 0x28a57adeUL, 0x35b761c9UL, 0x3eb968c4UL, 0x0f9357e7UL, 0x049d5eeaUL, 0x198f45fdUL, 0x12814cf0UL,
2545
    0xcb3bab6bUL, 0xc035a266UL, 0xdd27b971UL, 0xd629b07cUL, 0xe7038f5fUL, 0xec0d8652UL, 0xf11f9d45UL, 0xfa119448UL,
2546
    0x934be303UL, 0x9845ea0eUL, 0x8557f119UL, 0x8e59f814UL, 0xbf73c737UL, 0xb47dce3aUL, 0xa96fd52dUL, 0xa261dc20UL,
2547
    0xf6ad766dUL, 0xfda37f60UL, 0xe0b16477UL, 0xebbf6d7aUL, 0xda955259UL, 0xd19b5b54UL, 0xcc894043UL, 0xc787494eUL,
2548
    0xaedd3e05UL, 0xa5d33708UL, 0xb8c12c1fUL, 0xb3cf2512UL, 0x82e51a31UL, 0x89eb133cUL, 0x94f9082bUL, 0x9ff70126UL,
2549
    0x464de6bdUL, 0x4d43efb0UL, 0x5051f4a7UL, 0x5b5ffdaaUL, 0x6a75c289UL, 0x617bcb84UL, 0x7c69d093UL, 0x7767d99eUL,
2550
    0x1e3daed5UL, 0x1533a7d8UL, 0x0821bccfUL, 0x032fb5c2UL, 0x32058ae1UL, 0x390b83ecUL, 0x241998fbUL, 0x2f1791f6UL,
2551
    0x8d764dd6UL, 0x867844dbUL, 0x9b6a5fccUL, 0x906456c1UL, 0xa14e69e2UL, 0xaa4060efUL, 0xb7527bf8UL, 0xbc5c72f5UL,
2552
    0xd50605beUL, 0xde080cb3UL, 0xc31a17a4UL, 0xc8141ea9UL, 0xf93e218aUL, 0xf2302887UL, 0xef223390UL, 0xe42c3a9dUL,
2553
    0x3d96dd06UL, 0x3698d40bUL, 0x2b8acf1cUL, 0x2084c611UL, 0x11aef932UL, 0x1aa0f03fUL, 0x07b2eb28UL, 0x0cbce225UL,
2554
    0x65e6956eUL, 0x6ee89c63UL, 0x73fa8774UL, 0x78f48e79UL, 0x49deb15aUL, 0x42d0b857UL, 0x5fc2a340UL, 0x54ccaa4dUL,
2555
    0xf741ecdaUL, 0xfc4fe5d7UL, 0xe15dfec0UL, 0xea53f7cdUL, 0xdb79c8eeUL, 0xd077c1e3UL, 0xcd65daf4UL, 0xc66bd3f9UL,
2556
    0xaf31a4b2UL, 0xa43fadbfUL, 0xb92db6a8UL, 0xb223bfa5UL, 0x83098086UL, 0x8807898bUL, 0x9515929cUL, 0x9e1b9b91UL,
2557
    0x47a17c0aUL, 0x4caf7507UL, 0x51bd6e10UL, 0x5ab3671dUL, 0x6b99583eUL, 0x60975133UL, 0x7d854a24UL, 0x768b4329UL,
2558
    0x1fd13462UL, 0x14df3d6fUL, 0x09cd2678UL, 0x02c32f75UL, 0x33e91056UL, 0x38e7195bUL, 0x25f5024cUL, 0x2efb0b41UL,
2559
    0x8c9ad761UL, 0x8794de6cUL, 0x9a86c57bUL, 0x9188cc76UL, 0xa0a2f355UL, 0xabacfa58UL, 0xb6bee14fUL, 0xbdb0e842UL,
2560
    0xd4ea9f09UL, 0xdfe49604UL, 0xc2f68d13UL, 0xc9f8841eUL, 0xf8d2bb3dUL, 0xf3dcb230UL, 0xeecea927UL, 0xe5c0a02aUL,
2561
    0x3c7a47b1UL, 0x37744ebcUL, 0x2a6655abUL, 0x21685ca6UL, 0x10426385UL, 0x1b4c6a88UL, 0x065e719fUL, 0x0d507892UL,
2562
    0x640a0fd9UL, 0x6f0406d4UL, 0x72161dc3UL, 0x791814ceUL, 0x48322bedUL, 0x433c22e0UL, 0x5e2e39f7UL, 0x552030faUL,
2563
    0x01ec9ab7UL, 0x0ae293baUL, 0x17f088adUL, 0x1cfe81a0UL, 0x2dd4be83UL, 0x26dab78eUL, 0x3bc8ac99UL, 0x30c6a594UL,
2564
    0x599cd2dfUL, 0x5292dbd2UL, 0x4f80c0c5UL, 0x448ec9c8UL, 0x75a4f6ebUL, 0x7eaaffe6UL, 0x63b8e4f1UL, 0x68b6edfcUL,
2565
    0xb10c0a67UL, 0xba02036aUL, 0xa710187dUL, 0xac1e1170UL, 0x9d342e53UL, 0x963a275eUL, 0x8b283c49UL, 0x80263544UL,
2566
    0xe97c420fUL, 0xe2724b02UL, 0xff605015UL, 0xf46e5918UL, 0xc544663bUL, 0xce4a6f36UL, 0xd3587421UL, 0xd8567d2cUL,
2567
    0x7a37a10cUL, 0x7139a801UL, 0x6c2bb316UL, 0x6725ba1bUL, 0x560f8538UL, 0x5d018c35UL, 0x40139722UL, 0x4b1d9e2fUL,
2568
    0x2247e964UL, 0x2949e069UL, 0x345bfb7eUL, 0x3f55f273UL, 0x0e7fcd50UL, 0x0571c45dUL, 0x1863df4aUL, 0x136dd647UL,
2569
    0xcad731dcUL, 0xc1d938d1UL, 0xdccb23c6UL, 0xd7c52acbUL, 0xe6ef15e8UL, 0xede11ce5UL, 0xf0f307f2UL, 0xfbfd0effUL,
2570
    0x92a779b4UL, 0x99a970b9UL, 0x84bb6baeUL, 0x8fb562a3UL, 0xbe9f5d80UL, 0xb591548dUL, 0xa8834f9aUL, 0xa38d4697UL};
2571

2572
static const std::uint32_t Tks2[] = {
2573
    0x00000000UL, 0x0d0b0e09UL, 0x1a161c12UL, 0x171d121bUL, 0x342c3824UL, 0x3927362dUL, 0x2e3a2436UL, 0x23312a3fUL,
2574
    0x68587048UL, 0x65537e41UL, 0x724e6c5aUL, 0x7f456253UL, 0x5c74486cUL, 0x517f4665UL, 0x4662547eUL, 0x4b695a77UL,
2575
    0xd0b0e090UL, 0xddbbee99UL, 0xcaa6fc82UL, 0xc7adf28bUL, 0xe49cd8b4UL, 0xe997d6bdUL, 0xfe8ac4a6UL, 0xf381caafUL,
2576
    0xb8e890d8UL, 0xb5e39ed1UL, 0xa2fe8ccaUL, 0xaff582c3UL, 0x8cc4a8fcUL, 0x81cfa6f5UL, 0x96d2b4eeUL, 0x9bd9bae7UL,
2577
    0xbb7bdb3bUL, 0xb670d532UL, 0xa16dc729UL, 0xac66c920UL, 0x8f57e31fUL, 0x825ced16UL, 0x9541ff0dUL, 0x984af104UL,
2578
    0xd323ab73UL, 0xde28a57aUL, 0xc935b761UL, 0xc43eb968UL, 0xe70f9357UL, 0xea049d5eUL, 0xfd198f45UL, 0xf012814cUL,
2579
    0x6bcb3babUL, 0x66c035a2UL, 0x71dd27b9UL, 0x7cd629b0UL, 0x5fe7038fUL, 0x52ec0d86UL, 0x45f11f9dUL, 0x48fa1194UL,
2580
    0x03934be3UL, 0x0e9845eaUL, 0x198557f1UL, 0x148e59f8UL, 0x37bf73c7UL, 0x3ab47dceUL, 0x2da96fd5UL, 0x20a261dcUL,
2581
    0x6df6ad76UL, 0x60fda37fUL, 0x77e0b164UL, 0x7aebbf6dUL, 0x59da9552UL, 0x54d19b5bUL, 0x43cc8940UL, 0x4ec78749UL,
2582
    0x05aedd3eUL, 0x08a5d337UL, 0x1fb8c12cUL, 0x12b3cf25UL, 0x3182e51aUL, 0x3c89eb13UL, 0x2b94f908UL, 0x269ff701UL,
2583
    0xbd464de6UL, 0xb04d43efUL, 0xa75051f4UL, 0xaa5b5ffdUL, 0x896a75c2UL, 0x84617bcbUL, 0x937c69d0UL, 0x9e7767d9UL,
2584
    0xd51e3daeUL, 0xd81533a7UL, 0xcf0821bcUL, 0xc2032fb5UL, 0xe132058aUL, 0xec390b83UL, 0xfb241998UL, 0xf62f1791UL,
2585
    0xd68d764dUL, 0xdb867844UL, 0xcc9b6a5fUL, 0xc1906456UL, 0xe2a14e69UL, 0xefaa4060UL, 0xf8b7527bUL, 0xf5bc5c72UL,
2586
    0xbed50605UL, 0xb3de080cUL, 0xa4c31a17UL, 0xa9c8141eUL, 0x8af93e21UL, 0x87f23028UL, 0x90ef2233UL, 0x9de42c3aUL,
2587
    0x063d96ddUL, 0x0b3698d4UL, 0x1c2b8acfUL, 0x112084c6UL, 0x3211aef9UL, 0x3f1aa0f0UL, 0x2807b2ebUL, 0x250cbce2UL,
2588
    0x6e65e695UL, 0x636ee89cUL, 0x7473fa87UL, 0x7978f48eUL, 0x5a49deb1UL, 0x5742d0b8UL, 0x405fc2a3UL, 0x4d54ccaaUL,
2589
    0xdaf741ecUL, 0xd7fc4fe5UL, 0xc0e15dfeUL, 0xcdea53f7UL, 0xeedb79c8UL, 0xe3d077c1UL, 0xf4cd65daUL, 0xf9c66bd3UL,
2590
    0xb2af31a4UL, 0xbfa43fadUL, 0xa8b92db6UL, 0xa5b223bfUL, 0x86830980UL, 0x8b880789UL, 0x9c951592UL, 0x919e1b9bUL,
2591
    0x0a47a17cUL, 0x074caf75UL, 0x1051bd6eUL, 0x1d5ab367UL, 0x3e6b9958UL, 0x33609751UL, 0x247d854aUL, 0x29768b43UL,
2592
    0x621fd134UL, 0x6f14df3dUL, 0x7809cd26UL, 0x7502c32fUL, 0x5633e910UL, 0x5b38e719UL, 0x4c25f502UL, 0x412efb0bUL,
2593
    0x618c9ad7UL, 0x6c8794deUL, 0x7b9a86c5UL, 0x769188ccUL, 0x55a0a2f3UL, 0x58abacfaUL, 0x4fb6bee1UL, 0x42bdb0e8UL,
2594
    0x09d4ea9fUL, 0x04dfe496UL, 0x13c2f68dUL, 0x1ec9f884UL, 0x3df8d2bbUL, 0x30f3dcb2UL, 0x27eecea9UL, 0x2ae5c0a0UL,
2595
    0xb13c7a47UL, 0xbc37744eUL, 0xab2a6655UL, 0xa621685cUL, 0x85104263UL, 0x881b4c6aUL, 0x9f065e71UL, 0x920d5078UL,
2596
    0xd9640a0fUL, 0xd46f0406UL, 0xc372161dUL, 0xce791814UL, 0xed48322bUL, 0xe0433c22UL, 0xf75e2e39UL, 0xfa552030UL,
2597
    0xb701ec9aUL, 0xba0ae293UL, 0xad17f088UL, 0xa01cfe81UL, 0x832dd4beUL, 0x8e26dab7UL, 0x993bc8acUL, 0x9430c6a5UL,
2598
    0xdf599cd2UL, 0xd25292dbUL, 0xc54f80c0UL, 0xc8448ec9UL, 0xeb75a4f6UL, 0xe67eaaffUL, 0xf163b8e4UL, 0xfc68b6edUL,
2599
    0x67b10c0aUL, 0x6aba0203UL, 0x7da71018UL, 0x70ac1e11UL, 0x539d342eUL, 0x5e963a27UL, 0x498b283cUL, 0x44802635UL,
2600
    0x0fe97c42UL, 0x02e2724bUL, 0x15ff6050UL, 0x18f46e59UL, 0x3bc54466UL, 0x36ce4a6fUL, 0x21d35874UL, 0x2cd8567dUL,
2601
    0x0c7a37a1UL, 0x017139a8UL, 0x166c2bb3UL, 0x1b6725baUL, 0x38560f85UL, 0x355d018cUL, 0x22401397UL, 0x2f4b1d9eUL,
2602
    0x642247e9UL, 0x692949e0UL, 0x7e345bfbUL, 0x733f55f2UL, 0x500e7fcdUL, 0x5d0571c4UL, 0x4a1863dfUL, 0x47136dd6UL,
2603
    0xdccad731UL, 0xd1c1d938UL, 0xc6dccb23UL, 0xcbd7c52aUL, 0xe8e6ef15UL, 0xe5ede11cUL, 0xf2f0f307UL, 0xfffbfd0eUL,
2604
    0xb492a779UL, 0xb999a970UL, 0xae84bb6bUL, 0xa38fb562UL, 0x80be9f5dUL, 0x8db59154UL, 0x9aa8834fUL, 0x97a38d46UL};
2605

2606
static const std::uint32_t Tks3[] = {
2607
    0x00000000UL, 0x090d0b0eUL, 0x121a161cUL, 0x1b171d12UL, 0x24342c38UL, 0x2d392736UL, 0x362e3a24UL, 0x3f23312aUL,
2608
    0x48685870UL, 0x4165537eUL, 0x5a724e6cUL, 0x537f4562UL, 0x6c5c7448UL, 0x65517f46UL, 0x7e466254UL, 0x774b695aUL,
2609
    0x90d0b0e0UL, 0x99ddbbeeUL, 0x82caa6fcUL, 0x8bc7adf2UL, 0xb4e49cd8UL, 0xbde997d6UL, 0xa6fe8ac4UL, 0xaff381caUL,
2610
    0xd8b8e890UL, 0xd1b5e39eUL, 0xcaa2fe8cUL, 0xc3aff582UL, 0xfc8cc4a8UL, 0xf581cfa6UL, 0xee96d2b4UL, 0xe79bd9baUL,
2611
    0x3bbb7bdbUL, 0x32b670d5UL, 0x29a16dc7UL, 0x20ac66c9UL, 0x1f8f57e3UL, 0x16825cedUL, 0x0d9541ffUL, 0x04984af1UL,
2612
    0x73d323abUL, 0x7ade28a5UL, 0x61c935b7UL, 0x68c43eb9UL, 0x57e70f93UL, 0x5eea049dUL, 0x45fd198fUL, 0x4cf01281UL,
2613
    0xab6bcb3bUL, 0xa266c035UL, 0xb971dd27UL, 0xb07cd629UL, 0x8f5fe703UL, 0x8652ec0dUL, 0x9d45f11fUL, 0x9448fa11UL,
2614
    0xe303934bUL, 0xea0e9845UL, 0xf1198557UL, 0xf8148e59UL, 0xc737bf73UL, 0xce3ab47dUL, 0xd52da96fUL, 0xdc20a261UL,
2615
    0x766df6adUL, 0x7f60fda3UL, 0x6477e0b1UL, 0x6d7aebbfUL, 0x5259da95UL, 0x5b54d19bUL, 0x4043cc89UL, 0x494ec787UL,
2616
    0x3e05aeddUL, 0x3708a5d3UL, 0x2c1fb8c1UL, 0x2512b3cfUL, 0x1a3182e5UL, 0x133c89ebUL, 0x082b94f9UL, 0x01269ff7UL,
2617
    0xe6bd464dUL, 0xefb04d43UL, 0xf4a75051UL, 0xfdaa5b5fUL, 0xc2896a75UL, 0xcb84617bUL, 0xd0937c69UL, 0xd99e7767UL,
2618
    0xaed51e3dUL, 0xa7d81533UL, 0xbccf0821UL, 0xb5c2032fUL, 0x8ae13205UL, 0x83ec390bUL, 0x98fb2419UL, 0x91f62f17UL,
2619
    0x4dd68d76UL, 0x44db8678UL, 0x5fcc9b6aUL, 0x56c19064UL, 0x69e2a14eUL, 0x60efaa40UL, 0x7bf8b752UL, 0x72f5bc5cUL,
2620
    0x05bed506UL, 0x0cb3de08UL, 0x17a4c31aUL, 0x1ea9c814UL, 0x218af93eUL, 0x2887f230UL, 0x3390ef22UL, 0x3a9de42cUL,
2621
    0xdd063d96UL, 0xd40b3698UL, 0xcf1c2b8aUL, 0xc6112084UL, 0xf93211aeUL, 0xf03f1aa0UL, 0xeb2807b2UL, 0xe2250cbcUL,
2622
    0x956e65e6UL, 0x9c636ee8UL, 0x877473faUL, 0x8e7978f4UL, 0xb15a49deUL, 0xb85742d0UL, 0xa3405fc2UL, 0xaa4d54ccUL,
2623
    0xecdaf741UL, 0xe5d7fc4fUL, 0xfec0e15dUL, 0xf7cdea53UL, 0xc8eedb79UL, 0xc1e3d077UL, 0xdaf4cd65UL, 0xd3f9c66bUL,
2624
    0xa4b2af31UL, 0xadbfa43fUL, 0xb6a8b92dUL, 0xbfa5b223UL, 0x80868309UL, 0x898b8807UL, 0x929c9515UL, 0x9b919e1bUL,
2625
    0x7c0a47a1UL, 0x75074cafUL, 0x6e1051bdUL, 0x671d5ab3UL, 0x583e6b99UL, 0x51336097UL, 0x4a247d85UL, 0x4329768bUL,
2626
    0x34621fd1UL, 0x3d6f14dfUL, 0x267809cdUL, 0x2f7502c3UL, 0x105633e9UL, 0x195b38e7UL, 0x024c25f5UL, 0x0b412efbUL,
2627
    0xd7618c9aUL, 0xde6c8794UL, 0xc57b9a86UL, 0xcc769188UL, 0xf355a0a2UL, 0xfa58abacUL, 0xe14fb6beUL, 0xe842bdb0UL,
2628
    0x9f09d4eaUL, 0x9604dfe4UL, 0x8d13c2f6UL, 0x841ec9f8UL, 0xbb3df8d2UL, 0xb230f3dcUL, 0xa927eeceUL, 0xa02ae5c0UL,
2629
    0x47b13c7aUL, 0x4ebc3774UL, 0x55ab2a66UL, 0x5ca62168UL, 0x63851042UL, 0x6a881b4cUL, 0x719f065eUL, 0x78920d50UL,
2630
    0x0fd9640aUL, 0x06d46f04UL, 0x1dc37216UL, 0x14ce7918UL, 0x2bed4832UL, 0x22e0433cUL, 0x39f75e2eUL, 0x30fa5520UL,
2631
    0x9ab701ecUL, 0x93ba0ae2UL, 0x88ad17f0UL, 0x81a01cfeUL, 0xbe832dd4UL, 0xb78e26daUL, 0xac993bc8UL, 0xa59430c6UL,
2632
    0xd2df599cUL, 0xdbd25292UL, 0xc0c54f80UL, 0xc9c8448eUL, 0xf6eb75a4UL, 0xffe67eaaUL, 0xe4f163b8UL, 0xedfc68b6UL,
2633
    0x0a67b10cUL, 0x036aba02UL, 0x187da710UL, 0x1170ac1eUL, 0x2e539d34UL, 0x275e963aUL, 0x3c498b28UL, 0x35448026UL,
2634
    0x420fe97cUL, 0x4b02e272UL, 0x5015ff60UL, 0x5918f46eUL, 0x663bc544UL, 0x6f36ce4aUL, 0x7421d358UL, 0x7d2cd856UL,
2635
    0xa10c7a37UL, 0xa8017139UL, 0xb3166c2bUL, 0xba1b6725UL, 0x8538560fUL, 0x8c355d01UL, 0x97224013UL, 0x9e2f4b1dUL,
2636
    0xe9642247UL, 0xe0692949UL, 0xfb7e345bUL, 0xf2733f55UL, 0xcd500e7fUL, 0xc45d0571UL, 0xdf4a1863UL, 0xd647136dUL,
2637
    0x31dccad7UL, 0x38d1c1d9UL, 0x23c6dccbUL, 0x2acbd7c5UL, 0x15e8e6efUL, 0x1ce5ede1UL, 0x07f2f0f3UL, 0x0efffbfdUL,
2638
    0x79b492a7UL, 0x70b999a9UL, 0x6bae84bbUL, 0x62a38fb5UL, 0x5d80be9fUL, 0x548db591UL, 0x4f9aa883UL, 0x4697a38dUL};
2639

2640
static const std::uint32_t rcon[] = {
2641
    0x01000000UL, 0x02000000UL, 0x04000000UL, 0x08000000UL,
2642
    0x10000000UL, 0x20000000UL, 0x40000000UL, 0x80000000UL,
2643
    0x1B000000UL, 0x36000000UL, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
2644
};
2645

2646
/* extract a byte portably */
2647
#ifdef _MSC_VER
2648
#define byte(x, n) ((unsigned char)((x) >> (8 * (n))))
2649
#else
2650
#define byte(x, n) (((x) >> (8 * (n))) & 255)
2651
#endif
2652

2653
static std::uint32_t setup_mix(std::uint32_t temp)
4,800✔
2654
{
2655
    return (Te4_3[byte(temp, 2)])
4,800✔
2656
        ^ (Te4_2[byte(temp, 1)])
4,800✔
2657
        ^ (Te4_1[byte(temp, 0)])
4,800✔
2658
        ^ (Te4_0[byte(temp, 3)]);
4,800✔
2659
}
2660

2661
#define LOAD32H(x, y)                                                                                                                                                                                           \
2662
    do                                                                                                                                                                                                          \
2663
    {                                                                                                                                                                                                           \
2664
        x = (static_cast<std::uint32_t>((y)[0] & 255) << 24) | (static_cast<std::uint32_t>((y)[1] & 255) << 16) | (static_cast<std::uint32_t>((y)[2] & 255) << 8) | (static_cast<std::uint32_t>((y)[3] & 255)); \
2665
    } while (0)
2666

2667
#define RORc(x, y) ((((static_cast<std::uint32_t>(x) & 0xFFFFFFFFUL) >> static_cast<std::uint32_t>((y)&31)) | (static_cast<std::uint32_t>(x) << static_cast<std::uint32_t>((32 - ((y)&31)) & 31))) & 0xFFFFFFFFUL)
2668

2669
struct rijndael_key
2670
{
2671
    std::uint32_t eK[60], dK[60];
2672
    int Nr;
2673
};
2674

2675
rijndael_key rijndael_setup(const std::vector<std::uint8_t> &key_data)
432✔
2676
{
2677
    rijndael_key skey;
2678

2679
    int i;
2680
    std::uint32_t temp, *rk;
2681
    std::uint32_t *rrk;
2682

2683
    if (key_data.size() != 16 && key_data.size() != 24 && key_data.size() != 32)
432✔
2684
    {
2685
        throw xlnt::exception("Invalid AES key length ("
2686
            + std::to_string(key_data.size())
×
2687
            + " bytes). Must be 16, 24 or 32 bytes.");
×
2688
    }
2689

2690
    skey.Nr = 10 + ((static_cast<int>(key_data.size()) / 8) - 2) * 2;
432✔
2691
    auto key = key_data.data();
432✔
2692

2693
    /* setup the forward key */
2694
    i = 0;
432✔
2695
    rk = skey.eK;
432✔
2696
    LOAD32H(rk[0], key);
432✔
2697
    LOAD32H(rk[1], key + 4);
432✔
2698
    LOAD32H(rk[2], key + 8);
432✔
2699
    LOAD32H(rk[3], key + 12);
432✔
2700
    if (key_data.size() == 16)
432✔
2701
    {
2702
        for (;;)
2703
        {
2704
            temp = rk[3];
2,720✔
2705
            rk[4] = rk[0] ^ setup_mix(temp) ^ rcon[i];
2,720✔
2706
            rk[5] = rk[1] ^ rk[4];
2,720✔
2707
            rk[6] = rk[2] ^ rk[5];
2,720✔
2708
            rk[7] = rk[3] ^ rk[6];
2,720✔
2709
            if (++i == 10)
2,720✔
2710
            {
2711
                break;
272✔
2712
            }
2713
            rk += 4;
2,448✔
2714
        }
2715
    }
2716
    else if (key_data.size() == 24)
160✔
2717
    {
2718
        LOAD32H(rk[4], key + 16);
×
2719
        LOAD32H(rk[5], key + 20);
×
2720
        for (;;)
2721
        {
2722
#ifdef _MSC_VER
2723
            temp = skey.eK[rk - skey.eK + 5];
2724
#else
2725
            temp = rk[5];
×
2726
#endif
2727
            rk[6] = rk[0] ^ setup_mix(temp) ^ rcon[i];
×
2728
            rk[7] = rk[1] ^ rk[6];
×
2729
            rk[8] = rk[2] ^ rk[7];
×
2730
            rk[9] = rk[3] ^ rk[8];
×
2731
            if (++i == 8)
×
2732
            {
2733
                break;
×
2734
            }
2735
            rk[10] = rk[4] ^ rk[9];
×
2736
            rk[11] = rk[5] ^ rk[10];
×
2737
            rk += 6;
×
2738
        }
2739
    }
2740
    else if (key_data.size() == 32)
160✔
2741
    {
2742
        LOAD32H(rk[4], key + 16);
160✔
2743
        LOAD32H(rk[5], key + 20);
160✔
2744
        LOAD32H(rk[6], key + 24);
160✔
2745
        LOAD32H(rk[7], key + 28);
160✔
2746
        for (;;)
2747
        {
2748
#ifdef _MSC_VER
2749
            temp = skey.eK[rk - skey.eK + 7];
2750
#else
2751
            temp = rk[7];
1,120✔
2752
#endif
2753
            rk[8] = rk[0] ^ setup_mix(temp) ^ rcon[i];
1,120✔
2754
            rk[9] = rk[1] ^ rk[8];
1,120✔
2755
            rk[10] = rk[2] ^ rk[9];
1,120✔
2756
            rk[11] = rk[3] ^ rk[10];
1,120✔
2757
            if (++i == 7)
1,120✔
2758
            {
2759
                break;
160✔
2760
            }
2761
            temp = rk[11];
960✔
2762
            rk[12] = rk[4] ^ setup_mix(RORc(temp, 8));
960✔
2763
            rk[13] = rk[5] ^ rk[12];
960✔
2764
            rk[14] = rk[6] ^ rk[13];
960✔
2765
            rk[15] = rk[7] ^ rk[14];
960✔
2766
            rk += 8;
960✔
2767
        }
2768
    }
2769

2770
    /* setup the inverse key now */
2771
    rk = skey.dK;
432✔
2772
    rrk = skey.eK + (28 + key_data.size()) - 4;
432✔
2773

2774
    /* apply the inverse MixColumn transform to all round keys but the first and the last: */
2775
    /* copy first */
2776
    *rk++ = *rrk++;
432✔
2777
    *rk++ = *rrk++;
432✔
2778
    *rk++ = *rrk++;
432✔
2779
    *rk = *rrk;
432✔
2780
    rk -= 3;
432✔
2781
    rrk -= 3;
432✔
2782

2783
    for (i = 1; i < skey.Nr; i++)
4,960✔
2784
    {
2785
        rrk -= 4;
4,528✔
2786
        rk += 4;
4,528✔
2787

2788
        temp = rrk[0];
4,528✔
2789
        rk[0] =
4,528✔
2790
            Tks0[byte(temp, 3)] ^ Tks1[byte(temp, 2)] ^ Tks2[byte(temp, 1)] ^ Tks3[byte(temp, 0)];
4,528✔
2791
        temp = rrk[1];
4,528✔
2792
        rk[1] =
4,528✔
2793
            Tks0[byte(temp, 3)] ^ Tks1[byte(temp, 2)] ^ Tks2[byte(temp, 1)] ^ Tks3[byte(temp, 0)];
4,528✔
2794
        temp = rrk[2];
4,528✔
2795
        rk[2] =
4,528✔
2796
            Tks0[byte(temp, 3)] ^ Tks1[byte(temp, 2)] ^ Tks2[byte(temp, 1)] ^ Tks3[byte(temp, 0)];
4,528✔
2797
        temp = rrk[3];
4,528✔
2798
        rk[3] =
4,528✔
2799
            Tks0[byte(temp, 3)] ^ Tks1[byte(temp, 2)] ^ Tks2[byte(temp, 1)] ^ Tks3[byte(temp, 0)];
4,528✔
2800
    }
2801

2802
    /* copy last */
2803
    rrk -= 4;
432✔
2804
    rk += 4;
432✔
2805
    *rk++ = *rrk++;
432✔
2806
    *rk++ = *rrk++;
432✔
2807
    *rk++ = *rrk++;
432✔
2808
    *rk = *rrk;
432✔
2809

2810
    return skey;
432✔
2811
}
2812

2813
#define STORE32H(x, y)                                         \
2814
    do                                                         \
2815
    {                                                          \
2816
        (y)[0] = static_cast<std::uint8_t>(((x) >> 24) & 255); \
2817
        (y)[1] = static_cast<std::uint8_t>(((x) >> 16) & 255); \
2818
        (y)[2] = static_cast<std::uint8_t>(((x) >> 8) & 255);  \
2819
        (y)[3] = static_cast<std::uint8_t>((x)&255);           \
2820
    } while (0)
2821

2822
#define Te0(x) TE0[x]
2823
#define Te1(x) TE1[x]
2824
#define Te2(x) TE2[x]
2825
#define Te3(x) TE3[x]
2826

2827
#define Td0(x) TD0[x]
2828
#define Td1(x) TD1[x]
2829
#define Td2(x) TD2[x]
2830
#define Td3(x) TD3[x]
2831

2832
void rijndael_ecb_encrypt(const unsigned char *pt, unsigned char *ct, rijndael_key &skey)
32,768✔
2833
{
2834
    std::uint32_t s0, s1, s2, s3, t0, t1, t2, t3, *rk;
2835
    int Nr, r;
2836

2837
    Nr = skey.Nr;
32,768✔
2838
    rk = skey.eK;
32,768✔
2839

2840
    /*
2841
     * map byte array block to cipher state
2842
     * and add initial round key:
2843
     */
2844
    LOAD32H(s0, pt);
32,768✔
2845
    s0 ^= rk[0];
32,768✔
2846
    LOAD32H(s1, pt + 4);
32,768✔
2847
    s1 ^= rk[1];
32,768✔
2848
    LOAD32H(s2, pt + 8);
32,768✔
2849
    s2 ^= rk[2];
32,768✔
2850
    LOAD32H(s3, pt + 12);
32,768✔
2851
    s3 ^= rk[3];
32,768✔
2852

2853
    /*
2854
     * Nr - 1 full rounds:
2855
     */
2856
    r = Nr >> 1;
32,768✔
2857
    for (;;)
2858
    {
2859
        t0 =
229,376✔
2860
            Te0(byte(s0, 3)) ^ Te1(byte(s1, 2)) ^ Te2(byte(s2, 1)) ^ Te3(byte(s3, 0)) ^ rk[4];
229,376✔
2861
        t1 =
229,376✔
2862
            Te0(byte(s1, 3)) ^ Te1(byte(s2, 2)) ^ Te2(byte(s3, 1)) ^ Te3(byte(s0, 0)) ^ rk[5];
229,376✔
2863
        t2 =
229,376✔
2864
            Te0(byte(s2, 3)) ^ Te1(byte(s3, 2)) ^ Te2(byte(s0, 1)) ^ Te3(byte(s1, 0)) ^ rk[6];
229,376✔
2865
        t3 =
229,376✔
2866
            Te0(byte(s3, 3)) ^ Te1(byte(s0, 2)) ^ Te2(byte(s1, 1)) ^ Te3(byte(s2, 0)) ^ rk[7];
229,376✔
2867

2868
        rk += 8;
229,376✔
2869
        if (--r == 0)
229,376✔
2870
        {
2871
            break;
32,768✔
2872
        }
2873

2874
        s0 =
196,608✔
2875
            Te0(byte(t0, 3)) ^ Te1(byte(t1, 2)) ^ Te2(byte(t2, 1)) ^ Te3(byte(t3, 0)) ^ rk[0];
196,608✔
2876
        s1 =
196,608✔
2877
            Te0(byte(t1, 3)) ^ Te1(byte(t2, 2)) ^ Te2(byte(t3, 1)) ^ Te3(byte(t0, 0)) ^ rk[1];
196,608✔
2878
        s2 =
196,608✔
2879
            Te0(byte(t2, 3)) ^ Te1(byte(t3, 2)) ^ Te2(byte(t0, 1)) ^ Te3(byte(t1, 0)) ^ rk[2];
196,608✔
2880
        s3 =
196,608✔
2881
            Te0(byte(t3, 3)) ^ Te1(byte(t0, 2)) ^ Te2(byte(t1, 1)) ^ Te3(byte(t2, 0)) ^ rk[3];
196,608✔
2882
    }
2883

2884
    /*
2885
     * apply last round and
2886
     * map cipher state to byte array block:
2887
     */
2888
    s0 =
32,768✔
2889
        (Te4_3[byte(t0, 3)]) ^ (Te4_2[byte(t1, 2)]) ^ (Te4_1[byte(t2, 1)]) ^ (Te4_0[byte(t3, 0)]) ^ rk[0];
32,768✔
2890
    STORE32H(s0, ct);
32,768✔
2891
    s1 =
32,768✔
2892
        (Te4_3[byte(t1, 3)]) ^ (Te4_2[byte(t2, 2)]) ^ (Te4_1[byte(t3, 1)]) ^ (Te4_0[byte(t0, 0)]) ^ rk[1];
32,768✔
2893
    STORE32H(s1, ct + 4);
32,768✔
2894
    s2 =
32,768✔
2895
        (Te4_3[byte(t2, 3)]) ^ (Te4_2[byte(t3, 2)]) ^ (Te4_1[byte(t0, 1)]) ^ (Te4_0[byte(t1, 0)]) ^ rk[2];
32,768✔
2896
    STORE32H(s2, ct + 8);
32,768✔
2897
    s3 =
32,768✔
2898
        (Te4_3[byte(t3, 3)]) ^ (Te4_2[byte(t0, 2)]) ^ (Te4_1[byte(t1, 1)]) ^ (Te4_0[byte(t2, 0)]) ^ rk[3];
32,768✔
2899
    STORE32H(s3, ct + 12);
32,768✔
2900
}
32,768✔
2901

2902
void rijndael_ecb_decrypt(const unsigned char *ct, unsigned char *pt, rijndael_key &skey)
66,899✔
2903
{
2904
    std::uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
2905

2906
    auto Nr = skey.Nr;
66,899✔
2907
    auto rk = skey.dK;
66,899✔
2908

2909
    /*
2910
     * map byte array block to cipher state
2911
     * and add initial round key:
2912
     */
2913
    LOAD32H(s0, ct);
66,899✔
2914
    s0 ^= rk[0];
66,899✔
2915
    LOAD32H(s1, ct + 4);
66,899✔
2916
    s1 ^= rk[1];
66,899✔
2917
    LOAD32H(s2, ct + 8);
66,899✔
2918
    s2 ^= rk[2];
66,899✔
2919
    LOAD32H(s3, ct + 12);
66,899✔
2920
    s3 ^= rk[3];
66,899✔
2921

2922
    /*
2923
     * Nr - 1 full rounds:
2924
     */
2925
    auto r = Nr >> 1;
66,899✔
2926

2927
    for (;;)
2928
    {
2929
        t0 =
339,211✔
2930
            Td0(byte(s0, 3)) ^ Td1(byte(s3, 2)) ^ Td2(byte(s2, 1)) ^ Td3(byte(s1, 0)) ^ rk[4];
339,211✔
2931
        t1 =
339,211✔
2932
            Td0(byte(s1, 3)) ^ Td1(byte(s0, 2)) ^ Td2(byte(s3, 1)) ^ Td3(byte(s2, 0)) ^ rk[5];
339,211✔
2933
        t2 =
339,211✔
2934
            Td0(byte(s2, 3)) ^ Td1(byte(s1, 2)) ^ Td2(byte(s0, 1)) ^ Td3(byte(s3, 0)) ^ rk[6];
339,211✔
2935
        t3 =
339,211✔
2936
            Td0(byte(s3, 3)) ^ Td1(byte(s2, 2)) ^ Td2(byte(s1, 1)) ^ Td3(byte(s0, 0)) ^ rk[7];
339,211✔
2937

2938
        rk += 8;
339,211✔
2939
        if (--r == 0)
339,211✔
2940
        {
2941
            break;
66,899✔
2942
        }
2943

2944
        s0 =
272,312✔
2945
            Td0(byte(t0, 3)) ^ Td1(byte(t3, 2)) ^ Td2(byte(t2, 1)) ^ Td3(byte(t1, 0)) ^ rk[0];
272,312✔
2946
        s1 =
272,312✔
2947
            Td0(byte(t1, 3)) ^ Td1(byte(t0, 2)) ^ Td2(byte(t3, 1)) ^ Td3(byte(t2, 0)) ^ rk[1];
272,312✔
2948
        s2 =
272,312✔
2949
            Td0(byte(t2, 3)) ^ Td1(byte(t1, 2)) ^ Td2(byte(t0, 1)) ^ Td3(byte(t3, 0)) ^ rk[2];
272,312✔
2950
        s3 =
272,312✔
2951
            Td0(byte(t3, 3)) ^ Td1(byte(t2, 2)) ^ Td2(byte(t1, 1)) ^ Td3(byte(t0, 0)) ^ rk[3];
272,312✔
2952
    }
2953

2954
    /*
2955
     * apply last round and
2956
     * map cipher state to byte array block:
2957
     */
2958
    s0 =
66,899✔
2959
        (Td4[byte(t0, 3)] & 0xff000000) ^ (Td4[byte(t3, 2)] & 0x00ff0000) ^ (Td4[byte(t2, 1)] & 0x0000ff00) ^ (Td4[byte(t1, 0)] & 0x000000ff) ^ rk[0];
66,899✔
2960
    STORE32H(s0, pt);
66,899✔
2961
    s1 =
66,899✔
2962
        (Td4[byte(t1, 3)] & 0xff000000) ^ (Td4[byte(t0, 2)] & 0x00ff0000) ^ (Td4[byte(t3, 1)] & 0x0000ff00) ^ (Td4[byte(t2, 0)] & 0x000000ff) ^ rk[1];
66,899✔
2963
    STORE32H(s1, pt + 4);
66,899✔
2964
    s2 =
66,899✔
2965
        (Td4[byte(t2, 3)] & 0xff000000) ^ (Td4[byte(t1, 2)] & 0x00ff0000) ^ (Td4[byte(t0, 1)] & 0x0000ff00) ^ (Td4[byte(t3, 0)] & 0x000000ff) ^ rk[2];
66,899✔
2966
    STORE32H(s2, pt + 8);
66,899✔
2967
    s3 =
66,899✔
2968
        (Td4[byte(t3, 3)] & 0xff000000) ^ (Td4[byte(t2, 2)] & 0x00ff0000) ^ (Td4[byte(t1, 1)] & 0x0000ff00) ^ (Td4[byte(t0, 0)] & 0x000000ff) ^ rk[3];
66,899✔
2969
    STORE32H(s3, pt + 12);
66,899✔
2970
}
66,899✔
2971

2972
#undef byte
2973
#undef LOAD32H
2974
#undef STORE32H
2975
#undef RORc
2976

2977
} // namespace
2978

2979
namespace xlnt {
2980
namespace detail {
2981

2982
std::vector<std::uint8_t> aes_ecb_encrypt(
×
2983
    const std::vector<std::uint8_t> &plaintext,
2984
    const std::vector<std::uint8_t> &key,
2985
    const std::size_t offset)
2986
{
2987
    if (plaintext.empty()) return {};
×
2988

2989
    auto len = plaintext.size() - offset;
×
2990

2991
    if (len % 16 != 0)
×
2992
    {
2993
        throw xlnt::exception("Invalid ECB plaintext length ("
2994
            + std::to_string(len)
×
2995
            + " bytes). Must be a multiple of 16 bytes.");
×
2996
    }
2997

2998
    auto ciphertext = std::vector<std::uint8_t>(len);
×
2999
    auto expanded_key = rijndael_setup(key);
×
3000
    auto pt = plaintext.data() + offset;
×
3001
    auto ct = ciphertext.data();
×
3002

3003
    while (len)
×
3004
    {
3005
        rijndael_ecb_encrypt(pt, ct, expanded_key);
×
3006

3007
        pt += 16;
×
3008
        ct += 16;
×
3009
        len -= 16;
×
3010
    }
3011

3012
    return ciphertext;
×
3013
}
×
3014

3015
std::vector<std::uint8_t> aes_ecb_decrypt(
22✔
3016
    const std::vector<std::uint8_t> &ciphertext,
3017
    const std::vector<std::uint8_t> &key,
3018
    const std::size_t offset)
3019
{
3020
    if (ciphertext.empty()) return {};
22✔
3021

3022
    auto len = ciphertext.size() - offset;
22✔
3023

3024
    if (len % 16 != 0)
22✔
3025
    {
3026
        throw xlnt::exception("Invalid ECB ciphertext length ("
3027
            + std::to_string(len)
×
3028
            + " bytes). Must be a multiple of 16 bytes.");
×
3029
    }
3030

3031
    auto plaintext = std::vector<std::uint8_t>(len);
22✔
3032
    auto expanded_key = rijndael_setup(key);
22✔
3033
    auto ct = ciphertext.data() + offset;
22✔
3034
    auto pt = plaintext.data();
22✔
3035

3036
    while (len)
2,600✔
3037
    {
3038
        rijndael_ecb_decrypt(ct, pt, expanded_key);
2,578✔
3039

3040
        pt += 16;
2,578✔
3041
        ct += 16;
2,578✔
3042
        len -= 16;
2,578✔
3043
    }
3044

3045
    return plaintext;
22✔
3046
}
22✔
3047

3048
std::vector<std::uint8_t> aes_cbc_encrypt(
128✔
3049
    const std::vector<std::uint8_t> &plaintext,
3050
    const std::vector<std::uint8_t> &key,
3051
    const std::vector<std::uint8_t> &original_iv,
3052
    const std::size_t offset)
3053
{
3054
    if (plaintext.empty()) return {};
128✔
3055

3056
    auto len = plaintext.size() - offset;
128✔
3057

3058
    if (len % 16 != 0)
128✔
3059
    {
3060
        throw xlnt::exception("Invalid CBC plaintext length ("
3061
            + std::to_string(len)
×
3062
            + " bytes). Must be a multiple of 16 bytes.");
×
3063
    }
3064

3065
    auto ciphertext = std::vector<std::uint8_t>(len);
128✔
3066
    auto expanded_key = rijndael_setup(key);
128✔
3067
    auto ct = ciphertext.data();
128✔
3068
    auto pt = plaintext.data() + offset;
128✔
3069
    auto iv_vec = original_iv;
128✔
3070
    auto iv = iv_vec.data();
128✔
3071

3072
    while (len)
32,896✔
3073
    {
3074
        for (auto x = 0; x < 16; x++)
557,056✔
3075
        {
3076
            iv[x] ^= pt[x];
524,288✔
3077
        }
3078

3079
        rijndael_ecb_encrypt(iv, ct, expanded_key);
32,768✔
3080

3081
        for (auto x = 0; x < 16; x++)
557,056✔
3082
        {
3083
            iv[x] = ct[x];
524,288✔
3084
        }
3085

3086
        pt += 16;
32,768✔
3087
        ct += 16;
32,768✔
3088
        len -= 16;
32,768✔
3089
    }
3090

3091
    return ciphertext;
128✔
3092
}
128✔
3093

3094
std::vector<std::uint8_t> aes_cbc_decrypt(
282✔
3095
    const std::vector<std::uint8_t> &ciphertext,
3096
    const std::vector<std::uint8_t> &key,
3097
    const std::vector<std::uint8_t> &original_iv,
3098
    const std::size_t offset)
3099
{
3100
    if (ciphertext.empty()) return {};
282✔
3101

3102
    auto len = ciphertext.size() - offset;
282✔
3103

3104
    if (ciphertext.size() % 16 != 0)
282✔
3105
    {
3106
        throw xlnt::exception("Invalid ECB ciphertext length ("
3107
            + std::to_string(len)
×
3108
            + " bytes). Must be a multiple of 16 bytes.");
×
3109
    }
3110

3111
    std::array<std::uint8_t, 16> temporary{{0}};
282✔
3112

3113
    auto plaintext = std::vector<std::uint8_t>(len);
282✔
3114
    auto expanded_key = rijndael_setup(key);
282✔
3115
    auto ct = ciphertext.data() + offset;
282✔
3116
    auto pt = plaintext.data();
282✔
3117
    auto iv_vec = original_iv;
282✔
3118
    auto iv = iv_vec.data();
282✔
3119

3120
    while (len)
64,603✔
3121
    {
3122
        rijndael_ecb_decrypt(ct, temporary.data(), expanded_key);
64,321✔
3123

3124
        for (auto x = std::size_t(0); x < 16; x++)
1,093,457✔
3125
        {
3126
            auto tmpy = static_cast<std::uint8_t>(temporary[x] ^ iv[x]);
1,029,136✔
3127
            iv[x] = ct[x];
1,029,136✔
3128
            pt[x] = tmpy;
1,029,136✔
3129
        }
3130

3131
        pt += 16;
64,321✔
3132
        ct += 16;
64,321✔
3133
        len -= 16;
64,321✔
3134
    }
3135

3136
    return plaintext;
282✔
3137
}
282✔
3138

3139
} // namespace detail
3140
} // namespace xlnt
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc