-
Notifications
You must be signed in to change notification settings - Fork 0
/
whirlbob.S
848 lines (796 loc) · 35.6 KB
/
whirlbob.S
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
// We use eight 1024 byte tables to compute pi; optimized for speed.
// IN: r13
// OUT: r1
// Registers changed: r0, r1.
.macro pi
////////////////////////////////////////////////////////////////////////////////
// Control data
ldr r2,=table0
add r3,r2,#1024
add r4,r3,#1024
add r5,r4,#1024
add r6,r5,#1024
add r7,r6,#1024
add r8,r7,#1024
add r9,r8,#1024
add r14,r9,#1088
b 1f
.pool
1:
tworounds 0 4 8 12
tworounds 16 20 24 28
tworounds 32 36 40 44
tworounds 48 52 56 60
tworounds 64 68 72 76
tworounds 80 84 88 92
// output in r13
mov r1,r13
////////////////////////////////////////////////////////////////////////////////
.endm
.macro tworounds roundkey1:req roundkey2:req roundkey3:req roundkey4:req
////////////////////////////////////////////////////////////////////////////////
// Offsets corrected for big endian...
firstvector 3 58 49 40 39 30 21 12 \roundkey1 \roundkey2 r13 r14
vector 11 2 57 48 47 38 29 20 r13 r14
vector 19 10 1 56 55 46 37 28 r13 r14
vector 27 18 9 0 63 54 45 36 r13 r14
vector 35 26 17 8 7 62 53 44 r13 r14
vector 43 34 25 16 15 6 61 52 r13 r14
vector 51 42 33 24 23 14 5 60 r13 r14
lastvector 59 50 41 32 31 22 13 4 r13 r14
firstvector 3 58 49 40 39 30 21 12 \roundkey3 \roundkey4 r14 r13
vector 11 2 57 48 47 38 29 20 r14 r13
vector 19 10 1 56 55 46 37 28 r14 r13
vector 27 18 9 0 63 54 45 36 r14 r13
vector 35 26 17 8 7 62 53 44 r14 r13
vector 43 34 25 16 15 6 61 52 r14 r13
vector 51 42 33 24 23 14 5 60 r14 r13
lastvector 59 50 41 32 31 22 13 4 r14 r13
////////////////////////////////////////////////////////////////////////////////
.endm
.macro vector a:req b:req c:req d:req e:req f:req g:req h:req in:req out:req
////////////////////////////////////////////////////////////////////////////////
// Get a byte from the input
ldrb r10,[\in,#\a]
// Get the input byte in a non-blocking way
ldrb r11,[\in,#\b]
// Initial lookups in r0,r1
ldr r0,[r2,r10,lsl #2]
ldr r1,[r6,r10,lsl #2]
// (Magic) table lookup
ldr r12,[r7,r11,lsl #2]
ldr r11,[r3,r11,lsl #2]
// Already get this byte so we do not block later
ldrb r10,[\in,#\c]
// Adding to total
eor r0,r0,r11
eor r1,r1,r12
// Repeat a couple of times
ldr r11,[r4,r10,lsl #2]
ldr r12,[r8,r10,lsl #2]
ldrb r10,[\in,#\d]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r5,r10,lsl #2]
ldr r12,[r9,r10,lsl #2]
ldrb r10,[\in,#\e]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r6,r10,lsl #2]
ldr r12,[r2,r10,lsl #2]
ldrb r10,[\in,#\f]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r7,r10,lsl #2]
ldr r12,[r3,r10,lsl #2]
ldrb r10,[\in,#\g]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r8,r10,lsl #2]
ldr r12,[r4,r10,lsl #2]
ldrb r10,[\in,#\h]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r9,r10,lsl #2]
ldr r12,[r5,r10,lsl #2]
eor r0,r0,r11
eor r1,r1,r12
// Store
str r0,[\out],#4
str r1,[\out],#4
////////////////////////////////////////////////////////////////////////////////
.endm
.macro lastvector a:req b:req c:req d:req e:req f:req g:req h:req in:req out:req
////////////////////////////////////////////////////////////////////////////////
// Get a byte from the input
ldrb r10,[\in,#\a]
// Get the input byte in a non-blocking way
ldrb r11,[\in,#\b]
// Initial lookups in r0,r1
ldr r0,[r2,r10,lsl #2]
ldr r1,[r6,r10,lsl #2]
// (Magic) table lookup
ldr r12,[r7,r11,lsl #2]
ldr r11,[r3,r11,lsl #2]
// Already get this byte so we do not block later
ldrb r10,[\in,#\c]
// Adding to total
eor r0,r0,r11
eor r1,r1,r12
// Repeat a couple of times
ldr r11,[r4,r10,lsl #2]
ldr r12,[r8,r10,lsl #2]
ldrb r10,[\in,#\d]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r5,r10,lsl #2]
ldr r12,[r9,r10,lsl #2]
ldrb r10,[\in,#\e]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r6,r10,lsl #2]
ldr r12,[r2,r10,lsl #2]
ldrb r10,[\in,#\f]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r7,r10,lsl #2]
ldr r12,[r3,r10,lsl #2]
ldrb r10,[\in,#\g]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r8,r10,lsl #2]
ldr r12,[r4,r10,lsl #2]
ldrb r10,[\in,#\h]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r9,r10,lsl #2]
ldr r12,[r5,r10,lsl #2]
eor r0,r0,r11
eor r1,r1,r12
// Store
str r0,[\out],#4
str r1,[\out],#-60
////////////////////////////////////////////////////////////////////////////////
.endm
.macro firstvector a:req b:req c:req d:req e:req f:req g:req h:req i:req j:req in:req out:req
////////////////////////////////////////////////////////////////////////////////
// Get the bytes from the input
ldrb r10,[\in,#\a]
ldrb r11,[\in,#\b]
// Initial lookups in r0,r1
ldr r0,[r2,r10,lsl #2]
ldr r1,[r6,r10,lsl #2]
// Get the input byte
// (Magic) table lookup
ldr r12,[r7,r11,lsl #2]
ldr r11,[r3,r11,lsl #2]
ldrb r10,[\in,#\c]
// Adding to total
eor r0,r0,r11
eor r1,r1,r12
// Repeat a couple of times
ldr r11,[r4,r10,lsl #2]
ldr r12,[r8,r10,lsl #2]
ldrb r10,[\in,#\d]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r5,r10,lsl #2]
ldr r12,[r9,r10,lsl #2]
ldrb r10,[\in,#\e]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r6,r10,lsl #2]
ldr r12,[r2,r10,lsl #2]
ldrb r10,[\in,#\f]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r7,r10,lsl #2]
ldr r12,[r3,r10,lsl #2]
ldrb r10,[\in,#\g]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r8,r10,lsl #2]
ldr r12,[r4,r10,lsl #2]
ldrb r10,[\in,#\h]
eor r0,r0,r11
eor r1,r1,r12
ldr r11,[r9,r10,lsl #2]
ldr r12,[r5,r10,lsl #2]
eor r0,r0,r11
eor r1,r1,r12
// Round constant, sbox should be 256 before table0.
// ldr r10,=sbox
add r10,r2,#-256
// i = 4*round*2
ldr r11,[r10,#\i]
ldr r12,[r10,#\j]
eor r0,r0,r11
eor r1,r1,r12
// Store
str r0,[\out],#4
str r1,[\out],#4
////////////////////////////////////////////////////////////////////////////////
.endm
.balign 4
.data
sbox:
.word 0x1823C6E8, 0x87B8014F, 0x36A6D2F5, 0x796F9152
.word 0x60BC9B8E, 0xA30C7B35, 0x1DE0D7C2, 0x2E4BFE57
.word 0x157737E5, 0x9FF04ADA, 0x58C9290A, 0xB1A06B85
.word 0xBD5D10F4, 0xCB3E0567, 0xE427418B, 0xA77D95D8
.word 0xFBEE7C66, 0xDD17479E, 0xCA2DBF07, 0xAD5A8333
.word 0x6302AA71, 0xC81949D9, 0xF2E35B88, 0x9A2632B0
.word 0xE90FD580, 0xBECD3448, 0xFF7A905F, 0x20681AAE
.word 0xB4549322, 0x64F17312, 0x4008C3EC, 0xDBA18D3D
.word 0x9700CF2B, 0x7682D61B, 0xB5AF6A50, 0x45F330EF
.word 0x3F55A2EA, 0x65BA2FC0, 0xDE1CFD4D, 0x9275068A
.word 0xB2E60E1F, 0x62D4A896, 0xF9C52559, 0x8472394C
.word 0x5E78388C, 0xD1A5E261, 0xB3219C1E, 0x43C7FC04
.word 0x51996D0D, 0xFADF7E24, 0x3BABCE11, 0x8F4EB7EB
.word 0x3C8194F7, 0xB9132CD3, 0xE76EC403, 0x56447FA9
.word 0x2ABBC153, 0xDC0B9D6C, 0x3174F646, 0xAC8914E1
.word 0x163A6909, 0x70B6D0ED, 0xCC4298A4, 0x285CF886
table0:
.word 0x18186018,0x23238c23,0xc6c63fc6,0xe8e887e8,0x87872687,0xb8b8dab8,0x01010401,0x4f4f214f
.word 0x3636d836,0xa6a6a2a6,0xd2d26fd2,0xf5f5f3f5,0x7979f979,0x6f6fa16f,0x91917e91,0x52525552
.word 0x60609d60,0xbcbccabc,0x9b9b569b,0x8e8e028e,0xa3a3b6a3,0x0c0c300c,0x7b7bf17b,0x3535d435
.word 0x1d1d741d,0xe0e0a7e0,0xd7d77bd7,0xc2c22fc2,0x2e2eb82e,0x4b4b314b,0xfefedffe,0x57574157
.word 0x15155415,0x7777c177,0x3737dc37,0xe5e5b3e5,0x9f9f469f,0xf0f0e7f0,0x4a4a354a,0xdada4fda
.word 0x58587d58,0xc9c903c9,0x2929a429,0x0a0a280a,0xb1b1feb1,0xa0a0baa0,0x6b6bb16b,0x85852e85
.word 0xbdbdcebd,0x5d5d695d,0x10104010,0xf4f4f7f4,0xcbcb0bcb,0x3e3ef83e,0x05051405,0x67678167
.word 0xe4e4b7e4,0x27279c27,0x41411941,0x8b8b168b,0xa7a7a6a7,0x7d7de97d,0x95956e95,0xd8d847d8
.word 0xfbfbcbfb,0xeeee9fee,0x7c7ced7c,0x66668566,0xdddd53dd,0x17175c17,0x47470147,0x9e9e429e
.word 0xcaca0fca,0x2d2db42d,0xbfbfc6bf,0x07071c07,0xadad8ead,0x5a5a755a,0x83833683,0x3333cc33
.word 0x63639163,0x02020802,0xaaaa92aa,0x7171d971,0xc8c807c8,0x19196419,0x49493949,0xd9d943d9
.word 0xf2f2eff2,0xe3e3abe3,0x5b5b715b,0x88881a88,0x9a9a529a,0x26269826,0x3232c832,0xb0b0fab0
.word 0xe9e983e9,0x0f0f3c0f,0xd5d573d5,0x80803a80,0xbebec2be,0xcdcd13cd,0x3434d034,0x48483d48
.word 0xffffdbff,0x7a7af57a,0x90907a90,0x5f5f615f,0x20208020,0x6868bd68,0x1a1a681a,0xaeae82ae
.word 0xb4b4eab4,0x54544d54,0x93937693,0x22228822,0x64648d64,0xf1f1e3f1,0x7373d173,0x12124812
.word 0x40401d40,0x08082008,0xc3c32bc3,0xecec97ec,0xdbdb4bdb,0xa1a1bea1,0x8d8d0e8d,0x3d3df43d
.word 0x97976697,0x00000000,0xcfcf1bcf,0x2b2bac2b,0x7676c576,0x82823282,0xd6d67fd6,0x1b1b6c1b
.word 0xb5b5eeb5,0xafaf86af,0x6a6ab56a,0x50505d50,0x45450945,0xf3f3ebf3,0x3030c030,0xefef9bef
.word 0x3f3ffc3f,0x55554955,0xa2a2b2a2,0xeaea8fea,0x65658965,0xbabad2ba,0x2f2fbc2f,0xc0c027c0
.word 0xdede5fde,0x1c1c701c,0xfdfdd3fd,0x4d4d294d,0x92927292,0x7575c975,0x06061806,0x8a8a128a
.word 0xb2b2f2b2,0xe6e6bfe6,0x0e0e380e,0x1f1f7c1f,0x62629562,0xd4d477d4,0xa8a89aa8,0x96966296
.word 0xf9f9c3f9,0xc5c533c5,0x25259425,0x59597959,0x84842a84,0x7272d572,0x3939e439,0x4c4c2d4c
.word 0x5e5e655e,0x7878fd78,0x3838e038,0x8c8c0a8c,0xd1d163d1,0xa5a5aea5,0xe2e2afe2,0x61619961
.word 0xb3b3f6b3,0x21218421,0x9c9c4a9c,0x1e1e781e,0x43431143,0xc7c73bc7,0xfcfcd7fc,0x04041004
.word 0x51515951,0x99995e99,0x6d6da96d,0x0d0d340d,0xfafacffa,0xdfdf5bdf,0x7e7ee57e,0x24249024
.word 0x3b3bec3b,0xabab96ab,0xcece1fce,0x11114411,0x8f8f068f,0x4e4e254e,0xb7b7e6b7,0xebeb8beb
.word 0x3c3cf03c,0x81813e81,0x94946a94,0xf7f7fbf7,0xb9b9deb9,0x13134c13,0x2c2cb02c,0xd3d36bd3
.word 0xe7e7bbe7,0x6e6ea56e,0xc4c437c4,0x03030c03,0x56564556,0x44440d44,0x7f7fe17f,0xa9a99ea9
.word 0x2a2aa82a,0xbbbbd6bb,0xc1c123c1,0x53535153,0xdcdc57dc,0x0b0b2c0b,0x9d9d4e9d,0x6c6cad6c
.word 0x3131c431,0x7474cd74,0xf6f6fff6,0x46460546,0xacac8aac,0x89891e89,0x14145014,0xe1e1a3e1
.word 0x16165816,0x3a3ae83a,0x6969b969,0x09092409,0x7070dd70,0xb6b6e2b6,0xd0d067d0,0xeded93ed
.word 0xcccc17cc,0x42421542,0x98985a98,0xa4a4aaa4,0x2828a028,0x5c5c6d5c,0xf8f8c7f8,0x86862286
table1:
.word 0xd8181860,0x2623238c,0xb8c6c63f,0xfbe8e887,0xcb878726,0x11b8b8da,0x09010104,0x0d4f4f21
.word 0x9b3636d8,0xffa6a6a2,0x0cd2d26f,0x0ef5f5f3,0x967979f9,0x306f6fa1,0x6d91917e,0xf8525255
.word 0x4760609d,0x35bcbcca,0x379b9b56,0x8a8e8e02,0xd2a3a3b6,0x6c0c0c30,0x847b7bf1,0x803535d4
.word 0xf51d1d74,0xb3e0e0a7,0x21d7d77b,0x9cc2c22f,0x432e2eb8,0x294b4b31,0x5dfefedf,0xd5575741
.word 0xbd151554,0xe87777c1,0x923737dc,0x9ee5e5b3,0x139f9f46,0x23f0f0e7,0x204a4a35,0x44dada4f
.word 0xa258587d,0xcfc9c903,0x7c2929a4,0x5a0a0a28,0x50b1b1fe,0xc9a0a0ba,0x146b6bb1,0xd985852e
.word 0x3cbdbdce,0x8f5d5d69,0x90101040,0x07f4f4f7,0xddcbcb0b,0xd33e3ef8,0x2d050514,0x78676781
.word 0x97e4e4b7,0x0227279c,0x73414119,0xa78b8b16,0xf6a7a7a6,0xb27d7de9,0x4995956e,0x56d8d847
.word 0x70fbfbcb,0xcdeeee9f,0xbb7c7ced,0x71666685,0x7bdddd53,0xaf17175c,0x45474701,0x1a9e9e42
.word 0xd4caca0f,0x582d2db4,0x2ebfbfc6,0x3f07071c,0xacadad8e,0xb05a5a75,0xef838336,0xb63333cc
.word 0x5c636391,0x12020208,0x93aaaa92,0xde7171d9,0xc6c8c807,0xd1191964,0x3b494939,0x5fd9d943
.word 0x31f2f2ef,0xa8e3e3ab,0xb95b5b71,0xbc88881a,0x3e9a9a52,0x0b262698,0xbf3232c8,0x59b0b0fa
.word 0xf2e9e983,0x770f0f3c,0x33d5d573,0xf480803a,0x27bebec2,0xebcdcd13,0x893434d0,0x3248483d
.word 0x54ffffdb,0x8d7a7af5,0x6490907a,0x9d5f5f61,0x3d202080,0x0f6868bd,0xca1a1a68,0xb7aeae82
.word 0x7db4b4ea,0xce54544d,0x7f939376,0x2f222288,0x6364648d,0x2af1f1e3,0xcc7373d1,0x82121248
.word 0x7a40401d,0x48080820,0x95c3c32b,0xdfecec97,0x4ddbdb4b,0xc0a1a1be,0x918d8d0e,0xc83d3df4
.word 0x5b979766,0x00000000,0xf9cfcf1b,0x6e2b2bac,0xe17676c5,0xe6828232,0x28d6d67f,0xc31b1b6c
.word 0x74b5b5ee,0xbeafaf86,0x1d6a6ab5,0xea50505d,0x57454509,0x38f3f3eb,0xad3030c0,0xc4efef9b
.word 0xda3f3ffc,0xc7555549,0xdba2a2b2,0xe9eaea8f,0x6a656589,0x03babad2,0x4a2f2fbc,0x8ec0c027
.word 0x60dede5f,0xfc1c1c70,0x46fdfdd3,0x1f4d4d29,0x76929272,0xfa7575c9,0x36060618,0xae8a8a12
.word 0x4bb2b2f2,0x85e6e6bf,0x7e0e0e38,0xe71f1f7c,0x55626295,0x3ad4d477,0x81a8a89a,0x52969662
.word 0x62f9f9c3,0xa3c5c533,0x10252594,0xab595979,0xd084842a,0xc57272d5,0xec3939e4,0x164c4c2d
.word 0x945e5e65,0x9f7878fd,0xe53838e0,0x988c8c0a,0x17d1d163,0xe4a5a5ae,0xa1e2e2af,0x4e616199
.word 0x42b3b3f6,0x34212184,0x089c9c4a,0xee1e1e78,0x61434311,0xb1c7c73b,0x4ffcfcd7,0x24040410
.word 0xe3515159,0x2599995e,0x226d6da9,0x650d0d34,0x79fafacf,0x69dfdf5b,0xa97e7ee5,0x19242490
.word 0xfe3b3bec,0x9aabab96,0xf0cece1f,0x99111144,0x838f8f06,0x044e4e25,0x66b7b7e6,0xe0ebeb8b
.word 0xc13c3cf0,0xfd81813e,0x4094946a,0x1cf7f7fb,0x18b9b9de,0x8b13134c,0x512c2cb0,0x05d3d36b
.word 0x8ce7e7bb,0x396e6ea5,0xaac4c437,0x1b03030c,0xdc565645,0x5e44440d,0xa07f7fe1,0x88a9a99e
.word 0x672a2aa8,0x0abbbbd6,0x87c1c123,0xf1535351,0x72dcdc57,0x530b0b2c,0x019d9d4e,0x2b6c6cad
.word 0xa43131c4,0xf37474cd,0x15f6f6ff,0x4c464605,0xa5acac8a,0xb589891e,0xb4141450,0xbae1e1a3
.word 0xa6161658,0xf73a3ae8,0x066969b9,0x41090924,0xd77070dd,0x6fb6b6e2,0x1ed0d067,0xd6eded93
.word 0xe2cccc17,0x68424215,0x2c98985a,0xeda4a4aa,0x752828a0,0x865c5c6d,0x6bf8f8c7,0xc2868622
table2:
.word 0x30d81818,0x46262323,0x91b8c6c6,0xcdfbe8e8,0x13cb8787,0x6d11b8b8,0x02090101,0x9e0d4f4f
.word 0x6c9b3636,0x51ffa6a6,0xb90cd2d2,0xf70ef5f5,0xf2967979,0xde306f6f,0x3f6d9191,0xa4f85252
.word 0xc0476060,0x6535bcbc,0x2b379b9b,0x018a8e8e,0x5bd2a3a3,0x186c0c0c,0xf6847b7b,0x6a803535
.word 0x3af51d1d,0xddb3e0e0,0xb321d7d7,0x999cc2c2,0x5c432e2e,0x96294b4b,0xe15dfefe,0xaed55757
.word 0x2abd1515,0xeee87777,0x6e923737,0xd79ee5e5,0x23139f9f,0xfd23f0f0,0x94204a4a,0xa944dada
.word 0xb0a25858,0x8fcfc9c9,0x527c2929,0x145a0a0a,0x7f50b1b1,0x5dc9a0a0,0xd6146b6b,0x17d98585
.word 0x673cbdbd,0xba8f5d5d,0x20901010,0xf507f4f4,0x8bddcbcb,0x7cd33e3e,0x0a2d0505,0xce786767
.word 0xd597e4e4,0x4e022727,0x82734141,0x0ba78b8b,0x53f6a7a7,0xfab27d7d,0x37499595,0xad56d8d8
.word 0xeb70fbfb,0xc1cdeeee,0xf8bb7c7c,0xcc716666,0xa77bdddd,0x2eaf1717,0x8e454747,0x211a9e9e
.word 0x89d4caca,0x5a582d2d,0x632ebfbf,0x0e3f0707,0x47acadad,0xb4b05a5a,0x1bef8383,0x66b63333
.word 0xc65c6363,0x04120202,0x4993aaaa,0xe2de7171,0x8dc6c8c8,0x32d11919,0x923b4949,0xaf5fd9d9
.word 0xf931f2f2,0xdba8e3e3,0xb6b95b5b,0x0dbc8888,0x293e9a9a,0x4c0b2626,0x64bf3232,0x7d59b0b0
.word 0xcff2e9e9,0x1e770f0f,0xb733d5d5,0x1df48080,0x6127bebe,0x87ebcdcd,0x68893434,0x90324848
.word 0xe354ffff,0xf48d7a7a,0x3d649090,0xbe9d5f5f,0x403d2020,0xd00f6868,0x34ca1a1a,0x41b7aeae
.word 0x757db4b4,0xa8ce5454,0x3b7f9393,0x442f2222,0xc8636464,0xff2af1f1,0xe6cc7373,0x24821212
.word 0x807a4040,0x10480808,0x9b95c3c3,0xc5dfecec,0xab4ddbdb,0x5fc0a1a1,0x07918d8d,0x7ac83d3d
.word 0x335b9797,0x00000000,0x83f9cfcf,0x566e2b2b,0xece17676,0x19e68282,0xb128d6d6,0x36c31b1b
.word 0x7774b5b5,0x43beafaf,0xd41d6a6a,0xa0ea5050,0x8a574545,0xfb38f3f3,0x60ad3030,0xc3c4efef
.word 0x7eda3f3f,0xaac75555,0x59dba2a2,0xc9e9eaea,0xca6a6565,0x6903baba,0x5e4a2f2f,0x9d8ec0c0
.word 0xa160dede,0x38fc1c1c,0xe746fdfd,0x9a1f4d4d,0x39769292,0xeafa7575,0x0c360606,0x09ae8a8a
.word 0x794bb2b2,0xd185e6e6,0x1c7e0e0e,0x3ee71f1f,0xc4556262,0xb53ad4d4,0x4d81a8a8,0x31529696
.word 0xef62f9f9,0x97a3c5c5,0x4a102525,0xb2ab5959,0x15d08484,0xe4c57272,0x72ec3939,0x98164c4c
.word 0xbc945e5e,0xf09f7878,0x70e53838,0x05988c8c,0xbf17d1d1,0x57e4a5a5,0xd9a1e2e2,0xc24e6161
.word 0x7b42b3b3,0x42342121,0x25089c9c,0x3cee1e1e,0x86614343,0x93b1c7c7,0xe54ffcfc,0x08240404
.word 0xa2e35151,0x2f259999,0xda226d6d,0x1a650d0d,0xe979fafa,0xa369dfdf,0xfca97e7e,0x48192424
.word 0x76fe3b3b,0x4b9aabab,0x81f0cece,0x22991111,0x03838f8f,0x9c044e4e,0x7366b7b7,0xcbe0ebeb
.word 0x78c13c3c,0x1ffd8181,0x35409494,0xf31cf7f7,0x6f18b9b9,0x268b1313,0x58512c2c,0xbb05d3d3
.word 0xd38ce7e7,0xdc396e6e,0x95aac4c4,0x061b0303,0xacdc5656,0x885e4444,0xfea07f7f,0x4f88a9a9
.word 0x54672a2a,0x6b0abbbb,0x9f87c1c1,0xa6f15353,0xa572dcdc,0x16530b0b,0x27019d9d,0xd82b6c6c
.word 0x62a43131,0xe8f37474,0xf115f6f6,0x8c4c4646,0x45a5acac,0x0fb58989,0x28b41414,0xdfbae1e1
.word 0x2ca61616,0x74f73a3a,0xd2066969,0x12410909,0xe0d77070,0x716fb6b6,0xbd1ed0d0,0xc7d6eded
.word 0x85e2cccc,0x84684242,0x2d2c9898,0x55eda4a4,0x50752828,0xb8865c5c,0xed6bf8f8,0x11c28686
table3:
.word 0x7830d818,0xaf462623,0xf991b8c6,0x6fcdfbe8,0xa113cb87,0x626d11b8,0x05020901,0x6e9e0d4f
.word 0xee6c9b36,0x0451ffa6,0xbdb90cd2,0x06f70ef5,0x80f29679,0xcede306f,0xef3f6d91,0x07a4f852
.word 0xfdc04760,0x766535bc,0xcd2b379b,0x8c018a8e,0x155bd2a3,0x3c186c0c,0x8af6847b,0xe16a8035
.word 0x693af51d,0x47ddb3e0,0xacb321d7,0xed999cc2,0x965c432e,0x7a96294b,0x21e15dfe,0x16aed557
.word 0x412abd15,0xb6eee877,0xeb6e9237,0x56d79ee5,0xd923139f,0x17fd23f0,0x7f94204a,0x95a944da
.word 0x25b0a258,0xca8fcfc9,0x8d527c29,0x22145a0a,0x4f7f50b1,0x1a5dc9a0,0xdad6146b,0xab17d985
.word 0x73673cbd,0x34ba8f5d,0x50209010,0x03f507f4,0xc08bddcb,0xc67cd33e,0x110a2d05,0xe6ce7867
.word 0x53d597e4,0xbb4e0227,0x58827341,0x9d0ba78b,0x0153f6a7,0x94fab27d,0xfb374995,0x9fad56d8
.word 0x30eb70fb,0x71c1cdee,0x91f8bb7c,0xe3cc7166,0x8ea77bdd,0x4b2eaf17,0x468e4547,0xdc211a9e
.word 0xc589d4ca,0x995a582d,0x79632ebf,0x1b0e3f07,0x2347acad,0x2fb4b05a,0xb51bef83,0xff66b633
.word 0xf2c65c63,0x0a041202,0x384993aa,0xa8e2de71,0xcf8dc6c8,0x7d32d119,0x70923b49,0x9aaf5fd9
.word 0x1df931f2,0x48dba8e3,0x2ab6b95b,0x920dbc88,0xc8293e9a,0xbe4c0b26,0xfa64bf32,0x4a7d59b0
.word 0x6acff2e9,0x331e770f,0xa6b733d5,0xba1df480,0x7c6127be,0xde87ebcd,0xe4688934,0x75903248
.word 0x24e354ff,0x8ff48d7a,0xea3d6490,0x3ebe9d5f,0xa0403d20,0xd5d00f68,0x7234ca1a,0x2c41b7ae
.word 0x5e757db4,0x19a8ce54,0xe53b7f93,0xaa442f22,0xe9c86364,0x12ff2af1,0xa2e6cc73,0x5a248212
.word 0x5d807a40,0x28104808,0xe89b95c3,0x7bc5dfec,0x90ab4ddb,0x1f5fc0a1,0x8307918d,0xc97ac83d
.word 0xf1335b97,0x00000000,0xd483f9cf,0x87566e2b,0xb3ece176,0xb019e682,0xa9b128d6,0x7736c31b
.word 0x5b7774b5,0x2943beaf,0xdfd41d6a,0x0da0ea50,0x4c8a5745,0x18fb38f3,0xf060ad30,0x74c3c4ef
.word 0xc37eda3f,0x1caac755,0x1059dba2,0x65c9e9ea,0xecca6a65,0x686903ba,0x935e4a2f,0xe79d8ec0
.word 0x81a160de,0x6c38fc1c,0x2ee746fd,0x649a1f4d,0xe0397692,0xbceafa75,0x1e0c3606,0x9809ae8a
.word 0x40794bb2,0x59d185e6,0x361c7e0e,0x633ee71f,0xf7c45562,0xa3b53ad4,0x324d81a8,0xf4315296
.word 0x3aef62f9,0xf697a3c5,0xb14a1025,0x20b2ab59,0xae15d084,0xa7e4c572,0xdd72ec39,0x6198164c
.word 0x3bbc945e,0x85f09f78,0xd870e538,0x8605988c,0xb2bf17d1,0x0b57e4a5,0x4dd9a1e2,0xf8c24e61
.word 0x457b42b3,0xa5423421,0xd625089c,0x663cee1e,0x52866143,0xfc93b1c7,0x2be54ffc,0x14082404
.word 0x08a2e351,0xc72f2599,0xc4da226d,0x391a650d,0x35e979fa,0x84a369df,0x9bfca97e,0xb4481924
.word 0xd776fe3b,0x3d4b9aab,0xd181f0ce,0x55229911,0x8903838f,0x6b9c044e,0x517366b7,0x60cbe0eb
.word 0xcc78c13c,0xbf1ffd81,0xfe354094,0x0cf31cf7,0x676f18b9,0x5f268b13,0x9c58512c,0xb8bb05d3
.word 0x5cd38ce7,0xcbdc396e,0xf395aac4,0x0f061b03,0x13acdc56,0x49885e44,0x9efea07f,0x374f88a9
.word 0x8254672a,0x6d6b0abb,0xe29f87c1,0x02a6f153,0x8ba572dc,0x2716530b,0xd327019d,0xc1d82b6c
.word 0xf562a431,0xb9e8f374,0x09f115f6,0x438c4c46,0x2645a5ac,0x970fb589,0x4428b414,0x42dfbae1
.word 0x4e2ca616,0xd274f73a,0xd0d20669,0x2d124109,0xade0d770,0x54716fb6,0xb7bd1ed0,0x7ec7d6ed
.word 0xdb85e2cc,0x57846842,0xc22d2c98,0x0e55eda4,0x88507528,0x31b8865c,0x3fed6bf8,0xa411c286
table4:
.word 0xc07830d8,0x05af4626,0x7ef991b8,0x136fcdfb,0x4ca113cb,0xa9626d11,0x08050209,0x426e9e0d
.word 0xadee6c9b,0x590451ff,0xdebdb90c,0xfb06f70e,0xef80f296,0x5fcede30,0xfcef3f6d,0xaa07a4f8
.word 0x27fdc047,0x89766535,0xaccd2b37,0x048c018a,0x71155bd2,0x603c186c,0xff8af684,0xb5e16a80
.word 0xe8693af5,0x5347ddb3,0xf6acb321,0x5eed999c,0x6d965c43,0x627a9629,0xa321e15d,0x8216aed5
.word 0xa8412abd,0x9fb6eee8,0xa5eb6e92,0x7b56d79e,0x8cd92313,0xd317fd23,0x6a7f9420,0x9e95a944
.word 0xfa25b0a2,0x06ca8fcf,0x558d527c,0x5022145a,0xe14f7f50,0x691a5dc9,0x7fdad614,0x5cab17d9
.word 0x8173673c,0xd234ba8f,0x80502090,0xf303f507,0x16c08bdd,0xedc67cd3,0x28110a2d,0x1fe6ce78
.word 0x7353d597,0x25bb4e02,0x32588273,0x2c9d0ba7,0x510153f6,0xcf94fab2,0xdcfb3749,0x8e9fad56
.word 0x8b30eb70,0x2371c1cd,0xc791f8bb,0x17e3cc71,0xa68ea77b,0xb84b2eaf,0x02468e45,0x84dc211a
.word 0x1ec589d4,0x75995a58,0x9179632e,0x381b0e3f,0x012347ac,0xea2fb4b0,0x6cb51bef,0x85ff66b6
.word 0x3ff2c65c,0x100a0412,0x39384993,0xafa8e2de,0x0ecf8dc6,0xc87d32d1,0x7270923b,0x869aaf5f
.word 0xc31df931,0x4b48dba8,0xe22ab6b9,0x34920dbc,0xa4c8293e,0x2dbe4c0b,0x8dfa64bf,0xe94a7d59
.word 0x1b6acff2,0x78331e77,0xe6a6b733,0x74ba1df4,0x997c6127,0x26de87eb,0xbde46889,0x7a759032
.word 0xab24e354,0xf78ff48d,0xf4ea3d64,0xc23ebe9d,0x1da0403d,0x67d5d00f,0xd07234ca,0x192c41b7
.word 0xc95e757d,0x9a19a8ce,0xece53b7f,0x0daa442f,0x07e9c863,0xdb12ff2a,0xbfa2e6cc,0x905a2482
.word 0x3a5d807a,0x40281048,0x56e89b95,0x337bc5df,0x9690ab4d,0x611f5fc0,0x1c830791,0xf5c97ac8
.word 0xccf1335b,0x00000000,0x36d483f9,0x4587566e,0x97b3ece1,0x64b019e6,0xfea9b128,0xd87736c3
.word 0xc15b7774,0x112943be,0x77dfd41d,0xba0da0ea,0x124c8a57,0xcb18fb38,0x9df060ad,0x2b74c3c4
.word 0xe5c37eda,0x921caac7,0x791059db,0x0365c9e9,0x0fecca6a,0xb9686903,0x65935e4a,0x4ee79d8e
.word 0xbe81a160,0xe06c38fc,0xbb2ee746,0x52649a1f,0xe4e03976,0x8fbceafa,0x301e0c36,0x249809ae
.word 0xf940794b,0x6359d185,0x70361c7e,0xf8633ee7,0x37f7c455,0xeea3b53a,0x29324d81,0xc4f43152
.word 0x9b3aef62,0x66f697a3,0x35b14a10,0xf220b2ab,0x54ae15d0,0xb7a7e4c5,0xd5dd72ec,0x5a619816
.word 0xca3bbc94,0xe785f09f,0xddd870e5,0x14860598,0xc6b2bf17,0x410b57e4,0x434dd9a1,0x2ff8c24e
.word 0xf1457b42,0x15a54234,0x94d62508,0xf0663cee,0x22528661,0x76fc93b1,0xb32be54f,0x20140824
.word 0xb208a2e3,0xbcc72f25,0x4fc4da22,0x68391a65,0x8335e979,0xb684a369,0xd79bfca9,0x3db44819
.word 0xc5d776fe,0x313d4b9a,0x3ed181f0,0x88552299,0x0c890383,0x4a6b9c04,0xd1517366,0x0b60cbe0
.word 0xfdcc78c1,0x7cbf1ffd,0xd4fe3540,0xeb0cf31c,0xa1676f18,0x985f268b,0x7d9c5851,0xd6b8bb05
.word 0x6b5cd38c,0x57cbdc39,0x6ef395aa,0x180f061b,0x8a13acdc,0x1a49885e,0xdf9efea0,0x21374f88
.word 0x4d825467,0xb16d6b0a,0x46e29f87,0xa202a6f1,0xae8ba572,0x58271653,0x9cd32701,0x47c1d82b
.word 0x95f562a4,0x87b9e8f3,0xe309f115,0x0a438c4c,0x092645a5,0x3c970fb5,0xa04428b4,0x5b42dfba
.word 0xb04e2ca6,0xcdd274f7,0x6fd0d206,0x482d1241,0xa7ade0d7,0xd954716f,0xceb7bd1e,0x3b7ec7d6
.word 0x2edb85e2,0x2a578468,0xb4c22d2c,0x490e55ed,0x5d885075,0xda31b886,0x933fed6b,0x44a411c2
table5:
.word 0x18c07830,0x2305af46,0xc67ef991,0xe8136fcd,0x874ca113,0xb8a9626d,0x01080502,0x4f426e9e
.word 0x36adee6c,0xa6590451,0xd2debdb9,0xf5fb06f7,0x79ef80f2,0x6f5fcede,0x91fcef3f,0x52aa07a4
.word 0x6027fdc0,0xbc897665,0x9baccd2b,0x8e048c01,0xa371155b,0x0c603c18,0x7bff8af6,0x35b5e16a
.word 0x1de8693a,0xe05347dd,0xd7f6acb3,0xc25eed99,0x2e6d965c,0x4b627a96,0xfea321e1,0x578216ae
.word 0x15a8412a,0x779fb6ee,0x37a5eb6e,0xe57b56d7,0x9f8cd923,0xf0d317fd,0x4a6a7f94,0xda9e95a9
.word 0x58fa25b0,0xc906ca8f,0x29558d52,0x0a502214,0xb1e14f7f,0xa0691a5d,0x6b7fdad6,0x855cab17
.word 0xbd817367,0x5dd234ba,0x10805020,0xf4f303f5,0xcb16c08b,0x3eedc67c,0x0528110a,0x671fe6ce
.word 0xe47353d5,0x2725bb4e,0x41325882,0x8b2c9d0b,0xa7510153,0x7dcf94fa,0x95dcfb37,0xd88e9fad
.word 0xfb8b30eb,0xee2371c1,0x7cc791f8,0x6617e3cc,0xdda68ea7,0x17b84b2e,0x4702468e,0x9e84dc21
.word 0xca1ec589,0x2d75995a,0xbf917963,0x07381b0e,0xad012347,0x5aea2fb4,0x836cb51b,0x3385ff66
.word 0x633ff2c6,0x02100a04,0xaa393849,0x71afa8e2,0xc80ecf8d,0x19c87d32,0x49727092,0xd9869aaf
.word 0xf2c31df9,0xe34b48db,0x5be22ab6,0x8834920d,0x9aa4c829,0x262dbe4c,0x328dfa64,0xb0e94a7d
.word 0xe91b6acf,0x0f78331e,0xd5e6a6b7,0x8074ba1d,0xbe997c61,0xcd26de87,0x34bde468,0x487a7590
.word 0xffab24e3,0x7af78ff4,0x90f4ea3d,0x5fc23ebe,0x201da040,0x6867d5d0,0x1ad07234,0xae192c41
.word 0xb4c95e75,0x549a19a8,0x93ece53b,0x220daa44,0x6407e9c8,0xf1db12ff,0x73bfa2e6,0x12905a24
.word 0x403a5d80,0x08402810,0xc356e89b,0xec337bc5,0xdb9690ab,0xa1611f5f,0x8d1c8307,0x3df5c97a
.word 0x97ccf133,0x00000000,0xcf36d483,0x2b458756,0x7697b3ec,0x8264b019,0xd6fea9b1,0x1bd87736
.word 0xb5c15b77,0xaf112943,0x6a77dfd4,0x50ba0da0,0x45124c8a,0xf3cb18fb,0x309df060,0xef2b74c3
.word 0x3fe5c37e,0x55921caa,0xa2791059,0xea0365c9,0x650fecca,0xbab96869,0x2f65935e,0xc04ee79d
.word 0xdebe81a1,0x1ce06c38,0xfdbb2ee7,0x4d52649a,0x92e4e039,0x758fbcea,0x06301e0c,0x8a249809
.word 0xb2f94079,0xe66359d1,0x0e70361c,0x1ff8633e,0x6237f7c4,0xd4eea3b5,0xa829324d,0x96c4f431
.word 0xf99b3aef,0xc566f697,0x2535b14a,0x59f220b2,0x8454ae15,0x72b7a7e4,0x39d5dd72,0x4c5a6198
.word 0x5eca3bbc,0x78e785f0,0x38ddd870,0x8c148605,0xd1c6b2bf,0xa5410b57,0xe2434dd9,0x612ff8c2
.word 0xb3f1457b,0x2115a542,0x9c94d625,0x1ef0663c,0x43225286,0xc776fc93,0xfcb32be5,0x04201408
.word 0x51b208a2,0x99bcc72f,0x6d4fc4da,0x0d68391a,0xfa8335e9,0xdfb684a3,0x7ed79bfc,0x243db448
.word 0x3bc5d776,0xab313d4b,0xce3ed181,0x11885522,0x8f0c8903,0x4e4a6b9c,0xb7d15173,0xeb0b60cb
.word 0x3cfdcc78,0x817cbf1f,0x94d4fe35,0xf7eb0cf3,0xb9a1676f,0x13985f26,0x2c7d9c58,0xd3d6b8bb
.word 0xe76b5cd3,0x6e57cbdc,0xc46ef395,0x03180f06,0x568a13ac,0x441a4988,0x7fdf9efe,0xa921374f
.word 0x2a4d8254,0xbbb16d6b,0xc146e29f,0x53a202a6,0xdcae8ba5,0x0b582716,0x9d9cd327,0x6c47c1d8
.word 0x3195f562,0x7487b9e8,0xf6e309f1,0x460a438c,0xac092645,0x893c970f,0x14a04428,0xe15b42df
.word 0x16b04e2c,0x3acdd274,0x696fd0d2,0x09482d12,0x70a7ade0,0xb6d95471,0xd0ceb7bd,0xed3b7ec7
.word 0xcc2edb85,0x422a5784,0x98b4c22d,0xa4490e55,0x285d8850,0x5cda31b8,0xf8933fed,0x8644a411
table6:
.word 0x6018c078,0x8c2305af,0x3fc67ef9,0x87e8136f,0x26874ca1,0xdab8a962,0x04010805,0x214f426e
.word 0xd836adee,0xa2a65904,0x6fd2debd,0xf3f5fb06,0xf979ef80,0xa16f5fce,0x7e91fcef,0x5552aa07
.word 0x9d6027fd,0xcabc8976,0x569baccd,0x028e048c,0xb6a37115,0x300c603c,0xf17bff8a,0xd435b5e1
.word 0x741de869,0xa7e05347,0x7bd7f6ac,0x2fc25eed,0xb82e6d96,0x314b627a,0xdffea321,0x41578216
.word 0x5415a841,0xc1779fb6,0xdc37a5eb,0xb3e57b56,0x469f8cd9,0xe7f0d317,0x354a6a7f,0x4fda9e95
.word 0x7d58fa25,0x03c906ca,0xa429558d,0x280a5022,0xfeb1e14f,0xbaa0691a,0xb16b7fda,0x2e855cab
.word 0xcebd8173,0x695dd234,0x40108050,0xf7f4f303,0x0bcb16c0,0xf83eedc6,0x14052811,0x81671fe6
.word 0xb7e47353,0x9c2725bb,0x19413258,0x168b2c9d,0xa6a75101,0xe97dcf94,0x6e95dcfb,0x47d88e9f
.word 0xcbfb8b30,0x9fee2371,0xed7cc791,0x856617e3,0x53dda68e,0x5c17b84b,0x01470246,0x429e84dc
.word 0x0fca1ec5,0xb42d7599,0xc6bf9179,0x1c07381b,0x8ead0123,0x755aea2f,0x36836cb5,0xcc3385ff
.word 0x91633ff2,0x0802100a,0x92aa3938,0xd971afa8,0x07c80ecf,0x6419c87d,0x39497270,0x43d9869a
.word 0xeff2c31d,0xabe34b48,0x715be22a,0x1a883492,0x529aa4c8,0x98262dbe,0xc8328dfa,0xfab0e94a
.word 0x83e91b6a,0x3c0f7833,0x73d5e6a6,0x3a8074ba,0xc2be997c,0x13cd26de,0xd034bde4,0x3d487a75
.word 0xdbffab24,0xf57af78f,0x7a90f4ea,0x615fc23e,0x80201da0,0xbd6867d5,0x681ad072,0x82ae192c
.word 0xeab4c95e,0x4d549a19,0x7693ece5,0x88220daa,0x8d6407e9,0xe3f1db12,0xd173bfa2,0x4812905a
.word 0x1d403a5d,0x20084028,0x2bc356e8,0x97ec337b,0x4bdb9690,0xbea1611f,0x0e8d1c83,0xf43df5c9
.word 0x6697ccf1,0x00000000,0x1bcf36d4,0xac2b4587,0xc57697b3,0x328264b0,0x7fd6fea9,0x6c1bd877
.word 0xeeb5c15b,0x86af1129,0xb56a77df,0x5d50ba0d,0x0945124c,0xebf3cb18,0xc0309df0,0x9bef2b74
.word 0xfc3fe5c3,0x4955921c,0xb2a27910,0x8fea0365,0x89650fec,0xd2bab968,0xbc2f6593,0x27c04ee7
.word 0x5fdebe81,0x701ce06c,0xd3fdbb2e,0x294d5264,0x7292e4e0,0xc9758fbc,0x1806301e,0x128a2498
.word 0xf2b2f940,0xbfe66359,0x380e7036,0x7c1ff863,0x956237f7,0x77d4eea3,0x9aa82932,0x6296c4f4
.word 0xc3f99b3a,0x33c566f6,0x942535b1,0x7959f220,0x2a8454ae,0xd572b7a7,0xe439d5dd,0x2d4c5a61
.word 0x655eca3b,0xfd78e785,0xe038ddd8,0x0a8c1486,0x63d1c6b2,0xaea5410b,0xafe2434d,0x99612ff8
.word 0xf6b3f145,0x842115a5,0x4a9c94d6,0x781ef066,0x11432252,0x3bc776fc,0xd7fcb32b,0x10042014
.word 0x5951b208,0x5e99bcc7,0xa96d4fc4,0x340d6839,0xcffa8335,0x5bdfb684,0xe57ed79b,0x90243db4
.word 0xec3bc5d7,0x96ab313d,0x1fce3ed1,0x44118855,0x068f0c89,0x254e4a6b,0xe6b7d151,0x8beb0b60
.word 0xf03cfdcc,0x3e817cbf,0x6a94d4fe,0xfbf7eb0c,0xdeb9a167,0x4c13985f,0xb02c7d9c,0x6bd3d6b8
.word 0xbbe76b5c,0xa56e57cb,0x37c46ef3,0x0c03180f,0x45568a13,0x0d441a49,0xe17fdf9e,0x9ea92137
.word 0xa82a4d82,0xd6bbb16d,0x23c146e2,0x5153a202,0x57dcae8b,0x2c0b5827,0x4e9d9cd3,0xad6c47c1
.word 0xc43195f5,0xcd7487b9,0xfff6e309,0x05460a43,0x8aac0926,0x1e893c97,0x5014a044,0xa3e15b42
.word 0x5816b04e,0xe83acdd2,0xb9696fd0,0x2409482d,0xdd70a7ad,0xe2b6d954,0x67d0ceb7,0x93ed3b7e
.word 0x17cc2edb,0x15422a57,0x5a98b4c2,0xaaa4490e,0xa0285d88,0x6d5cda31,0xc7f8933f,0x228644a4
table7:
.word 0x186018c0,0x238c2305,0xc63fc67e,0xe887e813,0x8726874c,0xb8dab8a9,0x01040108,0x4f214f42
.word 0x36d836ad,0xa6a2a659,0xd26fd2de,0xf5f3f5fb,0x79f979ef,0x6fa16f5f,0x917e91fc,0x525552aa
.word 0x609d6027,0xbccabc89,0x9b569bac,0x8e028e04,0xa3b6a371,0x0c300c60,0x7bf17bff,0x35d435b5
.word 0x1d741de8,0xe0a7e053,0xd77bd7f6,0xc22fc25e,0x2eb82e6d,0x4b314b62,0xfedffea3,0x57415782
.word 0x155415a8,0x77c1779f,0x37dc37a5,0xe5b3e57b,0x9f469f8c,0xf0e7f0d3,0x4a354a6a,0xda4fda9e
.word 0x587d58fa,0xc903c906,0x29a42955,0x0a280a50,0xb1feb1e1,0xa0baa069,0x6bb16b7f,0x852e855c
.word 0xbdcebd81,0x5d695dd2,0x10401080,0xf4f7f4f3,0xcb0bcb16,0x3ef83eed,0x05140528,0x6781671f
.word 0xe4b7e473,0x279c2725,0x41194132,0x8b168b2c,0xa7a6a751,0x7de97dcf,0x956e95dc,0xd847d88e
.word 0xfbcbfb8b,0xee9fee23,0x7ced7cc7,0x66856617,0xdd53dda6,0x175c17b8,0x47014702,0x9e429e84
.word 0xca0fca1e,0x2db42d75,0xbfc6bf91,0x071c0738,0xad8ead01,0x5a755aea,0x8336836c,0x33cc3385
.word 0x6391633f,0x02080210,0xaa92aa39,0x71d971af,0xc807c80e,0x196419c8,0x49394972,0xd943d986
.word 0xf2eff2c3,0xe3abe34b,0x5b715be2,0x881a8834,0x9a529aa4,0x2698262d,0x32c8328d,0xb0fab0e9
.word 0xe983e91b,0x0f3c0f78,0xd573d5e6,0x803a8074,0xbec2be99,0xcd13cd26,0x34d034bd,0x483d487a
.word 0xffdbffab,0x7af57af7,0x907a90f4,0x5f615fc2,0x2080201d,0x68bd6867,0x1a681ad0,0xae82ae19
.word 0xb4eab4c9,0x544d549a,0x937693ec,0x2288220d,0x648d6407,0xf1e3f1db,0x73d173bf,0x12481290
.word 0x401d403a,0x08200840,0xc32bc356,0xec97ec33,0xdb4bdb96,0xa1bea161,0x8d0e8d1c,0x3df43df5
.word 0x976697cc,0x00000000,0xcf1bcf36,0x2bac2b45,0x76c57697,0x82328264,0xd67fd6fe,0x1b6c1bd8
.word 0xb5eeb5c1,0xaf86af11,0x6ab56a77,0x505d50ba,0x45094512,0xf3ebf3cb,0x30c0309d,0xef9bef2b
.word 0x3ffc3fe5,0x55495592,0xa2b2a279,0xea8fea03,0x6589650f,0xbad2bab9,0x2fbc2f65,0xc027c04e
.word 0xde5fdebe,0x1c701ce0,0xfdd3fdbb,0x4d294d52,0x927292e4,0x75c9758f,0x06180630,0x8a128a24
.word 0xb2f2b2f9,0xe6bfe663,0x0e380e70,0x1f7c1ff8,0x62956237,0xd477d4ee,0xa89aa829,0x966296c4
.word 0xf9c3f99b,0xc533c566,0x25942535,0x597959f2,0x842a8454,0x72d572b7,0x39e439d5,0x4c2d4c5a
.word 0x5e655eca,0x78fd78e7,0x38e038dd,0x8c0a8c14,0xd163d1c6,0xa5aea541,0xe2afe243,0x6199612f
.word 0xb3f6b3f1,0x21842115,0x9c4a9c94,0x1e781ef0,0x43114322,0xc73bc776,0xfcd7fcb3,0x04100420
.word 0x515951b2,0x995e99bc,0x6da96d4f,0x0d340d68,0xfacffa83,0xdf5bdfb6,0x7ee57ed7,0x2490243d
.word 0x3bec3bc5,0xab96ab31,0xce1fce3e,0x11441188,0x8f068f0c,0x4e254e4a,0xb7e6b7d1,0xeb8beb0b
.word 0x3cf03cfd,0x813e817c,0x946a94d4,0xf7fbf7eb,0xb9deb9a1,0x134c1398,0x2cb02c7d,0xd36bd3d6
.word 0xe7bbe76b,0x6ea56e57,0xc437c46e,0x030c0318,0x5645568a,0x440d441a,0x7fe17fdf,0xa99ea921
.word 0x2aa82a4d,0xbbd6bbb1,0xc123c146,0x535153a2,0xdc57dcae,0x0b2c0b58,0x9d4e9d9c,0x6cad6c47
.word 0x31c43195,0x74cd7487,0xf6fff6e3,0x4605460a,0xac8aac09,0x891e893c,0x145014a0,0xe1a3e15b
.word 0x165816b0,0x3ae83acd,0x69b9696f,0x09240948,0x70dd70a7,0xb6e2b6d9,0xd067d0ce,0xed93ed3b
.word 0xcc17cc2e,0x4215422a,0x985a98b4,0xa4aaa449,0x28a0285d,0x5c6d5cda,0xf8c7f893,0x86228644
statevector:
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
keyvector:
.word 0x3139322d, 0x62697420
.word 0x53656372, 0x6574204b
.word 0x65792076, 0x616c7565
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
noncevector:
.word 0x4e6f6e63, 0x65732055
.word 0x73656420, 0x4f6e6365
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
authenticatedvector:
.word 0x41414420, 0x54657374
.word 0x20566563, 0x746f7220
.word 0x45786163, 0x7420426c
.word 0x6f636b20, 0x33322042
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
plaintext1:
.word 0x3220426c, 0x6f636b20
.word 0x54657374, 0x20566563
.word 0x746f7220, 0x666f7220
.word 0x73747269, 0x626f6231
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
plaintext2:
.word 0x39327232, 0x64320000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
ciphervector:
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
.word 0x00000000, 0x00000000
/*
testvector:
.word 0x7738E1B5, 0x41A036EA
.word 0x458D50F8, 0x0FA01C44
.word 0x7288CE97, 0xD1A0DCF0
.word 0x1695FFD6, 0xE71D0925
.word 0x33BE309F, 0x012A5909
.word 0x72911459, 0x5F086E76
.word 0x0718AFE3, 0x65BC09DE
.word 0xB6AFA180, 0xBCEC2A98
*/
mem:
.word 0
.text
.syntax unified
.globl func
func:
push {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
ldr r0,=mem
str r13,[r0]
ldr r13,=statevector
ldr r14,=keyvector
// Keyvector XOR'ing, this is pretty much unnessecary, we could just load the key in memory instead, oh well.
// 0x01 Goes at position 25, 0x12 goes at position 32
// Load key
ldr r0,[r14],#4
ldr r1,[r14],#4
ldr r2,[r14],#4
ldr r3,[r14],#4
ldr r4,[r14],#4
ldr r5,[r14],#4
// Load state
ldr r6,[r13],#4
ldr r7,[r13],#4
ldr r8,[r13],#4
ldr r9,[r13],#4
ldr r10,[r13],#4
ldr r11,[r13],#-20
// Xor key and state
eor r0,r0,r6
eor r1,r1,r7
eor r2,r2,r8
eor r3,r3,r9
eor r4,r4,r10
eor r5,r5,r11
// Store result
str r0,[r13],#4
str r1,[r13],#4
str r2,[r13],#4
str r3,[r13],#4
str r4,[r13],#4
str r5,[r13],#4
// Padding
mov r0,0x01000000
mov r1,0x12000000
str r0,[r13],#8
str r1,[r13],#-32
// In r13
pi
// Out r1
// Can't add to r13 compiler complains :(
add r14,r1,#128
// Nonce XOR'ing, 16 bytes
// Load Nonce
ldr r0,[r14],#4
ldr r1,[r14],#4
ldr r2,[r14],#4
ldr r3,[r14],#4
// Load state
ldr r6,[r13],#4
ldr r7,[r13],#4
ldr r8,[r13],#4
ldr r9,[r13],#4
ldr r10,[r13],#16
ldr r11,[r13],#-32
// Xor Nonce and state
eor r0,r0,r6
eor r1,r1,r7
eor r2,r2,r8
eor r3,r3,r9
mov r4,0x01000000
eor r4,r4,r10
mov r5,0x22000000
eor r5,r5,r11
// Store result
str r0,[r13],#4
str r1,[r13],#4
str r2,[r13],#4
str r3,[r13],#4
str r4,[r13],#16
str r5,[r13],#-32
pi
// Authenticated data XOR'ing, 32 bytes
// Load AAD 24 bytes
add r14,r1,#192
ldr r0,[r14],#4
ldr r1,[r14],#4
ldr r2,[r14],#4
ldr r3,[r14],#4
ldr r4,[r14],#4
ldr r5,[r14],#4
// Load state
ldr r6,[r13],#4
ldr r7,[r13],#4
ldr r8,[r13],#4
ldr r9,[r13],#4
ldr r10,[r13],#4
ldr r11,[r13],#-20
// Xor AAD and state
eor r0,r0,r6
eor r1,r1,r7
eor r2,r2,r8
eor r3,r3,r9
eor r4,r4,r10
eor r5,r5,r11
// Store result
str r0,[r13],#4
str r1,[r13],#4
str r2,[r13],#4
str r3,[r13],#4
str r4,[r13],#4
str r5,[r13],#4
// 8 More bytes of AAD
ldr r0,[r14],#4
ldr r1,[r14],#4
// 8 More bytes of state and one of padding
ldr r2,[r13],#4
ldr r3,[r13],#4
ldr r4,[r13],#-8
// Xor AAD and state
eor r0,r0,r2
eor r1,r1,r3
mov r2,0x43000000
eor r2,r2,r4
str r0,[r13],#4
str r1,[r13],#4
// Padding
str r2,[r13],#-32
pi
// Start encryption
add r12,r1,#384
add r14,r1,#256
// For the final output
// 9 Bytes of state
ldr r0,[r13],#4
ldr r1,[r13],#4
ldr r2,[r13],#4
ldr r3,[r13],#4
ldr r4,[r13],#4
ldr r5,[r13],#4
ldr r6,[r13],#4
ldr r7,[r13],#4
ldr r8,[r13],#-32
// First three chunks of plaintext
ldr r9,[r14],#4
ldr r10,[r14],#4
ldr r11,[r14],#4
eor r0,r0,r9
eor r1,r1,r10
eor r2,r2,r11
str r0,[r12],#4
str r0,[r13],#4
str r1,[r12],#4
str r1,[r13],#4
str r2,[r12],#4
str r2,[r13],#4
// Next five chunks of plaintext
ldr r0,[r14],#4
ldr r1,[r14],#4
ldr r2,[r14],#4
ldr r9,[r14],#4
ldr r10,[r14],#4
mov r11,0x50000000
eor r0,r0,r3
eor r1,r1,r4
eor r2,r2,r5
eor r9,r9,r6
eor r10,r10,r7
eor r11,r11,r8
str r0,[r12],#4
str r0,[r13],#4
str r1,[r12],#4
str r1,[r13],#4
str r2,[r12],#4
str r2,[r13],#4
str r9,[r12],#4
str r9,[r13],#4
str r10,[r12],#4
str r10,[r13],#4
str r11,[r13],#-32
pi
// encrypt second part of plain text
// Output pointer
add r12,r1,#416
// Second PT block pointer
add r14,r1,#320
ldr r0,[r13],#4
ldr r1,[r13],#-4
ldr r2,[r14],#4
ldr r3,[r14],#4
eor r0,r0,r2
eor r1,r1,r3
str r0,[r12],#4
str r1,[r12],#4
str r0,[r13],#4
mov r2,0x0100
eor r1,r1,r2
str r1,[r13],#-4
mov r0,0x52000000
ldr r1,[r13,#32]
eor r0,r0,r1
str r0,[r13,#32]
pi
add r12,r1,#420
// Store MAC
ldrh r2,[r1,#2] // aeae
ldrh r3,[r1],#4 // 710f
ldrh r4,[r1],#2 // 3e56
ldrh r5,[r1],#2 // 0ded
ldrh r6,[r1],#2 // 26fe
ldrh r7,[r1],#2 // 5bd0
ldrh r8,[r1],#2 // 4a4f
ldrh r9,[r1],#2 // 20f6
strh r2,[r12]
str r5,[r12,#4]
str r3,[r12,#6]
str r7,[r12,#8]
str r4,[r12,#10]
str r9,[r12,#12]
str r6,[r12,#14]
str r8,[r12,#18]
// T-t-t-that's all folks!
ldr r0,=mem
ldr r13,[r0]
add r1,r12,#-0x24
pop {r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r14}
bx lr