-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathstrumok.c
1108 lines (1032 loc) · 76.1 KB
/
strumok.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Copyright (c) 2019, Mykola Baibuz <[email protected]>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include "strumok.h"
#include <stdlib.h>
#define byte(n,w) (((w)>>(n*8)) & 0xff)
#define ainv_mul(w) (((w)>>8)^(strumok_alphainv_mul[w&0xff]))
#define a_mul(w) (((w)<<8)^(strumok_alpha_mul[w>>56]))
#define T(w) ((T0[byte(0,(w))])^(T1[byte(1,(w))])^(T2[byte(2,(w))])^(T3[byte(3,(w))])^(T4[byte(4,(w))])^(T5[byte(5,(w))])^(T6[byte(6,(w))])^(T7[byte(7,(w))]))
static uint64_t strumok_alpha_mul[256] = {
0x0000000000000000ULL, 0xD73F04125E000004ULL, 0xB37E0824BC000008ULL, 0x64410C36E200000CULL,
0x7BFC104865000010ULL, 0xACC3145A3B000014ULL, 0xC882186CD9000018ULL, 0x1FBD1C7E8700001CULL,
0xF6E52090CA000020ULL, 0x21DA248294000024ULL, 0x459B28B476000028ULL, 0x92A42CA62800002CULL,
0x8D1930D8AF000030ULL, 0x5A2634CAF1000034ULL, 0x3E6738FC13000038ULL, 0xE9583CEE4D00003CULL,
0xF1D7403D89000040ULL, 0x26E8442FD7000044ULL, 0x42A9481935000048ULL, 0x95964C0B6B00004CULL,
0x8A2B5075EC000050ULL, 0x5D145467B2000054ULL, 0x3955585150000058ULL, 0xEE6A5C430E00005CULL,
0x073260AD43000060ULL, 0xD00D64BF1D000064ULL, 0xB44C6889FF000068ULL, 0x63736C9BA100006CULL,
0x7CCE70E526000070ULL, 0xABF174F778000074ULL, 0xCFB078C19A000078ULL, 0x188F7CD3C400007CULL,
0xFFB3807A0F000080ULL, 0x288C846851000084ULL, 0x4CCD885EB3000088ULL, 0x9BF28C4CED00008CULL,
0x844F90326A000090ULL, 0x5370942034000094ULL, 0x37319816D6000098ULL, 0xE00E9C048800009CULL,
0x0956A0EAC50000A0ULL, 0xDE69A4F89B0000A4ULL, 0xBA28A8CE790000A8ULL, 0x6D17ACDC270000ACULL,
0x72AAB0A2A00000B0ULL, 0xA595B4B0FE0000B4ULL, 0xC1D4B8861C0000B8ULL, 0x16EBBC94420000BCULL,
0x0E64C047860000C0ULL, 0xD95BC455D80000C4ULL, 0xBD1AC8633A0000C8ULL, 0x6A25CC71640000CCULL,
0x7598D00FE30000D0ULL, 0xA2A7D41DBD0000D4ULL, 0xC6E6D82B5F0000D8ULL, 0x11D9DC39010000DCULL,
0xF881E0D74C0000E0ULL, 0x2FBEE4C5120000E4ULL, 0x4BFFE8F3F00000E8ULL, 0x9CC0ECE1AE0000ECULL,
0x837DF09F290000F0ULL, 0x5442F48D770000F4ULL, 0x3003F8BB950000F8ULL, 0xE73CFCA9CB0000FCULL,
0xE37B1DF41E00001DULL, 0x344419E640000019ULL, 0x500515D0A2000015ULL, 0x873A11C2FC000011ULL,
0x98870DBC7B00000DULL, 0x4FB809AE25000009ULL, 0x2BF90598C7000005ULL, 0xFCC6018A99000001ULL,
0x159E3D64D400003DULL, 0xC2A139768A000039ULL, 0xA6E0354068000035ULL, 0x71DF315236000031ULL,
0x6E622D2CB100002DULL, 0xB95D293EEF000029ULL, 0xDD1C25080D000025ULL, 0x0A23211A53000021ULL,
0x12AC5DC99700005DULL, 0xC59359DBC9000059ULL, 0xA1D255ED2B000055ULL, 0x76ED51FF75000051ULL,
0x69504D81F200004DULL, 0xBE6F4993AC000049ULL, 0xDA2E45A54E000045ULL, 0x0D1141B710000041ULL,
0xE4497D595D00007DULL, 0x3376794B03000079ULL, 0x5737757DE1000075ULL, 0x8008716FBF000071ULL,
0x9FB56D113800006DULL, 0x488A690366000069ULL, 0x2CCB653584000065ULL, 0xFBF46127DA000061ULL,
0x1CC89D8E1100009DULL, 0xCBF7999C4F000099ULL, 0xAFB695AAAD000095ULL, 0x788991B8F3000091ULL,
0x67348DC67400008DULL, 0xB00B89D42A000089ULL, 0xD44A85E2C8000085ULL, 0x037581F096000081ULL,
0xEA2DBD1EDB0000BDULL, 0x3D12B90C850000B9ULL, 0x5953B53A670000B5ULL, 0x8E6CB128390000B1ULL,
0x91D1AD56BE0000ADULL, 0x46EEA944E00000A9ULL, 0x22AFA572020000A5ULL, 0xF590A1605C0000A1ULL,
0xED1FDDB3980000DDULL, 0x3A20D9A1C60000D9ULL, 0x5E61D597240000D5ULL, 0x895ED1857A0000D1ULL,
0x96E3CDFBFD0000CDULL, 0x41DCC9E9A30000C9ULL, 0x259DC5DF410000C5ULL, 0xF2A2C1CD1F0000C1ULL,
0x1BFAFD23520000FDULL, 0xCCC5F9310C0000F9ULL, 0xA884F507EE0000F5ULL, 0x7FBBF115B00000F1ULL,
0x6006ED6B370000EDULL, 0xB739E979690000E9ULL, 0xD378E54F8B0000E5ULL, 0x0447E15DD50000E1ULL,
0xDBF63AF53C00003AULL, 0x0CC93EE76200003EULL, 0x688832D180000032ULL, 0xBFB736C3DE000036ULL,
0xA00A2ABD5900002AULL, 0x77352EAF0700002EULL, 0x13742299E5000022ULL, 0xC44B268BBB000026ULL,
0x2D131A65F600001AULL, 0xFA2C1E77A800001EULL, 0x9E6D12414A000012ULL, 0x4952165314000016ULL,
0x56EF0A2D9300000AULL, 0x81D00E3FCD00000EULL, 0xE59102092F000002ULL, 0x32AE061B71000006ULL,
0x2A217AC8B500007AULL, 0xFD1E7EDAEB00007EULL, 0x995F72EC09000072ULL, 0x4E6076FE57000076ULL,
0x51DD6A80D000006AULL, 0x86E26E928E00006EULL, 0xE2A362A46C000062ULL, 0x359C66B632000066ULL,
0xDCC45A587F00005AULL, 0x0BFB5E4A2100005EULL, 0x6FBA527CC3000052ULL, 0xB885566E9D000056ULL,
0xA7384A101A00004AULL, 0x70074E024400004EULL, 0x14464234A6000042ULL, 0xC3794626F8000046ULL,
0x2445BA8F330000BAULL, 0xF37ABE9D6D0000BEULL, 0x973BB2AB8F0000B2ULL, 0x4004B6B9D10000B6ULL,
0x5FB9AAC7560000AAULL, 0x8886AED5080000AEULL, 0xECC7A2E3EA0000A2ULL, 0x3BF8A6F1B40000A6ULL,
0xD2A09A1FF900009AULL, 0x059F9E0DA700009EULL, 0x61DE923B45000092ULL, 0xB6E196291B000096ULL,
0xA95C8A579C00008AULL, 0x7E638E45C200008EULL, 0x1A22827320000082ULL, 0xCD1D86617E000086ULL,
0xD592FAB2BA0000FAULL, 0x02ADFEA0E40000FEULL, 0x66ECF296060000F2ULL, 0xB1D3F684580000F6ULL,
0xAE6EEAFADF0000EAULL, 0x7951EEE8810000EEULL, 0x1D10E2DE630000E2ULL, 0xCA2FE6CC3D0000E6ULL,
0x2377DA22700000DAULL, 0xF448DE302E0000DEULL, 0x9009D206CC0000D2ULL, 0x4736D614920000D6ULL,
0x588BCA6A150000CAULL, 0x8FB4CE784B0000CEULL, 0xEBF5C24EA90000C2ULL, 0x3CCAC65CF70000C6ULL,
0x388D270122000027ULL, 0xEFB223137C000023ULL, 0x8BF32F259E00002FULL, 0x5CCC2B37C000002BULL,
0x4371374947000037ULL, 0x944E335B19000033ULL, 0xF00F3F6DFB00003FULL, 0x27303B7FA500003BULL,
0xCE680791E8000007ULL, 0x19570383B6000003ULL, 0x7D160FB55400000FULL, 0xAA290BA70A00000BULL,
0xB59417D98D000017ULL, 0x62AB13CBD3000013ULL, 0x06EA1FFD3100001FULL, 0xD1D51BEF6F00001BULL,
0xC95A673CAB000067ULL, 0x1E65632EF5000063ULL, 0x7A246F181700006FULL, 0xAD1B6B0A4900006BULL,
0xB2A67774CE000077ULL, 0x6599736690000073ULL, 0x01D87F507200007FULL, 0xD6E77B422C00007BULL,
0x3FBF47AC61000047ULL, 0xE88043BE3F000043ULL, 0x8CC14F88DD00004FULL, 0x5BFE4B9A8300004BULL,
0x444357E404000057ULL, 0x937C53F65A000053ULL, 0xF73D5FC0B800005FULL, 0x20025BD2E600005BULL,
0xC73EA77B2D0000A7ULL, 0x1001A369730000A3ULL, 0x7440AF5F910000AFULL, 0xA37FAB4DCF0000ABULL,
0xBCC2B733480000B7ULL, 0x6BFDB321160000B3ULL, 0x0FBCBF17F40000BFULL, 0xD883BB05AA0000BBULL,
0x31DB87EBE7000087ULL, 0xE6E483F9B9000083ULL, 0x82A58FCF5B00008FULL, 0x559A8BDD0500008BULL,
0x4A2797A382000097ULL, 0x9D1893B1DC000093ULL, 0xF9599F873E00009FULL, 0x2E669B956000009BULL,
0x36E9E746A40000E7ULL, 0xE1D6E354FA0000E3ULL, 0x8597EF62180000EFULL, 0x52A8EB70460000EBULL,
0x4D15F70EC10000F7ULL, 0x9A2AF31C9F0000F3ULL, 0xFE6BFF2A7D0000FFULL, 0x2954FB38230000FBULL,
0xC00CC7D66E0000C7ULL, 0x1733C3C4300000C3ULL, 0x7372CFF2D20000CFULL, 0xA44DCBE08C0000CBULL,
0xBBF0D79E0B0000D7ULL, 0x6CCFD38C550000D3ULL, 0x088EDFBAB70000DFULL, 0xDFB1DBA8E90000DBULL
};
static uint64_t strumok_alphainv_mul[256] = {
0x0000000000000000ULL, 0x47FCC6018A990000ULL, 0x8EE59102092F0000ULL, 0xC919570383B60000ULL,
0x01D73F04125E0000ULL, 0x462BF90598C70000ULL, 0x8F32AE061B710000ULL, 0xC8CE680791E80000ULL,
0x02B37E0824BC0000ULL, 0x454FB809AE250000ULL, 0x8C56EF0A2D930000ULL, 0xCBAA290BA70A0000ULL,
0x0364410C36E20000ULL, 0x4498870DBC7B0000ULL, 0x8D81D00E3FCD0000ULL, 0xCA7D160FB5540000ULL,
0x047BFC1048650000ULL, 0x43873A11C2FC0000ULL, 0x8A9E6D12414A0000ULL, 0xCD62AB13CBD30000ULL,
0x05ACC3145A3B0000ULL, 0x42500515D0A20000ULL, 0x8B49521653140000ULL, 0xCCB59417D98D0000ULL,
0x06C882186CD90000ULL, 0x41344419E6400000ULL, 0x882D131A65F60000ULL, 0xCFD1D51BEF6F0000ULL,
0x071FBD1C7E870000ULL, 0x40E37B1DF41E0000ULL, 0x89FA2C1E77A80000ULL, 0xCE06EA1FFD310000ULL,
0x08F6E52090CA0000ULL, 0x4F0A23211A530000ULL, 0x8613742299E50000ULL, 0xC1EFB223137C0000ULL,
0x0921DA2482940000ULL, 0x4EDD1C25080D0000ULL, 0x87C44B268BBB0000ULL, 0xC0388D2701220000ULL,
0x0A459B28B4760000ULL, 0x4DB95D293EEF0000ULL, 0x84A00A2ABD590000ULL, 0xC35CCC2B37C00000ULL,
0x0B92A42CA6280000ULL, 0x4C6E622D2CB10000ULL, 0x8577352EAF070000ULL, 0xC28BF32F259E0000ULL,
0x0C8D1930D8AF0000ULL, 0x4B71DF3152360000ULL, 0x82688832D1800000ULL, 0xC5944E335B190000ULL,
0x0D5A2634CAF10000ULL, 0x4AA6E03540680000ULL, 0x83BFB736C3DE0000ULL, 0xC443713749470000ULL,
0x0E3E6738FC130000ULL, 0x49C2A139768A0000ULL, 0x80DBF63AF53C0000ULL, 0xC727303B7FA50000ULL,
0x0FE9583CEE4D0000ULL, 0x48159E3D64D40000ULL, 0x810CC93EE7620000ULL, 0xC6F00F3F6DFB0000ULL,
0x10F1D7403D890000ULL, 0x570D1141B7100000ULL, 0x9E14464234A60000ULL, 0xD9E88043BE3F0000ULL,
0x1126E8442FD70000ULL, 0x56DA2E45A54E0000ULL, 0x9FC3794626F80000ULL, 0xD83FBF47AC610000ULL,
0x1242A94819350000ULL, 0x55BE6F4993AC0000ULL, 0x9CA7384A101A0000ULL, 0xDB5BFE4B9A830000ULL,
0x1395964C0B6B0000ULL, 0x5469504D81F20000ULL, 0x9D70074E02440000ULL, 0xDA8CC14F88DD0000ULL,
0x148A2B5075EC0000ULL, 0x5376ED51FF750000ULL, 0x9A6FBA527CC30000ULL, 0xDD937C53F65A0000ULL,
0x155D145467B20000ULL, 0x52A1D255ED2B0000ULL, 0x9BB885566E9D0000ULL, 0xDC444357E4040000ULL,
0x1639555851500000ULL, 0x51C59359DBC90000ULL, 0x98DCC45A587F0000ULL, 0xDF20025BD2E60000ULL,
0x17EE6A5C430E0000ULL, 0x5012AC5DC9970000ULL, 0x990BFB5E4A210000ULL, 0xDEF73D5FC0B80000ULL,
0x18073260AD430000ULL, 0x5FFBF46127DA0000ULL, 0x96E2A362A46C0000ULL, 0xD11E65632EF50000ULL,
0x19D00D64BF1D0000ULL, 0x5E2CCB6535840000ULL, 0x97359C66B6320000ULL, 0xD0C95A673CAB0000ULL,
0x1AB44C6889FF0000ULL, 0x5D488A6903660000ULL, 0x9451DD6A80D00000ULL, 0xD3AD1B6B0A490000ULL,
0x1B63736C9BA10000ULL, 0x5C9FB56D11380000ULL, 0x9586E26E928E0000ULL, 0xD27A246F18170000ULL,
0x1C7CCE70E5260000ULL, 0x5B8008716FBF0000ULL, 0x92995F72EC090000ULL, 0xD565997366900000ULL,
0x1DABF174F7780000ULL, 0x5A5737757DE10000ULL, 0x934E6076FE570000ULL, 0xD4B2A67774CE0000ULL,
0x1ECFB078C19A0000ULL, 0x593376794B030000ULL, 0x902A217AC8B50000ULL, 0xD7D6E77B422C0000ULL,
0x1F188F7CD3C40000ULL, 0x58E4497D595D0000ULL, 0x91FD1E7EDAEB0000ULL, 0xD601D87F50720000ULL,
0x20FFB3807A0F0000ULL, 0x67037581F0960000ULL, 0xAE1A228273200000ULL, 0xE9E6E483F9B90000ULL,
0x21288C8468510000ULL, 0x66D44A85E2C80000ULL, 0xAFCD1D86617E0000ULL, 0xE831DB87EBE70000ULL,
0x224CCD885EB30000ULL, 0x65B00B89D42A0000ULL, 0xACA95C8A579C0000ULL, 0xEB559A8BDD050000ULL,
0x239BF28C4CED0000ULL, 0x6467348DC6740000ULL, 0xAD7E638E45C20000ULL, 0xEA82A58FCF5B0000ULL,
0x24844F90326A0000ULL, 0x63788991B8F30000ULL, 0xAA61DE923B450000ULL, 0xED9D1893B1DC0000ULL,
0x2553709420340000ULL, 0x62AFB695AAAD0000ULL, 0xABB6E196291B0000ULL, 0xEC4A2797A3820000ULL,
0x2637319816D60000ULL, 0x61CBF7999C4F0000ULL, 0xA8D2A09A1FF90000ULL, 0xEF2E669B95600000ULL,
0x27E00E9C04880000ULL, 0x601CC89D8E110000ULL, 0xA9059F9E0DA70000ULL, 0xEEF9599F873E0000ULL,
0x280956A0EAC50000ULL, 0x6FF590A1605C0000ULL, 0xA6ECC7A2E3EA0000ULL, 0xE11001A369730000ULL,
0x29DE69A4F89B0000ULL, 0x6E22AFA572020000ULL, 0xA73BF8A6F1B40000ULL, 0xE0C73EA77B2D0000ULL,
0x2ABA28A8CE790000ULL, 0x6D46EEA944E00000ULL, 0xA45FB9AAC7560000ULL, 0xE3A37FAB4DCF0000ULL,
0x2B6D17ACDC270000ULL, 0x6C91D1AD56BE0000ULL, 0xA58886AED5080000ULL, 0xE27440AF5F910000ULL,
0x2C72AAB0A2A00000ULL, 0x6B8E6CB128390000ULL, 0xA2973BB2AB8F0000ULL, 0xE56BFDB321160000ULL,
0x2DA595B4B0FE0000ULL, 0x6A5953B53A670000ULL, 0xA34004B6B9D10000ULL, 0xE4BCC2B733480000ULL,
0x2EC1D4B8861C0000ULL, 0x693D12B90C850000ULL, 0xA02445BA8F330000ULL, 0xE7D883BB05AA0000ULL,
0x2F16EBBC94420000ULL, 0x68EA2DBD1EDB0000ULL, 0xA1F37ABE9D6D0000ULL, 0xE60FBCBF17F40000ULL,
0x300E64C047860000ULL, 0x77F2A2C1CD1F0000ULL, 0xBEEBF5C24EA90000ULL, 0xF91733C3C4300000ULL,
0x31D95BC455D80000ULL, 0x76259DC5DF410000ULL, 0xBF3CCAC65CF70000ULL, 0xF8C00CC7D66E0000ULL,
0x32BD1AC8633A0000ULL, 0x7541DCC9E9A30000ULL, 0xBC588BCA6A150000ULL, 0xFBA44DCBE08C0000ULL,
0x336A25CC71640000ULL, 0x7496E3CDFBFD0000ULL, 0xBD8FB4CE784B0000ULL, 0xFA7372CFF2D20000ULL,
0x347598D00FE30000ULL, 0x73895ED1857A0000ULL, 0xBA9009D206CC0000ULL, 0xFD6CCFD38C550000ULL,
0x35A2A7D41DBD0000ULL, 0x725E61D597240000ULL, 0xBB4736D614920000ULL, 0xFCBBF0D79E0B0000ULL,
0x36C6E6D82B5F0000ULL, 0x713A20D9A1C60000ULL, 0xB82377DA22700000ULL, 0xFFDFB1DBA8E90000ULL,
0x3711D9DC39010000ULL, 0x70ED1FDDB3980000ULL, 0xB9F448DE302E0000ULL, 0xFE088EDFBAB70000ULL,
0x38F881E0D74C0000ULL, 0x7F0447E15DD50000ULL, 0xB61D10E2DE630000ULL, 0xF1E1D6E354FA0000ULL,
0x392FBEE4C5120000ULL, 0x7ED378E54F8B0000ULL, 0xB7CA2FE6CC3D0000ULL, 0xF036E9E746A40000ULL,
0x3A4BFFE8F3F00000ULL, 0x7DB739E979690000ULL, 0xB4AE6EEAFADF0000ULL, 0xF352A8EB70460000ULL,
0x3B9CC0ECE1AE0000ULL, 0x7C6006ED6B370000ULL, 0xB57951EEE8810000ULL, 0xF28597EF62180000ULL,
0x3C837DF09F290000ULL, 0x7B7FBBF115B00000ULL, 0xB266ECF296060000ULL, 0xF59A2AF31C9F0000ULL,
0x3D5442F48D770000ULL, 0x7AA884F507EE0000ULL, 0xB3B1D3F684580000ULL, 0xF44D15F70EC10000ULL,
0x3E3003F8BB950000ULL, 0x79CCC5F9310C0000ULL, 0xB0D592FAB2BA0000ULL, 0xF72954FB38230000ULL,
0x3FE73CFCA9CB0000ULL, 0x781BFAFD23520000ULL, 0xB102ADFEA0E40000ULL, 0xF6FE6BFF2A7D0000ULL
};
static uint64_t T0[256] = {
0xA832A829D77F9AA8ULL, 0x4352432297D41143ULL, 0x5F3E5FC2DF80615FULL, 0x061E063014121806ULL,
0x6BDA6B7F670CB16BULL, 0x75BC758F2356C975ULL, 0x6CC16C477519AD6CULL, 0x592059F2CB927959ULL,
0x71A871AF3B4AD971ULL, 0xDF84DFB6F8275BDFULL, 0x87A1874C35B22687ULL, 0x95FB95DC59CC6E95ULL,
0x174B17B872655C17ULL, 0xF017F0D31AEAE7F0ULL, 0xD89FD88EEA3247D8ULL, 0x092D0948363F2409ULL,
0x6DC46D4F731EA96DULL, 0xF318F3CB10E3EBF3ULL, 0x1D691DE84E53741DULL, 0xCBC0CB16804B0BCBULL,
0xC9CAC9068C4503C9ULL, 0x4D644D52B3FE294DULL, 0x2C9C2C7DE8C4B02CULL, 0xAF29AF11C56A86AFULL,
0x798079EF0B72F979ULL, 0xE047E0537A9AA7E0ULL, 0x97F197CC55C26697ULL, 0xFD2EFDBB34C9D3FDULL,
0x6FCE6F5F7F10A16FULL, 0x4B7A4B62A7EC314BULL, 0x454C451283C60945ULL, 0x39DD39D596AFE439ULL,
0x3EC63EED84BAF83EULL, 0xDD8EDDA6F42953DDULL, 0xA315A371ED4EB6A3ULL, 0x4F6E4F42BFF0214FULL,
0xB45EB4C99F2BEAB4ULL, 0xB654B6D99325E2B6ULL, 0x9AC89AA47BE1529AULL, 0x0E360E70242A380EULL,
0x1F631FF8425D7C1FULL, 0xBF79BF91A51AC6BFULL, 0x154115A87E6B5415ULL, 0xE142E15B7C9DA3E1ULL,
0x49704972ABE23949ULL, 0xD2BDD2DED6046FD2ULL, 0x93E593EC4DDE7693ULL, 0xC6F9C67EAE683FC6ULL,
0x92E092E44BD97292ULL, 0x72A772B73143D572ULL, 0x9EDC9E8463FD429EULL, 0x61F8612F5B3A9961ULL,
0xD1B2D1C6DC0D63D1ULL, 0x63F2633F57349163ULL, 0xFA35FA8326DCCFFAULL, 0xEE71EE235EB09FEEULL,
0xF403F4F302F6F7F4ULL, 0x197D19C8564F6419ULL, 0xD5A6D5E6C41173D5ULL, 0xAD23AD01C9648EADULL,
0x582558FACD957D58ULL, 0xA40EA449FF5BAAA4ULL, 0xBB6DBBB1BD06D6BBULL, 0xA11FA161E140BEA1ULL,
0xDC8BDCAEF22E57DCULL, 0xF21DF2C316E4EFF2ULL, 0x83B5836C2DAE3683ULL, 0x37EB37A5B285DC37ULL,
0x4257422A91D31542ULL, 0xE453E4736286B7E4ULL, 0x7A8F7AF7017BF57AULL, 0x32FA328DAC9EC832ULL,
0x9CD69C946FF34A9CULL, 0xCCDBCC2E925E17CCULL, 0xAB3DAB31DD7696ABULL, 0x4A7F4A6AA1EB354AULL,
0x8F898F0C058A068FULL, 0x6ECB6E577917A56EULL, 0x04140420181C1004ULL, 0x27BB2725D2F59C27ULL,
0x2E962E6DE4CAB82EULL, 0xE75CE76B688FBBE7ULL, 0xE24DE2437694AFE2ULL, 0x5A2F5AEAC19B755AULL,
0x96F496C453C56296ULL, 0x164E16B074625816ULL, 0x23AF2305CAE98C23ULL, 0x2B872B45FAD1AC2BULL,
0xC2EDC25EB6742FC2ULL, 0x65EC650F43268965ULL, 0x66E36617492F8566ULL, 0x0F330F78222D3C0FULL,
0xBC76BC89AF13CABCULL, 0xA937A921D1789EA9ULL, 0x474647028FC80147ULL, 0x415841329BDA1941ULL,
0x34E434BDB88CD034ULL, 0x4875487AADE53D48ULL, 0xFC2BFCB332CED7FCULL, 0xB751B7D19522E6B7ULL,
0x6ADF6A77610BB56AULL, 0x88928834179F1A88ULL, 0xA50BA541F95CAEA5ULL, 0x530253A2F7A45153ULL,
0x86A4864433B52286ULL, 0xF93AF99B2CD5C3F9ULL, 0x5B2A5BE2C79C715BULL, 0xDB90DB96E03B4BDBULL,
0x38D838DD90A8E038ULL, 0x7B8A7BFF077CF17BULL, 0xC3E8C356B0732BC3ULL, 0x1E661EF0445A781EULL,
0x22AA220DCCEE8822ULL, 0x33FF3385AA99CC33ULL, 0x24B4243DD8FC9024ULL, 0x2888285DF0D8A028ULL,
0x36EE36ADB482D836ULL, 0xC7FCC776A86F3BC7ULL, 0xB240B2F98B39F2B2ULL, 0x3BD73BC59AA1EC3BULL,
0x8E8C8E04038D028EULL, 0x77B6779F2F58C177ULL, 0xBA68BAB9BB01D2BAULL, 0xF506F5FB04F1F3F5ULL,
0x144414A0786C5014ULL, 0x9FD99F8C65FA469FULL, 0x0828084030382008ULL, 0x551C5592E3B64955ULL,
0x9BCD9BAC7DE6569BULL, 0x4C614C5AB5F92D4CULL, 0xFE21FEA33EC0DFFEULL, 0x60FD60275D3D9D60ULL,
0x5C315CDAD5896D5CULL, 0xDA95DA9EE63C4FDAULL, 0x187818C050486018ULL, 0x4643460A89CF0546ULL,
0xCDDECD26945913CDULL, 0x7D947DCF136EE97DULL, 0x21A52115C6E78421ULL, 0xB04AB0E98737FAB0ULL,
0x3FC33FE582BDFC3FULL, 0x1B771BD85A416C1BULL, 0x8997893C11981E89ULL, 0xFF24FFAB38C7DBFFULL,
0xEB60EB0B40AB8BEBULL, 0x84AE84543FBB2A84ULL, 0x69D0696F6B02B969ULL, 0x3AD23ACD9CA6E83AULL,
0x9DD39D9C69F44E9DULL, 0xD7ACD7F6C81F7BD7ULL, 0xD3B8D3D6D0036BD3ULL, 0x70AD70A73D4DDD70ULL,
0x67E6671F4F288167ULL, 0x405D403A9DDD1D40ULL, 0xB55BB5C1992CEEB5ULL, 0xDE81DEBEFE205FDEULL,
0x5D345DD2D38E695DULL, 0x30F0309DA090C030ULL, 0x91EF91FC41D07E91ULL, 0xB14FB1E18130FEB1ULL,
0x788578E70D75FD78ULL, 0x1155118866774411ULL, 0x0105010806070401ULL, 0xE556E57B6481B3E5ULL,
0x0000000000000000ULL, 0x68D568676D05BD68ULL, 0x98C298B477EF5A98ULL, 0xA01AA069E747BAA0ULL,
0xC5F6C566A46133C5ULL, 0x020A02100C0E0802ULL, 0xA604A659F355A2A6ULL, 0x74B974872551CD74ULL,
0x2D992D75EEC3B42DULL, 0x0B270B583A312C0BULL, 0xA210A279EB49B2A2ULL, 0x76B37697295FC576ULL,
0xB345B3F18D3EF6B3ULL, 0xBE7CBE99A31DC2BEULL, 0xCED1CE3E9E501FCEULL, 0xBD73BD81A914CEBDULL,
0xAE2CAE19C36D82AEULL, 0xE96AE91B4CA583E9ULL, 0x8A988A241B91128AULL, 0x31F53195A697C431ULL,
0x1C6C1CE04854701CULL, 0xEC7BEC3352BE97ECULL, 0xF112F1DB1CEDE3F1ULL, 0x99C799BC71E85E99ULL,
0x94FE94D45FCB6A94ULL, 0xAA38AA39DB7192AAULL, 0xF609F6E30EF8FFF6ULL, 0x26BE262DD4F29826ULL,
0x2F932F65E2CDBC2FULL, 0xEF74EF2B58B79BEFULL, 0xE86FE8134AA287E8ULL, 0x8C868C140F830A8CULL,
0x35E135B5BE8BD435ULL, 0x030F03180A090C03ULL, 0xD4A3D4EEC21677D4ULL, 0x7F9E7FDF1F60E17FULL,
0xFB30FB8B20DBCBFBULL, 0x051105281E1B1405ULL, 0xC1E2C146BC7D23C1ULL, 0x5E3B5ECAD987655EULL,
0x90EA90F447D77A90ULL, 0x20A0201DC0E08020ULL, 0x3DC93DF58EB3F43DULL, 0x82B082642BA93282ULL,
0xF70CF7EB08FFFBF7ULL, 0xEA65EA0346AC8FEAULL, 0x0A220A503C36280AULL, 0x0D390D682E23340DULL,
0x7E9B7ED71967E57EULL, 0xF83FF8932AD2C7F8ULL, 0x500D50BAFDAD5D50ULL, 0x1A721AD05C46681AULL,
0xC4F3C46EA26637C4ULL, 0x071B073812151C07ULL, 0x57165782EFB84157ULL, 0xB862B8A9B70FDAB8ULL,
0x3CCC3CFD88B4F03CULL, 0x62F7623751339562ULL, 0xE348E34B7093ABE3ULL, 0xC8CFC80E8A4207C8ULL,
0xAC26AC09CF638AACULL, 0x520752AAF1A35552ULL, 0x64E9640745218D64ULL, 0x1050108060704010ULL,
0xD0B7D0CEDA0A67D0ULL, 0xD99AD986EC3543D9ULL, 0x135F13986A794C13ULL, 0x0C3C0C602824300CULL,
0x125A12906C7E4812ULL, 0x298D2955F6DFA429ULL, 0x510851B2FBAA5951ULL, 0xB967B9A1B108DEB9ULL,
0xCFD4CF3698571BCFULL, 0xD6A9D6FECE187FD6ULL, 0x73A273BF3744D173ULL, 0x8D838D1C09840E8DULL,
0x81BF817C21A03E81ULL, 0x5419549AE5B14D54ULL, 0xC0E7C04EBA7A27C0ULL, 0xED7EED3B54B993EDULL,
0x4E6B4E4AB9F7254EULL, 0x4449441A85C10D44ULL, 0xA701A751F552A6A7ULL, 0x2A822A4DFCD6A82AULL,
0x85AB855C39BC2E85ULL, 0x25B12535DEFB9425ULL, 0xE659E6636E88BFE6ULL, 0xCAC5CA1E864C0FCAULL,
0x7C917CC71569ED7CULL, 0x8B9D8B2C1D96168BULL, 0x5613568AE9BF4556ULL, 0x80BA807427A73A80ULL
};
static uint64_t T1[256] = {
0xD1CE3E9E501FCECEULL, 0x6DBBB1BD06D6BBBBULL, 0x60EB0B40AB8BEBEBULL, 0xE092E44BD9729292ULL,
0x65EA0346AC8FEAEAULL, 0xC0CB16804B0BCBCBULL, 0x5F13986A794C1313ULL, 0xE2C146BC7D23C1C1ULL,
0x6AE91B4CA583E9E9ULL, 0xD23ACD9CA6E83A3AULL, 0xA9D6FECE187FD6D6ULL, 0x40B2F98B39F2B2B2ULL,
0xBDD2DED6046FD2D2ULL, 0xEA90F447D77A9090ULL, 0x4B17B872655C1717ULL, 0x3FF8932AD2C7F8F8ULL,
0x57422A91D3154242ULL, 0x4115A87E6B541515ULL, 0x13568AE9BF455656ULL, 0x5EB4C99F2BEAB4B4ULL,
0xEC650F4326896565ULL, 0x6C1CE04854701C1CULL, 0x928834179F1A8888ULL, 0x52432297D4114343ULL,
0xF6C566A46133C5C5ULL, 0x315CDAD5896D5C5CULL, 0xEE36ADB482D83636ULL, 0x68BAB9BB01D2BABAULL,
0x06F5FB04F1F3F5F5ULL, 0x165782EFB8415757ULL, 0xE6671F4F28816767ULL, 0x838D1C09840E8D8DULL,
0xF53195A697C43131ULL, 0x09F6E30EF8FFF6F6ULL, 0xE9640745218D6464ULL, 0x2558FACD957D5858ULL,
0xDC9E8463FD429E9EULL, 0x03F4F302F6F7F4F4ULL, 0xAA220DCCEE882222ULL, 0x38AA39DB7192AAAAULL,
0xBC758F2356C97575ULL, 0x330F78222D3C0F0FULL, 0x0A02100C0E080202ULL, 0x4FB1E18130FEB1B1ULL,
0x84DFB6F8275BDFDFULL, 0xC46D4F731EA96D6DULL, 0xA273BF3744D17373ULL, 0x644D52B3FE294D4DULL,
0x917CC71569ED7C7CULL, 0xBE262DD4F2982626ULL, 0x962E6DE4CAB82E2EULL, 0x0CF7EB08FFFBF7F7ULL,
0x2808403038200808ULL, 0x345DD2D38E695D5DULL, 0x49441A85C10D4444ULL, 0xC63EED84BAF83E3EULL,
0xD99F8C65FA469F9FULL, 0x4414A0786C501414ULL, 0xCFC80E8A4207C8C8ULL, 0x2CAE19C36D82AEAEULL,
0x19549AE5B14D5454ULL, 0x5010806070401010ULL, 0x9FD88EEA3247D8D8ULL, 0x76BC89AF13CABCBCULL,
0x721AD05C46681A1AULL, 0xDA6B7F670CB16B6BULL, 0xD0696F6B02B96969ULL, 0x18F3CB10E3EBF3F3ULL,
0x73BD81A914CEBDBDULL, 0xFF3385AA99CC3333ULL, 0x3DAB31DD7696ABABULL, 0x35FA8326DCCFFAFAULL,
0xB2D1C6DC0D63D1D1ULL, 0xCD9BAC7DE6569B9BULL, 0xD568676D05BD6868ULL, 0x6B4E4AB9F7254E4EULL,
0x4E16B07462581616ULL, 0xFB95DC59CC6E9595ULL, 0xEF91FC41D07E9191ULL, 0x71EE235EB09FEEEEULL,
0x614C5AB5F92D4C4CULL, 0xF2633F5734916363ULL, 0x8C8E04038D028E8EULL, 0x2A5BE2C79C715B5BULL,
0xDBCC2E925E17CCCCULL, 0xCC3CFD88B4F03C3CULL, 0x7D19C8564F641919ULL, 0x1FA161E140BEA1A1ULL,
0xBF817C21A03E8181ULL, 0x704972ABE2394949ULL, 0x8A7BFF077CF17B7BULL, 0x9AD986EC3543D9D9ULL,
0xCE6F5F7F10A16F6FULL, 0xEB37A5B285DC3737ULL, 0xFD60275D3D9D6060ULL, 0xC5CA1E864C0FCACAULL,
0x5CE76B688FBBE7E7ULL, 0x872B45FAD1AC2B2BULL, 0x75487AADE53D4848ULL, 0x2EFDBB34C9D3FDFDULL,
0xF496C453C5629696ULL, 0x4C451283C6094545ULL, 0x2BFCB332CED7FCFCULL, 0x5841329BDA194141ULL,
0x5A12906C7E481212ULL, 0x390D682E23340D0DULL, 0x8079EF0B72F97979ULL, 0x56E57B6481B3E5E5ULL,
0x97893C11981E8989ULL, 0x868C140F830A8C8CULL, 0x48E34B7093ABE3E3ULL, 0xA0201DC0E0802020ULL,
0xF0309DA090C03030ULL, 0x8BDCAEF22E57DCDCULL, 0x51B7D19522E6B7B7ULL, 0xC16C477519AD6C6CULL,
0x7F4A6AA1EB354A4AULL, 0x5BB5C1992CEEB5B5ULL, 0xC33FE582BDFC3F3FULL, 0xF197CC55C2669797ULL,
0xA3D4EEC21677D4D4ULL, 0xF762375133956262ULL, 0x992D75EEC3B42D2DULL, 0x1E06301412180606ULL,
0x0EA449FF5BAAA4A4ULL, 0x0BA541F95CAEA5A5ULL, 0xB5836C2DAE368383ULL, 0x3E5FC2DF80615F5FULL,
0x822A4DFCD6A82A2AULL, 0x95DA9EE63C4FDADAULL, 0xCAC9068C4503C9C9ULL, 0x0000000000000000ULL,
0x9B7ED71967E57E7EULL, 0x10A279EB49B2A2A2ULL, 0x1C5592E3B6495555ULL, 0x79BF91A51AC6BFBFULL,
0x5511886677441111ULL, 0xA6D5E6C41173D5D5ULL, 0xD69C946FF34A9C9CULL, 0xD4CF3698571BCFCFULL,
0x360E70242A380E0EULL, 0x220A503C36280A0AULL, 0xC93DF58EB3F43D3DULL, 0x0851B2FBAA595151ULL,
0x947DCF136EE97D7DULL, 0xE593EC4DDE769393ULL, 0x771BD85A416C1B1BULL, 0x21FEA33EC0DFFEFEULL,
0xF3C46EA26637C4C4ULL, 0x4647028FC8014747ULL, 0x2D0948363F240909ULL, 0xA4864433B5228686ULL,
0x270B583A312C0B0BULL, 0x898F0C058A068F8FULL, 0xD39D9C69F44E9D9DULL, 0xDF6A77610BB56A6AULL,
0x1B073812151C0707ULL, 0x67B9A1B108DEB9B9ULL, 0x4AB0E98737FAB0B0ULL, 0xC298B477EF5A9898ULL,
0x7818C05048601818ULL, 0xFA328DAC9EC83232ULL, 0xA871AF3B4AD97171ULL, 0x7A4B62A7EC314B4BULL,
0x74EF2B58B79BEFEFULL, 0xD73BC59AA1EC3B3BULL, 0xAD70A73D4DDD7070ULL, 0x1AA069E747BAA0A0ULL,
0x53E4736286B7E4E4ULL, 0x5D403A9DDD1D4040ULL, 0x24FFAB38C7DBFFFFULL, 0xE8C356B0732BC3C3ULL,
0x37A921D1789EA9A9ULL, 0x59E6636E88BFE6E6ULL, 0x8578E70D75FD7878ULL, 0x3AF99B2CD5C3F9F9ULL,
0x9D8B2C1D96168B8BULL, 0x43460A89CF054646ULL, 0xBA807427A73A8080ULL, 0x661EF0445A781E1EULL,
0xD838DD90A8E03838ULL, 0x42E15B7C9DA3E1E1ULL, 0x62B8A9B70FDAB8B8ULL, 0x32A829D77F9AA8A8ULL,
0x47E0537A9AA7E0E0ULL, 0x3C0C602824300C0CULL, 0xAF2305CAE98C2323ULL, 0xB37697295FC57676ULL,
0x691DE84E53741D1DULL, 0xB12535DEFB942525ULL, 0xB4243DD8FC902424ULL, 0x1105281E1B140505ULL,
0x12F1DB1CEDE3F1F1ULL, 0xCB6E577917A56E6EULL, 0xFE94D45FCB6A9494ULL, 0x88285DF0D8A02828ULL,
0xC89AA47BE1529A9AULL, 0xAE84543FBB2A8484ULL, 0x6FE8134AA287E8E8ULL, 0x15A371ED4EB6A3A3ULL,
0x6E4F42BFF0214F4FULL, 0xB6779F2F58C17777ULL, 0xB8D3D6D0036BD3D3ULL, 0xAB855C39BC2E8585ULL,
0x4DE2437694AFE2E2ULL, 0x0752AAF1A3555252ULL, 0x1DF2C316E4EFF2F2ULL, 0xB082642BA9328282ULL,
0x0D50BAFDAD5D5050ULL, 0x8F7AF7017BF57A7AULL, 0x932F65E2CDBC2F2FULL, 0xB974872551CD7474ULL,
0x0253A2F7A4515353ULL, 0x45B3F18D3EF6B3B3ULL, 0xF8612F5B3A996161ULL, 0x29AF11C56A86AFAFULL,
0xDD39D596AFE43939ULL, 0xE135B5BE8BD43535ULL, 0x81DEBEFE205FDEDEULL, 0xDECD26945913CDCDULL,
0x631FF8425D7C1F1FULL, 0xC799BC71E85E9999ULL, 0x26AC09CF638AACACULL, 0x23AD01C9648EADADULL,
0xA772B73143D57272ULL, 0x9C2C7DE8C4B02C2CULL, 0x8EDDA6F42953DDDDULL, 0xB7D0CEDA0A67D0D0ULL,
0xA1874C35B2268787ULL, 0x7CBE99A31DC2BEBEULL, 0x3B5ECAD987655E5EULL, 0x04A659F355A2A6A6ULL,
0x7BEC3352BE97ECECULL, 0x140420181C100404ULL, 0xF9C67EAE683FC6C6ULL, 0x0F03180A090C0303ULL,
0xE434BDB88CD03434ULL, 0x30FB8B20DBCBFBFBULL, 0x90DB96E03B4BDBDBULL, 0x2059F2CB92795959ULL,
0x54B6D99325E2B6B6ULL, 0xEDC25EB6742FC2C2ULL, 0x0501080607040101ULL, 0x17F0D31AEAE7F0F0ULL,
0x2F5AEAC19B755A5AULL, 0x7EED3B54B993EDEDULL, 0x01A751F552A6A7A7ULL, 0xE36617492F856666ULL,
0xA52115C6E7842121ULL, 0x9E7FDF1F60E17F7FULL, 0x988A241B91128A8AULL, 0xBB2725D2F59C2727ULL,
0xFCC776A86F3BC7C7ULL, 0xE7C04EBA7A27C0C0ULL, 0x8D2955F6DFA42929ULL, 0xACD7F6C81F7BD7D7ULL
};
static uint64_t T2[256] = {
0x93EC4DDE769393E5ULL, 0xD986EC3543D9D99AULL, 0x9AA47BE1529A9AC8ULL, 0xB5C1992CEEB5B55BULL,
0x98B477EF5A9898C2ULL, 0x220DCCEE882222AAULL, 0x451283C60945454CULL, 0xFCB332CED7FCFC2BULL,
0xBAB9BB01D2BABA68ULL, 0x6A77610BB56A6ADFULL, 0xDFB6F8275BDFDF84ULL, 0x02100C0E0802020AULL,
0x9F8C65FA469F9FD9ULL, 0xDCAEF22E57DCDC8BULL, 0x51B2FBAA59515108ULL, 0x59F2CB9279595920ULL,
0x4A6AA1EB354A4A7FULL, 0x17B872655C17174BULL, 0x2B45FAD1AC2B2B87ULL, 0xC25EB6742FC2C2EDULL,
0x94D45FCB6A9494FEULL, 0xF4F302F6F7F4F403ULL, 0xBBB1BD06D6BBBB6DULL, 0xA371ED4EB6A3A315ULL,
0x62375133956262F7ULL, 0xE4736286B7E4E453ULL, 0x71AF3B4AD97171A8ULL, 0xD4EEC21677D4D4A3ULL,
0xCD26945913CDCDDEULL, 0x70A73D4DDD7070ADULL, 0x16B074625816164EULL, 0xE15B7C9DA3E1E142ULL,
0x4972ABE239494970ULL, 0x3CFD88B4F03C3CCCULL, 0xC04EBA7A27C0C0E7ULL, 0xD88EEA3247D8D89FULL,
0x5CDAD5896D5C5C31ULL, 0x9BAC7DE6569B9BCDULL, 0xAD01C9648EADAD23ULL, 0x855C39BC2E8585ABULL,
0x53A2F7A451535302ULL, 0xA161E140BEA1A11FULL, 0x7AF7017BF57A7A8FULL, 0xC80E8A4207C8C8CFULL,
0x2D75EEC3B42D2D99ULL, 0xE0537A9AA7E0E047ULL, 0xD1C6DC0D63D1D1B2ULL, 0x72B73143D57272A7ULL,
0xA659F355A2A6A604ULL, 0x2C7DE8C4B02C2C9CULL, 0xC46EA26637C4C4F3ULL, 0xE34B7093ABE3E348ULL,
0x7697295FC57676B3ULL, 0x78E70D75FD787885ULL, 0xB7D19522E6B7B751ULL, 0xB4C99F2BEAB4B45EULL,
0x0948363F2409092DULL, 0x3BC59AA1EC3B3BD7ULL, 0x0E70242A380E0E36ULL, 0x41329BDA19414158ULL,
0x4C5AB5F92D4C4C61ULL, 0xDEBEFE205FDEDE81ULL, 0xB2F98B39F2B2B240ULL, 0x90F447D77A9090EAULL,
0x2535DEFB942525B1ULL, 0xA541F95CAEA5A50BULL, 0xD7F6C81F7BD7D7ACULL, 0x03180A090C03030FULL,
0x1188667744111155ULL, 0x0000000000000000ULL, 0xC356B0732BC3C3E8ULL, 0x2E6DE4CAB82E2E96ULL,
0x92E44BD9729292E0ULL, 0xEF2B58B79BEFEF74ULL, 0x4E4AB9F7254E4E6BULL, 0x12906C7E4812125AULL,
0x9D9C69F44E9D9DD3ULL, 0x7DCF136EE97D7D94ULL, 0xCB16804B0BCBCBC0ULL, 0x35B5BE8BD43535E1ULL,
0x1080607040101050ULL, 0xD5E6C41173D5D5A6ULL, 0x4F42BFF0214F4F6EULL, 0x9E8463FD429E9EDCULL,
0x4D52B3FE294D4D64ULL, 0xA921D1789EA9A937ULL, 0x5592E3B64955551CULL, 0xC67EAE683FC6C6F9ULL,
0xD0CEDA0A67D0D0B7ULL, 0x7BFF077CF17B7B8AULL, 0x18C0504860181878ULL, 0x97CC55C2669797F1ULL,
0xD3D6D0036BD3D3B8ULL, 0x36ADB482D83636EEULL, 0xE6636E88BFE6E659ULL, 0x487AADE53D484875ULL,
0x568AE9BF45565613ULL, 0x817C21A03E8181BFULL, 0x8F0C058A068F8F89ULL, 0x779F2F58C17777B6ULL,
0xCC2E925E17CCCCDBULL, 0x9C946FF34A9C9CD6ULL, 0xB9A1B108DEB9B967ULL, 0xE2437694AFE2E24DULL,
0xAC09CF638AACAC26ULL, 0xB8A9B70FDAB8B862ULL, 0x2F65E2CDBC2F2F93ULL, 0x15A87E6B54151541ULL,
0xA449FF5BAAA4A40EULL, 0x7CC71569ED7C7C91ULL, 0xDA9EE63C4FDADA95ULL, 0x38DD90A8E03838D8ULL,
0x1EF0445A781E1E66ULL, 0x0B583A312C0B0B27ULL, 0x05281E1B14050511ULL, 0xD6FECE187FD6D6A9ULL,
0x14A0786C50141444ULL, 0x6E577917A56E6ECBULL, 0x6C477519AD6C6CC1ULL, 0x7ED71967E57E7E9BULL,
0x6617492F856666E3ULL, 0xFDBB34C9D3FDFD2EULL, 0xB1E18130FEB1B14FULL, 0xE57B6481B3E5E556ULL,
0x60275D3D9D6060FDULL, 0xAF11C56A86AFAF29ULL, 0x5ECAD987655E5E3BULL, 0x3385AA99CC3333FFULL,
0x874C35B2268787A1ULL, 0xC9068C4503C9C9CAULL, 0xF0D31AEAE7F0F017ULL, 0x5DD2D38E695D5D34ULL,
0x6D4F731EA96D6DC4ULL, 0x3FE582BDFC3F3FC3ULL, 0x8834179F1A888892ULL, 0x8D1C09840E8D8D83ULL,
0xC776A86F3BC7C7FCULL, 0xF7EB08FFFBF7F70CULL, 0x1DE84E53741D1D69ULL, 0xE91B4CA583E9E96AULL,
0xEC3352BE97ECEC7BULL, 0xED3B54B993EDED7EULL, 0x807427A73A8080BAULL, 0x2955F6DFA429298DULL,
0x2725D2F59C2727BBULL, 0xCF3698571BCFCFD4ULL, 0x99BC71E85E9999C7ULL, 0xA829D77F9AA8A832ULL,
0x50BAFDAD5D50500DULL, 0x0F78222D3C0F0F33ULL, 0x37A5B285DC3737EBULL, 0x243DD8FC902424B4ULL,
0x285DF0D8A0282888ULL, 0x309DA090C03030F0ULL, 0x95DC59CC6E9595FBULL, 0xD2DED6046FD2D2BDULL,
0x3EED84BAF83E3EC6ULL, 0x5BE2C79C715B5B2AULL, 0x403A9DDD1D40405DULL, 0x836C2DAE368383B5ULL,
0xB3F18D3EF6B3B345ULL, 0x696F6B02B96969D0ULL, 0x5782EFB841575716ULL, 0x1FF8425D7C1F1F63ULL,
0x073812151C07071BULL, 0x1CE04854701C1C6CULL, 0x8A241B91128A8A98ULL, 0xBC89AF13CABCBC76ULL,
0x201DC0E0802020A0ULL, 0xEB0B40AB8BEBEB60ULL, 0xCE3E9E501FCECED1ULL, 0x8E04038D028E8E8CULL,
0xAB31DD7696ABAB3DULL, 0xEE235EB09FEEEE71ULL, 0x3195A697C43131F5ULL, 0xA279EB49B2A2A210ULL,
0x73BF3744D17373A2ULL, 0xF99B2CD5C3F9F93AULL, 0xCA1E864C0FCACAC5ULL, 0x3ACD9CA6E83A3AD2ULL,
0x1AD05C46681A1A72ULL, 0xFB8B20DBCBFBFB30ULL, 0x0D682E23340D0D39ULL, 0xC146BC7D23C1C1E2ULL,
0xFEA33EC0DFFEFE21ULL, 0xFA8326DCCFFAFA35ULL, 0xF2C316E4EFF2F21DULL, 0x6F5F7F10A16F6FCEULL,
0xBD81A914CEBDBD73ULL, 0x96C453C5629696F4ULL, 0xDDA6F42953DDDD8EULL, 0x432297D411434352ULL,
0x52AAF1A355525207ULL, 0xB6D99325E2B6B654ULL, 0x0840303820080828ULL, 0xF3CB10E3EBF3F318ULL,
0xAE19C36D82AEAE2CULL, 0xBE99A31DC2BEBE7CULL, 0x19C8564F6419197DULL, 0x893C11981E898997ULL,
0x328DAC9EC83232FAULL, 0x262DD4F2982626BEULL, 0xB0E98737FAB0B04AULL, 0xEA0346AC8FEAEA65ULL,
0x4B62A7EC314B4B7AULL, 0x640745218D6464E9ULL, 0x84543FBB2A8484AEULL, 0x82642BA9328282B0ULL,
0x6B7F670CB16B6BDAULL, 0xF5FB04F1F3F5F506ULL, 0x79EF0B72F9797980ULL, 0xBF91A51AC6BFBF79ULL,
0x0108060704010105ULL, 0x5FC2DF80615F5F3EULL, 0x758F2356C97575BCULL, 0x633F5734916363F2ULL,
0x1BD85A416C1B1B77ULL, 0x2305CAE98C2323AFULL, 0x3DF58EB3F43D3DC9ULL, 0x68676D05BD6868D5ULL,
0x2A4DFCD6A82A2A82ULL, 0x650F4326896565ECULL, 0xE8134AA287E8E86FULL, 0x91FC41D07E9191EFULL,
0xF6E30EF8FFF6F609ULL, 0xFFAB38C7DBFFFF24ULL, 0x13986A794C13135FULL, 0x58FACD957D585825ULL,
0xF1DB1CEDE3F1F112ULL, 0x47028FC801474746ULL, 0x0A503C36280A0A22ULL, 0x7FDF1F60E17F7F9EULL,
0xC566A46133C5C5F6ULL, 0xA751F552A6A7A701ULL, 0xE76B688FBBE7E75CULL, 0x612F5B3A996161F8ULL,
0x5AEAC19B755A5A2FULL, 0x063014121806061EULL, 0x460A89CF05464643ULL, 0x441A85C10D444449ULL,
0x422A91D315424257ULL, 0x0420181C10040414ULL, 0xA069E747BAA0A01AULL, 0xDB96E03B4BDBDB90ULL,
0x39D596AFE43939DDULL, 0x864433B5228686A4ULL, 0x549AE5B14D545419ULL, 0xAA39DB7192AAAA38ULL,
0x8C140F830A8C8C86ULL, 0x34BDB88CD03434E4ULL, 0x2115C6E7842121A5ULL, 0x8B2C1D96168B8B9DULL,
0xF8932AD2C7F8F83FULL, 0x0C602824300C0C3CULL, 0x74872551CD7474B9ULL, 0x671F4F28816767E6ULL
};
static uint64_t T3[256] = {
0x676D05BD6868D568ULL, 0x1C09840E8D8D838DULL, 0x1E864C0FCACAC5CAULL, 0x52B3FE294D4D644DULL,
0xBF3744D17373A273ULL, 0x62A7EC314B4B7A4BULL, 0x4AB9F7254E4E6B4EULL, 0x4DFCD6A82A2A822AULL,
0xEEC21677D4D4A3D4ULL, 0xAAF1A35552520752ULL, 0x2DD4F2982626BE26ULL, 0xF18D3EF6B3B345B3ULL,
0x9AE5B14D54541954ULL, 0xF0445A781E1E661EULL, 0xC8564F6419197D19ULL, 0xF8425D7C1F1F631FULL,
0x0DCCEE882222AA22ULL, 0x180A090C03030F03ULL, 0x0A89CF0546464346ULL, 0xF58EB3F43D3DC93DULL,
0x75EEC3B42D2D992DULL, 0x6AA1EB354A4A7F4AULL, 0xA2F7A45153530253ULL, 0x6C2DAE368383B583ULL,
0x986A794C13135F13ULL, 0x241B91128A8A988AULL, 0xD19522E6B7B751B7ULL, 0xE6C41173D5D5A6D5ULL,
0x35DEFB942525B125ULL, 0xEF0B72F979798079ULL, 0xFB04F1F3F5F506F5ULL, 0x81A914CEBDBD73BDULL,
0xFACD957D58582558ULL, 0x65E2CDBC2F2F932FULL, 0x682E23340D0D390DULL, 0x100C0E0802020A02ULL,
0x3B54B993EDED7EEDULL, 0xB2FBAA5951510851ULL, 0x8463FD429E9EDC9EULL, 0x8866774411115511ULL,
0xC316E4EFF2F21DF2ULL, 0xED84BAF83E3EC63EULL, 0x92E3B64955551C55ULL, 0xCAD987655E5E3B5EULL,
0xC6DC0D63D1D1B2D1ULL, 0xB074625816164E16ULL, 0xFD88B4F03C3CCC3CULL, 0x17492F856666E366ULL,
0xA73D4DDD7070AD70ULL, 0xD2D38E695D5D345DULL, 0xCB10E3EBF3F318F3ULL, 0x1283C60945454C45ULL,
0x3A9DDD1D40405D40ULL, 0x2E925E17CCCCDBCCULL, 0x134AA287E8E86FE8ULL, 0xD45FCB6A9494FE94ULL,
0x8AE9BF4556561356ULL, 0x4030382008082808ULL, 0x3E9E501FCECED1CEULL, 0xD05C46681A1A721AULL,
0xCD9CA6E83A3AD23AULL, 0xDED6046FD2D2BDD2ULL, 0x5B7C9DA3E1E142E1ULL, 0xB6F8275BDFDF84DFULL,
0xC1992CEEB5B55BB5ULL, 0xDD90A8E03838D838ULL, 0x577917A56E6ECB6EULL, 0x70242A380E0E360EULL,
0x7B6481B3E5E556E5ULL, 0xF302F6F7F4F403F4ULL, 0x9B2CD5C3F9F93AF9ULL, 0x4433B5228686A486ULL,
0x1B4CA583E9E96AE9ULL, 0x42BFF0214F4F6E4FULL, 0xFECE187FD6D6A9D6ULL, 0x5C39BC2E8585AB85ULL,
0x05CAE98C2323AF23ULL, 0x3698571BCFCFD4CFULL, 0x8DAC9EC83232FA32ULL, 0xBC71E85E9999C799ULL,
0x95A697C43131F531ULL, 0xA0786C5014144414ULL, 0x19C36D82AEAE2CAEULL, 0x235EB09FEEEE71EEULL,
0x0E8A4207C8C8CFC8ULL, 0x7AADE53D48487548ULL, 0xD6D0036BD3D3B8D3ULL, 0x9DA090C03030F030ULL,
0x61E140BEA1A11FA1ULL, 0xE44BD9729292E092ULL, 0x329BDA1941415841ULL, 0xE18130FEB1B14FB1ULL,
0xC050486018187818ULL, 0x6EA26637C4C4F3C4ULL, 0x7DE8C4B02C2C9C2CULL, 0xAF3B4AD97171A871ULL,
0xB73143D57272A772ULL, 0x1A85C10D44444944ULL, 0xA87E6B5415154115ULL, 0xBB34C9D3FDFD2EFDULL,
0xA5B285DC3737EB37ULL, 0x99A31DC2BEBE7CBEULL, 0xC2DF80615F5F3E5FULL, 0x39DB7192AAAA38AAULL,
0xAC7DE6569B9BCD9BULL, 0x34179F1A88889288ULL, 0x8EEA3247D8D89FD8ULL, 0x31DD7696ABAB3DABULL,
0x3C11981E89899789ULL, 0x946FF34A9C9CD69CULL, 0x8326DCCFFAFA35FAULL, 0x275D3D9D6060FD60ULL,
0x0346AC8FEAEA65EAULL, 0x89AF13CABCBC76BCULL, 0x375133956262F762ULL, 0x602824300C0C3C0CULL,
0x3DD8FC902424B424ULL, 0x59F355A2A6A604A6ULL, 0x29D77F9AA8A832A8ULL, 0x3352BE97ECEC7BECULL,
0x1F4F28816767E667ULL, 0x1DC0E0802020A020ULL, 0x96E03B4BDBDB90DBULL, 0xC71569ED7C7C917CULL,
0x5DF0D8A028288828ULL, 0xA6F42953DDDD8EDDULL, 0x09CF638AACAC26ACULL, 0xE2C79C715B5B2A5BULL,
0xBDB88CD03434E434ULL, 0xD71967E57E7E9B7EULL, 0x8060704010105010ULL, 0xDB1CEDE3F1F112F1ULL,
0xFF077CF17B7B8A7BULL, 0x0C058A068F8F898FULL, 0x3F5734916363F263ULL, 0x69E747BAA0A01AA0ULL,
0x281E1B1405051105ULL, 0xA47BE1529A9AC89AULL, 0x2297D41143435243ULL, 0x9F2F58C17777B677ULL,
0x15C6E7842121A521ULL, 0x91A51AC6BFBF79BFULL, 0x25D2F59C2727BB27ULL, 0x48363F2409092D09ULL,
0x56B0732BC3C3E8C3ULL, 0x8C65FA469F9FD99FULL, 0xD99325E2B6B654B6ULL, 0xF6C81F7BD7D7ACD7ULL,
0x55F6DFA429298D29ULL, 0x5EB6742FC2C2EDC2ULL, 0x0B40AB8BEBEB60EBULL, 0x4EBA7A27C0C0E7C0ULL,
0x49FF5BAAA4A40EA4ULL, 0x2C1D96168B8B9D8BULL, 0x140F830A8C8C868CULL, 0xE84E53741D1D691DULL,
0x8B20DBCBFBFB30FBULL, 0xAB38C7DBFFFF24FFULL, 0x46BC7D23C1C1E2C1ULL, 0xF98B39F2B2B240B2ULL,
0xCC55C2669797F197ULL, 0x6DE4CAB82E2E962EULL, 0x932AD2C7F8F83FF8ULL, 0x0F4326896565EC65ULL,
0xE30EF8FFF6F609F6ULL, 0x8F2356C97575BC75ULL, 0x3812151C07071B07ULL, 0x20181C1004041404ULL,
0x72ABE23949497049ULL, 0x85AA99CC3333FF33ULL, 0x736286B7E4E453E4ULL, 0x86EC3543D9D99AD9ULL,
0xA1B108DEB9B967B9ULL, 0xCEDA0A67D0D0B7D0ULL, 0x2A91D31542425742ULL, 0x76A86F3BC7C7FCC7ULL,
0x477519AD6C6CC16CULL, 0xF447D77A9090EA90ULL, 0x0000000000000000ULL, 0x04038D028E8E8C8EULL,
0x5F7F10A16F6FCE6FULL, 0xBAFDAD5D50500D50ULL, 0x0806070401010501ULL, 0x66A46133C5C5F6C5ULL,
0x9EE63C4FDADA95DAULL, 0x028FC80147474647ULL, 0xE582BDFC3F3FC33FULL, 0x26945913CDCDDECDULL,
0x6F6B02B96969D069ULL, 0x79EB49B2A2A210A2ULL, 0x437694AFE2E24DE2ULL, 0xF7017BF57A7A8F7AULL,
0x51F552A6A7A701A7ULL, 0x7EAE683FC6C6F9C6ULL, 0xEC4DDE769393E593ULL, 0x78222D3C0F0F330FULL,
0x503C36280A0A220AULL, 0x3014121806061E06ULL, 0x636E88BFE6E659E6ULL, 0x45FAD1AC2B2B872BULL,
0xC453C5629696F496ULL, 0x71ED4EB6A3A315A3ULL, 0xE04854701C1C6C1CULL, 0x11C56A86AFAF29AFULL,
0x77610BB56A6ADF6AULL, 0x906C7E4812125A12ULL, 0x543FBB2A8484AE84ULL, 0xD596AFE43939DD39ULL,
0x6B688FBBE7E75CE7ULL, 0xE98737FAB0B04AB0ULL, 0x642BA9328282B082ULL, 0xEB08FFFBF7F70CF7ULL,
0xA33EC0DFFEFE21FEULL, 0x9C69F44E9D9DD39DULL, 0x4C35B2268787A187ULL, 0xDAD5896D5C5C315CULL,
0x7C21A03E8181BF81ULL, 0xB5BE8BD43535E135ULL, 0xBEFE205FDEDE81DEULL, 0xC99F2BEAB4B45EB4ULL,
0x41F95CAEA5A50BA5ULL, 0xB332CED7FCFC2BFCULL, 0x7427A73A8080BA80ULL, 0x2B58B79BEFEF74EFULL,
0x16804B0BCBCBC0CBULL, 0xB1BD06D6BBBB6DBBULL, 0x7F670CB16B6BDA6BULL, 0x97295FC57676B376ULL,
0xB9BB01D2BABA68BAULL, 0xEAC19B755A5A2F5AULL, 0xCF136EE97D7D947DULL, 0xE70D75FD78788578ULL,
0x583A312C0B0B270BULL, 0xDC59CC6E9595FB95ULL, 0x4B7093ABE3E348E3ULL, 0x01C9648EADAD23ADULL,
0x872551CD7474B974ULL, 0xB477EF5A9898C298ULL, 0xC59AA1EC3B3BD73BULL, 0xADB482D83636EE36ULL,
0x0745218D6464E964ULL, 0x4F731EA96D6DC46DULL, 0xAEF22E57DCDC8BDCULL, 0xD31AEAE7F0F017F0ULL,
0xF2CB927959592059ULL, 0x21D1789EA9A937A9ULL, 0x5AB5F92D4C4C614CULL, 0xB872655C17174B17ULL,
0xDF1F60E17F7F9E7FULL, 0xFC41D07E9191EF91ULL, 0xA9B70FDAB8B862B8ULL, 0x068C4503C9C9CAC9ULL,
0x82EFB84157571657ULL, 0xD85A416C1B1B771BULL, 0x537A9AA7E0E047E0ULL, 0x2F5B3A996161F861ULL
};
static uint64_t T4[256] = {
0xD77F9AA8A832A829ULL, 0x97D4114343524322ULL, 0xDF80615F5F3E5FC2ULL, 0x14121806061E0630ULL,
0x670CB16B6BDA6B7FULL, 0x2356C97575BC758FULL, 0x7519AD6C6CC16C47ULL, 0xCB927959592059F2ULL,
0x3B4AD97171A871AFULL, 0xF8275BDFDF84DFB6ULL, 0x35B2268787A1874CULL, 0x59CC6E9595FB95DCULL,
0x72655C17174B17B8ULL, 0x1AEAE7F0F017F0D3ULL, 0xEA3247D8D89FD88EULL, 0x363F2409092D0948ULL,
0x731EA96D6DC46D4FULL, 0x10E3EBF3F318F3CBULL, 0x4E53741D1D691DE8ULL, 0x804B0BCBCBC0CB16ULL,
0x8C4503C9C9CAC906ULL, 0xB3FE294D4D644D52ULL, 0xE8C4B02C2C9C2C7DULL, 0xC56A86AFAF29AF11ULL,
0x0B72F979798079EFULL, 0x7A9AA7E0E047E053ULL, 0x55C2669797F197CCULL, 0x34C9D3FDFD2EFDBBULL,
0x7F10A16F6FCE6F5FULL, 0xA7EC314B4B7A4B62ULL, 0x83C60945454C4512ULL, 0x96AFE43939DD39D5ULL,
0x84BAF83E3EC63EEDULL, 0xF42953DDDD8EDDA6ULL, 0xED4EB6A3A315A371ULL, 0xBFF0214F4F6E4F42ULL,
0x9F2BEAB4B45EB4C9ULL, 0x9325E2B6B654B6D9ULL, 0x7BE1529A9AC89AA4ULL, 0x242A380E0E360E70ULL,
0x425D7C1F1F631FF8ULL, 0xA51AC6BFBF79BF91ULL, 0x7E6B5415154115A8ULL, 0x7C9DA3E1E142E15BULL,
0xABE2394949704972ULL, 0xD6046FD2D2BDD2DEULL, 0x4DDE769393E593ECULL, 0xAE683FC6C6F9C67EULL,
0x4BD9729292E092E4ULL, 0x3143D57272A772B7ULL, 0x63FD429E9EDC9E84ULL, 0x5B3A996161F8612FULL,
0xDC0D63D1D1B2D1C6ULL, 0x5734916363F2633FULL, 0x26DCCFFAFA35FA83ULL, 0x5EB09FEEEE71EE23ULL,
0x02F6F7F4F403F4F3ULL, 0x564F6419197D19C8ULL, 0xC41173D5D5A6D5E6ULL, 0xC9648EADAD23AD01ULL,
0xCD957D58582558FAULL, 0xFF5BAAA4A40EA449ULL, 0xBD06D6BBBB6DBBB1ULL, 0xE140BEA1A11FA161ULL,
0xF22E57DCDC8BDCAEULL, 0x16E4EFF2F21DF2C3ULL, 0x2DAE368383B5836CULL, 0xB285DC3737EB37A5ULL,
0x91D315424257422AULL, 0x6286B7E4E453E473ULL, 0x017BF57A7A8F7AF7ULL, 0xAC9EC83232FA328DULL,
0x6FF34A9C9CD69C94ULL, 0x925E17CCCCDBCC2EULL, 0xDD7696ABAB3DAB31ULL, 0xA1EB354A4A7F4A6AULL,
0x058A068F8F898F0CULL, 0x7917A56E6ECB6E57ULL, 0x181C100404140420ULL, 0xD2F59C2727BB2725ULL,
0xE4CAB82E2E962E6DULL, 0x688FBBE7E75CE76BULL, 0x7694AFE2E24DE243ULL, 0xC19B755A5A2F5AEAULL,
0x53C5629696F496C4ULL, 0x74625816164E16B0ULL, 0xCAE98C2323AF2305ULL, 0xFAD1AC2B2B872B45ULL,
0xB6742FC2C2EDC25EULL, 0x4326896565EC650FULL, 0x492F856666E36617ULL, 0x222D3C0F0F330F78ULL,
0xAF13CABCBC76BC89ULL, 0xD1789EA9A937A921ULL, 0x8FC8014747464702ULL, 0x9BDA194141584132ULL,
0xB88CD03434E434BDULL, 0xADE53D484875487AULL, 0x32CED7FCFC2BFCB3ULL, 0x9522E6B7B751B7D1ULL,
0x610BB56A6ADF6A77ULL, 0x179F1A8888928834ULL, 0xF95CAEA5A50BA541ULL, 0xF7A45153530253A2ULL,
0x33B5228686A48644ULL, 0x2CD5C3F9F93AF99BULL, 0xC79C715B5B2A5BE2ULL, 0xE03B4BDBDB90DB96ULL,
0x90A8E03838D838DDULL, 0x077CF17B7B8A7BFFULL, 0xB0732BC3C3E8C356ULL, 0x445A781E1E661EF0ULL,
0xCCEE882222AA220DULL, 0xAA99CC3333FF3385ULL, 0xD8FC902424B4243DULL, 0xF0D8A0282888285DULL,
0xB482D83636EE36ADULL, 0xA86F3BC7C7FCC776ULL, 0x8B39F2B2B240B2F9ULL, 0x9AA1EC3B3BD73BC5ULL,
0x038D028E8E8C8E04ULL, 0x2F58C17777B6779FULL, 0xBB01D2BABA68BAB9ULL, 0x04F1F3F5F506F5FBULL,
0x786C5014144414A0ULL, 0x65FA469F9FD99F8CULL, 0x3038200808280840ULL, 0xE3B64955551C5592ULL,
0x7DE6569B9BCD9BACULL, 0xB5F92D4C4C614C5AULL, 0x3EC0DFFEFE21FEA3ULL, 0x5D3D9D6060FD6027ULL,
0xD5896D5C5C315CDAULL, 0xE63C4FDADA95DA9EULL, 0x50486018187818C0ULL, 0x89CF05464643460AULL,
0x945913CDCDDECD26ULL, 0x136EE97D7D947DCFULL, 0xC6E7842121A52115ULL, 0x8737FAB0B04AB0E9ULL,
0x82BDFC3F3FC33FE5ULL, 0x5A416C1B1B771BD8ULL, 0x11981E898997893CULL, 0x38C7DBFFFF24FFABULL,
0x40AB8BEBEB60EB0BULL, 0x3FBB2A8484AE8454ULL, 0x6B02B96969D0696FULL, 0x9CA6E83A3AD23ACDULL,
0x69F44E9D9DD39D9CULL, 0xC81F7BD7D7ACD7F6ULL, 0xD0036BD3D3B8D3D6ULL, 0x3D4DDD7070AD70A7ULL,
0x4F28816767E6671FULL, 0x9DDD1D40405D403AULL, 0x992CEEB5B55BB5C1ULL, 0xFE205FDEDE81DEBEULL,
0xD38E695D5D345DD2ULL, 0xA090C03030F0309DULL, 0x41D07E9191EF91FCULL, 0x8130FEB1B14FB1E1ULL,
0x0D75FD78788578E7ULL, 0x6677441111551188ULL, 0x0607040101050108ULL, 0x6481B3E5E556E57BULL,
0x0000000000000000ULL, 0x6D05BD6868D56867ULL, 0x77EF5A9898C298B4ULL, 0xE747BAA0A01AA069ULL,
0xA46133C5C5F6C566ULL, 0x0C0E0802020A0210ULL, 0xF355A2A6A604A659ULL, 0x2551CD7474B97487ULL,
0xEEC3B42D2D992D75ULL, 0x3A312C0B0B270B58ULL, 0xEB49B2A2A210A279ULL, 0x295FC57676B37697ULL,
0x8D3EF6B3B345B3F1ULL, 0xA31DC2BEBE7CBE99ULL, 0x9E501FCECED1CE3EULL, 0xA914CEBDBD73BD81ULL,
0xC36D82AEAE2CAE19ULL, 0x4CA583E9E96AE91BULL, 0x1B91128A8A988A24ULL, 0xA697C43131F53195ULL,
0x4854701C1C6C1CE0ULL, 0x52BE97ECEC7BEC33ULL, 0x1CEDE3F1F112F1DBULL, 0x71E85E9999C799BCULL,
0x5FCB6A9494FE94D4ULL, 0xDB7192AAAA38AA39ULL, 0x0EF8FFF6F609F6E3ULL, 0xD4F2982626BE262DULL,
0xE2CDBC2F2F932F65ULL, 0x58B79BEFEF74EF2BULL, 0x4AA287E8E86FE813ULL, 0x0F830A8C8C868C14ULL,
0xBE8BD43535E135B5ULL, 0x0A090C03030F0318ULL, 0xC21677D4D4A3D4EEULL, 0x1F60E17F7F9E7FDFULL,
0x20DBCBFBFB30FB8BULL, 0x1E1B140505110528ULL, 0xBC7D23C1C1E2C146ULL, 0xD987655E5E3B5ECAULL,
0x47D77A9090EA90F4ULL, 0xC0E0802020A0201DULL, 0x8EB3F43D3DC93DF5ULL, 0x2BA9328282B08264ULL,
0x08FFFBF7F70CF7EBULL, 0x46AC8FEAEA65EA03ULL, 0x3C36280A0A220A50ULL, 0x2E23340D0D390D68ULL,
0x1967E57E7E9B7ED7ULL, 0x2AD2C7F8F83FF893ULL, 0xFDAD5D50500D50BAULL, 0x5C46681A1A721AD0ULL,
0xA26637C4C4F3C46EULL, 0x12151C07071B0738ULL, 0xEFB8415757165782ULL, 0xB70FDAB8B862B8A9ULL,
0x88B4F03C3CCC3CFDULL, 0x5133956262F76237ULL, 0x7093ABE3E348E34BULL, 0x8A4207C8C8CFC80EULL,
0xCF638AACAC26AC09ULL, 0xF1A35552520752AAULL, 0x45218D6464E96407ULL, 0x6070401010501080ULL,
0xDA0A67D0D0B7D0CEULL, 0xEC3543D9D99AD986ULL, 0x6A794C13135F1398ULL, 0x2824300C0C3C0C60ULL,
0x6C7E4812125A1290ULL, 0xF6DFA429298D2955ULL, 0xFBAA5951510851B2ULL, 0xB108DEB9B967B9A1ULL,
0x98571BCFCFD4CF36ULL, 0xCE187FD6D6A9D6FEULL, 0x3744D17373A273BFULL, 0x09840E8D8D838D1CULL,
0x21A03E8181BF817CULL, 0xE5B14D545419549AULL, 0xBA7A27C0C0E7C04EULL, 0x54B993EDED7EED3BULL,
0xB9F7254E4E6B4E4AULL, 0x85C10D444449441AULL, 0xF552A6A7A701A751ULL, 0xFCD6A82A2A822A4DULL,
0x39BC2E8585AB855CULL, 0xDEFB942525B12535ULL, 0x6E88BFE6E659E663ULL, 0x864C0FCACAC5CA1EULL,
0x1569ED7C7C917CC7ULL, 0x1D96168B8B9D8B2CULL, 0xE9BF45565613568AULL, 0x27A73A8080BA8074ULL
};
static uint64_t T5[256] = {
0x501FCECED1CE3E9EULL, 0x06D6BBBB6DBBB1BDULL, 0xAB8BEBEB60EB0B40ULL, 0xD9729292E092E44BULL,
0xAC8FEAEA65EA0346ULL, 0x4B0BCBCBC0CB1680ULL, 0x794C13135F13986AULL, 0x7D23C1C1E2C146BCULL,
0xA583E9E96AE91B4CULL, 0xA6E83A3AD23ACD9CULL, 0x187FD6D6A9D6FECEULL, 0x39F2B2B240B2F98BULL,
0x046FD2D2BDD2DED6ULL, 0xD77A9090EA90F447ULL, 0x655C17174B17B872ULL, 0xD2C7F8F83FF8932AULL,
0xD315424257422A91ULL, 0x6B5415154115A87EULL, 0xBF45565613568AE9ULL, 0x2BEAB4B45EB4C99FULL,
0x26896565EC650F43ULL, 0x54701C1C6C1CE048ULL, 0x9F1A888892883417ULL, 0xD411434352432297ULL,
0x6133C5C5F6C566A4ULL, 0x896D5C5C315CDAD5ULL, 0x82D83636EE36ADB4ULL, 0x01D2BABA68BAB9BBULL,
0xF1F3F5F506F5FB04ULL, 0xB8415757165782EFULL, 0x28816767E6671F4FULL, 0x840E8D8D838D1C09ULL,
0x97C43131F53195A6ULL, 0xF8FFF6F609F6E30EULL, 0x218D6464E9640745ULL, 0x957D58582558FACDULL,
0xFD429E9EDC9E8463ULL, 0xF6F7F4F403F4F302ULL, 0xEE882222AA220DCCULL, 0x7192AAAA38AA39DBULL,
0x56C97575BC758F23ULL, 0x2D3C0F0F330F7822ULL, 0x0E0802020A02100CULL, 0x30FEB1B14FB1E181ULL,
0x275BDFDF84DFB6F8ULL, 0x1EA96D6DC46D4F73ULL, 0x44D17373A273BF37ULL, 0xFE294D4D644D52B3ULL,
0x69ED7C7C917CC715ULL, 0xF2982626BE262DD4ULL, 0xCAB82E2E962E6DE4ULL, 0xFFFBF7F70CF7EB08ULL,
0x3820080828084030ULL, 0x8E695D5D345DD2D3ULL, 0xC10D444449441A85ULL, 0xBAF83E3EC63EED84ULL,
0xFA469F9FD99F8C65ULL, 0x6C5014144414A078ULL, 0x4207C8C8CFC80E8AULL, 0x6D82AEAE2CAE19C3ULL,
0xB14D545419549AE5ULL, 0x7040101050108060ULL, 0x3247D8D89FD88EEAULL, 0x13CABCBC76BC89AFULL,
0x46681A1A721AD05CULL, 0x0CB16B6BDA6B7F67ULL, 0x02B96969D0696F6BULL, 0xE3EBF3F318F3CB10ULL,
0x14CEBDBD73BD81A9ULL, 0x99CC3333FF3385AAULL, 0x7696ABAB3DAB31DDULL, 0xDCCFFAFA35FA8326ULL,
0x0D63D1D1B2D1C6DCULL, 0xE6569B9BCD9BAC7DULL, 0x05BD6868D568676DULL, 0xF7254E4E6B4E4AB9ULL,
0x625816164E16B074ULL, 0xCC6E9595FB95DC59ULL, 0xD07E9191EF91FC41ULL, 0xB09FEEEE71EE235EULL,
0xF92D4C4C614C5AB5ULL, 0x34916363F2633F57ULL, 0x8D028E8E8C8E0403ULL, 0x9C715B5B2A5BE2C7ULL,
0x5E17CCCCDBCC2E92ULL, 0xB4F03C3CCC3CFD88ULL, 0x4F6419197D19C856ULL, 0x40BEA1A11FA161E1ULL,
0xA03E8181BF817C21ULL, 0xE2394949704972ABULL, 0x7CF17B7B8A7BFF07ULL, 0x3543D9D99AD986ECULL,
0x10A16F6FCE6F5F7FULL, 0x85DC3737EB37A5B2ULL, 0x3D9D6060FD60275DULL, 0x4C0FCACAC5CA1E86ULL,
0x8FBBE7E75CE76B68ULL, 0xD1AC2B2B872B45FAULL, 0xE53D484875487AADULL, 0xC9D3FDFD2EFDBB34ULL,
0xC5629696F496C453ULL, 0xC60945454C451283ULL, 0xCED7FCFC2BFCB332ULL, 0xDA1941415841329BULL,
0x7E4812125A12906CULL, 0x23340D0D390D682EULL, 0x72F979798079EF0BULL, 0x81B3E5E556E57B64ULL,
0x981E898997893C11ULL, 0x830A8C8C868C140FULL, 0x93ABE3E348E34B70ULL, 0xE0802020A0201DC0ULL,
0x90C03030F0309DA0ULL, 0x2E57DCDC8BDCAEF2ULL, 0x22E6B7B751B7D195ULL, 0x19AD6C6CC16C4775ULL,
0xEB354A4A7F4A6AA1ULL, 0x2CEEB5B55BB5C199ULL, 0xBDFC3F3FC33FE582ULL, 0xC2669797F197CC55ULL,
0x1677D4D4A3D4EEC2ULL, 0x33956262F7623751ULL, 0xC3B42D2D992D75EEULL, 0x121806061E063014ULL,
0x5BAAA4A40EA449FFULL, 0x5CAEA5A50BA541F9ULL, 0xAE368383B5836C2DULL, 0x80615F5F3E5FC2DFULL,
0xD6A82A2A822A4DFCULL, 0x3C4FDADA95DA9EE6ULL, 0x4503C9C9CAC9068CULL, 0x0000000000000000ULL,
0x67E57E7E9B7ED719ULL, 0x49B2A2A210A279EBULL, 0xB64955551C5592E3ULL, 0x1AC6BFBF79BF91A5ULL,
0x7744111155118866ULL, 0x1173D5D5A6D5E6C4ULL, 0xF34A9C9CD69C946FULL, 0x571BCFCFD4CF3698ULL,
0x2A380E0E360E7024ULL, 0x36280A0A220A503CULL, 0xB3F43D3DC93DF58EULL, 0xAA5951510851B2FBULL,
0x6EE97D7D947DCF13ULL, 0xDE769393E593EC4DULL, 0x416C1B1B771BD85AULL, 0xC0DFFEFE21FEA33EULL,
0x6637C4C4F3C46EA2ULL, 0xC80147474647028FULL, 0x3F2409092D094836ULL, 0xB5228686A4864433ULL,
0x312C0B0B270B583AULL, 0x8A068F8F898F0C05ULL, 0xF44E9D9DD39D9C69ULL, 0x0BB56A6ADF6A7761ULL,
0x151C07071B073812ULL, 0x08DEB9B967B9A1B1ULL, 0x37FAB0B04AB0E987ULL, 0xEF5A9898C298B477ULL,
0x486018187818C050ULL, 0x9EC83232FA328DACULL, 0x4AD97171A871AF3BULL, 0xEC314B4B7A4B62A7ULL,
0xB79BEFEF74EF2B58ULL, 0xA1EC3B3BD73BC59AULL, 0x4DDD7070AD70A73DULL, 0x47BAA0A01AA069E7ULL,
0x86B7E4E453E47362ULL, 0xDD1D40405D403A9DULL, 0xC7DBFFFF24FFAB38ULL, 0x732BC3C3E8C356B0ULL,
0x789EA9A937A921D1ULL, 0x88BFE6E659E6636EULL, 0x75FD78788578E70DULL, 0xD5C3F9F93AF99B2CULL,
0x96168B8B9D8B2C1DULL, 0xCF05464643460A89ULL, 0xA73A8080BA807427ULL, 0x5A781E1E661EF044ULL,
0xA8E03838D838DD90ULL, 0x9DA3E1E142E15B7CULL, 0x0FDAB8B862B8A9B7ULL, 0x7F9AA8A832A829D7ULL,
0x9AA7E0E047E0537AULL, 0x24300C0C3C0C6028ULL, 0xE98C2323AF2305CAULL, 0x5FC57676B3769729ULL,
0x53741D1D691DE84EULL, 0xFB942525B12535DEULL, 0xFC902424B4243DD8ULL, 0x1B1405051105281EULL,
0xEDE3F1F112F1DB1CULL, 0x17A56E6ECB6E5779ULL, 0xCB6A9494FE94D45FULL, 0xD8A0282888285DF0ULL,
0xE1529A9AC89AA47BULL, 0xBB2A8484AE84543FULL, 0xA287E8E86FE8134AULL, 0x4EB6A3A315A371EDULL,
0xF0214F4F6E4F42BFULL, 0x58C17777B6779F2FULL, 0x036BD3D3B8D3D6D0ULL, 0xBC2E8585AB855C39ULL,
0x94AFE2E24DE24376ULL, 0xA35552520752AAF1ULL, 0xE4EFF2F21DF2C316ULL, 0xA9328282B082642BULL,
0xAD5D50500D50BAFDULL, 0x7BF57A7A8F7AF701ULL, 0xCDBC2F2F932F65E2ULL, 0x51CD7474B9748725ULL,
0xA45153530253A2F7ULL, 0x3EF6B3B345B3F18DULL, 0x3A996161F8612F5BULL, 0x6A86AFAF29AF11C5ULL,
0xAFE43939DD39D596ULL, 0x8BD43535E135B5BEULL, 0x205FDEDE81DEBEFEULL, 0x5913CDCDDECD2694ULL,
0x5D7C1F1F631FF842ULL, 0xE85E9999C799BC71ULL, 0x638AACAC26AC09CFULL, 0x648EADAD23AD01C9ULL,
0x43D57272A772B731ULL, 0xC4B02C2C9C2C7DE8ULL, 0x2953DDDD8EDDA6F4ULL, 0x0A67D0D0B7D0CEDAULL,
0xB2268787A1874C35ULL, 0x1DC2BEBE7CBE99A3ULL, 0x87655E5E3B5ECAD9ULL, 0x55A2A6A604A659F3ULL,
0xBE97ECEC7BEC3352ULL, 0x1C10040414042018ULL, 0x683FC6C6F9C67EAEULL, 0x090C03030F03180AULL,
0x8CD03434E434BDB8ULL, 0xDBCBFBFB30FB8B20ULL, 0x3B4BDBDB90DB96E0ULL, 0x927959592059F2CBULL,
0x25E2B6B654B6D993ULL, 0x742FC2C2EDC25EB6ULL, 0x0704010105010806ULL, 0xEAE7F0F017F0D31AULL,
0x9B755A5A2F5AEAC1ULL, 0xB993EDED7EED3B54ULL, 0x52A6A7A701A751F5ULL, 0x2F856666E3661749ULL,
0xE7842121A52115C6ULL, 0x60E17F7F9E7FDF1FULL, 0x91128A8A988A241BULL, 0xF59C2727BB2725D2ULL,
0x6F3BC7C7FCC776A8ULL, 0x7A27C0C0E7C04EBAULL, 0xDFA429298D2955F6ULL, 0x1F7BD7D7ACD7F6C8ULL
};
static uint64_t T6[256] = {
0x769393E593EC4DDEULL, 0x43D9D99AD986EC35ULL, 0x529A9AC89AA47BE1ULL, 0xEEB5B55BB5C1992CULL,
0x5A9898C298B477EFULL, 0x882222AA220DCCEEULL, 0x0945454C451283C6ULL, 0xD7FCFC2BFCB332CEULL,
0xD2BABA68BAB9BB01ULL, 0xB56A6ADF6A77610BULL, 0x5BDFDF84DFB6F827ULL, 0x0802020A02100C0EULL,
0x469F9FD99F8C65FAULL, 0x57DCDC8BDCAEF22EULL, 0x5951510851B2FBAAULL, 0x7959592059F2CB92ULL,
0x354A4A7F4A6AA1EBULL, 0x5C17174B17B87265ULL, 0xAC2B2B872B45FAD1ULL, 0x2FC2C2EDC25EB674ULL,
0x6A9494FE94D45FCBULL, 0xF7F4F403F4F302F6ULL, 0xD6BBBB6DBBB1BD06ULL, 0xB6A3A315A371ED4EULL,
0x956262F762375133ULL, 0xB7E4E453E4736286ULL, 0xD97171A871AF3B4AULL, 0x77D4D4A3D4EEC216ULL,
0x13CDCDDECD269459ULL, 0xDD7070AD70A73D4DULL, 0x5816164E16B07462ULL, 0xA3E1E142E15B7C9DULL,
0x394949704972ABE2ULL, 0xF03C3CCC3CFD88B4ULL, 0x27C0C0E7C04EBA7AULL, 0x47D8D89FD88EEA32ULL,
0x6D5C5C315CDAD589ULL, 0x569B9BCD9BAC7DE6ULL, 0x8EADAD23AD01C964ULL, 0x2E8585AB855C39BCULL,
0x5153530253A2F7A4ULL, 0xBEA1A11FA161E140ULL, 0xF57A7A8F7AF7017BULL, 0x07C8C8CFC80E8A42ULL,
0xB42D2D992D75EEC3ULL, 0xA7E0E047E0537A9AULL, 0x63D1D1B2D1C6DC0DULL, 0xD57272A772B73143ULL,
0xA2A6A604A659F355ULL, 0xB02C2C9C2C7DE8C4ULL, 0x37C4C4F3C46EA266ULL, 0xABE3E348E34B7093ULL,
0xC57676B37697295FULL, 0xFD78788578E70D75ULL, 0xE6B7B751B7D19522ULL, 0xEAB4B45EB4C99F2BULL,
0x2409092D0948363FULL, 0xEC3B3BD73BC59AA1ULL, 0x380E0E360E70242AULL, 0x1941415841329BDAULL,
0x2D4C4C614C5AB5F9ULL, 0x5FDEDE81DEBEFE20ULL, 0xF2B2B240B2F98B39ULL, 0x7A9090EA90F447D7ULL,
0x942525B12535DEFBULL, 0xAEA5A50BA541F95CULL, 0x7BD7D7ACD7F6C81FULL, 0x0C03030F03180A09ULL,
0x4411115511886677ULL, 0x0000000000000000ULL, 0x2BC3C3E8C356B073ULL, 0xB82E2E962E6DE4CAULL,
0x729292E092E44BD9ULL, 0x9BEFEF74EF2B58B7ULL, 0x254E4E6B4E4AB9F7ULL, 0x4812125A12906C7EULL,
0x4E9D9DD39D9C69F4ULL, 0xE97D7D947DCF136EULL, 0x0BCBCBC0CB16804BULL, 0xD43535E135B5BE8BULL,
0x4010105010806070ULL, 0x73D5D5A6D5E6C411ULL, 0x214F4F6E4F42BFF0ULL, 0x429E9EDC9E8463FDULL,
0x294D4D644D52B3FEULL, 0x9EA9A937A921D178ULL, 0x4955551C5592E3B6ULL, 0x3FC6C6F9C67EAE68ULL,
0x67D0D0B7D0CEDA0AULL, 0xF17B7B8A7BFF077CULL, 0x6018187818C05048ULL, 0x669797F197CC55C2ULL,
0x6BD3D3B8D3D6D003ULL, 0xD83636EE36ADB482ULL, 0xBFE6E659E6636E88ULL, 0x3D484875487AADE5ULL,
0x45565613568AE9BFULL, 0x3E8181BF817C21A0ULL, 0x068F8F898F0C058AULL, 0xC17777B6779F2F58ULL,
0x17CCCCDBCC2E925EULL, 0x4A9C9CD69C946FF3ULL, 0xDEB9B967B9A1B108ULL, 0xAFE2E24DE2437694ULL,
0x8AACAC26AC09CF63ULL, 0xDAB8B862B8A9B70FULL, 0xBC2F2F932F65E2CDULL, 0x5415154115A87E6BULL,
0xAAA4A40EA449FF5BULL, 0xED7C7C917CC71569ULL, 0x4FDADA95DA9EE63CULL, 0xE03838D838DD90A8ULL,
0x781E1E661EF0445AULL, 0x2C0B0B270B583A31ULL, 0x1405051105281E1BULL, 0x7FD6D6A9D6FECE18ULL,
0x5014144414A0786CULL, 0xA56E6ECB6E577917ULL, 0xAD6C6CC16C477519ULL, 0xE57E7E9B7ED71967ULL,
0x856666E36617492FULL, 0xD3FDFD2EFDBB34C9ULL, 0xFEB1B14FB1E18130ULL, 0xB3E5E556E57B6481ULL,
0x9D6060FD60275D3DULL, 0x86AFAF29AF11C56AULL, 0x655E5E3B5ECAD987ULL, 0xCC3333FF3385AA99ULL,
0x268787A1874C35B2ULL, 0x03C9C9CAC9068C45ULL, 0xE7F0F017F0D31AEAULL, 0x695D5D345DD2D38EULL,
0xA96D6DC46D4F731EULL, 0xFC3F3FC33FE582BDULL, 0x1A8888928834179FULL, 0x0E8D8D838D1C0984ULL,
0x3BC7C7FCC776A86FULL, 0xFBF7F70CF7EB08FFULL, 0x741D1D691DE84E53ULL, 0x83E9E96AE91B4CA5ULL,
0x97ECEC7BEC3352BEULL, 0x93EDED7EED3B54B9ULL, 0x3A8080BA807427A7ULL, 0xA429298D2955F6DFULL,
0x9C2727BB2725D2F5ULL, 0x1BCFCFD4CF369857ULL, 0x5E9999C799BC71E8ULL, 0x9AA8A832A829D77FULL,
0x5D50500D50BAFDADULL, 0x3C0F0F330F78222DULL, 0xDC3737EB37A5B285ULL, 0x902424B4243DD8FCULL,
0xA0282888285DF0D8ULL, 0xC03030F0309DA090ULL, 0x6E9595FB95DC59CCULL, 0x6FD2D2BDD2DED604ULL,
0xF83E3EC63EED84BAULL, 0x715B5B2A5BE2C79CULL, 0x1D40405D403A9DDDULL, 0x368383B5836C2DAEULL,
0xF6B3B345B3F18D3EULL, 0xB96969D0696F6B02ULL, 0x415757165782EFB8ULL, 0x7C1F1F631FF8425DULL,
0x1C07071B07381215ULL, 0x701C1C6C1CE04854ULL, 0x128A8A988A241B91ULL, 0xCABCBC76BC89AF13ULL,
0x802020A0201DC0E0ULL, 0x8BEBEB60EB0B40ABULL, 0x1FCECED1CE3E9E50ULL, 0x028E8E8C8E04038DULL,
0x96ABAB3DAB31DD76ULL, 0x9FEEEE71EE235EB0ULL, 0xC43131F53195A697ULL, 0xB2A2A210A279EB49ULL,
0xD17373A273BF3744ULL, 0xC3F9F93AF99B2CD5ULL, 0x0FCACAC5CA1E864CULL, 0xE83A3AD23ACD9CA6ULL,
0x681A1A721AD05C46ULL, 0xCBFBFB30FB8B20DBULL, 0x340D0D390D682E23ULL, 0x23C1C1E2C146BC7DULL,
0xDFFEFE21FEA33EC0ULL, 0xCFFAFA35FA8326DCULL, 0xEFF2F21DF2C316E4ULL, 0xA16F6FCE6F5F7F10ULL,
0xCEBDBD73BD81A914ULL, 0x629696F496C453C5ULL, 0x53DDDD8EDDA6F429ULL, 0x11434352432297D4ULL,
0x5552520752AAF1A3ULL, 0xE2B6B654B6D99325ULL, 0x2008082808403038ULL, 0xEBF3F318F3CB10E3ULL,
0x82AEAE2CAE19C36DULL, 0xC2BEBE7CBE99A31DULL, 0x6419197D19C8564FULL, 0x1E898997893C1198ULL,
0xC83232FA328DAC9EULL, 0x982626BE262DD4F2ULL, 0xFAB0B04AB0E98737ULL, 0x8FEAEA65EA0346ACULL,
0x314B4B7A4B62A7ECULL, 0x8D6464E964074521ULL, 0x2A8484AE84543FBBULL, 0x328282B082642BA9ULL,
0xB16B6BDA6B7F670CULL, 0xF3F5F506F5FB04F1ULL, 0xF979798079EF0B72ULL, 0xC6BFBF79BF91A51AULL,
0x0401010501080607ULL, 0x615F5F3E5FC2DF80ULL, 0xC97575BC758F2356ULL, 0x916363F2633F5734ULL,
0x6C1B1B771BD85A41ULL, 0x8C2323AF2305CAE9ULL, 0xF43D3DC93DF58EB3ULL, 0xBD6868D568676D05ULL,
0xA82A2A822A4DFCD6ULL, 0x896565EC650F4326ULL, 0x87E8E86FE8134AA2ULL, 0x7E9191EF91FC41D0ULL,
0xFFF6F609F6E30EF8ULL, 0xDBFFFF24FFAB38C7ULL, 0x4C13135F13986A79ULL, 0x7D58582558FACD95ULL,
0xE3F1F112F1DB1CEDULL, 0x0147474647028FC8ULL, 0x280A0A220A503C36ULL, 0xE17F7F9E7FDF1F60ULL,
0x33C5C5F6C566A461ULL, 0xA6A7A701A751F552ULL, 0xBBE7E75CE76B688FULL, 0x996161F8612F5B3AULL,
0x755A5A2F5AEAC19BULL, 0x1806061E06301412ULL, 0x05464643460A89CFULL, 0x0D444449441A85C1ULL,
0x15424257422A91D3ULL, 0x100404140420181CULL, 0xBAA0A01AA069E747ULL, 0x4BDBDB90DB96E03BULL,
0xE43939DD39D596AFULL, 0x228686A4864433B5ULL, 0x4D545419549AE5B1ULL, 0x92AAAA38AA39DB71ULL,
0x0A8C8C868C140F83ULL, 0xD03434E434BDB88CULL, 0x842121A52115C6E7ULL, 0x168B8B9D8B2C1D96ULL,
0xC7F8F83FF8932AD2ULL, 0x300C0C3C0C602824ULL, 0xCD7474B974872551ULL, 0x816767E6671F4F28ULL
};
static uint64_t T7[256] = {
0x6868D568676D05BDULL, 0x8D8D838D1C09840EULL, 0xCACAC5CA1E864C0FULL, 0x4D4D644D52B3FE29ULL,
0x7373A273BF3744D1ULL, 0x4B4B7A4B62A7EC31ULL, 0x4E4E6B4E4AB9F725ULL, 0x2A2A822A4DFCD6A8ULL,
0xD4D4A3D4EEC21677ULL, 0x52520752AAF1A355ULL, 0x2626BE262DD4F298ULL, 0xB3B345B3F18D3EF6ULL,
0x545419549AE5B14DULL, 0x1E1E661EF0445A78ULL, 0x19197D19C8564F64ULL, 0x1F1F631FF8425D7CULL,
0x2222AA220DCCEE88ULL, 0x03030F03180A090CULL, 0x464643460A89CF05ULL, 0x3D3DC93DF58EB3F4ULL,
0x2D2D992D75EEC3B4ULL, 0x4A4A7F4A6AA1EB35ULL, 0x53530253A2F7A451ULL, 0x8383B5836C2DAE36ULL,
0x13135F13986A794CULL, 0x8A8A988A241B9112ULL, 0xB7B751B7D19522E6ULL, 0xD5D5A6D5E6C41173ULL,
0x2525B12535DEFB94ULL, 0x79798079EF0B72F9ULL, 0xF5F506F5FB04F1F3ULL, 0xBDBD73BD81A914CEULL,
0x58582558FACD957DULL, 0x2F2F932F65E2CDBCULL, 0x0D0D390D682E2334ULL, 0x02020A02100C0E08ULL,
0xEDED7EED3B54B993ULL, 0x51510851B2FBAA59ULL, 0x9E9EDC9E8463FD42ULL, 0x1111551188667744ULL,
0xF2F21DF2C316E4EFULL, 0x3E3EC63EED84BAF8ULL, 0x55551C5592E3B649ULL, 0x5E5E3B5ECAD98765ULL,
0xD1D1B2D1C6DC0D63ULL, 0x16164E16B0746258ULL, 0x3C3CCC3CFD88B4F0ULL, 0x6666E36617492F85ULL,
0x7070AD70A73D4DDDULL, 0x5D5D345DD2D38E69ULL, 0xF3F318F3CB10E3EBULL, 0x45454C451283C609ULL,
0x40405D403A9DDD1DULL, 0xCCCCDBCC2E925E17ULL, 0xE8E86FE8134AA287ULL, 0x9494FE94D45FCB6AULL,
0x565613568AE9BF45ULL, 0x0808280840303820ULL, 0xCECED1CE3E9E501FULL, 0x1A1A721AD05C4668ULL,
0x3A3AD23ACD9CA6E8ULL, 0xD2D2BDD2DED6046FULL, 0xE1E142E15B7C9DA3ULL, 0xDFDF84DFB6F8275BULL,
0xB5B55BB5C1992CEEULL, 0x3838D838DD90A8E0ULL, 0x6E6ECB6E577917A5ULL, 0x0E0E360E70242A38ULL,
0xE5E556E57B6481B3ULL, 0xF4F403F4F302F6F7ULL, 0xF9F93AF99B2CD5C3ULL, 0x8686A4864433B522ULL,
0xE9E96AE91B4CA583ULL, 0x4F4F6E4F42BFF021ULL, 0xD6D6A9D6FECE187FULL, 0x8585AB855C39BC2EULL,
0x2323AF2305CAE98CULL, 0xCFCFD4CF3698571BULL, 0x3232FA328DAC9EC8ULL, 0x9999C799BC71E85EULL,
0x3131F53195A697C4ULL, 0x14144414A0786C50ULL, 0xAEAE2CAE19C36D82ULL, 0xEEEE71EE235EB09FULL,
0xC8C8CFC80E8A4207ULL, 0x484875487AADE53DULL, 0xD3D3B8D3D6D0036BULL, 0x3030F0309DA090C0ULL,
0xA1A11FA161E140BEULL, 0x9292E092E44BD972ULL, 0x41415841329BDA19ULL, 0xB1B14FB1E18130FEULL,
0x18187818C0504860ULL, 0xC4C4F3C46EA26637ULL, 0x2C2C9C2C7DE8C4B0ULL, 0x7171A871AF3B4AD9ULL,
0x7272A772B73143D5ULL, 0x444449441A85C10DULL, 0x15154115A87E6B54ULL, 0xFDFD2EFDBB34C9D3ULL,
0x3737EB37A5B285DCULL, 0xBEBE7CBE99A31DC2ULL, 0x5F5F3E5FC2DF8061ULL, 0xAAAA38AA39DB7192ULL,
0x9B9BCD9BAC7DE656ULL, 0x8888928834179F1AULL, 0xD8D89FD88EEA3247ULL, 0xABAB3DAB31DD7696ULL,
0x898997893C11981EULL, 0x9C9CD69C946FF34AULL, 0xFAFA35FA8326DCCFULL, 0x6060FD60275D3D9DULL,
0xEAEA65EA0346AC8FULL, 0xBCBC76BC89AF13CAULL, 0x6262F76237513395ULL, 0x0C0C3C0C60282430ULL,
0x2424B4243DD8FC90ULL, 0xA6A604A659F355A2ULL, 0xA8A832A829D77F9AULL, 0xECEC7BEC3352BE97ULL,
0x6767E6671F4F2881ULL, 0x2020A0201DC0E080ULL, 0xDBDB90DB96E03B4BULL, 0x7C7C917CC71569EDULL,
0x282888285DF0D8A0ULL, 0xDDDD8EDDA6F42953ULL, 0xACAC26AC09CF638AULL, 0x5B5B2A5BE2C79C71ULL,
0x3434E434BDB88CD0ULL, 0x7E7E9B7ED71967E5ULL, 0x1010501080607040ULL, 0xF1F112F1DB1CEDE3ULL,
0x7B7B8A7BFF077CF1ULL, 0x8F8F898F0C058A06ULL, 0x6363F2633F573491ULL, 0xA0A01AA069E747BAULL,
0x05051105281E1B14ULL, 0x9A9AC89AA47BE152ULL, 0x434352432297D411ULL, 0x7777B6779F2F58C1ULL,
0x2121A52115C6E784ULL, 0xBFBF79BF91A51AC6ULL, 0x2727BB2725D2F59CULL, 0x09092D0948363F24ULL,
0xC3C3E8C356B0732BULL, 0x9F9FD99F8C65FA46ULL, 0xB6B654B6D99325E2ULL, 0xD7D7ACD7F6C81F7BULL,
0x29298D2955F6DFA4ULL, 0xC2C2EDC25EB6742FULL, 0xEBEB60EB0B40AB8BULL, 0xC0C0E7C04EBA7A27ULL,
0xA4A40EA449FF5BAAULL, 0x8B8B9D8B2C1D9616ULL, 0x8C8C868C140F830AULL, 0x1D1D691DE84E5374ULL,
0xFBFB30FB8B20DBCBULL, 0xFFFF24FFAB38C7DBULL, 0xC1C1E2C146BC7D23ULL, 0xB2B240B2F98B39F2ULL,
0x9797F197CC55C266ULL, 0x2E2E962E6DE4CAB8ULL, 0xF8F83FF8932AD2C7ULL, 0x6565EC650F432689ULL,
0xF6F609F6E30EF8FFULL, 0x7575BC758F2356C9ULL, 0x07071B073812151CULL, 0x0404140420181C10ULL,
0x4949704972ABE239ULL, 0x3333FF3385AA99CCULL, 0xE4E453E4736286B7ULL, 0xD9D99AD986EC3543ULL,
0xB9B967B9A1B108DEULL, 0xD0D0B7D0CEDA0A67ULL, 0x424257422A91D315ULL, 0xC7C7FCC776A86F3BULL,
0x6C6CC16C477519ADULL, 0x9090EA90F447D77AULL, 0x0000000000000000ULL, 0x8E8E8C8E04038D02ULL,
0x6F6FCE6F5F7F10A1ULL, 0x50500D50BAFDAD5DULL, 0x0101050108060704ULL, 0xC5C5F6C566A46133ULL,
0xDADA95DA9EE63C4FULL, 0x47474647028FC801ULL, 0x3F3FC33FE582BDFCULL, 0xCDCDDECD26945913ULL,
0x6969D0696F6B02B9ULL, 0xA2A210A279EB49B2ULL, 0xE2E24DE2437694AFULL, 0x7A7A8F7AF7017BF5ULL,
0xA7A701A751F552A6ULL, 0xC6C6F9C67EAE683FULL, 0x9393E593EC4DDE76ULL, 0x0F0F330F78222D3CULL,
0x0A0A220A503C3628ULL, 0x06061E0630141218ULL, 0xE6E659E6636E88BFULL, 0x2B2B872B45FAD1ACULL,
0x9696F496C453C562ULL, 0xA3A315A371ED4EB6ULL, 0x1C1C6C1CE0485470ULL, 0xAFAF29AF11C56A86ULL,
0x6A6ADF6A77610BB5ULL, 0x12125A12906C7E48ULL, 0x8484AE84543FBB2AULL, 0x3939DD39D596AFE4ULL,
0xE7E75CE76B688FBBULL, 0xB0B04AB0E98737FAULL, 0x8282B082642BA932ULL, 0xF7F70CF7EB08FFFBULL,
0xFEFE21FEA33EC0DFULL, 0x9D9DD39D9C69F44EULL, 0x8787A1874C35B226ULL, 0x5C5C315CDAD5896DULL,
0x8181BF817C21A03EULL, 0x3535E135B5BE8BD4ULL, 0xDEDE81DEBEFE205FULL, 0xB4B45EB4C99F2BEAULL,
0xA5A50BA541F95CAEULL, 0xFCFC2BFCB332CED7ULL, 0x8080BA807427A73AULL, 0xEFEF74EF2B58B79BULL,
0xCBCBC0CB16804B0BULL, 0xBBBB6DBBB1BD06D6ULL, 0x6B6BDA6B7F670CB1ULL, 0x7676B37697295FC5ULL,
0xBABA68BAB9BB01D2ULL, 0x5A5A2F5AEAC19B75ULL, 0x7D7D947DCF136EE9ULL, 0x78788578E70D75FDULL,
0x0B0B270B583A312CULL, 0x9595FB95DC59CC6EULL, 0xE3E348E34B7093ABULL, 0xADAD23AD01C9648EULL,
0x7474B974872551CDULL, 0x9898C298B477EF5AULL, 0x3B3BD73BC59AA1ECULL, 0x3636EE36ADB482D8ULL,
0x6464E9640745218DULL, 0x6D6DC46D4F731EA9ULL, 0xDCDC8BDCAEF22E57ULL, 0xF0F017F0D31AEAE7ULL,
0x59592059F2CB9279ULL, 0xA9A937A921D1789EULL, 0x4C4C614C5AB5F92DULL, 0x17174B17B872655CULL,
0x7F7F9E7FDF1F60E1ULL, 0x9191EF91FC41D07EULL, 0xB8B862B8A9B70FDAULL, 0xC9C9CAC9068C4503ULL,
0x5757165782EFB841ULL, 0x1B1B771BD85A416CULL, 0xE0E047E0537A9AA7ULL, 0x6161F8612F5B3A99ULL
};
struct Dstu8845Ctx_st {
uint64_t S[16];
uint64_t r[2];
uint64_t key[8];
uint64_t iv[4];
uint8_t key_size; // Key size in bytes
};
static inline void next_stream(Dstu8845Ctx *ctx, uint64_t *out_stream)
{
uint64_t fsmtmp;
ctx->S[0] = a_mul(ctx->S[0]) ^ ctx->S[13] ^ ainv_mul(ctx->S[11]);
fsmtmp = ctx->r[1] + ctx->S[13];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[0] = (ctx->r[0] + ctx->S[0]) ^ ctx->r[1] ^ ctx->S[1];
ctx->S[1] = a_mul(ctx->S[1]) ^ ctx->S[14] ^ ainv_mul(ctx->S[12]);
fsmtmp = ctx->r[1] + ctx->S[14];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[1] = (ctx->r[0] + ctx->S[1]) ^ ctx->r[1] ^ ctx->S[2];
ctx->S[2] = a_mul(ctx->S[2]) ^ ctx->S[15] ^ ainv_mul(ctx->S[13]);
fsmtmp = ctx->r[1] + ctx->S[15];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[2] = (ctx->r[0] + ctx->S[2]) ^ ctx->r[1] ^ ctx->S[3];
ctx->S[3] = a_mul(ctx->S[3]) ^ ctx->S[0] ^ ainv_mul(ctx->S[14]);
fsmtmp = ctx->r[1] + ctx->S[0];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[3] = (ctx->r[0] + ctx->S[3]) ^ ctx->r[1] ^ ctx->S[4];
ctx->S[4] = a_mul(ctx->S[4]) ^ ctx->S[1] ^ ainv_mul(ctx->S[15]);
fsmtmp = ctx->r[1] + ctx->S[1];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[4] = (ctx->r[0] + ctx->S[4]) ^ ctx->r[1] ^ ctx->S[5];
ctx->S[5] = a_mul(ctx->S[5]) ^ ctx->S[2] ^ ainv_mul(ctx->S[0]);
fsmtmp = ctx->r[1] + ctx->S[2];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[5] = (ctx->r[0] + ctx->S[5]) ^ ctx->r[1] ^ ctx->S[6];
ctx->S[6] = a_mul(ctx->S[6]) ^ ctx->S[3] ^ ainv_mul(ctx->S[1]);
fsmtmp = ctx->r[1] + ctx->S[3];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[6] = (ctx->r[0] + ctx->S[6]) ^ ctx->r[1] ^ ctx->S[7];
ctx->S[7] = a_mul(ctx->S[7]) ^ ctx->S[4] ^ ainv_mul(ctx->S[2]);
fsmtmp = ctx->r[1] + ctx->S[4];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[7] = (ctx->r[0] + ctx->S[7]) ^ ctx->r[1] ^ ctx->S[8];
ctx->S[8] = a_mul(ctx->S[8]) ^ ctx->S[5] ^ ainv_mul(ctx->S[3]);
fsmtmp = ctx->r[1] + ctx->S[5];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[8] = (ctx->r[0] + ctx->S[8]) ^ ctx->r[1] ^ ctx->S[9];
ctx->S[9] = a_mul(ctx->S[9]) ^ ctx->S[6] ^ ainv_mul(ctx->S[4]);
fsmtmp = ctx->r[1] + ctx->S[6];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[9] = (ctx->r[0] + ctx->S[9]) ^ ctx->r[1] ^ ctx->S[10];
ctx->S[10] = a_mul(ctx->S[10]) ^ ctx->S[7] ^ ainv_mul(ctx->S[5]);
fsmtmp = ctx->r[1] + ctx->S[7];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[10] = (ctx->r[0] + ctx->S[10]) ^ ctx->r[1] ^ ctx->S[11];
ctx->S[11] = a_mul(ctx->S[11]) ^ ctx->S[8] ^ ainv_mul(ctx->S[6]);
fsmtmp = ctx->r[1] + ctx->S[8];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[11] = (ctx->r[0] + ctx->S[11]) ^ ctx->r[1] ^ ctx->S[12];
ctx->S[12] = a_mul(ctx->S[12]) ^ ctx->S[9] ^ ainv_mul(ctx->S[7]);
fsmtmp = ctx->r[1] + ctx->S[9];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[12] = (ctx->r[0] + ctx->S[12]) ^ ctx->r[1] ^ ctx->S[13];
ctx->S[13] = a_mul(ctx->S[13]) ^ ctx->S[10] ^ ainv_mul(ctx->S[8]);
fsmtmp = ctx->r[1] + ctx->S[10];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[13] = (ctx->r[0] + ctx->S[13]) ^ ctx->r[1] ^ ctx->S[14];
ctx->S[14] = a_mul(ctx->S[14]) ^ ctx->S[11] ^ ainv_mul(ctx->S[9]);
fsmtmp = ctx->r[1] + ctx->S[11];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[14] = (ctx->r[0] + ctx->S[14]) ^ ctx->r[1] ^ ctx->S[15];
ctx->S[15] = a_mul(ctx->S[15]) ^ ctx->S[12] ^ ainv_mul(ctx->S[10]);
fsmtmp = ctx->r[1] + ctx->S[12];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out_stream[15] = (ctx->r[0] + ctx->S[15]) ^ ctx->r[1] ^ ctx->S[0];
}
static inline void next_stream_full_crypt(Dstu8845Ctx *ctx, uint64_t *in, uint64_t *out)
{
uint64_t fsmtmp;
ctx->S[0] = a_mul(ctx->S[0]) ^ ctx->S[13] ^ ainv_mul(ctx->S[11]);
fsmtmp = ctx->r[1] + ctx->S[13];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[0] = in[0] ^ (ctx->r[0] + ctx->S[0]) ^ ctx->r[1] ^ ctx->S[1];
ctx->S[1] = a_mul(ctx->S[1]) ^ ctx->S[14] ^ ainv_mul(ctx->S[12]);
fsmtmp = ctx->r[1] + ctx->S[14];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[1] = in[1] ^ (ctx->r[0] + ctx->S[1]) ^ ctx->r[1] ^ ctx->S[2];
ctx->S[2] = a_mul(ctx->S[2]) ^ ctx->S[15] ^ ainv_mul(ctx->S[13]);
fsmtmp = ctx->r[1] + ctx->S[15];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[2] = in[2] ^ (ctx->r[0] + ctx->S[2]) ^ ctx->r[1] ^ ctx->S[3];
ctx->S[3] = a_mul(ctx->S[3]) ^ ctx->S[0] ^ ainv_mul(ctx->S[14]);
fsmtmp = ctx->r[1] + ctx->S[0];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[3] = in[3] ^ (ctx->r[0] + ctx->S[3]) ^ ctx->r[1] ^ ctx->S[4];
ctx->S[4] = a_mul(ctx->S[4]) ^ ctx->S[1] ^ ainv_mul(ctx->S[15]);
fsmtmp = ctx->r[1] + ctx->S[1];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[4] = in[4] ^ (ctx->r[0] + ctx->S[4]) ^ ctx->r[1] ^ ctx->S[5];
ctx->S[5] = a_mul(ctx->S[5]) ^ ctx->S[2] ^ ainv_mul(ctx->S[0]);
fsmtmp = ctx->r[1] + ctx->S[2];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[5] = in[5] ^(ctx->r[0] + ctx->S[5]) ^ ctx->r[1] ^ ctx->S[6];
ctx->S[6] = a_mul(ctx->S[6]) ^ ctx->S[3] ^ ainv_mul(ctx->S[1]);
fsmtmp = ctx->r[1] + ctx->S[3];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[6] = in[6] ^(ctx->r[0] + ctx->S[6]) ^ ctx->r[1] ^ ctx->S[7];
ctx->S[7] = a_mul(ctx->S[7]) ^ ctx->S[4] ^ ainv_mul(ctx->S[2]);
fsmtmp = ctx->r[1] + ctx->S[4];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[7] = in[7] ^(ctx->r[0] + ctx->S[7]) ^ ctx->r[1] ^ ctx->S[8];
ctx->S[8] = a_mul(ctx->S[8]) ^ ctx->S[5] ^ ainv_mul(ctx->S[3]);
fsmtmp = ctx->r[1] + ctx->S[5];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[8] = in[8] ^(ctx->r[0] + ctx->S[8]) ^ ctx->r[1] ^ ctx->S[9];
ctx->S[9] = a_mul(ctx->S[9]) ^ ctx->S[6] ^ ainv_mul(ctx->S[4]);
fsmtmp = ctx->r[1] + ctx->S[6];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[9] = in[9] ^(ctx->r[0] + ctx->S[9]) ^ ctx->r[1] ^ ctx->S[10];
ctx->S[10] = a_mul(ctx->S[10]) ^ ctx->S[7] ^ ainv_mul(ctx->S[5]);
fsmtmp = ctx->r[1] + ctx->S[7];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[10] = in[10] ^(ctx->r[0] + ctx->S[10]) ^ ctx->r[1] ^ ctx->S[11];
ctx->S[11] = a_mul(ctx->S[11]) ^ ctx->S[8] ^ ainv_mul(ctx->S[6]);
fsmtmp = ctx->r[1] + ctx->S[8];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[11] = in[11] ^ (ctx->r[0] + ctx->S[11]) ^ ctx->r[1] ^ ctx->S[12];
ctx->S[12] = a_mul(ctx->S[12]) ^ ctx->S[9] ^ ainv_mul(ctx->S[7]);
fsmtmp = ctx->r[1] + ctx->S[9];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[12] = in[12] ^ (ctx->r[0] + ctx->S[12]) ^ ctx->r[1] ^ ctx->S[13];
ctx->S[13] = a_mul(ctx->S[13]) ^ ctx->S[10] ^ ainv_mul(ctx->S[8]);
fsmtmp = ctx->r[1] + ctx->S[10];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[13] = in[13] ^ (ctx->r[0] + ctx->S[13]) ^ ctx->r[1] ^ ctx->S[14];
ctx->S[14] = a_mul(ctx->S[14]) ^ ctx->S[11] ^ ainv_mul(ctx->S[9]);
fsmtmp = ctx->r[1] + ctx->S[11];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[14] = in[14] ^ (ctx->r[0] + ctx->S[14]) ^ ctx->r[1] ^ ctx->S[15];
ctx->S[15] = a_mul(ctx->S[15]) ^ ctx->S[12] ^ ainv_mul(ctx->S[10]);
fsmtmp = ctx->r[1] + ctx->S[12];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
out[15] = in[15] ^ (ctx->r[0] + ctx->S[15]) ^ ctx->r[1] ^ ctx->S[0];
}
Dstu8845Ctx *dstu8845_alloc()
{
Dstu8845Ctx *ctx = NULL;
ctx = calloc(1, sizeof(Dstu8845Ctx));
if (ctx == NULL) {
return NULL;
}
memset(ctx, 0, sizeof(Dstu8845Ctx));
return ctx;
}
int dstu8845_init(Dstu8845Ctx *ctx, const uint64_t *key, uint8_t key_size, const uint64_t *iv)
{
if (key_size == 32) {
ctx->key_size = key_size;
memcpy(ctx->iv, iv, 32);
memcpy(ctx->key, key, 32);
ctx->S[0] = ctx->key[3] ^ ctx->iv[0];
ctx->S[1] = ctx->key[2];
ctx->S[2] = ctx->key[1] ^ ctx->iv[1];
ctx->S[3] = ctx->key[0] ^ ctx->iv[2];
ctx->S[4] = ctx->key[3];
ctx->S[5] = ctx->key[2] ^ ctx->iv[3];
ctx->S[6] = ~ctx->key[1];
ctx->S[7] = ~ctx->key[0];
ctx->S[8] = ctx->key[3];
ctx->S[9] = ctx->key[2];
ctx->S[10] = ~ctx->key[1];
ctx->S[11] = ctx->key[0];
ctx->S[12] = ctx->key[3];
ctx->S[13] = ~ctx->key[2];
ctx->S[14] = ctx->key[1];
ctx->S[15] = ~ctx->key[0];
} else if (key_size == 64) {
ctx->key_size = key_size;
memcpy(ctx->iv, iv, 32);
memcpy(ctx->key, key, 64);
ctx->S[0] = ctx->key[7] ^ ctx->iv[0];
ctx->S[1] = ctx->key[6];
ctx->S[2] = ctx->key[5];
ctx->S[3] = ctx->key[4] ^ ctx->iv[1];
ctx->S[4] = ctx->key[3];
ctx->S[5] = ctx->key[2] ^ ctx->iv[2];
ctx->S[6] = ctx->key[1];
ctx->S[7] = ~ctx->key[0];
ctx->S[8] = ctx->key[4] ^ ctx->iv[3];
ctx->S[9] = ~ctx->key[6];
ctx->S[10] = ctx->key[5];
ctx->S[11] = ~ctx->key[7];
ctx->S[12] = ctx->key[3];
ctx->S[13] = ctx->key[2];
ctx->S[14] = ~ctx->key[1];
ctx->S[15] = ctx->key[0];
} else {
return 0;
}
ctx->r[0] = 0;
ctx->r[1] = 0;
for (int i = 0; i < 2; i++) {
static uint64_t outfrom_fsm, fsmtmp;
outfrom_fsm = (ctx->r[0] + ctx->S[15]) ^ ctx->r[1];
ctx->S[0] = a_mul(ctx->S[0]) ^ ctx->S[13] ^ ainv_mul(ctx->S[11]) ^ outfrom_fsm;
fsmtmp = ctx->r[1] + ctx->S[13];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
outfrom_fsm = (ctx->r[0] + ctx->S[0]) ^ ctx->r[1];
ctx->S[1] = a_mul(ctx->S[1]) ^ ctx->S[14] ^ ainv_mul(ctx->S[12]) ^ outfrom_fsm;
fsmtmp = ctx->r[1] + ctx->S[14];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
outfrom_fsm = (ctx->r[0] + ctx->S[1]) ^ ctx->r[1];
ctx->S[2] = a_mul(ctx->S[2]) ^ ctx->S[15] ^ ainv_mul(ctx->S[13]) ^ outfrom_fsm;
fsmtmp = ctx->r[1] + ctx->S[15];
ctx->r[1] = T(ctx->r[0]);
ctx->r[0] = fsmtmp;
outfrom_fsm = (ctx->r[0] + ctx->S[2]) ^ ctx->r[1];
ctx->S[3] = a_mul(ctx->S[3]) ^ ctx->S[0] ^ ainv_mul(ctx->S[14]) ^ outfrom_fsm;
fsmtmp = ctx->r[1] + ctx->S[0];