Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
9070 hidnplayr 1
;--------------------------------------------------------------------------;
2
; Blowfish algorithm by Echo
3
;--------------------------------------------------------------------------;
4
; Blowfish is a keyed, symmetric block cipher, designed in 1993 by Bruce
5
; Schneier and included in a large number of cipher suites and encryption products.
6
;--------------------------------------------------------------------------;
7
; Implemented in x86 assembly using FASM
8
;--------------------------------------------------------------------------;
9
 
10
BLOWFISH_BLOCKSIZE      = 8
11
 
12
struct blowfish_context
13
        pbox    rd 18
14
        sbox    rd 1024
15
ends
16
 
17
;--------------------------------------------------------------------------;
18
; blowfish_init F: Generates subkeys to be used for encryption and decryption
19
; @ctx_init: Pointer an allocated region of memory that will contain a crypt context
20
; @key: Pointer to an array of bytes to be used to encrypt or decrypt a 64-bit block of data
21
; @key_len: Length of @key, not to exceed 56 bytes
22
; Return: Nothing
23
;--------------------------------------------------------------------------;
24
 
25
proc blowfish_set_key, _ctx, _userkey, _userkey_len
26
 
27
        push    ecx
28
        push    edx
29
        push    ebx
30
        push    edi
31
        push    esi
32
 
33
        ; Write the values of the PBOX into a region allocated for the crypt context
34
        mov     edi, [_ctx]
35
        mov     esi, blowfish_fixed_p
36
        mov     ecx, 18
37
        rep movsd
38
        ; Write the values of the SBOX into that context
39
        mov     esi, blowfish_fixed_s
40
        mov     ecx, 1024
41
        rep movsd
42
 
43
        xor     ecx, ecx
44
        xor     eax, eax
45
  .init_subkey_generation:
46
 
47
        xor     edx, edx
48
        xor     ebx, ebx
49
  .init_subkey_generation2:
50
        ; Check to make sure the index offset doesn't go out of bounds
51
        cmp     [_userkey_len], eax
52
        jne     .dont_reset_index
53
        xor     eax, eax
54
  .dont_reset_index:
55
        mov     esi, [_userkey]
56
 
57
        ; Create an element so that, the element is bitwise shifted left by 8 bits and bitwise or'd with @key at the current offset
58
        mov     esi, [esi + eax]
59
        and     esi, 0xFF
60
        shl     ebx, 8
61
        or      ebx, esi
62
 
63
        inc     eax
64
        inc     edx
65
        cmp     edx, 4
66
        jne     .init_subkey_generation2
67
 
68
        ; Bitwise xor every integar in the pbox of the crypt context with previous result
69
        mov     esi, [_ctx]
70
        xor     dword [esi + ecx * 4], ebx
71
 
72
        inc     ecx
73
        cmp     ecx, 18
74
        jne     .init_subkey_generation
75
 
76
        xor     ebx, ebx
77
        xor     eax, eax
78
        xor     edx, edx
79
  .init_permutations:
80
        ; Store two 32-bit unsigned integars on the stack and pass their stack location to blowfish_encrypt_block
81
        push    edx
82
        push    eax
83
        mov     esi, esp
84
        add     esi, 4
85
        push    esi
86
        sub     esi, 4
87
        push    esi
88
        push    [_ctx]
89
        call    blowfish_encrypt
90
        pop     eax
91
        pop     edx
92
 
93
        ; Move the upper 32 bits of the result from the above call to blowfish_encrypt_block into every other element in the PBOX of the crypt context
94
        mov     esi, [_ctx]
95
        mov     [esi + ebx * 4], eax
96
 
97
        ; Same prodecure here except use the lower 32 bits
98
        inc     ebx
99
        mov     dword [esi + ebx * 4], edx
100
 
101
        inc     ebx
102
        cmp     ebx, 18
103
        jne     .init_permutations
104
 
105
        xor     ebx, ebx
106
  .init_substitution_box:
107
        xor     ecx, ecx
108
  .init_substitution_box2:
109
        ; Store two 32-bit unsigned integars on the stack and pass their stack location to blowfish_encrypt_block
110
        push    edx
111
        push    eax
112
        mov     esi, esp
113
        add     esi, 4
114
        push    esi
115
        sub     esi, 4
116
        push    esi
117
        push    [_ctx]
118
        call    blowfish_encrypt
119
        pop     eax
120
        pop     edx
121
 
122
        ; Find the correct address of the required element in the SBOX of the crypt context
