Home | History | Annotate | Download | only in cipher
      1 /*
      2  * aes.c
      3  *
      4  * An implemnetation of the AES block cipher.
      5  *
      6  * David A. McGrew
      7  * Cisco Systems, Inc.
      8  */
      9 
     10 /*
     11  *
     12  * Copyright (c) 2001-2006, Cisco Systems, Inc.
     13  * All rights reserved.
     14  *
     15  * Redistribution and use in source and binary forms, with or without
     16  * modification, are permitted provided that the following conditions
     17  * are met:
     18  *
     19  *   Redistributions of source code must retain the above copyright
     20  *   notice, this list of conditions and the following disclaimer.
     21  *
     22  *   Redistributions in binary form must reproduce the above
     23  *   copyright notice, this list of conditions and the following
     24  *   disclaimer in the documentation and/or other materials provided
     25  *   with the distribution.
     26  *
     27  *   Neither the name of the Cisco Systems, Inc. nor the names of its
     28  *   contributors may be used to endorse or promote products derived
     29  *   from this software without specific prior written permission.
     30  *
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     34  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     35  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     36  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     37  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     38  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     41  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     42  * OF THE POSSIBILITY OF SUCH DAMAGE.
     43  *
     44  */
     45 
     46 
     47 #include "aes.h"
     48 #include "err.h"
     49 
     50 /*
     51  * we use the tables T0, T1, T2, T3, and T4 to compute AES, and
     52  * the tables U0, U1, U2, and U4 to compute its inverse
     53  *
     54  * different tables are used on little-endian (Intel, VMS) and
     55  * big-endian processors (everything else)
     56  *
     57  * these tables are computed using the program tables/aes_tables; use
     58  * this program to generate different tables for porting or
     59  * optimization on a different platform
     60  */
     61 
     62 #ifndef WORDS_BIGENDIAN
     63 
     64 static uint32_t T0[256] = {
     65   0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6,
     66   0xdf2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
     67   0x50303060, 0x3010102, 0xa96767ce, 0x7d2b2b56,
     68   0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec,
     69   0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa,
     70   0x15fafaef, 0xeb5959b2, 0xc947478e, 0xbf0f0fb,
     71   0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45,
     72   0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b,
     73   0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c,
     74   0x5a36366c, 0x413f3f7e, 0x2f7f7f5, 0x4fcccc83,
     75   0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x8f1f1f9,
     76   0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a,
     77   0xc040408, 0x52c7c795, 0x65232346, 0x5ec3c39d,
     78   0x28181830, 0xa1969637, 0xf05050a, 0xb59a9a2f,
     79   0x907070e, 0x36121224, 0x9b80801b, 0x3de2e2df,
     80   0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea,
     81   0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34,
     82   0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b,
     83   0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d,
     84   0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413,
     85   0xf55353a6, 0x68d1d1b9, 0x0, 0x2cededc1,
     86   0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6,
     87   0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972,
     88   0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85,
     89   0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed,
     90   0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511,
     91   0xcf45458a, 0x10f9f9e9, 0x6020204, 0x817f7ffe,
     92   0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b,
     93   0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05,
     94   0xad92923f, 0xbc9d9d21, 0x48383870, 0x4f5f5f1,
     95   0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142,
     96   0x30101020, 0x1affffe5, 0xef3f3fd, 0x6dd2d2bf,
     97   0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3,
     98   0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e,
     99   0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a,
    100   0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6,
    101   0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3,
    102   0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b,
    103   0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428,
    104   0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad,
    105   0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14,
    106   0xdb494992, 0xa06060c, 0x6c242448, 0xe45c5cb8,
    107   0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4,
    108   0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2,
    109   0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda,
    110   0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949,
    111   0xb46c6cd8, 0xfa5656ac, 0x7f4f4f3, 0x25eaeacf,
    112   0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810,
    113   0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c,
    114   0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697,
    115   0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e,
    116   0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f,
    117   0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc,
    118   0xd8484890, 0x5030306, 0x1f6f6f7, 0x120e0e1c,
    119   0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969,
    120   0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27,
    121   0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122,
    122   0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433,
    123   0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9,
    124   0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
    125   0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a,
    126   0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0,
    127   0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e,
    128   0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c,
    129 };
    130 
    131 static uint32_t T1[256] = {
    132   0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d,
    133   0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154,
    134   0x30306050, 0x1010203, 0x6767cea9, 0x2b2b567d,
    135   0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a,
    136   0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87,
    137   0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b,
    138   0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea,
    139   0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b,
    140   0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a,
    141   0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f,
    142   0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908,
    143   0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f,
    144   0x404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e,
    145   0x18183028, 0x969637a1, 0x5050a0f, 0x9a9a2fb5,
    146   0x7070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d,
    147   0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f,
    148   0x909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e,
    149   0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb,
    150   0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce,
    151   0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397,
    152   0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c,
    153   0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed,
    154   0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b,
    155   0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a,
    156   0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16,
    157   0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194,
    158   0x45458acf, 0xf9f9e910, 0x2020406, 0x7f7ffe81,
    159   0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3,
    160   0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a,
    161   0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104,
    162   0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263,
    163   0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d,
    164   0xcdcd814c, 0xc0c1814, 0x13132635, 0xececc32f,
    165   0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39,
    166   0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47,
    167   0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695,
    168   0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f,
    169   0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83,
    170   0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c,
    171   0xdedea779, 0x5e5ebce2, 0xb0b161d, 0xdbdbad76,
    172   0xe0e0db3b, 0x32326456, 0x3a3a744e, 0xa0a141e,
    173   0x494992db, 0x6060c0a, 0x2424486c, 0x5c5cb8e4,
    174   0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6,
    175   0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b,
    176   0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7,
    177   0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0,
    178   0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25,
    179   0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x8081018,
    180   0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72,
    181   0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751,
    182   0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21,
    183   0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85,
    184   0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa,
    185   0x484890d8, 0x3030605, 0xf6f6f701, 0xe0e1c12,
    186   0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0,
    187   0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9,
    188   0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233,
    189   0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7,
    190   0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920,
    191   0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a,
    192   0x8c8c038f, 0xa1a159f8, 0x89890980, 0xd0d1a17,
    193   0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8,
    194   0x414182c3, 0x999929b0, 0x2d2d5a77, 0xf0f1e11,
    195   0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a,
    196 };
    197 
    198 static uint32_t T2[256] = {
    199   0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b,
    200   0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5,
    201   0x30605030, 0x1020301, 0x67cea967, 0x2b567d2b,
    202   0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76,
    203   0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d,
    204   0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0,
    205   0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf,
    206   0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0,
    207   0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26,
    208   0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc,
    209   0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1,
    210   0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15,
    211   0x4080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3,
    212   0x18302818, 0x9637a196, 0x50a0f05, 0x9a2fb59a,
    213   0x70e0907, 0x12243612, 0x801b9b80, 0xe2df3de2,
    214   0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75,
    215   0x9121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a,
    216   0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0,
    217   0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3,
    218   0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784,
    219   0x53a6f553, 0xd1b968d1, 0x0, 0xedc12ced,
    220   0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b,
    221   0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39,
    222   0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf,
    223   0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb,
    224   0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485,
    225   0x458acf45, 0xf9e910f9, 0x2040602, 0x7ffe817f,
    226   0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8,
    227   0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f,
    228   0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5,
    229   0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321,
    230   0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2,
    231   0xcd814ccd, 0xc18140c, 0x13263513, 0xecc32fec,
    232   0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917,
    233   0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d,
    234   0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573,
    235   0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc,
    236   0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388,
    237   0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14,
    238   0xdea779de, 0x5ebce25e, 0xb161d0b, 0xdbad76db,
    239   0xe0db3be0, 0x32645632, 0x3a744e3a, 0xa141e0a,
    240   0x4992db49, 0x60c0a06, 0x24486c24, 0x5cb8e45c,
    241   0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662,
    242   0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79,
    243   0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d,
    244   0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9,
    245   0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea,
    246   0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x8101808,
    247   0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e,
    248   0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6,
    249   0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f,
    250   0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a,
    251   0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66,
    252   0x4890d848, 0x3060503, 0xf6f701f6, 0xe1c120e,
    253   0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9,
    254   0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e,
    255   0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311,
    256   0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794,
    257   0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9,
    258   0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf,
    259   0x8c038f8c, 0xa159f8a1, 0x89098089, 0xd1a170d,
    260   0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868,
    261   0x4182c341, 0x9929b099, 0x2d5a772d, 0xf1e110f,
    262   0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16,
    263 };
    264 
    265 static uint32_t T3[256] = {
    266   0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b,
    267   0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5,
    268   0x60503030, 0x2030101, 0xcea96767, 0x567d2b2b,
    269   0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676,
    270   0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d,
    271   0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0,
    272   0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf,
    273   0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0,
    274   0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626,
    275   0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc,
    276   0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1,
    277   0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515,
    278   0x80c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3,
    279   0x30281818, 0x37a19696, 0xa0f0505, 0x2fb59a9a,
    280   0xe090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2,
    281   0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575,
    282   0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a,
    283   0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0,
    284   0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3,
    285   0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484,
    286   0xa6f55353, 0xb968d1d1, 0x0, 0xc12ceded,
    287   0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b,
    288   0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939,
    289   0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf,
    290   0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb,
    291   0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585,
    292   0x8acf4545, 0xe910f9f9, 0x4060202, 0xfe817f7f,
    293   0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8,
    294   0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x58a8f8f,
    295   0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5,
    296   0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121,
    297   0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2,
    298   0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec,
    299   0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717,
    300   0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d,
    301   0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373,
    302   0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc,
    303   0x44662222, 0x547e2a2a, 0x3bab9090, 0xb838888,
    304   0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414,
    305   0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb,
    306   0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a,
    307   0x92db4949, 0xc0a0606, 0x486c2424, 0xb8e45c5c,
    308   0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262,
    309   0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979,
    310   0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d,
    311   0x18c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9,
    312   0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea,
    313   0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808,
    314   0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e,
    315   0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6,
    316   0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f,
    317   0x96dd4b4b, 0x61dcbdbd, 0xd868b8b, 0xf858a8a,
    318   0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666,
    319   0x90d84848, 0x6050303, 0xf701f6f6, 0x1c120e0e,
    320   0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9,
    321   0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e,
    322   0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111,
    323   0xd2bb6969, 0xa970d9d9, 0x7898e8e, 0x33a79494,
    324   0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9,
    325   0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf,
    326   0x38f8c8c, 0x59f8a1a1, 0x9808989, 0x1a170d0d,
    327   0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868,
    328   0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f,
    329   0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616,
    330 };
    331 
    332 static uint32_t U0[256] = {
    333   0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a,
    334   0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
    335   0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5,
    336   0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5,
    337   0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d,
    338   0x2752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b,
    339   0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295,
    340   0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e,
    341   0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927,
    342   0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d,
    343   0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362,
    344   0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9,
    345   0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52,
    346   0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566,
    347   0x728ebb2, 0x3c2b52f, 0x9a7bc586, 0xa50837d3,
    348   0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed,
    349   0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e,
    350   0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4,
    351   0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4,
    352   0x39ec830b, 0xaaef6040, 0x69f715e, 0x51106ebd,
    353   0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d,
    354   0xb58d5491, 0x55dc471, 0x6fd40604, 0xff155060,
    355   0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967,
    356   0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879,
    357   0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x0,
    358   0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c,
    359   0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36,
    360   0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624,
    361   0xb1670a0c, 0xfe75793, 0xd296eeb4, 0x9e919b1b,
    362   0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c,
    363   0xaba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12,
    364   0xb0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14,
    365   0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3,
    366   0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b,
    367   0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8,
    368   0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684,
    369   0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7,
    370   0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177,
    371   0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947,
    372   0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322,
    373   0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498,
    374   0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f,
    375   0xe49d3a2c, 0xd927850, 0x9bcc5f6a, 0x62467e54,
    376   0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382,
    377   0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf,
    378   0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb,
    379   0x97826cd, 0xf418596e, 0x1b79aec, 0xa89a4f83,
    380   0x656e95e6, 0x7ee6ffaa, 0x8cfbc21, 0xe6e815ef,
    381   0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029,
    382   0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235,
    383   0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733,
    384   0x4a9804f1, 0xf7daec41, 0xe50cd7f, 0x2ff69117,
    385   0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4,
    386   0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546,
    387   0x4ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb,
    388   0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d,
    389   0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb,
    390   0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a,
    391   0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773,
    392   0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
    393   0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2,
    394   0x72c31d16, 0xc25e2bc, 0x8b493c28, 0x41950dff,
    395   0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664,
    396   0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0,
    397 };
    398 
    399 static uint32_t U1[256] = {
    400   0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96,
    401   0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x3e34b93,
    402   0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525,
    403   0xd7e54ffc, 0xcb2ac5d7, 0x44352680, 0xa362b58f,
    404   0x5ab1de49, 0x1bba2567, 0xeea4598, 0xc0fe5de1,
    405   0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6,
    406   0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da,
    407   0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44,
    408   0x89c2756a, 0x798ef478, 0x3e58996b, 0x71b927dd,
    409   0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4,
    410   0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245,
    411   0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994,
    412   0x68487058, 0xfd458f19, 0x6cde9487, 0xf87b52b7,
    413   0xd373ab23, 0x24b72e2, 0x8f1fe357, 0xab55662a,
    414   0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x837d3a5,
    415   0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c,
    416   0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1,
    417   0xf4da65cd, 0xbe0506d5, 0x6234d11f, 0xfea6c48a,
    418   0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475,
    419   0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51,
    420   0x8a213ef9, 0x6dd963d, 0x53eddae, 0xbde64d46,
    421   0x8d5491b5, 0x5dc47105, 0xd406046f, 0x155060ff,
    422   0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777,
    423   0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db,
    424   0xa7ca147, 0xf427ce9, 0x1e84f8c9, 0x0,
    425   0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e,
    426   0xff0efdfb, 0x38850f56, 0xd5ae3d1e, 0x392d3627,
    427   0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a,
    428   0x670a0cb1, 0xe757930f, 0x96eeb4d2, 0x919b1b9e,
    429   0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16,
    430   0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d,
    431   0xd090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8,
    432   0x19f15785, 0x775af4c, 0xdd99eebb, 0x607fa3fd,
    433   0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34,
    434   0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863,
    435   0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420,
    436   0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d,
    437   0x2f9e1d4b, 0x30b2dcf3, 0x52860dec, 0xe3c177d0,
    438   0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722,
    439   0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef,
    440   0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0xbd49836,
    441   0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4,
    442   0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462,
    443   0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5,
    444   0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3,
    445   0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b,
    446   0x7826cd09, 0x18596ef4, 0xb79aec01, 0x9a4f83a8,
    447   0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6,
    448   0x9be7bad9, 0x366f4ace, 0x99fead4, 0x7cb029d6,
    449   0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0,
    450   0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315,
    451   0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f,
    452   0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x496e4df,
    453   0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, 0x5165467f,
    454   0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e,
    455   0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13,
    456   0x61d79a8c, 0xca1377a, 0x14f8598e, 0x3c13eb89,
    457   0x27a9ceee, 0xc961b735, 0xe51ce1ed, 0xb1477a3c,
    458   0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf,
    459   0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886,
    460   0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f,
    461   0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41,
    462   0x1a83971, 0xb30c08de, 0xe4b4d89c, 0xc1566490,
    463   0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042,
    464 };
    465 
    466 static uint32_t U2[256] = {
    467   0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e,
    468   0xab3bcb6b, 0x9d1ff145, 0xfaacab58, 0xe34b9303,
    469   0x302055fa, 0x76adf66d, 0xcc889176, 0x2f5254c,
    470   0xe54ffcd7, 0x2ac5d7cb, 0x35268044, 0x62b58fa3,
    471   0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0,
    472   0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9,
    473   0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59,
    474   0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8,
    475   0xc2756a89, 0x8ef47879, 0x58996b3e, 0xb927dd71,
    476   0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a,
    477   0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f,
    478   0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x8f9942b,
    479   0x48705868, 0x458f19fd, 0xde94876c, 0x7b52b7f8,
    480   0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab,
    481   0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508,
    482   0x2830f287, 0xbf23b2a5, 0x302ba6a, 0x16ed5c82,
    483   0xcf8a2b1c, 0x79a792b4, 0x7f3f0f2, 0x694ea1e2,
    484   0xda65cdf4, 0x506d5be, 0x34d11f62, 0xa6c48afe,
    485   0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb,
    486   0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110,
    487   0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd,
    488   0x5491b58d, 0xc471055d, 0x6046fd4, 0x5060ff15,
    489   0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e,
    490   0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee,
    491   0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x0,
    492   0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72,
    493   0xefdfbff, 0x850f5638, 0xae3d1ed5, 0x2d362739,
    494   0xf0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e,
    495   0xa0cb167, 0x57930fe7, 0xeeb4d296, 0x9b1b9e91,
    496   0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a,
    497   0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17,
    498   0x90e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9,
    499   0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60,
    500   0x1f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e,
    501   0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1,
    502   0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011,
    503   0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1,
    504   0x9e1d4b2f, 0xb2dcf330, 0x860dec52, 0xc177d0e3,
    505   0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264,
    506   0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90,
    507   0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b,
    508   0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf,
    509   0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246,
    510   0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af,
    511   0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312,
    512   0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb,
    513   0x26cd0978, 0x596ef418, 0x9aec01b7, 0x4f83a89a,
    514   0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8,
    515   0xe7bad99b, 0x6f4ace36, 0x9fead409, 0xb029d67c,
    516   0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066,
    517   0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8,
    518   0x4f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6,
    519   0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04,
    520   0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, 0x65467f51,
    521   0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0xbfb2e41,
    522   0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347,
    523   0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c,
    524   0xa9ceee27, 0x61b735c9, 0x1ce1ede5, 0x477a3cb1,
    525   0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37,
    526   0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db,
    527   0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40,
    528   0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0xdff4195,
    529   0xa8397101, 0xc08deb3, 0xb4d89ce4, 0x566490c1,
    530   0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257,
    531 };
    532 
    533 static uint32_t U3[256] = {
    534   0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27,
    535   0x3bcb6bab, 0x1ff1459d, 0xacab58fa, 0x4b9303e3,
    536   0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02,
    537   0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362,
    538   0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe,
    539   0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3,
    540   0x3e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952,
    541   0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9,
    542   0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9,
    543   0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace,
    544   0x63184adf, 0xe582311a, 0x97603351, 0x62457f53,
    545   0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08,
    546   0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b,
    547   0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55,
    548   0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837,
    549   0x30f28728, 0x23b2a5bf, 0x2ba6a03, 0xed5c8216,
    550   0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269,
    551   0x65cdf4da, 0x6d5be05, 0xd11f6234, 0xc48afea6,
    552   0x349d532e, 0xa2a055f3, 0x532e18a, 0xa475ebf6,
    553   0xb39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e,
    554   0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6,
    555   0x91b58d54, 0x71055dc4, 0x46fd406, 0x60ff1550,
    556   0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9,
    557   0xb0bd42e8, 0x7888b89, 0xe7385b19, 0x79dbeec8,
    558   0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x0,
    559   0x9838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a,
    560   0xfdfbff0e, 0xf563885, 0x3d1ed5ae, 0x3627392d,
    561   0xa64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36,
    562   0xcb1670a, 0x930fe757, 0xb4d296ee, 0x1b9e919b,
    563   0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12,
    564   0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b,
    565   0xe0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e,
    566   0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f,
    567   0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb,
    568   0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4,
    569   0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6,
    570   0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129,
    571   0x1d4b2f9e, 0xdcf330b2, 0xdec5286, 0x77d0e3c1,
    572   0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9,
    573   0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033,
    574   0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4,
    575   0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad,
    576   0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e,
    577   0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3,
    578   0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225,
    579   0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b,
    580   0xcd097826, 0x6ef41859, 0xec01b79a, 0x83a89a4f,
    581   0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815,
    582   0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0,
    583   0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2,
    584   0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7,
    585   0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691,
    586   0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496,
    587   0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165,
    588   0x9d04ea5e, 0x15d358c, 0xfa737487, 0xfb2e410b,
    589   0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6,
    590   0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13,
    591   0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147,
    592   0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7,
    593   0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
    594   0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3,
    595   0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d,
    596   0x397101a8, 0x8deb30c, 0xd89ce4b4, 0x6490c156,
    597   0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8,
    598 };
    599 
    600 #else /* assume big endian */
    601 
    602 static uint32_t T0[256] = {
    603   0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
    604   0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
    605   0x60303050, 0x2010103, 0xce6767a9, 0x562b2b7d,
    606   0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
    607   0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
    608   0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
    609   0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
    610   0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
    611   0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
    612   0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
    613   0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
    614   0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
    615   0x804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
    616   0x30181828, 0x379696a1, 0xa05050f, 0x2f9a9ab5,
    617   0xe070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
    618   0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
    619   0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
    620   0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
    621   0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
    622   0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
    623   0xa65353f5, 0xb9d1d168, 0x0, 0xc1eded2c,
    624   0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
    625   0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
    626   0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
    627   0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
    628   0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
    629   0x8a4545cf, 0xe9f9f910, 0x4020206, 0xfe7f7f81,
    630   0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
    631   0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x58f8f8a,
    632   0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
    633   0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
    634   0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
    635   0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
    636   0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
    637   0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
    638   0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
    639   0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
    640   0x44222266, 0x542a2a7e, 0x3b9090ab, 0xb888883,
    641   0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
    642   0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
    643   0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
    644   0x924949db, 0xc06060a, 0x4824246c, 0xb85c5ce4,
    645   0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
    646   0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
    647   0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
    648   0x18d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
    649   0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
    650   0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
    651   0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
    652   0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
    653   0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
    654   0x964b4bdd, 0x61bdbddc, 0xd8b8b86, 0xf8a8a85,
    655   0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
    656   0x904848d8, 0x6030305, 0xf7f6f601, 0x1c0e0e12,
    657   0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
    658   0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
    659   0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
    660   0xd26969bb, 0xa9d9d970, 0x78e8e89, 0x339494a7,
    661   0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
    662   0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
    663   0x38c8c8f, 0x59a1a1f8, 0x9898980, 0x1a0d0d17,
    664   0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
    665   0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
    666   0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a,
    667 };
    668 
    669 static uint32_t T1[256] = {
    670   0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
    671   0xdfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
    672   0x50603030, 0x3020101, 0xa9ce6767, 0x7d562b2b,
    673   0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
    674   0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
    675   0x15effafa, 0xebb25959, 0xc98e4747, 0xbfbf0f0,
    676   0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
    677   0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
    678   0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
    679   0x5a6c3636, 0x417e3f3f, 0x2f5f7f7, 0x4f83cccc,
    680   0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x8f9f1f1,
    681   0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
    682   0xc080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
    683   0x28301818, 0xa1379696, 0xf0a0505, 0xb52f9a9a,
    684   0x90e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
    685   0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
    686   0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
    687   0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
    688   0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
    689   0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
    690   0xf5a65353, 0x68b9d1d1, 0x0, 0x2cc1eded,
    691   0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
    692   0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
    693   0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
    694   0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
    695   0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
    696   0xcf8a4545, 0x10e9f9f9, 0x6040202, 0x81fe7f7f,
    697   0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
    698   0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
    699   0xad3f9292, 0xbc219d9d, 0x48703838, 0x4f1f5f5,
    700   0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
    701   0x30201010, 0x1ae5ffff, 0xefdf3f3, 0x6dbfd2d2,
    702   0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
    703   0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
    704   0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
    705   0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
    706   0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
    707   0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
    708   0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
    709   0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
    710   0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
    711   0xdb924949, 0xa0c0606, 0x6c482424, 0xe4b85c5c,
    712   0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
    713   0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
    714   0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
    715   0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
    716   0xb4d86c6c, 0xfaac5656, 0x7f3f4f4, 0x25cfeaea,
    717   0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
    718   0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
    719   0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
    720   0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
    721   0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
    722   0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
    723   0xd8904848, 0x5060303, 0x1f7f6f6, 0x121c0e0e,
    724   0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
    725   0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
    726   0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
    727   0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
    728   0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
    729   0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
    730   0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
    731   0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
    732   0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
    733   0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616,
    734 };
    735 
    736 static uint32_t T2[256] = {
    737   0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
    738   0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
    739   0x30506030, 0x1030201, 0x67a9ce67, 0x2b7d562b,
    740   0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
    741   0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
    742   0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
    743   0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
    744   0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
    745   0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
    746   0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
    747   0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
    748   0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
    749   0x40c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
    750   0x18283018, 0x96a13796, 0x50f0a05, 0x9ab52f9a,
    751   0x7090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
    752   0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
    753   0x91b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
    754   0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
    755   0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
    756   0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
    757   0x53f5a653, 0xd168b9d1, 0x0, 0xed2cc1ed,
    758   0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
    759   0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
    760   0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
    761   0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
    762   0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
    763   0x45cf8a45, 0xf910e9f9, 0x2060402, 0x7f81fe7f,
    764   0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
    765   0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
    766   0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
    767   0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
    768   0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
    769   0xcd4c81cd, 0xc14180c, 0x13352613, 0xec2fc3ec,
    770   0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
    771   0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
    772   0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
    773   0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
    774   0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
    775   0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
    776   0xde79a7de, 0x5ee2bc5e, 0xb1d160b, 0xdb76addb,
    777   0xe03bdbe0, 0x32566432, 0x3a4e743a, 0xa1e140a,
    778   0x49db9249, 0x60a0c06, 0x246c4824, 0x5ce4b85c,
    779   0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
    780   0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
    781   0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
    782   0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
    783   0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
    784   0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x8181008,
    785   0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
    786   0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
    787   0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
    788   0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
    789   0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
    790   0x48d89048, 0x3050603, 0xf601f7f6, 0xe121c0e,
    791   0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
    792   0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
    793   0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
    794   0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
    795   0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
    796   0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
    797   0x8c8f038c, 0xa1f859a1, 0x89800989, 0xd171a0d,
    798   0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
    799   0x41c38241, 0x99b02999, 0x2d775a2d, 0xf111e0f,
    800   0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16,
    801 };
    802 
    803 static uint32_t T3[256] = {
    804   0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
    805   0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
    806   0x30305060, 0x1010302, 0x6767a9ce, 0x2b2b7d56,
    807   0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
    808   0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
    809   0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
    810   0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
    811   0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
    812   0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
    813   0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
    814   0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
    815   0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
    816   0x4040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
    817   0x18182830, 0x9696a137, 0x5050f0a, 0x9a9ab52f,
    818   0x707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
    819   0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
    820   0x9091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
    821   0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
    822   0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
    823   0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
    824   0x5353f5a6, 0xd1d168b9, 0x0, 0xeded2cc1,
    825   0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
    826   0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
    827   0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
    828   0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
    829   0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
    830   0x4545cf8a, 0xf9f910e9, 0x2020604, 0x7f7f81fe,
    831   0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
    832   0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
    833   0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
    834   0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
    835   0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
    836   0xcdcd4c81, 0xc0c1418, 0x13133526, 0xecec2fc3,
    837   0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
    838   0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
    839   0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
    840   0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
    841   0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
    842   0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
    843   0xdede79a7, 0x5e5ee2bc, 0xb0b1d16, 0xdbdb76ad,
    844   0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0xa0a1e14,
    845   0x4949db92, 0x6060a0c, 0x24246c48, 0x5c5ce4b8,
    846   0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
    847   0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
    848   0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
    849   0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
    850   0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
    851   0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x8081810,
    852   0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
    853   0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
    854   0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
    855   0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
    856   0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
    857   0x4848d890, 0x3030506, 0xf6f601f7, 0xe0e121c,
    858   0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
    859   0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
    860   0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
    861   0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
    862   0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
    863   0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
    864   0x8c8c8f03, 0xa1a1f859, 0x89898009, 0xd0d171a,
    865   0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
    866   0x4141c382, 0x9999b029, 0x2d2d775a, 0xf0f111e,
    867   0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c,
    868 };
    869 
    870 static uint32_t U0[256] = {
    871   0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
    872   0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
    873   0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
    874   0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
    875   0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
    876   0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
    877   0x38f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
    878   0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
    879   0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
    880   0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
    881   0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
    882   0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
    883   0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
    884   0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
    885   0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
    886   0x302887f2, 0x23bfa5b2, 0x2036aba, 0xed16825c,
    887   0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
    888   0x65daf4cd, 0x605bed5, 0xd134621f, 0xc4a6fe8a,
    889   0x342e539d, 0xa2f355a0, 0x58ae132, 0xa4f6eb75,
    890   0xb83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
    891   0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
    892   0x91548db5, 0x71c45d05, 0x406d46f, 0x605015ff,
    893   0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
    894   0xb0e842bd, 0x7898b88, 0xe7195b38, 0x79c8eedb,
    895   0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x0,
    896   0x9808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
    897   0xfd0efffb, 0xf853856, 0x3daed51e, 0x362d3927,
    898   0xa0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
    899   0xc0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
    900   0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
    901   0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
    902   0xe090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
    903   0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
    904   0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
    905   0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
    906   0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
    907   0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
    908   0x1d9e2f4b, 0xdcb230f3, 0xd8652ec, 0x77c1e3d0,
    909   0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
    910   0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
    911   0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
    912   0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
    913   0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
    914   0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
    915   0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
    916   0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
    917   0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
    918   0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
    919   0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
    920   0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
    921   0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
    922   0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
    923   0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
    924   0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
    925   0x9d5eea04, 0x18c355d, 0xfa877473, 0xfb0b412e,
    926   0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
    927   0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
    928   0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
    929   0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
    930   0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
    931   0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
    932   0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
    933   0x39a80171, 0x80cb3de, 0xd8b4e49c, 0x6456c190,
    934   0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
    935 };
    936 
    937 static uint32_t U1[256] = {
    938   0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
    939   0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
    940   0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
    941   0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
    942   0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
    943   0x2c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
    944   0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
    945   0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
    946   0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
    947   0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
    948   0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
    949   0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
    950   0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
    951   0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
    952   0x7b2eb28, 0x32fb5c2, 0x9a86c57b, 0xa5d33708,
    953   0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
    954   0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
    955   0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
    956   0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
    957   0x390b83ec, 0xaa4060ef, 0x65e719f, 0x51bd6e10,
    958   0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
    959   0xb591548d, 0x571c45d, 0x6f0406d4, 0xff605015,
    960   0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
    961   0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
    962   0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x0,
    963   0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
    964   0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
    965   0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
    966   0xb10c0a67, 0xf9357e7, 0xd2b4ee96, 0x9e1b9b91,
    967   0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
    968   0xae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
    969   0xb0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
    970   0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
    971   0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
    972   0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
    973   0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
    974   0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
    975   0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
    976   0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
    977   0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
    978   0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
    979   0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
    980   0xe42c3a9d, 0xd507892, 0x9b6a5fcc, 0x62547e46,
    981   0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
    982   0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
    983   0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
    984   0x9cd2678, 0xf46e5918, 0x1ec9ab7, 0xa8834f9a,
    985   0x65e6956e, 0x7eaaffe6, 0x821bccf, 0xe6ef15e8,
    986   0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
    987   0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
    988   0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
    989   0x4af10498, 0xf741ecda, 0xe7fcd50, 0x2f1791f6,
    990   0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
    991   0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
    992   0x49d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
    993   0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
    994   0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
    995   0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
    996   0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
    997   0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
    998   0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
    999   0x72161dc3, 0xcbce225, 0x8b283c49, 0x41ff0d95,
   1000   0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
   1001   0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
   1002 };
   1003 
   1004 static uint32_t U2[256] = {
   1005   0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
   1006   0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x3934be3,
   1007   0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
   1008   0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
   1009   0x5a49deb1, 0x1b6725ba, 0xe9845ea, 0xc0e15dfe,
   1010   0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
   1011   0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
   1012   0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
   1013   0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
   1014   0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
   1015   0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
   1016   0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
   1017   0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
   1018   0xd323ab73, 0x2e2724b, 0x8f57e31f, 0xab2a6655,
   1019   0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x8a5d337,
   1020   0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
   1021   0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
   1022   0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
   1023   0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
   1024   0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
   1025   0x8af93e21, 0x63d96dd, 0x5aedd3e, 0xbd464de6,
   1026   0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
   1027   0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
   1028   0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
   1029   0xa47a17c, 0xfe97c42, 0x1ec9f884, 0x0,
   1030   0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
   1031   0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
   1032   0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
   1033   0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
   1034   0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
   1035   0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
   1036   0xd0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
   1037   0x198557f1, 0x74caf75, 0xddbbee99, 0x60fda37f,
   1038   0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
   1039   0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
   1040   0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
   1041   0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
   1042   0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
   1043   0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
   1044   0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
   1045   0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0xb3698d4,
   1046   0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
   1047   0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
   1048   0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
   1049   0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
   1050   0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
   1051   0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
   1052   0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
   1053   0x9bd9bae7, 0x36ce4a6f, 0x9d4ea9f, 0x7cd629b0,
   1054   0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
   1055   0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
   1056   0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
   1057   0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x4dfe496,
   1058   0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
   1059   0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
   1060   0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
   1061   0x618c9ad7, 0xc7a37a1, 0x148e59f8, 0x3c89eb13,
   1062   0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
   1063   0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
   1064   0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
   1065   0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
   1066   0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
   1067   0x17139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
   1068   0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8
   1069 };
   1070 
   1071 static uint32_t U3[256] = {
   1072   0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
   1073   0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
   1074   0x30fa5520, 0x766df6ad, 0xcc769188, 0x24c25f5,
   1075   0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
   1076   0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
   1077   0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
   1078   0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
   1079   0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
   1080   0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
   1081   0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
   1082   0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
   1083   0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x82b94f9,
   1084   0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
   1085   0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
   1086   0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
   1087   0x2887f230, 0xbfa5b223, 0x36aba02, 0x16825ced,
   1088   0xcf1c2b8a, 0x79b492a7, 0x7f2f0f3, 0x69e2a14e,
   1089   0xdaf4cd65, 0x5bed506, 0x34621fd1, 0xa6fe8ac4,
   1090   0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
   1091   0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
   1092   0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
   1093   0x548db591, 0xc45d0571, 0x6d46f04, 0x5015ff60,
   1094   0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
   1095   0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
   1096   0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x0,
   1097   0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
   1098   0xefffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
   1099   0xfd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
   1100   0xa67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
   1101   0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
   1102   0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
   1103   0x90d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
   1104   0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
   1105   0x1269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
   1106   0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
   1107   0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
   1108   0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
   1109   0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
   1110   0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
   1111   0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
   1112   0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
   1113   0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
   1114   0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
   1115   0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
   1116   0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
   1117   0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
   1118   0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
   1119   0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
   1120   0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
   1121   0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
   1122   0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
   1123   0x4984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
   1124   0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
   1125   0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
   1126   0x5eea049d, 0x8c355d01, 0x877473fa, 0xb412efb,
   1127   0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
   1128   0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
   1129   0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
   1130   0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
   1131   0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
   1132   0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
   1133   0x1dc37216, 0xe2250cbc, 0x3c498b28, 0xd9541ff,
   1134   0xa8017139, 0xcb3de08, 0xb4e49cd8, 0x56c19064,
   1135   0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0
   1136 };
   1137 
   1138 #endif
   1139 
   1140 /*
   1141  * the following tables (aes_sbox, aes_inv_sbox, T4, U4) are
   1142  * endian-neutral
   1143  */
   1144 
   1145 static uint8_t
   1146 aes_sbox[256] = {
   1147   0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
   1148   0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
   1149   0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
   1150   0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
   1151   0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
   1152   0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
   1153   0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
   1154   0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
   1155   0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
   1156   0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
   1157   0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
   1158   0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
   1159   0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
   1160   0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
   1161   0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
   1162   0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
   1163   0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
   1164   0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
   1165   0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
   1166   0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
   1167   0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
   1168   0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
   1169   0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
   1170   0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
   1171   0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
   1172   0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
   1173   0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
   1174   0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
   1175   0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
   1176   0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
   1177   0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
   1178   0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
   1179 };
   1180 
   1181 #ifndef CPU_RISC
   1182 static uint8_t
   1183 aes_inv_sbox[256] = {
   1184   0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
   1185   0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
   1186   0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
   1187   0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
   1188   0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
   1189   0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
   1190   0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
   1191   0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
   1192   0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
   1193   0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
   1194   0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
   1195   0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
   1196   0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
   1197   0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
   1198   0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
   1199   0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
   1200   0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
   1201   0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
   1202   0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
   1203   0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
   1204   0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
   1205   0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
   1206   0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
   1207   0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
   1208   0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
   1209   0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
   1210   0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
   1211   0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
   1212   0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
   1213   0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
   1214   0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
   1215   0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
   1216 };
   1217 #endif /* ! CPU_RISC */
   1218 
   1219 #ifdef CPU_RISC
   1220 static uint32_t
   1221 T4[256] = {
   1222   0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
   1223   0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
   1224   0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
   1225   0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
   1226   0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
   1227   0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
   1228   0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
   1229   0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
   1230   0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
   1231   0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
   1232   0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
   1233   0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
   1234   0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
   1235   0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
   1236   0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
   1237   0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
   1238   0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
   1239   0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
   1240   0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
   1241   0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
   1242   0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
   1243   0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
   1244   0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
   1245   0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
   1246   0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
   1247   0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
   1248   0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
   1249   0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
   1250   0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
   1251   0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
   1252   0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
   1253   0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
   1254   0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
   1255   0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
   1256   0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
   1257   0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
   1258   0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
   1259   0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
   1260   0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
   1261   0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
   1262   0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
   1263   0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
   1264   0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
   1265   0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
   1266   0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
   1267   0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
   1268   0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
   1269   0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
   1270   0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
   1271   0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
   1272   0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
   1273   0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
   1274   0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
   1275   0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
   1276   0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
   1277   0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
   1278   0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
   1279   0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
   1280   0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
   1281   0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
   1282   0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
   1283   0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
   1284   0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
   1285   0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616
   1286 };
   1287 
   1288 static uint32_t U4[256] = {
   1289   0x52525252, 0x9090909, 0x6a6a6a6a, 0xd5d5d5d5,
   1290   0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
   1291   0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
   1292   0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
   1293   0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
   1294   0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
   1295   0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
   1296   0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
   1297   0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
   1298   0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
   1299   0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0xb0b0b0b,
   1300   0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
   1301   0x8080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
   1302   0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
   1303   0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
   1304   0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
   1305   0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
   1306   0x86868686, 0x68686868, 0x98989898, 0x16161616,
   1307   0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
   1308   0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
   1309   0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
   1310   0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
   1311   0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
   1312   0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
   1313   0x90909090, 0xd8d8d8d8, 0xabababab, 0x0,
   1314   0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0xa0a0a0a,
   1315   0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x5050505,
   1316   0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x6060606,
   1317   0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
   1318   0xcacacaca, 0x3f3f3f3f, 0xf0f0f0f, 0x2020202,
   1319   0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x3030303,
   1320   0x1010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
   1321   0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
   1322   0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
   1323   0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
   1324   0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
   1325   0x96969696, 0xacacacac, 0x74747474, 0x22222222,
   1326   0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
   1327   0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
   1328   0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
   1329   0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
   1330   0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
   1331   0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0xe0e0e0e,
   1332   0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
   1333   0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
   1334   0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
   1335   0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
   1336   0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
   1337   0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
   1338   0x88888888, 0x7070707, 0xc7c7c7c7, 0x31313131,
   1339   0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
   1340   0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
   1341   0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
   1342   0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0xd0d0d0d,
   1343   0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
   1344   0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
   1345   0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
   1346   0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
   1347   0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
   1348   0x83838383, 0x53535353, 0x99999999, 0x61616161,
   1349   0x17171717, 0x2b2b2b2b, 0x4040404, 0x7e7e7e7e,
   1350   0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
   1351   0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
   1352   0x55555555, 0x21212121, 0xc0c0c0c, 0x7d7d7d7d
   1353 };
   1354 #endif /* CPU_RISC */
   1355 
   1356 
   1357 /* aes internals */
   1358 
   1359 extern debug_module_t mod_aes_icm;
   1360 
   1361 static void
   1362 aes_128_expand_encryption_key(const uint8_t *key,
   1363 			      aes_expanded_key_t *expanded_key) {
   1364   int i;
   1365   gf2_8 rc;
   1366 
   1367   /* initialize round constant */
   1368   rc = 1;
   1369 
   1370   expanded_key->num_rounds = 10;
   1371 
   1372   v128_copy_octet_string(&expanded_key->round[0], key);
   1373 
   1374 #if 0
   1375   debug_print(mod_aes_icm,
   1376 	      "expanded key[0]:  %s", v128_hex_string(&expanded_key->round[0]));
   1377 #endif
   1378 
   1379   /* loop over round keys */
   1380   for (i=1; i < 11; i++) {
   1381 
   1382     /* munge first word of round key */
   1383     expanded_key->round[i].v8[0] = aes_sbox[expanded_key->round[i-1].v8[13]] ^ rc;
   1384     expanded_key->round[i].v8[1] = aes_sbox[expanded_key->round[i-1].v8[14]];
   1385     expanded_key->round[i].v8[2] = aes_sbox[expanded_key->round[i-1].v8[15]];
   1386     expanded_key->round[i].v8[3] = aes_sbox[expanded_key->round[i-1].v8[12]];
   1387 
   1388     expanded_key->round[i].v32[0] ^=  expanded_key->round[i-1].v32[0];
   1389 
   1390     /* set remaining 32 bit words to the exor of the one previous with
   1391      * the one four words previous */
   1392 
   1393     expanded_key->round[i].v32[1] =
   1394       expanded_key->round[i].v32[0] ^ expanded_key->round[i-1].v32[1];
   1395 
   1396     expanded_key->round[i].v32[2] =
   1397       expanded_key->round[i].v32[1] ^ expanded_key->round[i-1].v32[2];
   1398 
   1399     expanded_key->round[i].v32[3] =
   1400       expanded_key->round[i].v32[2] ^ expanded_key->round[i-1].v32[3];
   1401 
   1402 #if 0
   1403 	debug_print2(mod_aes_icm,
   1404 				"expanded key[%d]:  %s", i,v128_hex_string(&expanded_key->round[i]));
   1405 #endif
   1406 
   1407     /* modify round constant */
   1408     rc = gf2_8_shift(rc);
   1409 
   1410   }
   1411 }
   1412 
   1413 static void
   1414 aes_256_expand_encryption_key(const unsigned char *key,
   1415 			      aes_expanded_key_t *expanded_key) {
   1416   int i;
   1417   gf2_8 rc;
   1418 
   1419   /* initialize round constant */
   1420   rc = 1;
   1421 
   1422   expanded_key->num_rounds = 14;
   1423 
   1424   v128_copy_octet_string(&expanded_key->round[0], key);
   1425   v128_copy_octet_string(&expanded_key->round[1], key+16);
   1426 
   1427 #if 0
   1428   debug_print(mod_aes_icm,
   1429 	      "expanded key[0]:  %s", v128_hex_string(&expanded_key->round[0]));
   1430   debug_print(mod_aes_icm,
   1431 	      "expanded key[1]:  %s", v128_hex_string(&expanded_key->round[1]));
   1432 #endif
   1433 
   1434   /* loop over rest of round keys */
   1435   for (i=2; i < 15; i++) {
   1436 
   1437     /* munge first word of round key */
   1438     if ((i & 1) == 0) {
   1439       expanded_key->round[i].v8[0] = aes_sbox[expanded_key->round[i-1].v8[13]] ^ rc;
   1440       expanded_key->round[i].v8[1] = aes_sbox[expanded_key->round[i-1].v8[14]];
   1441       expanded_key->round[i].v8[2] = aes_sbox[expanded_key->round[i-1].v8[15]];
   1442       expanded_key->round[i].v8[3] = aes_sbox[expanded_key->round[i-1].v8[12]];
   1443 
   1444       /* modify round constant */
   1445       rc = gf2_8_shift(rc);
   1446     }
   1447     else {
   1448       expanded_key->round[i].v8[0] = aes_sbox[expanded_key->round[i-1].v8[12]];
   1449       expanded_key->round[i].v8[1] = aes_sbox[expanded_key->round[i-1].v8[13]];
   1450       expanded_key->round[i].v8[2] = aes_sbox[expanded_key->round[i-1].v8[14]];
   1451       expanded_key->round[i].v8[3] = aes_sbox[expanded_key->round[i-1].v8[15]];
   1452     }
   1453 
   1454     expanded_key->round[i].v32[0] ^=  expanded_key->round[i-2].v32[0];
   1455 
   1456     /* set remaining 32 bit words to the exor of the one previous with
   1457      * the one eight words previous */
   1458 
   1459     expanded_key->round[i].v32[1] =
   1460       expanded_key->round[i].v32[0] ^ expanded_key->round[i-2].v32[1];
   1461 
   1462     expanded_key->round[i].v32[2] =
   1463       expanded_key->round[i].v32[1] ^ expanded_key->round[i-2].v32[2];
   1464 
   1465     expanded_key->round[i].v32[3] =
   1466       expanded_key->round[i].v32[2] ^ expanded_key->round[i-2].v32[3];
   1467 
   1468 #if 0
   1469     debug_print2(mod_aes_icm,
   1470 		 "expanded key[%d]:  %s", i,v128_hex_string(&expanded_key->round[i]));
   1471 #endif
   1472 
   1473   }
   1474 }
   1475 
   1476 err_status_t
   1477 aes_expand_encryption_key(const uint8_t *key,
   1478 			  int key_len,
   1479 			  aes_expanded_key_t *expanded_key) {
   1480   if (key_len == 16) {
   1481     aes_128_expand_encryption_key(key, expanded_key);
   1482     return err_status_ok;
   1483   }
   1484   else if (key_len == 24) {
   1485     /* AES-192 not yet supported */
   1486     return err_status_bad_param;
   1487   }
   1488   else if (key_len == 32) {
   1489     aes_256_expand_encryption_key(key, expanded_key);
   1490     return err_status_ok;
   1491   }
   1492   else
   1493     return err_status_bad_param;
   1494 }
   1495 
   1496 err_status_t
   1497 aes_expand_decryption_key(const uint8_t *key,
   1498 			  int key_len,
   1499 			  aes_expanded_key_t *expanded_key) {
   1500   int i;
   1501   err_status_t status;
   1502   int num_rounds = expanded_key->num_rounds;
   1503 
   1504   status = aes_expand_encryption_key(key, key_len, expanded_key);
   1505   if (status)
   1506     return status;
   1507 
   1508   /* invert the order of the round keys */
   1509   for (i=0; i < num_rounds/2; i++) {
   1510     v128_t tmp;
   1511     v128_copy(&tmp, &expanded_key->round[num_rounds-i]);
   1512     v128_copy(&expanded_key->round[num_rounds-i], &expanded_key->round[i]);
   1513     v128_copy(&expanded_key->round[i], &tmp);
   1514   }
   1515 
   1516   /*
   1517    * apply the inverse mixColumn transform to the round keys (except
   1518    * for the first and the last)
   1519    *
   1520    * mixColumn is implemented by using the tables U0, U1, U2, U3,
   1521    * followed by the T4 table (which cancels out the use of the sbox
   1522    * in the U-tables)
   1523    */
   1524   for (i=1; i < num_rounds; i++) {
   1525 #ifdef CPU_RISC
   1526     uint32_t tmp;
   1527 
   1528     tmp = expanded_key->round[i].v32[0];
   1529     expanded_key->round[i].v32[0] =
   1530       U0[T4[(tmp >> 24)       ] & 0xff] ^
   1531       U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
   1532       U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
   1533       U3[T4[(tmp)       & 0xff] & 0xff];
   1534 
   1535     tmp = expanded_key->round[i].v32[1];
   1536     expanded_key->round[i].v32[1] =
   1537       U0[T4[(tmp >> 24)       ] & 0xff] ^
   1538       U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
   1539       U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
   1540       U3[T4[(tmp)       & 0xff] & 0xff];
   1541 
   1542     tmp = expanded_key->round[i].v32[2];
   1543     expanded_key->round[i].v32[2] =
   1544       U0[T4[(tmp >> 24)       ] & 0xff] ^
   1545       U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
   1546       U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
   1547       U3[T4[(tmp)       & 0xff] & 0xff];
   1548 
   1549     tmp = expanded_key->round[i].v32[3];
   1550     expanded_key->round[i].v32[3] =
   1551       U0[T4[(tmp >> 24)       ] & 0xff] ^
   1552       U1[T4[(tmp >> 16) & 0xff] & 0xff] ^
   1553       U2[T4[(tmp >> 8)  & 0xff] & 0xff] ^
   1554       U3[T4[(tmp)       & 0xff] & 0xff];
   1555 #else /* assume CPU_CISC */
   1556 
   1557     uint32_t c0, c1, c2, c3;
   1558 
   1559     c0 = U0[aes_sbox[expanded_key->round[i].v8[0]]]
   1560        ^ U1[aes_sbox[expanded_key->round[i].v8[1]]]
   1561        ^ U2[aes_sbox[expanded_key->round[i].v8[2]]]
   1562        ^ U3[aes_sbox[expanded_key->round[i].v8[3]]];
   1563 
   1564     c1 = U0[aes_sbox[expanded_key->round[i].v8[4]]]
   1565        ^ U1[aes_sbox[expanded_key->round[i].v8[5]]]
   1566        ^ U2[aes_sbox[expanded_key->round[i].v8[6]]]
   1567        ^ U3[aes_sbox[expanded_key->round[i].v8[7]]];
   1568 
   1569     c2 = U0[aes_sbox[expanded_key->round[i].v8[8]]]
   1570        ^ U1[aes_sbox[expanded_key->round[i].v8[9]]]
   1571        ^ U2[aes_sbox[expanded_key->round[i].v8[10]]]
   1572        ^ U3[aes_sbox[expanded_key->round[i].v8[11]]];
   1573 
   1574     c3 = U0[aes_sbox[expanded_key->round[i].v8[12]]]
   1575        ^ U1[aes_sbox[expanded_key->round[i].v8[13]]]
   1576        ^ U2[aes_sbox[expanded_key->round[i].v8[14]]]
   1577        ^ U3[aes_sbox[expanded_key->round[i].v8[15]]];
   1578 
   1579     expanded_key->round[i].v32[0] = c0;
   1580     expanded_key->round[i].v32[1] = c1;
   1581     expanded_key->round[i].v32[2] = c2;
   1582     expanded_key->round[i].v32[3] = c3;
   1583 
   1584 #endif
   1585   }
   1586 
   1587   return err_status_ok;
   1588 }
   1589 
   1590 #ifdef CPU_CISC
   1591 
   1592 
   1593 static INLINE void
   1594 aes_round(v128_t *state, const v128_t *round_key) {
   1595   uint32_t column0, column1, column2, column3;
   1596 
   1597   /* compute the columns of the output square in terms of the octets
   1598      of state, using the tables T0, T1, T2, T3 */
   1599 
   1600   column0 = T0[state->v8[0]] ^ T1[state->v8[5]]
   1601     ^ T2[state->v8[10]] ^ T3[state->v8[15]];
   1602 
   1603   column1 = T0[state->v8[4]] ^ T1[state->v8[9]]
   1604     ^ T2[state->v8[14]] ^ T3[state->v8[3]];
   1605 
   1606   column2 = T0[state->v8[8]] ^ T1[state->v8[13]]
   1607     ^ T2[state->v8[2]] ^ T3[state->v8[7]];
   1608 
   1609   column3 = T0[state->v8[12]] ^ T1[state->v8[1]]
   1610     ^ T2[state->v8[6]] ^ T3[state->v8[11]];
   1611 
   1612   state->v32[0] = column0 ^ round_key->v32[0];
   1613   state->v32[1] = column1 ^ round_key->v32[1];
   1614   state->v32[2] = column2 ^ round_key->v32[2];
   1615   state->v32[3] = column3 ^ round_key->v32[3];
   1616 
   1617 }
   1618 
   1619 
   1620 static INLINE void
   1621 aes_inv_round(v128_t *state, const v128_t *round_key) {
   1622   uint32_t column0, column1, column2, column3;
   1623 
   1624   /* compute the columns of the output square in terms of the octets
   1625      of state, using the tables U0, U1, U2, U3 */
   1626 
   1627   column0 = U0[state->v8[0]] ^ U1[state->v8[13]]
   1628     ^ U2[state->v8[10]] ^ U3[state->v8[7]];
   1629 
   1630   column1 = U0[state->v8[4]] ^ U1[state->v8[1]]
   1631     ^ U2[state->v8[14]] ^ U3[state->v8[11]];
   1632 
   1633   column2 = U0[state->v8[8]] ^ U1[state->v8[5]]
   1634     ^ U2[state->v8[2]] ^ U3[state->v8[15]];
   1635 
   1636   column3 = U0[state->v8[12]] ^ U1[state->v8[9]]
   1637     ^ U2[state->v8[6]] ^ U3[state->v8[3]];
   1638 
   1639   state->v32[0] = column0 ^ round_key->v32[0];
   1640   state->v32[1] = column1 ^ round_key->v32[1];
   1641   state->v32[2] = column2 ^ round_key->v32[2];
   1642   state->v32[3] = column3 ^ round_key->v32[3];
   1643 
   1644 }
   1645 
   1646 static INLINE void
   1647 aes_final_round(v128_t *state, const v128_t *round_key) {
   1648   uint8_t tmp;
   1649 
   1650   /* byte substitutions and row shifts */
   1651   /* first row - no shift */
   1652   state->v8[0] = aes_sbox[state->v8[0]];
   1653   state->v8[4] = aes_sbox[state->v8[4]];
   1654   state->v8[8] = aes_sbox[state->v8[8]];
   1655   state->v8[12] = aes_sbox[state->v8[12]];
   1656 
   1657   /* second row - shift one left */
   1658   tmp = aes_sbox[state->v8[1]];
   1659   state->v8[1] = aes_sbox[state->v8[5]];
   1660   state->v8[5] = aes_sbox[state->v8[9]];
   1661   state->v8[9] = aes_sbox[state->v8[13]];
   1662   state->v8[13] = tmp;
   1663 
   1664   /* third row - shift two left */
   1665   tmp = aes_sbox[state->v8[10]];
   1666   state->v8[10] = aes_sbox[state->v8[2]];
   1667   state->v8[2] = tmp;
   1668   tmp = aes_sbox[state->v8[14]];
   1669   state->v8[14] = aes_sbox[state->v8[6]];
   1670   state->v8[6] = tmp;
   1671 
   1672   /* fourth row - shift three left */
   1673   tmp = aes_sbox[state->v8[15]];
   1674   state->v8[15] = aes_sbox[state->v8[11]];
   1675   state->v8[11] = aes_sbox[state->v8[7]];
   1676   state->v8[7] = aes_sbox[state->v8[3]];
   1677   state->v8[3] = tmp;
   1678 
   1679   v128_xor_eq(state, round_key);
   1680 }
   1681 
   1682 static INLINE void
   1683 aes_inv_final_round(v128_t *state, const v128_t *round_key) {
   1684   uint8_t tmp;
   1685 
   1686   /* byte substitutions and row shifts */
   1687   /* first row - no shift */
   1688   state->v8[0] = aes_inv_sbox[state->v8[0]];
   1689   state->v8[4] = aes_inv_sbox[state->v8[4]];
   1690   state->v8[8] = aes_inv_sbox[state->v8[8]];
   1691   state->v8[12] = aes_inv_sbox[state->v8[12]];
   1692 
   1693   /* second row - shift one right */
   1694   tmp = aes_inv_sbox[state->v8[13]];
   1695   state->v8[13] = aes_inv_sbox[state->v8[9]];
   1696   state->v8[9] = aes_inv_sbox[state->v8[5]];
   1697   state->v8[5] = aes_inv_sbox[state->v8[1]];
   1698   state->v8[1] = tmp;
   1699 
   1700   /* third row - shift two right */
   1701   tmp = aes_inv_sbox[state->v8[2]];
   1702   state->v8[2] = aes_inv_sbox[state->v8[10]];
   1703   state->v8[10] = tmp;
   1704   tmp = aes_inv_sbox[state->v8[6]];
   1705   state->v8[6] = aes_inv_sbox[state->v8[14]];
   1706   state->v8[14] = tmp;
   1707 
   1708   /* fourth row - shift three right */
   1709   tmp = aes_inv_sbox[state->v8[3]];
   1710   state->v8[3] = aes_inv_sbox[state->v8[7]];
   1711   state->v8[7] = aes_inv_sbox[state->v8[11]];
   1712   state->v8[11] = aes_inv_sbox[state->v8[15]];
   1713   state->v8[15] = tmp;
   1714 
   1715   v128_xor_eq(state, round_key);
   1716 }
   1717 
   1718 
   1719 #elif CPU_RISC
   1720 
   1721 static INLINE void
   1722 aes_round(v128_t *state, const v128_t *round_key) {
   1723   uint32_t column0, column1, column2, column3;
   1724 
   1725   /* compute the columns of the output square in terms of the octets
   1726      of state, using the tables T0, T1, T2, T3 */
   1727 #ifdef WORDS_BIGENDIAN
   1728   column0 = T0[state->v32[0] >> 24] ^ T1[(state->v32[1] >> 16) & 0xff]
   1729     ^ T2[(state->v32[2] >> 8) & 0xff] ^ T3[state->v32[3] & 0xff];
   1730 
   1731   column1 = T0[state->v32[1] >> 24] ^ T1[(state->v32[2] >> 16) & 0xff]
   1732     ^ T2[(state->v32[3] >> 8) & 0xff] ^ T3[state->v32[0] & 0xff];
   1733 
   1734   column2 = T0[state->v32[2] >> 24] ^ T1[(state->v32[3] >> 16) & 0xff]
   1735     ^ T2[(state->v32[0] >> 8) & 0xff] ^ T3[state->v32[1] & 0xff];
   1736 
   1737   column3 = T0[state->v32[3] >> 24] ^ T1[(state->v32[0] >> 16) & 0xff]
   1738     ^ T2[(state->v32[1] >> 8) & 0xff] ^ T3[state->v32[2] & 0xff];
   1739 #else
   1740   column0 = T0[state->v32[0] & 0xff] ^ T1[(state->v32[1] >> 8) & 0xff]
   1741 	^ T2[(state->v32[2] >> 16) & 0xff] ^ T3[state->v32[3] >> 24];
   1742 
   1743   column1 = T0[state->v32[1] & 0xff] ^ T1[(state->v32[2] >> 8) & 0xff]
   1744 	^ T2[(state->v32[3] >> 16) & 0xff] ^ T3[state->v32[0] >> 24];
   1745 
   1746   column2 = T0[state->v32[2] & 0xff] ^ T1[(state->v32[3] >> 8) & 0xff]
   1747 	^ T2[(state->v32[0] >> 16) & 0xff] ^ T3[state->v32[1] >> 24];
   1748 
   1749   column3 = T0[state->v32[3] & 0xff] ^ T1[(state->v32[0] >> 8) & 0xff]
   1750 	^ T2[(state->v32[1] >> 16) & 0xff] ^ T3[state->v32[2] >> 24];
   1751 #endif /* WORDS_BIGENDIAN */
   1752 
   1753   state->v32[0] = column0 ^ round_key->v32[0];
   1754   state->v32[1] = column1 ^ round_key->v32[1];
   1755   state->v32[2] = column2 ^ round_key->v32[2];
   1756   state->v32[3] = column3 ^ round_key->v32[3];
   1757 
   1758 }
   1759 
   1760 static INLINE void
   1761 aes_inv_round(v128_t *state, const v128_t *round_key) {
   1762   uint32_t column0, column1, column2, column3;
   1763 
   1764   /* compute the columns of the output square in terms of the octets
   1765      of state, using the tables U0, U1, U2, U3 */
   1766 
   1767 #ifdef WORDS_BIGENDIAN
   1768   /* FIX!  WRong indexes */
   1769   column0 = U0[state->v32[0] >> 24] ^ U1[(state->v32[3] >> 16) & 0xff]
   1770     ^ U2[(state->v32[2] >> 8) & 0xff] ^ U3[state->v32[1] & 0xff];
   1771 
   1772   column1 = U0[state->v32[1] >> 24] ^ U1[(state->v32[0] >> 16) & 0xff]
   1773     ^ U2[(state->v32[3] >> 8) & 0xff] ^ U3[state->v32[2] & 0xff];
   1774 
   1775   column2 = U0[state->v32[2] >> 24] ^ U1[(state->v32[1] >> 16) & 0xff]
   1776     ^ U2[(state->v32[0] >> 8) & 0xff] ^ U3[state->v32[3] & 0xff];
   1777 
   1778   column3 = U0[state->v32[3] >> 24] ^ U1[(state->v32[2] >> 16) & 0xff]
   1779     ^ U2[(state->v32[1] >> 8) & 0xff] ^ U3[state->v32[0] & 0xff];
   1780 #else
   1781   column0 = U0[state->v32[0] & 0xff] ^ U1[(state->v32[1] >> 8) & 0xff]
   1782 	^ U2[(state->v32[2] >> 16) & 0xff] ^ U3[state->v32[3] >> 24];
   1783 
   1784   column1 = U0[state->v32[1] & 0xff] ^ U1[(state->v32[2] >> 8) & 0xff]
   1785 	^ U2[(state->v32[3] >> 16) & 0xff] ^ U3[state->v32[0] >> 24];
   1786 
   1787   column2 = U0[state->v32[2] & 0xff] ^ U1[(state->v32[3] >> 8) & 0xff]
   1788 	^ U2[(state->v32[0] >> 16) & 0xff] ^ U3[state->v32[1] >> 24];
   1789 
   1790   column3 = U0[state->v32[3] & 0xff] ^ U1[(state->v32[0] >> 8) & 0xff]
   1791 	^ U2[(state->v32[1] >> 16) & 0xff] ^ U3[state->v32[2] >> 24];
   1792 #endif /* WORDS_BIGENDIAN */
   1793 
   1794   state->v32[0] = column0 ^ round_key->v32[0];
   1795   state->v32[1] = column1 ^ round_key->v32[1];
   1796   state->v32[2] = column2 ^ round_key->v32[2];
   1797   state->v32[3] = column3 ^ round_key->v32[3];
   1798 
   1799 }
   1800 
   1801 static INLINE void
   1802 aes_final_round(v128_t *state, const v128_t *round_key) {
   1803   uint32_t tmp0, tmp1, tmp2, tmp3;
   1804 
   1805   tmp0 = (T4[(state->v32[0] >> 24)]        & 0xff000000)
   1806        ^ (T4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000)
   1807        ^ (T4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00)
   1808        ^ (T4[(state->v32[3]      ) & 0xff] & 0x000000ff)
   1809        ^ round_key->v32[0];
   1810 
   1811   tmp1 = (T4[(state->v32[1] >> 24)]        & 0xff000000)
   1812        ^ (T4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000)
   1813        ^ (T4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00)
   1814        ^ (T4[(state->v32[0]      ) & 0xff] & 0x000000ff)
   1815        ^ round_key->v32[1];
   1816 
   1817   tmp2 = (T4[(state->v32[2] >> 24)]        & 0xff000000)
   1818        ^ (T4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000)
   1819        ^ (T4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00)
   1820        ^ (T4[(state->v32[1]      ) & 0xff] & 0x000000ff)
   1821        ^ round_key->v32[2];
   1822 
   1823   tmp3 = (T4[(state->v32[3] >> 24)]        & 0xff000000)
   1824        ^ (T4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000)
   1825        ^ (T4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00)
   1826        ^ (T4[(state->v32[2]      ) & 0xff] & 0x000000ff)
   1827        ^ round_key->v32[3];
   1828 
   1829   state->v32[0] = tmp0;
   1830   state->v32[1] = tmp1;
   1831   state->v32[2] = tmp2;
   1832   state->v32[3] = tmp3;
   1833 
   1834 }
   1835 
   1836 static INLINE void
   1837 aes_inv_final_round(v128_t *state, const v128_t *round_key) {
   1838   uint32_t tmp0, tmp1, tmp2, tmp3;
   1839 
   1840   tmp0 = (U4[(state->v32[0] >> 24)]        & 0xff000000)
   1841        ^ (U4[(state->v32[3] >> 16) & 0xff] & 0x00ff0000)
   1842        ^ (U4[(state->v32[2] >>  8) & 0xff] & 0x0000ff00)
   1843        ^ (U4[(state->v32[1]      ) & 0xff] & 0x000000ff)
   1844        ^ round_key->v32[0];
   1845 
   1846   tmp1 = (U4[(state->v32[1] >> 24)]        & 0xff000000)
   1847        ^ (U4[(state->v32[0] >> 16) & 0xff] & 0x00ff0000)
   1848        ^ (U4[(state->v32[3] >>  8) & 0xff] & 0x0000ff00)
   1849        ^ (U4[(state->v32[2]      ) & 0xff] & 0x000000ff)
   1850        ^ round_key->v32[1];
   1851 
   1852   tmp2 = (U4[(state->v32[2] >> 24)]        & 0xff000000)
   1853        ^ (U4[(state->v32[1] >> 16) & 0xff] & 0x00ff0000)
   1854        ^ (U4[(state->v32[0] >>  8) & 0xff] & 0x0000ff00)
   1855        ^ (U4[(state->v32[3]      ) & 0xff] & 0x000000ff)
   1856        ^ round_key->v32[2];
   1857 
   1858   tmp3 = (U4[(state->v32[3] >> 24)]        & 0xff000000)
   1859        ^ (U4[(state->v32[2] >> 16) & 0xff] & 0x00ff0000)
   1860        ^ (U4[(state->v32[1] >>  8) & 0xff] & 0x0000ff00)
   1861        ^ (U4[(state->v32[0]      ) & 0xff] & 0x000000ff)
   1862        ^ round_key->v32[3];
   1863 
   1864   state->v32[0] = tmp0;
   1865   state->v32[1] = tmp1;
   1866   state->v32[2] = tmp2;
   1867   state->v32[3] = tmp3;
   1868 
   1869 }
   1870 
   1871 #elif CPU_16  /* assume 16-bit word size on processor */
   1872 
   1873 static INLINE void
   1874 aes_round(v128_t *state, const v128_t *round_key) {
   1875   uint32_t column0, column1, column2, column3;
   1876   uint16_t c
   1877   /* compute the columns of the output square in terms of the octets
   1878      of state, using the tables T0, T1, T2, T3 */
   1879 
   1880   column0 = T0[state->v8[0]] ^ T1[state->v8[5]]
   1881     ^ T2[state->v8[10]] ^ T3[state->v8[15]];
   1882 
   1883   column1 = T0[state->v8[4]] ^ T1[state->v8[9]]
   1884     ^ T2[state->v8[14]] ^ T3[state->v8[3]];
   1885 
   1886   column2 = T0[state->v8[8]] ^ T1[state->v8[13]]
   1887     ^ T2[state->v8[2]] ^ T3[state->v8[7]];
   1888 
   1889   column3 = T0[state->v8[12]] ^ T1[state->v8[1]]
   1890     ^ T2[state->v8[6]] ^ T3[state->v8[11]];
   1891 
   1892   state->v32[0] = column0 ^ round_key->v32[0];
   1893   state->v32[1] = column1 ^ round_key->v32[1];
   1894   state->v32[2] = column2 ^ round_key->v32[2];
   1895   state->v32[3] = column3 ^ round_key->v32[3];
   1896 
   1897 }
   1898 
   1899 
   1900 static INLINE void
   1901 aes_inv_round(v128_t *state, const v128_t *round_key) {
   1902   uint32_t column0, column1, column2, column3;
   1903 
   1904   /* compute the columns of the output square in terms of the octets
   1905      of state, using the tables U0, U1, U2, U3 */
   1906 
   1907   column0 = U0[state->v8[0]] ^ U1[state->v8[5]]
   1908     ^ U2[state->v8[10]] ^ U3[state->v8[15]];
   1909 
   1910   column1 = U0[state->v8[4]] ^ U1[state->v8[9]]
   1911     ^ U2[state->v8[14]] ^ U3[state->v8[3]];
   1912 
   1913   column2 = U0[state->v8[8]] ^ U1[state->v8[13]]
   1914     ^ U2[state->v8[2]] ^ U3[state->v8[7]];
   1915 
   1916   column3 = U0[state->v8[12]] ^ U1[state->v8[1]]
   1917     ^ U2[state->v8[6]] ^ U3[state->v8[11]];
   1918 
   1919   state->v32[0] = column0 ^ round_key->v32[0];
   1920   state->v32[1] = column1 ^ round_key->v32[1];
   1921   state->v32[2] = column2 ^ round_key->v32[2];
   1922   state->v32[3] = column3 ^ round_key->v32[3];
   1923 
   1924 }
   1925 
   1926 static INLINE void
   1927 aes_final_round(v128_t *state, const v128_t *round_key) {
   1928   uint8_t tmp;
   1929 
   1930   /* byte substitutions and row shifts */
   1931   /* first row - no shift */
   1932   state->v8[0] = aes_sbox[state->v8[0]];
   1933   state->v8[4] = aes_sbox[state->v8[4]];
   1934   state->v8[8] = aes_sbox[state->v8[8]];
   1935   state->v8[12] = aes_sbox[state->v8[12]];
   1936 
   1937   /* second row - shift one left */
   1938   tmp = aes_sbox[state->v8[1]];
   1939   state->v8[1] = aes_sbox[state->v8[5]];
   1940   state->v8[5] = aes_sbox[state->v8[9]];
   1941   state->v8[9] = aes_sbox[state->v8[13]];
   1942   state->v8[13] = tmp;
   1943 
   1944   /* third row - shift two left */
   1945   tmp = aes_sbox[state->v8[10]];
   1946   state->v8[10] = aes_sbox[state->v8[2]];
   1947   state->v8[2] = tmp;
   1948   tmp = aes_sbox[state->v8[14]];
   1949   state->v8[14] = aes_sbox[state->v8[6]];
   1950   state->v8[6] = tmp;
   1951 
   1952   /* fourth row - shift three left */
   1953   tmp = aes_sbox[state->v8[15]];
   1954   state->v8[15] = aes_sbox[state->v8[11]];
   1955   state->v8[11] = aes_sbox[state->v8[7]];
   1956   state->v8[7] = aes_sbox[state->v8[3]];
   1957   state->v8[3] = tmp;
   1958 
   1959   v128_xor_eq(state, round_key);
   1960 }
   1961 
   1962 static INLINE void
   1963 aes_inv_final_round(v128_t *state, const v128_t *round_key) {
   1964   uint8_t tmp;
   1965 
   1966   /* byte substitutions and row shifts */
   1967   /* first row - no shift */
   1968   state->v8[0] = aes_inv_sbox[state->v8[0]];
   1969   state->v8[4] = aes_inv_sbox[state->v8[4]];
   1970   state->v8[8] = aes_inv_sbox[state->v8[8]];
   1971   state->v8[12] = aes_inv_sbox[state->v8[12]];
   1972 
   1973   /* second row - shift one left */
   1974   tmp = aes_inv_sbox[state->v8[1]];
   1975   state->v8[1] = aes_inv_sbox[state->v8[5]];
   1976   state->v8[5] = aes_inv_sbox[state->v8[9]];
   1977   state->v8[9] = aes_inv_sbox[state->v8[13]];
   1978   state->v8[13] = tmp;
   1979 
   1980   /* third row - shift two left */
   1981   tmp = aes_inv_sbox[state->v8[10]];
   1982   state->v8[10] = aes_inv_sbox[state->v8[2]];
   1983   state->v8[2] = tmp;
   1984   tmp = aes_inv_sbox[state->v8[14]];
   1985   state->v8[14] = aes_inv_sbox[state->v8[6]];
   1986   state->v8[6] = tmp;
   1987 
   1988   /* fourth row - shift three left */
   1989   tmp = aes_inv_sbox[state->v8[15]];
   1990   state->v8[15] = aes_inv_sbox[state->v8[11]];
   1991   state->v8[11] = aes_inv_sbox[state->v8[7]];
   1992   state->v8[7] = aes_inv_sbox[state->v8[3]];
   1993   state->v8[3] = tmp;
   1994 
   1995   v128_xor_eq(state, round_key);
   1996 }
   1997 
   1998 #endif  /* CPU type */
   1999 
   2000 
   2001 void
   2002 aes_encrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key) {
   2003 
   2004   /* add in the subkey */
   2005   v128_xor_eq(plaintext, &exp_key->round[0]);
   2006 
   2007   /* now do the rounds */
   2008   aes_round(plaintext, &exp_key->round[1]);
   2009   aes_round(plaintext, &exp_key->round[2]);
   2010   aes_round(plaintext, &exp_key->round[3]);
   2011   aes_round(plaintext, &exp_key->round[4]);
   2012   aes_round(plaintext, &exp_key->round[5]);
   2013   aes_round(plaintext, &exp_key->round[6]);
   2014   aes_round(plaintext, &exp_key->round[7]);
   2015   aes_round(plaintext, &exp_key->round[8]);
   2016   aes_round(plaintext, &exp_key->round[9]);
   2017   if (exp_key->num_rounds == 10) {
   2018     aes_final_round(plaintext, &exp_key->round[10]);
   2019   }
   2020   else if (exp_key->num_rounds == 12) {
   2021     aes_round(plaintext, &exp_key->round[10]);
   2022     aes_round(plaintext, &exp_key->round[11]);
   2023     aes_final_round(plaintext, &exp_key->round[12]);
   2024   }
   2025   else if (exp_key->num_rounds == 14) {
   2026     aes_round(plaintext, &exp_key->round[10]);
   2027     aes_round(plaintext, &exp_key->round[11]);
   2028     aes_round(plaintext, &exp_key->round[12]);
   2029     aes_round(plaintext, &exp_key->round[13]);
   2030     aes_final_round(plaintext, &exp_key->round[14]);
   2031   }
   2032 }
   2033 
   2034 void
   2035 aes_decrypt(v128_t *plaintext, const aes_expanded_key_t *exp_key) {
   2036 
   2037   /* add in the subkey */
   2038   v128_xor_eq(plaintext, &exp_key->round[0]);
   2039 
   2040   /* now do the rounds */
   2041   aes_inv_round(plaintext, &exp_key->round[1]);
   2042   aes_inv_round(plaintext, &exp_key->round[2]);
   2043   aes_inv_round(plaintext, &exp_key->round[3]);
   2044   aes_inv_round(plaintext, &exp_key->round[4]);
   2045   aes_inv_round(plaintext, &exp_key->round[5]);
   2046   aes_inv_round(plaintext, &exp_key->round[6]);
   2047   aes_inv_round(plaintext, &exp_key->round[7]);
   2048   aes_inv_round(plaintext, &exp_key->round[8]);
   2049   aes_inv_round(plaintext, &exp_key->round[9]);
   2050   if (exp_key->num_rounds == 10) {
   2051     aes_inv_final_round(plaintext, &exp_key->round[10]);
   2052   }
   2053   else if (exp_key->num_rounds == 12) {
   2054     aes_inv_round(plaintext, &exp_key->round[10]);
   2055     aes_inv_round(plaintext, &exp_key->round[11]);
   2056     aes_inv_final_round(plaintext, &exp_key->round[12]);
   2057   }
   2058   else if (exp_key->num_rounds == 14) {
   2059     aes_inv_round(plaintext, &exp_key->round[10]);
   2060     aes_inv_round(plaintext, &exp_key->round[11]);
   2061     aes_inv_round(plaintext, &exp_key->round[12]);
   2062     aes_inv_round(plaintext, &exp_key->round[13]);
   2063     aes_inv_final_round(plaintext, &exp_key->round[14]);
   2064   }
   2065 }
   2066