Home | History | Annotate | Download | only in crypto
      1 /*
      2  * AES (Rijndael) cipher
      3  *
      4  * Modifications to public domain implementation:
      5  * - support only 128-bit keys
      6  * - cleanup
      7  * - use C pre-processor to make it easier to change S table access
      8  * - added option (AES_SMALL_TABLES) for reducing code size by about 8 kB at
      9  *   cost of reduced throughput (quite small difference on Pentium 4,
     10  *   10-25% when using -O1 or -O2 optimization)
     11  *
     12  * Copyright (c) 2003-2005, Jouni Malinen <j (at) w1.fi>
     13  *
     14  * This program is free software; you can redistribute it and/or modify
     15  * it under the terms of the GNU General Public License version 2 as
     16  * published by the Free Software Foundation.
     17  *
     18  * Alternatively, this software may be distributed under the terms of BSD
     19  * license.
     20  *
     21  * See README and COPYING for more details.
     22  */
     23 
     24 #include "includes.h"
     25 
     26 #include "common.h"
     27 
     28 #ifdef INTERNAL_AES
     29 
     30 #include "crypto.h"
     31 
     32 /*
     33  * rijndael-alg-fst.c
     34  *
     35  * @version 3.0 (December 2000)
     36  *
     37  * Optimised ANSI C code for the Rijndael cipher (now AES)
     38  *
     39  * @author Vincent Rijmen <vincent.rijmen (at) esat.kuleuven.ac.be>
     40  * @author Antoon Bosselaers <antoon.bosselaers (at) esat.kuleuven.ac.be>
     41  * @author Paulo Barreto <paulo.barreto (at) terra.com.br>
     42  *
     43  * This code is hereby placed in the public domain.
     44  *
     45  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
     46  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     47  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     48  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
     49  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     50  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     51  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
     52  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     53  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
     54  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     55  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     56  */
     57 
     58 /* #define FULL_UNROLL */
     59 #define AES_SMALL_TABLES
     60 
     61 
     62 /*
     63 Te0[x] = S [x].[02, 01, 01, 03];
     64 Te1[x] = S [x].[03, 02, 01, 01];
     65 Te2[x] = S [x].[01, 03, 02, 01];
     66 Te3[x] = S [x].[01, 01, 03, 02];
     67 Te4[x] = S [x].[01, 01, 01, 01];
     68 
     69 Td0[x] = Si[x].[0e, 09, 0d, 0b];
     70 Td1[x] = Si[x].[0b, 0e, 09, 0d];
     71 Td2[x] = Si[x].[0d, 0b, 0e, 09];
     72 Td3[x] = Si[x].[09, 0d, 0b, 0e];
     73 Td4[x] = Si[x].[01, 01, 01, 01];
     74 */
     75 
     76 static const u32 Te0[256] = {
     77     0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU,
     78     0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U,
     79     0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU,
     80     0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU,
     81     0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
     82     0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU,
     83     0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU,
     84     0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU,
     85     0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU,
     86     0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
     87     0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U,
     88     0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU,
     89     0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU,
     90     0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U,
     91     0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
     92     0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU,
     93     0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU,
     94     0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU,
     95     0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU,
     96     0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
     97     0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU,
     98     0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU,
     99     0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU,
    100     0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU,
    101     0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
    102     0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U,
    103     0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U,
    104     0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U,
    105     0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU,
    106     0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
    107     0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U,
    108     0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU,
    109     0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU,
    110     0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U,
    111     0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
    112     0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U,
    113     0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU,
    114     0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U,
    115     0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU,
    116     0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
    117     0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU,
    118     0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U,
    119     0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U,
    120     0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU,
    121     0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
    122     0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U,
    123     0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U,
    124     0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U,
    125     0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U,
    126     0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
    127     0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U,
    128     0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U,
    129     0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU,
    130     0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U,
    131     0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
    132     0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U,
    133     0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U,
    134     0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U,
    135     0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U,
    136     0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
    137     0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U,
    138     0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U,
    139     0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U,
    140     0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU,
    141 };
    142 #ifndef AES_SMALL_TABLES
    143 static const u32 Te1[256] = {
    144     0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU,
    145     0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U,
    146     0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU,
    147     0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U,
    148     0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
    149     0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U,
    150     0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU,
    151     0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U,
    152     0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U,
    153     0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
    154     0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U,
    155     0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U,
    156     0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U,
    157     0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU,
    158     0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
    159     0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U,
    160     0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU,
    161     0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U,
    162     0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U,
    163     0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
    164     0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU,
    165     0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU,
    166     0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U,
    167     0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU,
    168     0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
    169     0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U,
    170     0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU,
    171     0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U,
    172     0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU,
    173     0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
    174     0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U,
    175     0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U,
    176     0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU,
    177     0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U,
    178     0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
    179     0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U,
    180     0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU,
    181     0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U,
    182     0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U,
    183     0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
    184     0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU,
    185     0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU,
    186     0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U,
    187     0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U,
    188     0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
    189     0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U,
    190     0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU,
    191     0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U,
    192     0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU,
    193     0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
    194     0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU,
    195     0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU,
    196     0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U,
    197     0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU,
    198     0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
    199     0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU,
    200     0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U,
    201     0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U,
    202     0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U,
    203     0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
    204     0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU,
    205     0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U,
    206     0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU,
    207     0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U,
    208 };
    209 static const u32 Te2[256] = {
    210     0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU,
    211     0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U,
    212     0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU,
    213     0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U,
    214     0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
    215     0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U,
    216     0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU,
    217     0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U,
    218     0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U,
    219     0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
    220     0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U,
    221     0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U,
    222     0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U,
    223     0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU,
    224     0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
    225     0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U,
    226     0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU,
    227     0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U,
    228     0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U,
    229     0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
    230     0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU,
    231     0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU,
    232     0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U,
    233     0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU,
    234     0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
    235     0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U,
    236     0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU,
    237     0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U,
    238     0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU,
    239     0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
    240     0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U,
    241     0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U,
    242     0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU,
    243     0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U,
    244     0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
    245     0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U,
    246     0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU,
    247     0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U,
    248     0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U,
    249     0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
    250     0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU,
    251     0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU,
    252     0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U,
    253     0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U,
    254     0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
    255     0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U,
    256     0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU,
    257     0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U,
    258     0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU,
    259     0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
    260     0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU,
    261     0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU,
    262     0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U,
    263     0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU,
    264     0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
    265     0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU,
    266     0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U,
    267     0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U,
    268     0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U,
    269     0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
    270     0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU,
    271     0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U,
    272     0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU,
    273     0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U,
    274 };
    275 static const u32 Te3[256] = {
    276 
    277     0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U,
    278     0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U,
    279     0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U,
    280     0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU,
    281     0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
    282     0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU,
    283     0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U,
    284     0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU,
    285     0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU,
    286     0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
    287     0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U,
    288     0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU,
    289     0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU,
    290     0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU,
    291     0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
    292     0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU,
    293     0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U,
    294     0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU,
    295     0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU,
    296     0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
    297     0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U,
    298     0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U,
    299     0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U,
    300     0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U,
    301     0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
    302     0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U,
    303     0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU,
    304     0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU,
    305     0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U,
    306     0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
    307     0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U,
    308     0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU,
    309     0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U,
    310     0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU,
    311     0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
    312     0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U,
    313     0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U,
    314     0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU,
    315     0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U,
    316     0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
    317     0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U,
    318     0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U,
    319     0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U,
    320     0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U,
    321     0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
    322     0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U,
    323     0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU,
    324     0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U,
    325     0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU,
    326     0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
    327     0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU,
    328     0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU,
    329     0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU,
    330     0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU,
    331     0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
    332     0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U,
    333     0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U,
    334     0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U,
    335     0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U,
    336     0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
    337     0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU,
    338     0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U,
    339     0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU,
    340     0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU,
    341 };
    342 static const u32 Te4[256] = {
    343     0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU,
    344     0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U,
    345     0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU,
    346     0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U,
    347     0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU,
    348     0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U,
    349     0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU,
    350     0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U,
    351     0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U,
    352     0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU,
    353     0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U,
    354     0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U,
    355     0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U,
    356     0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU,
    357     0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U,
    358     0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U,
    359     0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU,
    360     0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U,
    361     0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U,
    362     0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U,
    363     0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU,
    364     0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU,
    365     0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U,
    366     0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU,
    367     0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU,
    368     0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U,
    369     0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU,
    370     0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U,
    371     0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU,
    372     0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U,
    373     0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U,
    374     0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U,
    375     0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU,
    376     0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U,
    377     0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU,
    378     0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U,
    379     0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU,
    380     0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U,
    381     0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U,
    382     0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU,
    383     0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU,
    384     0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU,
    385     0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U,
    386     0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U,
    387     0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU,
    388     0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U,
    389     0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU,
    390     0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U,
    391     0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU,
    392     0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U,
    393     0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU,
    394     0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU,
    395     0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U,
    396     0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU,
    397     0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U,
    398     0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU,
    399     0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U,
    400     0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U,
    401     0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U,
    402     0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU,
    403     0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU,
    404     0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U,
    405     0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU,
    406     0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U,
    407 };
    408 #endif /* AES_SMALL_TABLES */
    409 static const u32 Td0[256] = {
    410     0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U,
    411     0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U,
    412     0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U,
    413     0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU,
    414     0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
    415     0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U,
    416     0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU,
    417     0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U,
    418     0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU,
    419     0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
    420     0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U,
    421     0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U,
    422     0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U,
    423     0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU,
    424     0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
    425     0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU,
    426     0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U,
    427     0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU,
    428     0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U,
    429     0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
    430     0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U,
    431     0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU,
    432     0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U,
    433     0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU,
    434     0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
    435     0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU,
    436     0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U,
    437     0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU,
    438     0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU,
    439     0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
    440     0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU,
    441     0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U,
    442     0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU,
    443     0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U,
    444     0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
    445     0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U,
    446     0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU,
    447     0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U,
    448     0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U,
    449     0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
    450     0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U,
    451     0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U,
    452     0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U,
    453     0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U,
    454     0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
    455     0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU,
    456     0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U,
    457     0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U,
    458     0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U,
    459     0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
    460     0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U,
    461     0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU,
    462     0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU,
    463     0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU,
    464     0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
    465     0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U,
    466     0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U,
    467     0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU,
    468     0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU,
    469     0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
    470     0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU,
    471     0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U,
    472     0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U,
    473     0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U,
    474 };
    475 #ifndef AES_SMALL_TABLES
    476 static const u32 Td1[256] = {
    477     0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU,
    478     0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U,
    479     0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU,
    480     0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U,
    481     0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
    482     0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U,
    483     0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U,
    484     0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U,
    485     0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U,
    486     0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
    487     0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU,
    488     0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU,
    489     0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U,
    490     0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU,
    491     0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
    492     0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U,
    493     0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U,
    494     0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU,
    495     0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU,
    496     0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
    497     0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU,
    498     0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U,
    499     0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU,
    500     0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU,
    501     0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
    502     0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U,
    503     0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U,
    504     0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU,
    505     0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U,
    506     0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
    507     0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U,
    508     0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U,
    509     0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U,
    510     0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU,
    511     0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
    512     0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U,
    513     0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U,
    514     0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U,
    515     0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U,
    516     0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
    517     0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU,
    518     0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU,
    519     0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U,
    520     0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU,
    521     0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
    522     0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU,
    523     0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU,
    524     0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U,
    525     0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU,
    526     0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
    527     0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U,
    528     0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U,
    529     0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U,
    530     0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U,
    531     0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
    532     0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U,
    533     0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU,
    534     0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U,
    535     0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U,
    536     0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
    537     0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U,
    538     0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U,
    539     0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U,
    540     0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U,
    541 };
    542 static const u32 Td2[256] = {
    543     0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U,
    544     0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U,
    545     0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U,
    546     0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U,
    547     0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
    548     0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U,
    549     0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U,
    550     0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U,
    551     0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U,
    552     0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
    553     0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U,
    554     0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U,
    555     0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU,
    556     0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U,
    557     0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
    558     0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U,
    559     0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U,
    560     0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U,
    561     0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U,
    562     0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
    563 
    564     0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U,
    565     0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U,
    566     0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U,
    567     0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U,
    568     0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
    569     0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU,
    570     0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU,
    571     0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U,
    572     0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU,
    573     0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
    574     0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU,
    575     0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU,
    576     0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU,
    577     0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU,
    578     0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
    579     0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U,
    580     0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U,
    581     0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U,
    582     0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U,
    583     0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
    584     0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U,
    585     0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU,
    586     0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU,
    587     0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U,
    588     0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
    589     0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU,
    590     0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU,
    591     0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U,
    592     0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U,
    593     0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
    594     0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U,
    595     0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U,
    596     0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U,
    597     0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U,
    598     0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
    599     0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U,
    600     0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U,
    601     0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U,
    602     0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U,
    603     0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
    604     0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U,
    605     0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU,
    606     0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U,
    607     0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U,
    608 };
    609 static const u32 Td3[256] = {
    610     0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU,
    611     0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU,
    612     0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U,
    613     0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U,
    614     0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
    615     0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU,
    616     0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U,
    617     0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU,
    618     0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U,
    619     0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
    620     0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U,
    621     0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U,
    622     0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U,
    623     0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U,
    624     0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
    625     0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU,
    626     0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU,
    627     0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U,
    628     0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U,
    629     0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
    630     0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU,
    631     0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U,
    632     0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U,
    633     0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U,
    634     0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
    635     0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU,
    636     0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U,
    637     0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U,
    638     0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU,
    639     0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
    640     0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U,
    641     0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U,
    642     0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U,
    643     0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU,
    644     0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
    645     0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U,
    646     0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U,
    647     0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U,
    648     0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U,
    649     0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
    650     0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U,
    651     0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU,
    652     0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U,
    653     0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U,
    654     0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
    655     0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU,
    656     0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U,
    657     0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU,
    658     0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U,
    659     0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
    660     0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U,
    661     0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U,
    662     0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U,
    663     0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U,
    664     0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
    665     0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU,
    666     0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU,
    667     0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU,
    668     0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U,
    669     0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
    670     0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U,
    671     0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU,
    672     0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U,
    673     0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U,
    674 };
    675 static const u32 Td4[256] = {
    676     0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U,
    677     0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U,
    678     0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU,
    679     0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU,
    680     0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U,
    681     0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U,
    682     0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U,
    683     0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU,
    684     0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U,
    685     0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU,
    686     0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU,
    687     0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU,
    688     0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U,
    689     0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U,
    690     0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U,
    691     0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U,
    692     0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U,
    693     0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U,
    694     0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU,
    695     0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U,
    696     0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U,
    697     0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU,
    698     0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U,
    699     0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U,
    700     0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U,
    701     0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU,
    702     0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U,
    703     0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U,
    704     0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU,
    705     0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U,
    706     0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U,
    707     0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU,
    708     0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U,
    709     0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU,
    710     0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU,
    711     0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U,
    712     0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U,
    713     0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U,
    714     0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U,
    715     0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU,
    716     0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U,
    717     0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U,
    718     0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU,
    719     0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU,
    720     0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU,
    721     0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U,
    722     0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU,
    723     0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U,
    724     0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U,
    725     0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U,
    726     0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U,
    727     0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU,
    728     0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U,
    729     0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU,
    730     0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU,
    731     0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU,
    732     0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU,
    733     0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U,
    734     0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU,
    735     0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U,
    736     0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU,
    737     0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U,
    738     0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U,
    739     0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU,
    740 };
    741 static const u32 rcon[] = {
    742 	0x01000000, 0x02000000, 0x04000000, 0x08000000,
    743 	0x10000000, 0x20000000, 0x40000000, 0x80000000,
    744 	0x1B000000, 0x36000000, /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
    745 };
    746 #else /* AES_SMALL_TABLES */
    747 static const u8 Td4s[256] = {
    748     0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U,
    749     0xbfU, 0x40U, 0xa3U, 0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU,
    750     0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU, 0xffU, 0x87U,
    751     0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU,
    752     0x54U, 0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU,
    753     0xeeU, 0x4cU, 0x95U, 0x0bU, 0x42U, 0xfaU, 0xc3U, 0x4eU,
    754     0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U, 0xb2U,
    755     0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U,
    756     0x72U, 0xf8U, 0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U,
    757     0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU, 0x65U, 0xb6U, 0x92U,
    758     0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
    759     0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U,
    760     0x90U, 0xd8U, 0xabU, 0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU,
    761     0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U, 0x45U, 0x06U,
    762     0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U,
    763     0xc1U, 0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU,
    764     0x3aU, 0x91U, 0x11U, 0x41U, 0x4fU, 0x67U, 0xdcU, 0xeaU,
    765     0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U, 0x73U,
    766     0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U,
    767     0xe2U, 0xf9U, 0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU,
    768     0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU, 0x29U, 0xc5U, 0x89U,
    769     0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
    770     0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U,
    771     0x9aU, 0xdbU, 0xc0U, 0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U,
    772     0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U, 0xc7U, 0x31U,
    773     0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU,
    774     0x60U, 0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU,
    775     0x2dU, 0xe5U, 0x7aU, 0x9fU, 0x93U, 0xc9U, 0x9cU, 0xefU,
    776     0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U, 0xb0U,
    777     0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U,
    778     0x17U, 0x2bU, 0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U,
    779     0xe1U, 0x69U, 0x14U, 0x63U, 0x55U, 0x21U, 0x0cU, 0x7dU,
    780 };
    781 static const u8 rcons[] = {
    782 	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36
    783 	/* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
    784 };
    785 #endif /* AES_SMALL_TABLES */
    786 
    787 
    788 #ifndef AES_SMALL_TABLES
    789 
    790 #define RCON(i) rcon[(i)]
    791 
    792 #define TE0(i) Te0[((i) >> 24) & 0xff]
    793 #define TE1(i) Te1[((i) >> 16) & 0xff]
    794 #define TE2(i) Te2[((i) >> 8) & 0xff]
    795 #define TE3(i) Te3[(i) & 0xff]
    796 #define TE41(i) (Te4[((i) >> 24) & 0xff] & 0xff000000)
    797 #define TE42(i) (Te4[((i) >> 16) & 0xff] & 0x00ff0000)
    798 #define TE43(i) (Te4[((i) >> 8) & 0xff] & 0x0000ff00)
    799 #define TE44(i) (Te4[(i) & 0xff] & 0x000000ff)
    800 #define TE421(i) (Te4[((i) >> 16) & 0xff] & 0xff000000)
    801 #define TE432(i) (Te4[((i) >> 8) & 0xff] & 0x00ff0000)
    802 #define TE443(i) (Te4[(i) & 0xff] & 0x0000ff00)
    803 #define TE414(i) (Te4[((i) >> 24) & 0xff] & 0x000000ff)
    804 #define TE4(i) (Te4[(i)] & 0x000000ff)
    805 
    806 #define TD0(i) Td0[((i) >> 24) & 0xff]
    807 #define TD1(i) Td1[((i) >> 16) & 0xff]
    808 #define TD2(i) Td2[((i) >> 8) & 0xff]
    809 #define TD3(i) Td3[(i) & 0xff]
    810 #define TD41(i) (Td4[((i) >> 24) & 0xff] & 0xff000000)
    811 #define TD42(i) (Td4[((i) >> 16) & 0xff] & 0x00ff0000)
    812 #define TD43(i) (Td4[((i) >> 8) & 0xff] & 0x0000ff00)
    813 #define TD44(i) (Td4[(i) & 0xff] & 0x000000ff)
    814 #define TD0_(i) Td0[(i) & 0xff]
    815 #define TD1_(i) Td1[(i) & 0xff]
    816 #define TD2_(i) Td2[(i) & 0xff]
    817 #define TD3_(i) Td3[(i) & 0xff]
    818 
    819 #else /* AES_SMALL_TABLES */
    820 
    821 #define RCON(i) (rcons[(i)] << 24)
    822 
    823 static inline u32 rotr(u32 val, int bits)
    824 {
    825 	return (val >> bits) | (val << (32 - bits));
    826 }
    827 
    828 #define TE0(i) Te0[((i) >> 24) & 0xff]
    829 #define TE1(i) rotr(Te0[((i) >> 16) & 0xff], 8)
    830 #define TE2(i) rotr(Te0[((i) >> 8) & 0xff], 16)
    831 #define TE3(i) rotr(Te0[(i) & 0xff], 24)
    832 #define TE41(i) ((Te0[((i) >> 24) & 0xff] << 8) & 0xff000000)
    833 #define TE42(i) (Te0[((i) >> 16) & 0xff] & 0x00ff0000)
    834 #define TE43(i) (Te0[((i) >> 8) & 0xff] & 0x0000ff00)
    835 #define TE44(i) ((Te0[(i) & 0xff] >> 8) & 0x000000ff)
    836 #define TE421(i) ((Te0[((i) >> 16) & 0xff] << 8) & 0xff000000)
    837 #define TE432(i) (Te0[((i) >> 8) & 0xff] & 0x00ff0000)
    838 #define TE443(i) (Te0[(i) & 0xff] & 0x0000ff00)
    839 #define TE414(i) ((Te0[((i) >> 24) & 0xff] >> 8) & 0x000000ff)
    840 #define TE4(i) ((Te0[(i)] >> 8) & 0x000000ff)
    841 
    842 #define TD0(i) Td0[((i) >> 24) & 0xff]
    843 #define TD1(i) rotr(Td0[((i) >> 16) & 0xff], 8)
    844 #define TD2(i) rotr(Td0[((i) >> 8) & 0xff], 16)
    845 #define TD3(i) rotr(Td0[(i) & 0xff], 24)
    846 #define TD41(i) (Td4s[((i) >> 24) & 0xff] << 24)
    847 #define TD42(i) (Td4s[((i) >> 16) & 0xff] << 16)
    848 #define TD43(i) (Td4s[((i) >> 8) & 0xff] << 8)
    849 #define TD44(i) (Td4s[(i) & 0xff])
    850 #define TD0_(i) Td0[(i) & 0xff]
    851 #define TD1_(i) rotr(Td0[(i) & 0xff], 8)
    852 #define TD2_(i) rotr(Td0[(i) & 0xff], 16)
    853 #define TD3_(i) rotr(Td0[(i) & 0xff], 24)
    854 
    855 #endif /* AES_SMALL_TABLES */
    856 
    857 #define SWAP(x) (_lrotl(x, 8) & 0x00ff00ff | _lrotr(x, 8) & 0xff00ff00)
    858 
    859 #ifdef _MSC_VER
    860 #define GETU32(p) SWAP(*((u32 *)(p)))
    861 #define PUTU32(ct, st) { *((u32 *)(ct)) = SWAP((st)); }
    862 #else
    863 #define GETU32(pt) (((u32)(pt)[0] << 24) ^ ((u32)(pt)[1] << 16) ^ \
    864 ((u32)(pt)[2] <<  8) ^ ((u32)(pt)[3]))
    865 #define PUTU32(ct, st) { \
    866 (ct)[0] = (u8)((st) >> 24); (ct)[1] = (u8)((st) >> 16); \
    867 (ct)[2] = (u8)((st) >>  8); (ct)[3] = (u8)(st); }
    868 #endif
    869 
    870 /**
    871  * Expand the cipher key into the encryption key schedule.
    872  *
    873  * @return	the number of rounds for the given cipher key size.
    874  */
    875 void rijndaelKeySetupEnc(u32 rk[/*44*/], const u8 cipherKey[])
    876 {
    877 	int i;
    878 	u32 temp;
    879 
    880 	rk[0] = GETU32(cipherKey     );
    881 	rk[1] = GETU32(cipherKey +  4);
    882 	rk[2] = GETU32(cipherKey +  8);
    883 	rk[3] = GETU32(cipherKey + 12);
    884 	for (i = 0; i < 10; i++) {
    885 		temp  = rk[3];
    886 		rk[4] = rk[0] ^
    887 			TE421(temp) ^ TE432(temp) ^ TE443(temp) ^ TE414(temp) ^
    888 			RCON(i);
    889 		rk[5] = rk[1] ^ rk[4];
    890 		rk[6] = rk[2] ^ rk[5];
    891 		rk[7] = rk[3] ^ rk[6];
    892 		rk += 4;
    893 	}
    894 }
    895 
    896 #ifndef CONFIG_NO_AES_DECRYPT
    897 /**
    898  * Expand the cipher key into the decryption key schedule.
    899  *
    900  * @return	the number of rounds for the given cipher key size.
    901  */
    902 void rijndaelKeySetupDec(u32 rk[/*44*/], const u8 cipherKey[])
    903 {
    904 	int Nr = 10, i, j;
    905 	u32 temp;
    906 
    907 	/* expand the cipher key: */
    908 	rijndaelKeySetupEnc(rk, cipherKey);
    909 	/* invert the order of the round keys: */
    910 	for (i = 0, j = 4*Nr; i < j; i += 4, j -= 4) {
    911 		temp = rk[i    ]; rk[i    ] = rk[j    ]; rk[j    ] = temp;
    912 		temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp;
    913 		temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp;
    914 		temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp;
    915 	}
    916 	/* apply the inverse MixColumn transform to all round keys but the
    917 	 * first and the last: */
    918 	for (i = 1; i < Nr; i++) {
    919 		rk += 4;
    920 		for (j = 0; j < 4; j++) {
    921 			rk[j] = TD0_(TE4((rk[j] >> 24)       )) ^
    922 				TD1_(TE4((rk[j] >> 16) & 0xff)) ^
    923 				TD2_(TE4((rk[j] >>  8) & 0xff)) ^
    924 				TD3_(TE4((rk[j]      ) & 0xff));
    925 		}
    926 	}
    927 }
    928 #endif /* CONFIG_NO_AES_DECRYPT */
    929 
    930 #ifndef CONFIG_NO_AES_ENCRYPT
    931 void rijndaelEncrypt(const u32 rk[/*44*/], const u8 pt[16], u8 ct[16])
    932 {
    933 	u32 s0, s1, s2, s3, t0, t1, t2, t3;
    934 	const int Nr = 10;
    935 #ifndef FULL_UNROLL
    936 	int r;
    937 #endif /* ?FULL_UNROLL */
    938 
    939 	/*
    940 	 * map byte array block to cipher state
    941 	 * and add initial round key:
    942 	 */
    943 	s0 = GETU32(pt     ) ^ rk[0];
    944 	s1 = GETU32(pt +  4) ^ rk[1];
    945 	s2 = GETU32(pt +  8) ^ rk[2];
    946 	s3 = GETU32(pt + 12) ^ rk[3];
    947 
    948 #define ROUND(i,d,s) \
    949 d##0 = TE0(s##0) ^ TE1(s##1) ^ TE2(s##2) ^ TE3(s##3) ^ rk[4 * i]; \
    950 d##1 = TE0(s##1) ^ TE1(s##2) ^ TE2(s##3) ^ TE3(s##0) ^ rk[4 * i + 1]; \
    951 d##2 = TE0(s##2) ^ TE1(s##3) ^ TE2(s##0) ^ TE3(s##1) ^ rk[4 * i + 2]; \
    952 d##3 = TE0(s##3) ^ TE1(s##0) ^ TE2(s##1) ^ TE3(s##2) ^ rk[4 * i + 3]
    953 
    954 #ifdef FULL_UNROLL
    955 
    956 	ROUND(1,t,s);
    957 	ROUND(2,s,t);
    958 	ROUND(3,t,s);
    959 	ROUND(4,s,t);
    960 	ROUND(5,t,s);
    961 	ROUND(6,s,t);
    962 	ROUND(7,t,s);
    963 	ROUND(8,s,t);
    964 	ROUND(9,t,s);
    965 
    966 	rk += Nr << 2;
    967 
    968 #else  /* !FULL_UNROLL */
    969 
    970 	/* Nr - 1 full rounds: */
    971 	r = Nr >> 1;
    972 	for (;;) {
    973 		ROUND(1,t,s);
    974 		rk += 8;
    975 		if (--r == 0)
    976 			break;
    977 		ROUND(0,s,t);
    978 	}
    979 
    980 #endif /* ?FULL_UNROLL */
    981 
    982 #undef ROUND
    983 
    984 	/*
    985 	 * apply last round and
    986 	 * map cipher state to byte array block:
    987 	 */
    988 	s0 = TE41(t0) ^ TE42(t1) ^ TE43(t2) ^ TE44(t3) ^ rk[0];
    989 	PUTU32(ct     , s0);
    990 	s1 = TE41(t1) ^ TE42(t2) ^ TE43(t3) ^ TE44(t0) ^ rk[1];
    991 	PUTU32(ct +  4, s1);
    992 	s2 = TE41(t2) ^ TE42(t3) ^ TE43(t0) ^ TE44(t1) ^ rk[2];
    993 	PUTU32(ct +  8, s2);
    994 	s3 = TE41(t3) ^ TE42(t0) ^ TE43(t1) ^ TE44(t2) ^ rk[3];
    995 	PUTU32(ct + 12, s3);
    996 }
    997 #endif /* CONFIG_NO_AES_ENCRYPT */
    998 
    999 void rijndaelDecrypt(const u32 rk[/*44*/], const u8 ct[16], u8 pt[16])
   1000 {
   1001 	u32 s0, s1, s2, s3, t0, t1, t2, t3;
   1002 	const int Nr = 10;
   1003 #ifndef FULL_UNROLL
   1004 	int r;
   1005 #endif /* ?FULL_UNROLL */
   1006 
   1007 	/*
   1008 	 * map byte array block to cipher state
   1009 	 * and add initial round key:
   1010 	 */
   1011 	s0 = GETU32(ct     ) ^ rk[0];
   1012 	s1 = GETU32(ct +  4) ^ rk[1];
   1013 	s2 = GETU32(ct +  8) ^ rk[2];
   1014 	s3 = GETU32(ct + 12) ^ rk[3];
   1015 
   1016 #define ROUND(i,d,s) \
   1017 d##0 = TD0(s##0) ^ TD1(s##3) ^ TD2(s##2) ^ TD3(s##1) ^ rk[4 * i]; \
   1018 d##1 = TD0(s##1) ^ TD1(s##0) ^ TD2(s##3) ^ TD3(s##2) ^ rk[4 * i + 1]; \
   1019 d##2 = TD0(s##2) ^ TD1(s##1) ^ TD2(s##0) ^ TD3(s##3) ^ rk[4 * i + 2]; \
   1020 d##3 = TD0(s##3) ^ TD1(s##2) ^ TD2(s##1) ^ TD3(s##0) ^ rk[4 * i + 3]
   1021 
   1022 #ifdef FULL_UNROLL
   1023 
   1024 	ROUND(1,t,s);
   1025 	ROUND(2,s,t);
   1026 	ROUND(3,t,s);
   1027 	ROUND(4,s,t);
   1028 	ROUND(5,t,s);
   1029 	ROUND(6,s,t);
   1030 	ROUND(7,t,s);
   1031 	ROUND(8,s,t);
   1032 	ROUND(9,t,s);
   1033 
   1034 	rk += Nr << 2;
   1035 
   1036 #else  /* !FULL_UNROLL */
   1037 
   1038 	/* Nr - 1 full rounds: */
   1039 	r = Nr >> 1;
   1040 	for (;;) {
   1041 		ROUND(1,t,s);
   1042 		rk += 8;
   1043 		if (--r == 0)
   1044 			break;
   1045 		ROUND(0,s,t);
   1046 	}
   1047 
   1048 #endif /* ?FULL_UNROLL */
   1049 
   1050 #undef ROUND
   1051 
   1052 	/*
   1053 	 * apply last round and
   1054 	 * map cipher state to byte array block:
   1055 	 */
   1056 	s0 = TD41(t0) ^ TD42(t3) ^ TD43(t2) ^ TD44(t1) ^ rk[0];
   1057 	PUTU32(pt     , s0);
   1058 	s1 = TD41(t1) ^ TD42(t0) ^ TD43(t3) ^ TD44(t2) ^ rk[1];
   1059 	PUTU32(pt +  4, s1);
   1060 	s2 = TD41(t2) ^ TD42(t1) ^ TD43(t0) ^ TD44(t3) ^ rk[2];
   1061 	PUTU32(pt +  8, s2);
   1062 	s3 = TD41(t3) ^ TD42(t2) ^ TD43(t1) ^ TD44(t0) ^ rk[3];
   1063 	PUTU32(pt + 12, s3);
   1064 }
   1065 
   1066 
   1067 
   1068 /* Generic wrapper functions for AES functions */
   1069 
   1070 #define AES_PRIV_SIZE (4 * 44)
   1071 
   1072 #ifndef CONFIG_NO_AES_ENCRYPT
   1073 void * aes_encrypt_init(const u8 *key, size_t len)
   1074 {
   1075 	u32 *rk;
   1076 	if (len != 16)
   1077 		return NULL;
   1078 	rk = os_malloc(AES_PRIV_SIZE);
   1079 	if (rk == NULL)
   1080 		return NULL;
   1081 	rijndaelKeySetupEnc(rk, key);
   1082 	return rk;
   1083 }
   1084 
   1085 
   1086 void aes_encrypt(void *ctx, const u8 *plain, u8 *crypt)
   1087 {
   1088 	rijndaelEncrypt(ctx, plain, crypt);
   1089 }
   1090 
   1091 
   1092 void aes_encrypt_deinit(void *ctx)
   1093 {
   1094 	os_memset(ctx, 0, AES_PRIV_SIZE);
   1095 	os_free(ctx);
   1096 }
   1097 #endif /* CONFIG_NO_AES_ENCRYPT */
   1098 
   1099 
   1100 #ifndef CONFIG_NO_AES_DECRYPT
   1101 void * aes_decrypt_init(const u8 *key, size_t len)
   1102 {
   1103 	u32 *rk;
   1104 	if (len != 16)
   1105 		return NULL;
   1106 	rk = os_malloc(AES_PRIV_SIZE);
   1107 	if (rk == NULL)
   1108 		return NULL;
   1109 	rijndaelKeySetupDec(rk, key);
   1110 	return rk;
   1111 }
   1112 
   1113 
   1114 void aes_decrypt(void *ctx, const u8 *crypt, u8 *plain)
   1115 {
   1116 	rijndaelDecrypt(ctx, crypt, plain);
   1117 }
   1118 
   1119 
   1120 void aes_decrypt_deinit(void *ctx)
   1121 {
   1122 	os_memset(ctx, 0, AES_PRIV_SIZE);
   1123 	os_free(ctx);
   1124 }
   1125 #endif /* CONFIG_NO_AES_DECRYPT */
   1126 
   1127 #endif /* INTERNAL_AES */
   1128