123
        mov     esi, [_ctx]
124
        lea     esi, [esi + 72 + ecx * 4]
125
        push    eax
126
        mov     eax, ebx
127
        push    ecx
128
        mov     ecx, 1024
129
        push    edx
130
        mul     ecx
131
        pop     edx
132
        pop     ecx
133
        add     esi, eax
134
        pop     eax
135
 
136
        ; Move the upper 32-bit result from the previous call to blowfish_encrypt_block into the SBOX of the crypt context, offset by the previous result
137
        mov     [esi], eax
138
 
139
        ; Same procedure here except, use the lower 32-bit result for every other element in the SBOX of the crypt context
140
        mov     [esi + 4], edx
141
        inc     ecx
142
 
143
        inc     ecx
144
        cmp     ecx, 256
145
        jne     .init_substitution_box2
146
 
147
        inc     ebx
148
        cmp     ebx, 4
149
        jne     .init_substitution_box
150
 
151
        pop     esi
152
        pop     edi
153
        pop     ebx
154
        pop     edx
155
        pop     ecx
156
 
157
        ret
158
 
159
endp
160
 
161
;--------------------------------------------------------------------------;
162
; Procedure F: Seperates @x into four 8-bit quarters
163
; @ctx_F: Pointer to crypt context to be used
164
; @x: 32-bit unsigned integar to be used
165
; Return: Divided value of @x
166
;--------------------------------------------------------------------------;
167
 
168
proc blowfish_f, _ctx, x
169
 
170
        push    edx
171
        push    ecx
172
 
173
        mov     edx, [x]
174
        shr     edx, 24
175
        and     edx, 0xFF
176
 
177
        mov     ecx, [x]
178
        shr     ecx, 16
179
        and     ecx, 0xFF
180
 
181
        ; Get an unsigned integar from the first 256 integers in the SBOX in relation to the upper 8 bits of @x
182
        mov     eax, [_ctx]
183
        mov     eax, [eax + edx * 4 + 0x48]
184
 
185
        ; Do the same here but take the lower 8 bits of the high word and add the two together
186
        mov     edx, [_ctx]
187
        add     eax, [edx + ecx * 4 + 0x448]
188
 
189
        mov     edx, [x]
190
        shr     edx, 8
191
        and     edx, 0xFF
192
 
193
        ; Same procedure except, use the upper 8 bits of the low word and xor with the previous value
194
        mov     ecx, [_ctx]
195
        xor     eax, [ecx + edx * 4 + 0x848]
196
 
197
        ; Same procedure except, use the lower 8 bits of the low word and add to the previous value
198
        mov     edx, [x]
199
        and     edx, 0xFF
200
        add     eax, [ecx + edx * 4 + 0xC48]
201
 
202
        pop     ecx
203
        pop     edx
204
 
205
        ret
206
 
207
endp
208
 
209
 
210
proc blowfish_encrypt, _ctx, _in, _out
211
 
212
locals
213
        low_encrypt  dd ?
214
        high_encrypt dd ?
215
endl
216
 
217
        push    ecx edx esi edi
218
 
219
        mov     esi, [_in]
220
        mov     edi, [_out]
221
        mov     [low_encrypt], edi
222
        movsd
223
        mov     [low_encrypt], edi
224
        movsd
225
 
226
; Begin 16 round encyption on 64 bit element
227
        xor     ecx, ecx
228
  .loop_encrypt:
229
        ; Bitwise xor @high_encrypt with every PBOX in the given crypt context
230
        mov     eax, [_ctx]
231
        mov     eax, [eax + ecx * 4]
232
        mov     edx, [high_encrypt]
233
        xor     dword[edx], eax
234
 
235
        ; Bitwise xor @low_encrypt with the value returned by F using @high_encrypt
236
        push    dword[edx]
237
        push    [_ctx]
238
        call    blowfish_f
239
        mov     edx, [low_encrypt]
240
        xor     dword[edx], eax
241
 
242
        ; Swap upper and lower 32 bits
243
        push    dword[edx]
244
        mov     eax, [high_encrypt]
245
        mov     eax, [eax]
246
        mov     dword[edx], eax
247
        pop     edx
248
        mov     eax, [high_encrypt]
249
        mov     dword[eax], edx
250
 
251
        inc     ecx
252
        cmp     ecx, 16
253
        jne     .loop_encrypt
254
 
255
        ; Swap upper and lower 32 bits again
256
        mov     edx, [low_encrypt]
257
        push    dword[edx]
