Subversion Repositories Kolibri OS

Rev

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

  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