258
        mov     eax, [high_encrypt]
259
        mov     eax, [eax]
260
        mov     dword[edx], eax
261
        pop     edx
262
        mov     eax, [high_encrypt]
263
        mov     dword[eax], edx
264
 
265
        ; Bitwise xor @low_encrypt with the value of the second to last PBOX in the given crypt context
266
        mov     eax, [low_encrypt]
267
        mov     edx, [_ctx]
268
        mov     edx, [edx + 64]
269
        xor     dword[eax], edx
270
 
271
        ; Bitwise xor @high_encrypt with the value of the last PBOX in the given crypt context
272
        mov     eax, [high_encrypt]
273
        mov     edx, [_ctx]
274
        mov     edx, [edx + 68]
275
        xor     dword[eax], edx
276
 
277
        pop     edi esi edx ecx
278
 
279
        ret
280
 
281
endp
282
 
283
 
284
 
285
proc blowfish_decrypt, _ctx, _in, _out
286
 
287
locals
288
        low_decrypt  dd ?
289
        high_decrypt dd ?
290
endl
291
 
292
        push    ecx edx esi edi
293
 
294
        mov     esi, [_in]
295
        mov     edi, [_out]
296
        mov     [low_decrypt], edi
297
        movsd
298
        mov     [low_decrypt], edi
299
        movsd
300
 
301
; Begin 16 round encyption on 64 bit element
302
        mov     ecx, 16
303
  .loop_encrypt:
304
        ; Bitwise xor @high_encrypt with every PBOX in the given crypt context
305
        mov     eax, [_ctx]
306
        mov     eax, [eax + ecx * 4]
307
        mov     edx, [high_decrypt]
308
        xor     dword[edx], eax
309
 
310
        ; Bitwise xor @low_encrypt with the value returned by F using @high_encrypt
311
        push    dword[edx]
312
        push    [_ctx]
313
        call    F
314
        mov     edx, [low_decrypt]
315
        xor     dword[edx], eax
316
 
317
        ; Swap upper and lower 32 bits
318
        push    dword[edx]
319
        mov     eax, [high_decrypt]
320
        mov     eax, [eax]
321
        mov     dword[edx], eax
322
        pop     edx
323
        mov     eax, [high_decrypt]
324
        mov     dword[eax], edx
325
 
326
        dec     ecx
327
        jnz     .loop_encrypt
328
 
329
        ; Swap upper and lower 32 bits again
330
        mov     edx, [low_decrypt]
331
        push    dword[edx]
332
        mov     eax, [high_decrypt]
333
        mov     eax, [eax]
334
        mov     dword[edx], eax
335
        pop     edx
336
        mov     eax, [high_decrypt]
337
        mov     dword[eax], edx
338
 
339
        ; Bitwise xor @low_encrypt with the value of the second PBOX in the given crypt context
340
        mov     eax, [low_decrypt]
341
        mov     edx, [_ctx]
342
        mov     edx, [edx + 4]
343
        xor     dword[eax], edx
344
 
345
        ; Bitwise xor @high_encrypt with the value of the first PBOX in the given crypt context
346
        mov     eax, [high_decrypt]
347
        mov     edx, [_ctx]
348
        mov     edx, [edx + 0]
349
        xor     dword[eax], edx
350
 
351
        pop     edi esi edx ecx
352
 
353
        ret
354
 
355
endp
356
 
357
 
358
;--------------------------------------------------------------------------;
359
; Following tables are used for key generation
360
;--------------------------------------------------------------------------;
361
iglobal
362
 
363
blowfish_fixed_p dd \
364
        0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, \
365
        0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, \
366
        0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, \
367
        0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, \
368
        0x9216D5D9, 0x8979FB1B
369
 
370
blowfish_fixed_s dd \
371
        0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,\
372
        0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, \
373
        0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, \
374
        0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, \
375
        0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, \
376
        0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, \
377
        0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, \
378
        0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, \
379
        0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, \
380
        0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, \
381
        0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, \
382
        0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, \
383
        0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, \
384
        0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, \
385
        0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, \
386
        0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, \
387
        0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, \
388
        0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, \
389
        0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, \
390
        0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, \
391
        0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, \
392
        0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, \
393
        0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, \
394
        0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, \
395
        0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, \
396
        0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, \
397
        0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, \
398
        0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, \
399
        0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, \
400
        0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, \
401
        0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, \
402
        0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, \
403
        0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, \
404
        0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, \
405
        0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, \
406
        0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, \
407
        0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, \
408
        0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, \
409
        0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, \
410
        0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, \
411
        0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, \
412
        0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, \
413
        0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, \
414
        0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, \
415
        0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, \
416
        0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, \
417
        0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, \
418
        0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, \
419
        0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, \
420
        0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, \
421
        0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, \
422
        0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, \
423
        0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, \
424
        0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, \
425
        0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, \
426
        0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, \
427
        0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, \
428
        0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, \
429
        0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, \
430
        0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, \
431
        0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, \
432
        0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, \
433
        0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, \
434
        0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A, \
435
        0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, \
436
        0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, \
437
        0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, \
438
        0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, \
439
        0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, \
440
        0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, \
441
        0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, \
442
        0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, \
443
        0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, \
444
        0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, \
445
        0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, \
446
        0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, \
447
        0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, \
448
        0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, \
449
        0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, \
450
        0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, \
451
        0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, \
452
        0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, \
453
        0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, \
454
        0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, \
455
        0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, \
456
        0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, \
457
        0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, \
458
        0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, \
459
        0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, \
460
        0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, \
461
        0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, \
462
        0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, \
463
        0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, \
464
        0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, \
465
        0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, \
466
        0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, \
467
        0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, \
468
        0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, \
469
        0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, \
470
        0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, \
471
        0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, \
472
        0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, \
473
        0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, \
474
        0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, \
475
        0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, \
476
        0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, \
477
        0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, \
478
        0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, \
479
        0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, \
480
        0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, \
481
        0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, \
482
        0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, \
483
        0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, \
484
        0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, \
485
        0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, \
486
        0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, \
487
        0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, \
488
        0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, \
489
        0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, \
490
        0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, \
491
        0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, \
492
        0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, \
493
        0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, \
494
        0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, \
495
        0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, \
496
        0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, \
497
        0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, \
498
        0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7, \
499
        0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, \
500
        0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, \
501
        0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, \
502
        0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, \
503
        0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, \
504
        0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, \
505
        0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, \
506
        0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, \
507
        0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, \
508
        0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, \
509
        0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, \
510
        0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, \
511
        0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, \
512
        0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, \
513
        0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, \
514
        0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, \
515
        0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, \
516
        0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, \
517
        0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, \
518
        0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, \
519
        0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, \
520
        0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, \
521
        0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, \
522
        0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, \
523
        0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, \
524
        0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, \
525
        0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, \
526
        0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, \
527
        0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, \
528
        0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, \
529
        0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, \
530
        0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, \
531
        0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, \
532
        0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, \
533
        0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, \
534
        0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, \
535
        0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, \
536
        0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, \
537
        0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, \
538
        0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, \
539
        0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, \
540
        0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, \
541
        0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, \
542
        0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, \
543
        0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, \
544
        0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, \
545
        0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, \
546
        0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, \
547
        0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, \
548
        0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, \
549
        0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, \
550
        0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, \
551
        0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, \
552
        0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, \
553
        0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, \
554
        0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, \
555
        0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, \
556
        0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, \
557
        0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, \
558
        0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, \
559
        0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, \
560
        0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, \
561
        0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, \
562
        0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0, \
563
        0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, \
564
        0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, \
565
        0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, \
566
        0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, \
567
        0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, \
568
        0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, \
569
        0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, \
570
        0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, \
571
        0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, \
572
        0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, \
573
        0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, \
574
        0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, \
575
        0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, \
576
        0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, \
577
        0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, \
578
        0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, \
579
        0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, \
580
        0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, \
581
        0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, \
582
        0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, \
583
        0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, \
584
        0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, \
585
        0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, \
586
        0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, \
587
        0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, \
588
        0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, \
589
        0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, \
590
        0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, \
591
        0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, \
592
        0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, \
593
        0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, \
594
        0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, \
595
        0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, \
596
        0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, \
597
        0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, \
598
        0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, \
599
        0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, \
600
        0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, \
601
        0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, \
602
        0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, \
603
        0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, \
604
        0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, \
605
        0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, \
606
        0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, \
607
        0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, \
608
        0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, \
609
        0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, \
610
        0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, \
611
        0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, \
612
        0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, \
613
        0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, \
614
        0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, \
615
        0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, \
616
        0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, \
617
        0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, \
618
        0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, \
619
        0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, \
620
        0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, \
621
        0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, \
622
        0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, \
623
        0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, \
624
        0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, \
625
        0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, \
626
        0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6
627
 
628
endg