linux/crypto/aes_generic.c
<<
>>
Prefs
   1/*
   2 * Cryptographic API.
   3 *
   4 * AES Cipher Algorithm.
   5 *
   6 * Based on Brian Gladman's code.
   7 *
   8 * Linux developers:
   9 *  Alexander Kjeldaas <astor@fast.no>
  10 *  Herbert Valerio Riedel <hvr@hvrlab.org>
  11 *  Kyle McMartin <kyle@debian.org>
  12 *  Adam J. Richter <adam@yggdrasil.com> (conversion to 2.5 API).
  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 as published by
  16 * the Free Software Foundation; either version 2 of the License, or
  17 * (at your option) any later version.
  18 *
  19 * ---------------------------------------------------------------------------
  20 * Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK.
  21 * All rights reserved.
  22 *
  23 * LICENSE TERMS
  24 *
  25 * The free distribution and use of this software in both source and binary
  26 * form is allowed (with or without changes) provided that:
  27 *
  28 *   1. distributions of this source code include the above copyright
  29 *      notice, this list of conditions and the following disclaimer;
  30 *
  31 *   2. distributions in binary form include the above copyright
  32 *      notice, this list of conditions and the following disclaimer
  33 *      in the documentation and/or other associated materials;
  34 *
  35 *   3. the copyright holder's name is not used to endorse products
  36 *      built using this software without specific written permission.
  37 *
  38 * ALTERNATIVELY, provided that this notice is retained in full, this product
  39 * may be distributed under the terms of the GNU General Public License (GPL),
  40 * in which case the provisions of the GPL apply INSTEAD OF those given above.
  41 *
  42 * DISCLAIMER
  43 *
  44 * This software is provided 'as is' with no explicit or implied warranties
  45 * in respect of its properties, including, but not limited to, correctness
  46 * and/or fitness for purpose.
  47 * ---------------------------------------------------------------------------
  48 */
  49
  50#include <crypto/aes.h>
  51#include <linux/module.h>
  52#include <linux/init.h>
  53#include <linux/types.h>
  54#include <linux/errno.h>
  55#include <linux/crypto.h>
  56#include <asm/byteorder.h>
  57
  58static inline u8 byte(const u32 x, const unsigned n)
  59{
  60        return x >> (n << 3);
  61}
  62
  63static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
  64
  65const u32 crypto_ft_tab[4][256] = {
  66        {
  67                0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6,
  68                0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
  69                0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56,
  70                0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec,
  71                0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa,
  72                0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb,
  73                0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45,
  74                0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b,
  75                0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c,
  76                0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83,
  77                0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9,
  78                0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a,
  79                0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d,
  80                0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f,
  81                0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df,
  82                0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea,
  83                0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34,
  84                0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b,
  85                0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d,
  86                0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413,
  87                0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1,
  88                0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6,
  89                0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972,
  90                0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85,
  91                0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed,
  92                0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511,
  93                0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe,
  94                0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b,
  95                0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05,
  96                0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1,
  97                0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142,
  98                0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf,
  99                0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3,
 100                0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e,
 101                0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a,
 102                0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6,
 103                0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3,
 104                0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b,
 105                0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428,
 106                0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad,
 107                0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14,
 108                0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8,
 109                0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4,
 110                0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2,
 111                0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda,
 112                0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949,
 113                0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf,
 114                0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810,
 115                0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c,
 116                0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697,
 117                0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e,
 118                0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f,
 119                0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc,
 120                0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c,
 121                0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969,
 122                0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27,
 123                0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122,
 124                0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433,
 125                0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9,
 126                0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
 127                0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a,
 128                0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0,
 129                0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e,
 130                0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c,
 131        }, {
 132                0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d,
 133                0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154,
 134                0x30306050, 0x01010203, 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                0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e,
 145                0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5,
 146                0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d,
 147                0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f,
 148                0x0909121b, 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, 0x02020406, 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, 0x0c0c1814, 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, 0x0b0b161d, 0xdbdbad76,
 172                0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e,
 173                0x494992db, 0x06060c0a, 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, 0x08081018,
 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, 0x03030605, 0xf6f6f701, 0x0e0e1c12,
 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, 0x0d0d1a17,
 193                0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8,
 194                0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11,
 195                0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a,
 196        }, {
 197                0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b,
 198                0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5,
 199                0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b,
 200                0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76,
 201                0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d,
 202                0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0,
 203                0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf,
 204                0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0,
 205                0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26,
 206                0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc,
 207                0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1,
 208                0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15,
 209                0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3,
 210                0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a,
 211                0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2,
 212                0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75,
 213                0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a,
 214                0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0,
 215                0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3,
 216                0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784,
 217                0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced,
 218                0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b,
 219                0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39,
 220                0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf,
 221                0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb,
 222                0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485,
 223                0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f,
 224                0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8,
 225                0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f,
 226                0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5,
 227                0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321,
 228                0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2,
 229                0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec,
 230                0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917,
 231                0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d,
 232                0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573,
 233                0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc,
 234                0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388,
 235                0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14,
 236                0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db,
 237                0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a,
 238                0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c,
 239                0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662,
 240                0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79,
 241                0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d,
 242                0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9,
 243                0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea,
 244                0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808,
 245                0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e,
 246                0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6,
 247                0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f,
 248                0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a,
 249                0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66,
 250                0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e,
 251                0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9,
 252                0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e,
 253                0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311,
 254                0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794,
 255                0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9,
 256                0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf,
 257                0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d,
 258                0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868,
 259                0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f,
 260                0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16,
 261        }, {
 262                0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b,
 263                0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5,
 264                0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b,
 265                0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676,
 266                0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d,
 267                0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0,
 268                0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf,
 269                0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0,
 270                0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626,
 271                0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc,
 272                0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1,
 273                0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515,
 274                0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3,
 275                0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a,
 276                0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2,
 277                0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575,
 278                0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a,
 279                0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0,
 280                0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3,
 281                0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484,
 282                0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded,
 283                0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b,
 284                0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939,
 285                0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf,
 286                0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb,
 287                0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585,
 288                0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f,
 289                0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8,
 290                0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f,
 291                0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5,
 292                0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121,
 293                0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2,
 294                0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec,
 295                0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717,
 296                0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d,
 297                0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373,
 298                0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc,
 299                0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888,
 300                0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414,
 301                0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb,
 302                0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a,
 303                0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c,
 304                0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262,
 305                0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979,
 306                0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d,
 307                0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9,
 308                0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea,
 309                0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808,
 310                0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e,
 311                0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6,
 312                0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f,
 313                0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a,
 314                0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666,
 315                0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e,
 316                0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9,
 317                0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e,
 318                0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111,
 319                0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494,
 320                0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9,
 321                0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf,
 322                0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d,
 323                0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868,
 324                0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f,
 325                0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616,
 326        }
 327};
 328
 329const u32 crypto_fl_tab[4][256] = {
 330        {
 331                0x00000063, 0x0000007c, 0x00000077, 0x0000007b,
 332                0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5,
 333                0x00000030, 0x00000001, 0x00000067, 0x0000002b,
 334                0x000000fe, 0x000000d7, 0x000000ab, 0x00000076,
 335                0x000000ca, 0x00000082, 0x000000c9, 0x0000007d,
 336                0x000000fa, 0x00000059, 0x00000047, 0x000000f0,
 337                0x000000ad, 0x000000d4, 0x000000a2, 0x000000af,
 338                0x0000009c, 0x000000a4, 0x00000072, 0x000000c0,
 339                0x000000b7, 0x000000fd, 0x00000093, 0x00000026,
 340                0x00000036, 0x0000003f, 0x000000f7, 0x000000cc,
 341                0x00000034, 0x000000a5, 0x000000e5, 0x000000f1,
 342                0x00000071, 0x000000d8, 0x00000031, 0x00000015,
 343                0x00000004, 0x000000c7, 0x00000023, 0x000000c3,
 344                0x00000018, 0x00000096, 0x00000005, 0x0000009a,
 345                0x00000007, 0x00000012, 0x00000080, 0x000000e2,
 346                0x000000eb, 0x00000027, 0x000000b2, 0x00000075,
 347                0x00000009, 0x00000083, 0x0000002c, 0x0000001a,
 348                0x0000001b, 0x0000006e, 0x0000005a, 0x000000a0,
 349                0x00000052, 0x0000003b, 0x000000d6, 0x000000b3,
 350                0x00000029, 0x000000e3, 0x0000002f, 0x00000084,
 351                0x00000053, 0x000000d1, 0x00000000, 0x000000ed,
 352                0x00000020, 0x000000fc, 0x000000b1, 0x0000005b,
 353                0x0000006a, 0x000000cb, 0x000000be, 0x00000039,
 354                0x0000004a, 0x0000004c, 0x00000058, 0x000000cf,
 355                0x000000d0, 0x000000ef, 0x000000aa, 0x000000fb,
 356                0x00000043, 0x0000004d, 0x00000033, 0x00000085,
 357                0x00000045, 0x000000f9, 0x00000002, 0x0000007f,
 358                0x00000050, 0x0000003c, 0x0000009f, 0x000000a8,
 359                0x00000051, 0x000000a3, 0x00000040, 0x0000008f,
 360                0x00000092, 0x0000009d, 0x00000038, 0x000000f5,
 361                0x000000bc, 0x000000b6, 0x000000da, 0x00000021,
 362                0x00000010, 0x000000ff, 0x000000f3, 0x000000d2,
 363                0x000000cd, 0x0000000c, 0x00000013, 0x000000ec,
 364                0x0000005f, 0x00000097, 0x00000044, 0x00000017,
 365                0x000000c4, 0x000000a7, 0x0000007e, 0x0000003d,
 366                0x00000064, 0x0000005d, 0x00000019, 0x00000073,
 367                0x00000060, 0x00000081, 0x0000004f, 0x000000dc,
 368                0x00000022, 0x0000002a, 0x00000090, 0x00000088,
 369                0x00000046, 0x000000ee, 0x000000b8, 0x00000014,
 370                0x000000de, 0x0000005e, 0x0000000b, 0x000000db,
 371                0x000000e0, 0x00000032, 0x0000003a, 0x0000000a,
 372                0x00000049, 0x00000006, 0x00000024, 0x0000005c,
 373                0x000000c2, 0x000000d3, 0x000000ac, 0x00000062,
 374                0x00000091, 0x00000095, 0x000000e4, 0x00000079,
 375                0x000000e7, 0x000000c8, 0x00000037, 0x0000006d,
 376                0x0000008d, 0x000000d5, 0x0000004e, 0x000000a9,
 377                0x0000006c, 0x00000056, 0x000000f4, 0x000000ea,
 378                0x00000065, 0x0000007a, 0x000000ae, 0x00000008,
 379                0x000000ba, 0x00000078, 0x00000025, 0x0000002e,
 380                0x0000001c, 0x000000a6, 0x000000b4, 0x000000c6,
 381                0x000000e8, 0x000000dd, 0x00000074, 0x0000001f,
 382                0x0000004b, 0x000000bd, 0x0000008b, 0x0000008a,
 383                0x00000070, 0x0000003e, 0x000000b5, 0x00000066,
 384                0x00000048, 0x00000003, 0x000000f6, 0x0000000e,
 385                0x00000061, 0x00000035, 0x00000057, 0x000000b9,
 386                0x00000086, 0x000000c1, 0x0000001d, 0x0000009e,
 387                0x000000e1, 0x000000f8, 0x00000098, 0x00000011,
 388                0x00000069, 0x000000d9, 0x0000008e, 0x00000094,
 389                0x0000009b, 0x0000001e, 0x00000087, 0x000000e9,
 390                0x000000ce, 0x00000055, 0x00000028, 0x000000df,
 391                0x0000008c, 0x000000a1, 0x00000089, 0x0000000d,
 392                0x000000bf, 0x000000e6, 0x00000042, 0x00000068,
 393                0x00000041, 0x00000099, 0x0000002d, 0x0000000f,
 394                0x000000b0, 0x00000054, 0x000000bb, 0x00000016,
 395        }, {
 396                0x00006300, 0x00007c00, 0x00007700, 0x00007b00,
 397                0x0000f200, 0x00006b00, 0x00006f00, 0x0000c500,
 398                0x00003000, 0x00000100, 0x00006700, 0x00002b00,
 399                0x0000fe00, 0x0000d700, 0x0000ab00, 0x00007600,
 400                0x0000ca00, 0x00008200, 0x0000c900, 0x00007d00,
 401                0x0000fa00, 0x00005900, 0x00004700, 0x0000f000,
 402                0x0000ad00, 0x0000d400, 0x0000a200, 0x0000af00,
 403                0x00009c00, 0x0000a400, 0x00007200, 0x0000c000,
 404                0x0000b700, 0x0000fd00, 0x00009300, 0x00002600,
 405                0x00003600, 0x00003f00, 0x0000f700, 0x0000cc00,
 406                0x00003400, 0x0000a500, 0x0000e500, 0x0000f100,
 407                0x00007100, 0x0000d800, 0x00003100, 0x00001500,
 408                0x00000400, 0x0000c700, 0x00002300, 0x0000c300,
 409                0x00001800, 0x00009600, 0x00000500, 0x00009a00,
 410                0x00000700, 0x00001200, 0x00008000, 0x0000e200,
 411                0x0000eb00, 0x00002700, 0x0000b200, 0x00007500,
 412                0x00000900, 0x00008300, 0x00002c00, 0x00001a00,
 413                0x00001b00, 0x00006e00, 0x00005a00, 0x0000a000,
 414                0x00005200, 0x00003b00, 0x0000d600, 0x0000b300,
 415                0x00002900, 0x0000e300, 0x00002f00, 0x00008400,
 416                0x00005300, 0x0000d100, 0x00000000, 0x0000ed00,
 417                0x00002000, 0x0000fc00, 0x0000b100, 0x00005b00,
 418                0x00006a00, 0x0000cb00, 0x0000be00, 0x00003900,
 419                0x00004a00, 0x00004c00, 0x00005800, 0x0000cf00,
 420                0x0000d000, 0x0000ef00, 0x0000aa00, 0x0000fb00,
 421                0x00004300, 0x00004d00, 0x00003300, 0x00008500,
 422                0x00004500, 0x0000f900, 0x00000200, 0x00007f00,
 423                0x00005000, 0x00003c00, 0x00009f00, 0x0000a800,
 424                0x00005100, 0x0000a300, 0x00004000, 0x00008f00,
 425                0x00009200, 0x00009d00, 0x00003800, 0x0000f500,
 426                0x0000bc00, 0x0000b600, 0x0000da00, 0x00002100,
 427                0x00001000, 0x0000ff00, 0x0000f300, 0x0000d200,
 428                0x0000cd00, 0x00000c00, 0x00001300, 0x0000ec00,
 429                0x00005f00, 0x00009700, 0x00004400, 0x00001700,
 430                0x0000c400, 0x0000a700, 0x00007e00, 0x00003d00,
 431                0x00006400, 0x00005d00, 0x00001900, 0x00007300,
 432                0x00006000, 0x00008100, 0x00004f00, 0x0000dc00,
 433                0x00002200, 0x00002a00, 0x00009000, 0x00008800,
 434                0x00004600, 0x0000ee00, 0x0000b800, 0x00001400,
 435                0x0000de00, 0x00005e00, 0x00000b00, 0x0000db00,
 436                0x0000e000, 0x00003200, 0x00003a00, 0x00000a00,
 437                0x00004900, 0x00000600, 0x00002400, 0x00005c00,
 438                0x0000c200, 0x0000d300, 0x0000ac00, 0x00006200,
 439                0x00009100, 0x00009500, 0x0000e400, 0x00007900,
 440                0x0000e700, 0x0000c800, 0x00003700, 0x00006d00,
 441                0x00008d00, 0x0000d500, 0x00004e00, 0x0000a900,
 442                0x00006c00, 0x00005600, 0x0000f400, 0x0000ea00,
 443                0x00006500, 0x00007a00, 0x0000ae00, 0x00000800,
 444                0x0000ba00, 0x00007800, 0x00002500, 0x00002e00,
 445                0x00001c00, 0x0000a600, 0x0000b400, 0x0000c600,
 446                0x0000e800, 0x0000dd00, 0x00007400, 0x00001f00,
 447                0x00004b00, 0x0000bd00, 0x00008b00, 0x00008a00,
 448                0x00007000, 0x00003e00, 0x0000b500, 0x00006600,
 449                0x00004800, 0x00000300, 0x0000f600, 0x00000e00,
 450                0x00006100, 0x00003500, 0x00005700, 0x0000b900,
 451                0x00008600, 0x0000c100, 0x00001d00, 0x00009e00,
 452                0x0000e100, 0x0000f800, 0x00009800, 0x00001100,
 453                0x00006900, 0x0000d900, 0x00008e00, 0x00009400,
 454                0x00009b00, 0x00001e00, 0x00008700, 0x0000e900,
 455                0x0000ce00, 0x00005500, 0x00002800, 0x0000df00,
 456                0x00008c00, 0x0000a100, 0x00008900, 0x00000d00,
 457                0x0000bf00, 0x0000e600, 0x00004200, 0x00006800,
 458                0x00004100, 0x00009900, 0x00002d00, 0x00000f00,
 459                0x0000b000, 0x00005400, 0x0000bb00, 0x00001600,
 460        }, {
 461                0x00630000, 0x007c0000, 0x00770000, 0x007b0000,
 462                0x00f20000, 0x006b0000, 0x006f0000, 0x00c50000,
 463                0x00300000, 0x00010000, 0x00670000, 0x002b0000,
 464                0x00fe0000, 0x00d70000, 0x00ab0000, 0x00760000,
 465                0x00ca0000, 0x00820000, 0x00c90000, 0x007d0000,
 466                0x00fa0000, 0x00590000, 0x00470000, 0x00f00000,
 467                0x00ad0000, 0x00d40000, 0x00a20000, 0x00af0000,
 468                0x009c0000, 0x00a40000, 0x00720000, 0x00c00000,
 469                0x00b70000, 0x00fd0000, 0x00930000, 0x00260000,
 470                0x00360000, 0x003f0000, 0x00f70000, 0x00cc0000,
 471                0x00340000, 0x00a50000, 0x00e50000, 0x00f10000,
 472                0x00710000, 0x00d80000, 0x00310000, 0x00150000,
 473                0x00040000, 0x00c70000, 0x00230000, 0x00c30000,
 474                0x00180000, 0x00960000, 0x00050000, 0x009a0000,
 475                0x00070000, 0x00120000, 0x00800000, 0x00e20000,
 476                0x00eb0000, 0x00270000, 0x00b20000, 0x00750000,
 477                0x00090000, 0x00830000, 0x002c0000, 0x001a0000,
 478                0x001b0000, 0x006e0000, 0x005a0000, 0x00a00000,
 479                0x00520000, 0x003b0000, 0x00d60000, 0x00b30000,
 480                0x00290000, 0x00e30000, 0x002f0000, 0x00840000,
 481                0x00530000, 0x00d10000, 0x00000000, 0x00ed0000,
 482                0x00200000, 0x00fc0000, 0x00b10000, 0x005b0000,
 483                0x006a0000, 0x00cb0000, 0x00be0000, 0x00390000,
 484                0x004a0000, 0x004c0000, 0x00580000, 0x00cf0000,
 485                0x00d00000, 0x00ef0000, 0x00aa0000, 0x00fb0000,
 486                0x00430000, 0x004d0000, 0x00330000, 0x00850000,
 487                0x00450000, 0x00f90000, 0x00020000, 0x007f0000,
 488                0x00500000, 0x003c0000, 0x009f0000, 0x00a80000,
 489                0x00510000, 0x00a30000, 0x00400000, 0x008f0000,
 490                0x00920000, 0x009d0000, 0x00380000, 0x00f50000,
 491                0x00bc0000, 0x00b60000, 0x00da0000, 0x00210000,
 492                0x00100000, 0x00ff0000, 0x00f30000, 0x00d20000,
 493                0x00cd0000, 0x000c0000, 0x00130000, 0x00ec0000,
 494                0x005f0000, 0x00970000, 0x00440000, 0x00170000,
 495                0x00c40000, 0x00a70000, 0x007e0000, 0x003d0000,
 496                0x00640000, 0x005d0000, 0x00190000, 0x00730000,
 497                0x00600000, 0x00810000, 0x004f0000, 0x00dc0000,
 498                0x00220000, 0x002a0000, 0x00900000, 0x00880000,
 499                0x00460000, 0x00ee0000, 0x00b80000, 0x00140000,
 500                0x00de0000, 0x005e0000, 0x000b0000, 0x00db0000,
 501                0x00e00000, 0x00320000, 0x003a0000, 0x000a0000,
 502                0x00490000, 0x00060000, 0x00240000, 0x005c0000,
 503                0x00c20000, 0x00d30000, 0x00ac0000, 0x00620000,
 504                0x00910000, 0x00950000, 0x00e40000, 0x00790000,
 505                0x00e70000, 0x00c80000, 0x00370000, 0x006d0000,
 506                0x008d0000, 0x00d50000, 0x004e0000, 0x00a90000,
 507                0x006c0000, 0x00560000, 0x00f40000, 0x00ea0000,
 508                0x00650000, 0x007a0000, 0x00ae0000, 0x00080000,
 509                0x00ba0000, 0x00780000, 0x00250000, 0x002e0000,
 510                0x001c0000, 0x00a60000, 0x00b40000, 0x00c60000,
 511                0x00e80000, 0x00dd0000, 0x00740000, 0x001f0000,
 512                0x004b0000, 0x00bd0000, 0x008b0000, 0x008a0000,
 513                0x00700000, 0x003e0000, 0x00b50000, 0x00660000,
 514                0x00480000, 0x00030000, 0x00f60000, 0x000e0000,
 515                0x00610000, 0x00350000, 0x00570000, 0x00b90000,
 516                0x00860000, 0x00c10000, 0x001d0000, 0x009e0000,
 517                0x00e10000, 0x00f80000, 0x00980000, 0x00110000,
 518                0x00690000, 0x00d90000, 0x008e0000, 0x00940000,
 519                0x009b0000, 0x001e0000, 0x00870000, 0x00e90000,
 520                0x00ce0000, 0x00550000, 0x00280000, 0x00df0000,
 521                0x008c0000, 0x00a10000, 0x00890000, 0x000d0000,
 522                0x00bf0000, 0x00e60000, 0x00420000, 0x00680000,
 523                0x00410000, 0x00990000, 0x002d0000, 0x000f0000,
 524                0x00b00000, 0x00540000, 0x00bb0000, 0x00160000,
 525        }, {
 526                0x63000000, 0x7c000000, 0x77000000, 0x7b000000,
 527                0xf2000000, 0x6b000000, 0x6f000000, 0xc5000000,
 528                0x30000000, 0x01000000, 0x67000000, 0x2b000000,
 529                0xfe000000, 0xd7000000, 0xab000000, 0x76000000,
 530                0xca000000, 0x82000000, 0xc9000000, 0x7d000000,
 531                0xfa000000, 0x59000000, 0x47000000, 0xf0000000,
 532                0xad000000, 0xd4000000, 0xa2000000, 0xaf000000,
 533                0x9c000000, 0xa4000000, 0x72000000, 0xc0000000,
 534                0xb7000000, 0xfd000000, 0x93000000, 0x26000000,
 535                0x36000000, 0x3f000000, 0xf7000000, 0xcc000000,
 536                0x34000000, 0xa5000000, 0xe5000000, 0xf1000000,
 537                0x71000000, 0xd8000000, 0x31000000, 0x15000000,
 538                0x04000000, 0xc7000000, 0x23000000, 0xc3000000,
 539                0x18000000, 0x96000000, 0x05000000, 0x9a000000,
 540                0x07000000, 0x12000000, 0x80000000, 0xe2000000,
 541                0xeb000000, 0x27000000, 0xb2000000, 0x75000000,
 542                0x09000000, 0x83000000, 0x2c000000, 0x1a000000,
 543                0x1b000000, 0x6e000000, 0x5a000000, 0xa0000000,
 544                0x52000000, 0x3b000000, 0xd6000000, 0xb3000000,
 545                0x29000000, 0xe3000000, 0x2f000000, 0x84000000,
 546                0x53000000, 0xd1000000, 0x00000000, 0xed000000,
 547                0x20000000, 0xfc000000, 0xb1000000, 0x5b000000,
 548                0x6a000000, 0xcb000000, 0xbe000000, 0x39000000,
 549                0x4a000000, 0x4c000000, 0x58000000, 0xcf000000,
 550                0xd0000000, 0xef000000, 0xaa000000, 0xfb000000,
 551                0x43000000, 0x4d000000, 0x33000000, 0x85000000,
 552                0x45000000, 0xf9000000, 0x02000000, 0x7f000000,
 553                0x50000000, 0x3c000000, 0x9f000000, 0xa8000000,
 554                0x51000000, 0xa3000000, 0x40000000, 0x8f000000,
 555                0x92000000, 0x9d000000, 0x38000000, 0xf5000000,
 556                0xbc000000, 0xb6000000, 0xda000000, 0x21000000,
 557                0x10000000, 0xff000000, 0xf3000000, 0xd2000000,
 558                0xcd000000, 0x0c000000, 0x13000000, 0xec000000,
 559                0x5f000000, 0x97000000, 0x44000000, 0x17000000,
 560                0xc4000000, 0xa7000000, 0x7e000000, 0x3d000000,
 561                0x64000000, 0x5d000000, 0x19000000, 0x73000000,
 562                0x60000000, 0x81000000, 0x4f000000, 0xdc000000,
 563                0x22000000, 0x2a000000, 0x90000000, 0x88000000,
 564                0x46000000, 0xee000000, 0xb8000000, 0x14000000,
 565                0xde000000, 0x5e000000, 0x0b000000, 0xdb000000,
 566                0xe0000000, 0x32000000, 0x3a000000, 0x0a000000,
 567                0x49000000, 0x06000000, 0x24000000, 0x5c000000,
 568                0xc2000000, 0xd3000000, 0xac000000, 0x62000000,
 569                0x91000000, 0x95000000, 0xe4000000, 0x79000000,
 570                0xe7000000, 0xc8000000, 0x37000000, 0x6d000000,
 571                0x8d000000, 0xd5000000, 0x4e000000, 0xa9000000,
 572                0x6c000000, 0x56000000, 0xf4000000, 0xea000000,
 573                0x65000000, 0x7a000000, 0xae000000, 0x08000000,
 574                0xba000000, 0x78000000, 0x25000000, 0x2e000000,
 575                0x1c000000, 0xa6000000, 0xb4000000, 0xc6000000,
 576                0xe8000000, 0xdd000000, 0x74000000, 0x1f000000,
 577                0x4b000000, 0xbd000000, 0x8b000000, 0x8a000000,
 578                0x70000000, 0x3e000000, 0xb5000000, 0x66000000,
 579                0x48000000, 0x03000000, 0xf6000000, 0x0e000000,
 580                0x61000000, 0x35000000, 0x57000000, 0xb9000000,
 581                0x86000000, 0xc1000000, 0x1d000000, 0x9e000000,
 582                0xe1000000, 0xf8000000, 0x98000000, 0x11000000,
 583                0x69000000, 0xd9000000, 0x8e000000, 0x94000000,
 584                0x9b000000, 0x1e000000, 0x87000000, 0xe9000000,
 585                0xce000000, 0x55000000, 0x28000000, 0xdf000000,
 586                0x8c000000, 0xa1000000, 0x89000000, 0x0d000000,
 587                0xbf000000, 0xe6000000, 0x42000000, 0x68000000,
 588                0x41000000, 0x99000000, 0x2d000000, 0x0f000000,
 589                0xb0000000, 0x54000000, 0xbb000000, 0x16000000,
 590        }
 591};
 592
 593const u32 crypto_it_tab[4][256] = {
 594        {
 595                0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a,
 596                0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
 597                0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5,
 598                0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5,
 599                0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d,
 600                0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b,
 601                0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295,
 602                0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e,
 603                0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927,
 604                0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d,
 605                0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362,
 606                0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9,
 607                0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52,
 608                0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566,
 609                0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3,
 610                0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed,
 611                0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e,
 612                0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4,
 613                0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4,
 614                0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd,
 615                0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d,
 616                0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060,
 617                0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967,
 618                0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879,
 619                0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000,
 620                0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c,
 621                0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36,
 622                0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624,
 623                0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b,
 624                0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c,
 625                0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12,
 626                0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14,
 627                0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3,
 628                0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b,
 629                0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8,
 630                0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684,
 631                0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7,
 632                0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177,
 633                0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947,
 634                0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322,
 635                0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498,
 636                0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f,
 637                0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54,
 638                0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382,
 639                0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf,
 640                0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb,
 641                0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83,
 642                0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef,
 643                0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029,
 644                0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235,
 645                0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733,
 646                0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117,
 647                0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4,
 648                0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546,
 649                0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb,
 650                0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d,
 651                0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb,
 652                0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a,
 653                0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773,
 654                0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
 655                0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2,
 656                0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff,
 657                0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664,
 658                0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0,
 659        }, {
 660                0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96,
 661                0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x03e34b93,
 662                0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525,
 663                0xd7e54ffc, 0xcb2ac5d7, 0x44352680, 0xa362b58f,
 664                0x5ab1de49, 0x1bba2567, 0x0eea4598, 0xc0fe5de1,
 665                0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6,
 666                0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da,
 667                0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44,
 668                0x89c2756a, 0x798ef478, 0x3e58996b, 0x71b927dd,
 669                0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4,
 670                0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245,
 671                0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994,
 672                0x68487058, 0xfd458f19, 0x6cde9487, 0xf87b52b7,
 673                0xd373ab23, 0x024b72e2, 0x8f1fe357, 0xab55662a,
 674                0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x0837d3a5,
 675                0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c,
 676                0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1,
 677                0xf4da65cd, 0xbe0506d5, 0x6234d11f, 0xfea6c48a,
 678                0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475,
 679                0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51,
 680                0x8a213ef9, 0x06dd963d, 0x053eddae, 0xbde64d46,
 681                0x8d5491b5, 0x5dc47105, 0xd406046f, 0x155060ff,
 682                0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777,
 683                0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db,
 684                0x0a7ca147, 0x0f427ce9, 0x1e84f8c9, 0x00000000,
 685                0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e,
 686                0xff0efdfb, 0x38850f56, 0xd5ae3d1e, 0x392d3627,
 687                0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a,
 688                0x670a0cb1, 0xe757930f, 0x96eeb4d2, 0x919b1b9e,
 689                0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16,
 690                0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d,
 691                0x0d090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8,
 692                0x19f15785, 0x0775af4c, 0xdd99eebb, 0x607fa3fd,
 693                0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34,
 694                0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863,
 695                0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420,
 696                0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d,
 697                0x2f9e1d4b, 0x30b2dcf3, 0x52860dec, 0xe3c177d0,
 698                0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722,
 699                0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef,
 700                0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0x0bd49836,
 701                0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4,
 702                0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462,
 703                0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5,
 704                0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3,
 705                0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b,
 706                0x7826cd09, 0x18596ef4, 0xb79aec01, 0x9a4f83a8,
 707                0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6,
 708                0x9be7bad9, 0x366f4ace, 0x099fead4, 0x7cb029d6,
 709                0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0,
 710                0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315,
 711                0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f,
 712                0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x0496e4df,
 713                0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, 0x5165467f,
 714                0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e,
 715                0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13,
 716                0x61d79a8c, 0x0ca1377a, 0x14f8598e, 0x3c13eb89,
 717                0x27a9ceee, 0xc961b735, 0xe51ce1ed, 0xb1477a3c,
 718                0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf,
 719                0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886,
 720                0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f,
 721                0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41,
 722                0x01a83971, 0xb30c08de, 0xe4b4d89c, 0xc1566490,
 723                0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042,
 724        }, {
 725                0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e,
 726                0xab3bcb6b, 0x9d1ff145, 0xfaacab58, 0xe34b9303,
 727                0x302055fa, 0x76adf66d, 0xcc889176, 0x02f5254c,
 728                0xe54ffcd7, 0x2ac5d7cb, 0x35268044, 0x62b58fa3,
 729                0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0,
 730                0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9,
 731                0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59,
 732                0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8,
 733                0xc2756a89, 0x8ef47879, 0x58996b3e, 0xb927dd71,
 734                0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a,
 735                0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f,
 736                0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x08f9942b,
 737                0x48705868, 0x458f19fd, 0xde94876c, 0x7b52b7f8,
 738                0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab,
 739                0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508,
 740                0x2830f287, 0xbf23b2a5, 0x0302ba6a, 0x16ed5c82,
 741                0xcf8a2b1c, 0x79a792b4, 0x07f3f0f2, 0x694ea1e2,
 742                0xda65cdf4, 0x0506d5be, 0x34d11f62, 0xa6c48afe,
 743                0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb,
 744                0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110,
 745                0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd,
 746                0x5491b58d, 0xc471055d, 0x06046fd4, 0x5060ff15,
 747                0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e,
 748                0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee,
 749                0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x00000000,
 750                0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72,
 751                0x0efdfbff, 0x850f5638, 0xae3d1ed5, 0x2d362739,
 752                0x0f0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e,
 753                0x0a0cb167, 0x57930fe7, 0xeeb4d296, 0x9b1b9e91,
 754                0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a,
 755                0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17,
 756                0x090e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9,
 757                0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60,
 758                0x01f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e,
 759                0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1,
 760                0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011,
 761                0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1,
 762                0x9e1d4b2f, 0xb2dcf330, 0x860dec52, 0xc177d0e3,
 763                0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264,
 764                0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90,
 765                0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b,
 766                0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf,
 767                0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246,
 768                0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af,
 769                0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312,
 770                0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb,
 771                0x26cd0978, 0x596ef418, 0x9aec01b7, 0x4f83a89a,
 772                0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8,
 773                0xe7bad99b, 0x6f4ace36, 0x9fead409, 0xb029d67c,
 774                0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066,
 775                0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8,
 776                0x04f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6,
 777                0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04,
 778                0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, 0x65467f51,
 779                0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0x0bfb2e41,
 780                0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347,
 781                0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c,
 782                0xa9ceee27, 0x61b735c9, 0x1ce1ede5, 0x477a3cb1,
 783                0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37,
 784                0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db,
 785                0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40,
 786                0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0x0dff4195,
 787                0xa8397101, 0x0c08deb3, 0xb4d89ce4, 0x566490c1,
 788                0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257,
 789        }, {
 790                0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27,
 791                0x3bcb6bab, 0x1ff1459d, 0xacab58fa, 0x4b9303e3,
 792                0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02,
 793                0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362,
 794                0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe,
 795                0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3,
 796                0x03e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952,
 797                0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9,
 798                0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9,
 799                0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace,
 800                0x63184adf, 0xe582311a, 0x97603351, 0x62457f53,
 801                0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08,
 802                0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b,
 803                0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55,
 804                0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837,
 805                0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216,
 806                0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269,
 807                0x65cdf4da, 0x06d5be05, 0xd11f6234, 0xc48afea6,
 808                0x349d532e, 0xa2a055f3, 0x0532e18a, 0xa475ebf6,
 809                0x0b39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e,
 810                0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6,
 811                0x91b58d54, 0x71055dc4, 0x046fd406, 0x60ff1550,
 812                0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9,
 813                0xb0bd42e8, 0x07888b89, 0xe7385b19, 0x79dbeec8,
 814                0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000,
 815                0x09838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a,
 816                0xfdfbff0e, 0x0f563885, 0x3d1ed5ae, 0x3627392d,
 817                0x0a64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36,
 818                0x0cb1670a, 0x930fe757, 0xb4d296ee, 0x1b9e919b,
 819                0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12,
 820                0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b,
 821                0x0e0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e,
 822                0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f,
 823                0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb,
 824                0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4,
 825                0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6,
 826                0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129,
 827                0x1d4b2f9e, 0xdcf330b2, 0x0dec5286, 0x77d0e3c1,
 828                0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9,
 829                0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033,
 830                0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4,
 831                0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad,
 832                0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e,
 833                0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3,
 834                0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225,
 835                0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b,
 836                0xcd097826, 0x6ef41859, 0xec01b79a, 0x83a89a4f,
 837                0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815,
 838                0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0,
 839                0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2,
 840                0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7,
 841                0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691,
 842                0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496,
 843                0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165,
 844                0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b,
 845                0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6,
 846                0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13,
 847                0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147,
 848                0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7,
 849                0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
 850                0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3,
 851                0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d,
 852                0x397101a8, 0x08deb30c, 0xd89ce4b4, 0x6490c156,
 853                0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8,
 854        }
 855};
 856
 857const u32 crypto_il_tab[4][256] = {
 858        {
 859                0x00000052, 0x00000009, 0x0000006a, 0x000000d5,
 860                0x00000030, 0x00000036, 0x000000a5, 0x00000038,
 861                0x000000bf, 0x00000040, 0x000000a3, 0x0000009e,
 862                0x00000081, 0x000000f3, 0x000000d7, 0x000000fb,
 863                0x0000007c, 0x000000e3, 0x00000039, 0x00000082,
 864                0x0000009b, 0x0000002f, 0x000000ff, 0x00000087,
 865                0x00000034, 0x0000008e, 0x00000043, 0x00000044,
 866                0x000000c4, 0x000000de, 0x000000e9, 0x000000cb,
 867                0x00000054, 0x0000007b, 0x00000094, 0x00000032,
 868                0x000000a6, 0x000000c2, 0x00000023, 0x0000003d,
 869                0x000000ee, 0x0000004c, 0x00000095, 0x0000000b,
 870                0x00000042, 0x000000fa, 0x000000c3, 0x0000004e,
 871                0x00000008, 0x0000002e, 0x000000a1, 0x00000066,
 872                0x00000028, 0x000000d9, 0x00000024, 0x000000b2,
 873                0x00000076, 0x0000005b, 0x000000a2, 0x00000049,
 874                0x0000006d, 0x0000008b, 0x000000d1, 0x00000025,
 875                0x00000072, 0x000000f8, 0x000000f6, 0x00000064,
 876                0x00000086, 0x00000068, 0x00000098, 0x00000016,
 877                0x000000d4, 0x000000a4, 0x0000005c, 0x000000cc,
 878                0x0000005d, 0x00000065, 0x000000b6, 0x00000092,
 879                0x0000006c, 0x00000070, 0x00000048, 0x00000050,
 880                0x000000fd, 0x000000ed, 0x000000b9, 0x000000da,
 881                0x0000005e, 0x00000015, 0x00000046, 0x00000057,
 882                0x000000a7, 0x0000008d, 0x0000009d, 0x00000084,
 883                0x00000090, 0x000000d8, 0x000000ab, 0x00000000,
 884                0x0000008c, 0x000000bc, 0x000000d3, 0x0000000a,
 885                0x000000f7, 0x000000e4, 0x00000058, 0x00000005,
 886                0x000000b8, 0x000000b3, 0x00000045, 0x00000006,
 887                0x000000d0, 0x0000002c, 0x0000001e, 0x0000008f,
 888                0x000000ca, 0x0000003f, 0x0000000f, 0x00000002,
 889                0x000000c1, 0x000000af, 0x000000bd, 0x00000003,
 890                0x00000001, 0x00000013, 0x0000008a, 0x0000006b,
 891                0x0000003a, 0x00000091, 0x00000011, 0x00000041,
 892                0x0000004f, 0x00000067, 0x000000dc, 0x000000ea,
 893                0x00000097, 0x000000f2, 0x000000cf, 0x000000ce,
 894                0x000000f0, 0x000000b4, 0x000000e6, 0x00000073,
 895                0x00000096, 0x000000ac, 0x00000074, 0x00000022,
 896                0x000000e7, 0x000000ad, 0x00000035, 0x00000085,
 897                0x000000e2, 0x000000f9, 0x00000037, 0x000000e8,
 898                0x0000001c, 0x00000075, 0x000000df, 0x0000006e,
 899                0x00000047, 0x000000f1, 0x0000001a, 0x00000071,
 900                0x0000001d, 0x00000029, 0x000000c5, 0x00000089,
 901                0x0000006f, 0x000000b7, 0x00000062, 0x0000000e,
 902                0x000000aa, 0x00000018, 0x000000be, 0x0000001b,
 903                0x000000fc, 0x00000056, 0x0000003e, 0x0000004b,
 904                0x000000c6, 0x000000d2, 0x00000079, 0x00000020,
 905                0x0000009a, 0x000000db, 0x000000c0, 0x000000fe,
 906                0x00000078, 0x000000cd, 0x0000005a, 0x000000f4,
 907                0x0000001f, 0x000000dd, 0x000000a8, 0x00000033,
 908                0x00000088, 0x00000007, 0x000000c7, 0x00000031,
 909                0x000000b1, 0x00000012, 0x00000010, 0x00000059,
 910                0x00000027, 0x00000080, 0x000000ec, 0x0000005f,
 911                0x00000060, 0x00000051, 0x0000007f, 0x000000a9,
 912                0x00000019, 0x000000b5, 0x0000004a, 0x0000000d,
 913                0x0000002d, 0x000000e5, 0x0000007a, 0x0000009f,
 914                0x00000093, 0x000000c9, 0x0000009c, 0x000000ef,
 915                0x000000a0, 0x000000e0, 0x0000003b, 0x0000004d,
 916                0x000000ae, 0x0000002a, 0x000000f5, 0x000000b0,
 917                0x000000c8, 0x000000eb, 0x000000bb, 0x0000003c,
 918                0x00000083, 0x00000053, 0x00000099, 0x00000061,
 919                0x00000017, 0x0000002b, 0x00000004, 0x0000007e,
 920                0x000000ba, 0x00000077, 0x000000d6, 0x00000026,
 921                0x000000e1, 0x00000069, 0x00000014, 0x00000063,
 922                0x00000055, 0x00000021, 0x0000000c, 0x0000007d,
 923        }, {
 924                0x00005200, 0x00000900, 0x00006a00, 0x0000d500,
 925                0x00003000, 0x00003600, 0x0000a500, 0x00003800,
 926                0x0000bf00, 0x00004000, 0x0000a300, 0x00009e00,
 927                0x00008100, 0x0000f300, 0x0000d700, 0x0000fb00,
 928                0x00007c00, 0x0000e300, 0x00003900, 0x00008200,
 929                0x00009b00, 0x00002f00, 0x0000ff00, 0x00008700,
 930                0x00003400, 0x00008e00, 0x00004300, 0x00004400,
 931                0x0000c400, 0x0000de00, 0x0000e900, 0x0000cb00,
 932                0x00005400, 0x00007b00, 0x00009400, 0x00003200,
 933                0x0000a600, 0x0000c200, 0x00002300, 0x00003d00,
 934                0x0000ee00, 0x00004c00, 0x00009500, 0x00000b00,
 935                0x00004200, 0x0000fa00, 0x0000c300, 0x00004e00,
 936                0x00000800, 0x00002e00, 0x0000a100, 0x00006600,
 937                0x00002800, 0x0000d900, 0x00002400, 0x0000b200,
 938                0x00007600, 0x00005b00, 0x0000a200, 0x00004900,
 939                0x00006d00, 0x00008b00, 0x0000d100, 0x00002500,
 940                0x00007200, 0x0000f800, 0x0000f600, 0x00006400,
 941                0x00008600, 0x00006800, 0x00009800, 0x00001600,
 942                0x0000d400, 0x0000a400, 0x00005c00, 0x0000cc00,
 943                0x00005d00, 0x00006500, 0x0000b600, 0x00009200,
 944                0x00006c00, 0x00007000, 0x00004800, 0x00005000,
 945                0x0000fd00, 0x0000ed00, 0x0000b900, 0x0000da00,
 946                0x00005e00, 0x00001500, 0x00004600, 0x00005700,
 947                0x0000a700, 0x00008d00, 0x00009d00, 0x00008400,
 948                0x00009000, 0x0000d800, 0x0000ab00, 0x00000000,
 949                0x00008c00, 0x0000bc00, 0x0000d300, 0x00000a00,
 950                0x0000f700, 0x0000e400, 0x00005800, 0x00000500,
 951                0x0000b800, 0x0000b300, 0x00004500, 0x00000600,
 952                0x0000d000, 0x00002c00, 0x00001e00, 0x00008f00,
 953                0x0000ca00, 0x00003f00, 0x00000f00, 0x00000200,
 954                0x0000c100, 0x0000af00, 0x0000bd00, 0x00000300,
 955                0x00000100, 0x00001300, 0x00008a00, 0x00006b00,
 956                0x00003a00, 0x00009100, 0x00001100, 0x00004100,
 957                0x00004f00, 0x00006700, 0x0000dc00, 0x0000ea00,
 958                0x00009700, 0x0000f200, 0x0000cf00, 0x0000ce00,
 959                0x0000f000, 0x0000b400, 0x0000e600, 0x00007300,
 960                0x00009600, 0x0000ac00, 0x00007400, 0x00002200,
 961                0x0000e700, 0x0000ad00, 0x00003500, 0x00008500,
 962                0x0000e200, 0x0000f900, 0x00003700, 0x0000e800,
 963                0x00001c00, 0x00007500, 0x0000df00, 0x00006e00,
 964                0x00004700, 0x0000f100, 0x00001a00, 0x00007100,
 965                0x00001d00, 0x00002900, 0x0000c500, 0x00008900,
 966                0x00006f00, 0x0000b700, 0x00006200, 0x00000e00,
 967                0x0000aa00, 0x00001800, 0x0000be00, 0x00001b00,
 968                0x0000fc00, 0x00005600, 0x00003e00, 0x00004b00,
 969                0x0000c600, 0x0000d200, 0x00007900, 0x00002000,
 970                0x00009a00, 0x0000db00, 0x0000c000, 0x0000fe00,
 971                0x00007800, 0x0000cd00, 0x00005a00, 0x0000f400,
 972                0x00001f00, 0x0000dd00, 0x0000a800, 0x00003300,
 973                0x00008800, 0x00000700, 0x0000c700, 0x00003100,
 974                0x0000b100, 0x00001200, 0x00001000, 0x00005900,
 975                0x00002700, 0x00008000, 0x0000ec00, 0x00005f00,
 976                0x00006000, 0x00005100, 0x00007f00, 0x0000a900,
 977                0x00001900, 0x0000b500, 0x00004a00, 0x00000d00,
 978                0x00002d00, 0x0000e500, 0x00007a00, 0x00009f00,
 979                0x00009300, 0x0000c900, 0x00009c00, 0x0000ef00,
 980                0x0000a000, 0x0000e000, 0x00003b00, 0x00004d00,
 981                0x0000ae00, 0x00002a00, 0x0000f500, 0x0000b000,
 982                0x0000c800, 0x0000eb00, 0x0000bb00, 0x00003c00,
 983                0x00008300, 0x00005300, 0x00009900, 0x00006100,
 984                0x00001700, 0x00002b00, 0x00000400, 0x00007e00,
 985                0x0000ba00, 0x00007700, 0x0000d600, 0x00002600,
 986                0x0000e100, 0x00006900, 0x00001400, 0x00006300,
 987                0x00005500, 0x00002100, 0x00000c00, 0x00007d00,
 988        }, {
 989                0x00520000, 0x00090000, 0x006a0000, 0x00d50000,
 990                0x00300000, 0x00360000, 0x00a50000, 0x00380000,
 991                0x00bf0000, 0x00400000, 0x00a30000, 0x009e0000,
 992                0x00810000, 0x00f30000, 0x00d70000, 0x00fb0000,
 993                0x007c0000, 0x00e30000, 0x00390000, 0x00820000,
 994                0x009b0000, 0x002f0000, 0x00ff0000, 0x00870000,
 995                0x00340000, 0x008e0000, 0x00430000, 0x00440000,
 996                0x00c40000, 0x00de0000, 0x00e90000, 0x00cb0000,
 997                0x00540000, 0x007b0000, 0x00940000, 0x00320000,
 998                0x00a60000, 0x00c20000, 0x00230000, 0x003d0000,
 999                0x00ee0000, 0x004c0000, 0x00950000, 0x000b0000,
1000                0x00420000, 0x00fa0000, 0x00c30000, 0x004e0000,
1001                0x00080000, 0x002e0000, 0x00a10000, 0x00660000,
1002                0x00280000, 0x00d90000, 0x00240000, 0x00b20000,
1003                0x00760000, 0x005b0000, 0x00a20000, 0x00490000,
1004                0x006d0000, 0x008b0000, 0x00d10000, 0x00250000,
1005                0x00720000, 0x00f80000, 0x00f60000, 0x00640000,
1006                0x00860000, 0x00680000, 0x00980000, 0x00160000,
1007                0x00d40000, 0x00a40000, 0x005c0000, 0x00cc0000,
1008                0x005d0000, 0x00650000, 0x00b60000, 0x00920000,
1009                0x006c0000, 0x00700000, 0x00480000, 0x00500000,
1010                0x00fd0000, 0x00ed0000, 0x00b90000, 0x00da0000,
1011                0x005e0000, 0x00150000, 0x00460000, 0x00570000,
1012                0x00a70000, 0x008d0000, 0x009d0000, 0x00840000,
1013                0x00900000, 0x00d80000, 0x00ab0000, 0x00000000,
1014                0x008c0000, 0x00bc0000, 0x00d30000, 0x000a0000,
1015                0x00f70000, 0x00e40000, 0x00580000, 0x00050000,
1016                0x00b80000, 0x00b30000, 0x00450000, 0x00060000,
1017                0x00d00000, 0x002c0000, 0x001e0000, 0x008f0000,
1018                0x00ca0000, 0x003f0000, 0x000f0000, 0x00020000,
1019                0x00c10000, 0x00af0000, 0x00bd0000, 0x00030000,
1020                0x00010000, 0x00130000, 0x008a0000, 0x006b0000,
1021                0x003a0000, 0x00910000, 0x00110000, 0x00410000,
1022                0x004f0000, 0x00670000, 0x00dc0000, 0x00ea0000,
1023                0x00970000, 0x00f20000, 0x00cf0000, 0x00ce0000,
1024                0x00f00000, 0x00b40000, 0x00e60000, 0x00730000,
1025                0x00960000, 0x00ac0000, 0x00740000, 0x00220000,
1026                0x00e70000, 0x00ad0000, 0x00350000, 0x00850000,
1027                0x00e20000, 0x00f90000, 0x00370000, 0x00e80000,
1028                0x001c0000, 0x00750000, 0x00df0000, 0x006e0000,
1029                0x00470000, 0x00f10000, 0x001a0000, 0x00710000,
1030                0x001d0000, 0x00290000, 0x00c50000, 0x00890000,
1031                0x006f0000, 0x00b70000, 0x00620000, 0x000e0000,
1032                0x00aa0000, 0x00180000, 0x00be0000, 0x001b0000,
1033                0x00fc0000, 0x00560000, 0x003e0000, 0x004b0000,
1034                0x00c60000, 0x00d20000, 0x00790000, 0x00200000,
1035                0x009a0000, 0x00db0000, 0x00c00000, 0x00fe0000,
1036                0x00780000, 0x00cd0000, 0x005a0000, 0x00f40000,
1037                0x001f0000, 0x00dd0000, 0x00a80000, 0x00330000,
1038                0x00880000, 0x00070000, 0x00c70000, 0x00310000,
1039                0x00b10000, 0x00120000, 0x00100000, 0x00590000,
1040                0x00270000, 0x00800000, 0x00ec0000, 0x005f0000,
1041                0x00600000, 0x00510000, 0x007f0000, 0x00a90000,
1042                0x00190000, 0x00b50000, 0x004a0000, 0x000d0000,
1043                0x002d0000, 0x00e50000, 0x007a0000, 0x009f0000,
1044                0x00930000, 0x00c90000, 0x009c0000, 0x00ef0000,
1045                0x00a00000, 0x00e00000, 0x003b0000, 0x004d0000,
1046                0x00ae0000, 0x002a0000, 0x00f50000, 0x00b00000,
1047                0x00c80000, 0x00eb0000, 0x00bb0000, 0x003c0000,
1048                0x00830000, 0x00530000, 0x00990000, 0x00610000,
1049                0x00170000, 0x002b0000, 0x00040000, 0x007e0000,
1050                0x00ba0000, 0x00770000, 0x00d60000, 0x00260000,
1051                0x00e10000, 0x00690000, 0x00140000, 0x00630000,
1052                0x00550000, 0x00210000, 0x000c0000, 0x007d0000,
1053        }, {
1054                0x52000000, 0x09000000, 0x6a000000, 0xd5000000,
1055                0x30000000, 0x36000000, 0xa5000000, 0x38000000,
1056                0xbf000000, 0x40000000, 0xa3000000, 0x9e000000,
1057                0x81000000, 0xf3000000, 0xd7000000, 0xfb000000,
1058                0x7c000000, 0xe3000000, 0x39000000, 0x82000000,
1059                0x9b000000, 0x2f000000, 0xff000000, 0x87000000,
1060                0x34000000, 0x8e000000, 0x43000000, 0x44000000,
1061                0xc4000000, 0xde000000, 0xe9000000, 0xcb000000,
1062                0x54000000, 0x7b000000, 0x94000000, 0x32000000,
1063                0xa6000000, 0xc2000000, 0x23000000, 0x3d000000,
1064                0xee000000, 0x4c000000, 0x95000000, 0x0b000000,
1065                0x42000000, 0xfa000000, 0xc3000000, 0x4e000000,
1066                0x08000000, 0x2e000000, 0xa1000000, 0x66000000,
1067                0x28000000, 0xd9000000, 0x24000000, 0xb2000000,
1068                0x76000000, 0x5b000000, 0xa2000000, 0x49000000,
1069                0x6d000000, 0x8b000000, 0xd1000000, 0x25000000,
1070                0x72000000, 0xf8000000, 0xf6000000, 0x64000000,
1071                0x86000000, 0x68000000, 0x98000000, 0x16000000,
1072                0xd4000000, 0xa4000000, 0x5c000000, 0xcc000000,
1073                0x5d000000, 0x65000000, 0xb6000000, 0x92000000,
1074                0x6c000000, 0x70000000, 0x48000000, 0x50000000,
1075                0xfd000000, 0xed000000, 0xb9000000, 0xda000000,
1076                0x5e000000, 0x15000000, 0x46000000, 0x57000000,
1077                0xa7000000, 0x8d000000, 0x9d000000, 0x84000000,
1078                0x90000000, 0xd8000000, 0xab000000, 0x00000000,
1079                0x8c000000, 0xbc000000, 0xd3000000, 0x0a000000,
1080                0xf7000000, 0xe4000000, 0x58000000, 0x05000000,
1081                0xb8000000, 0xb3000000, 0x45000000, 0x06000000,
1082                0xd0000000, 0x2c000000, 0x1e000000, 0x8f000000,
1083                0xca000000, 0x3f000000, 0x0f000000, 0x02000000,
1084                0xc1000000, 0xaf000000, 0xbd000000, 0x03000000,
1085                0x01000000, 0x13000000, 0x8a000000, 0x6b000000,
1086                0x3a000000, 0x91000000, 0x11000000, 0x41000000,
1087                0x4f000000, 0x67000000, 0xdc000000, 0xea000000,
1088                0x97000000, 0xf2000000, 0xcf000000, 0xce000000,
1089                0xf0000000, 0xb4000000, 0xe6000000, 0x73000000,
1090                0x96000000, 0xac000000, 0x74000000, 0x22000000,
1091                0xe7000000, 0xad000000, 0x35000000, 0x85000000,
1092                0xe2000000, 0xf9000000, 0x37000000, 0xe8000000,
1093                0x1c000000, 0x75000000, 0xdf000000, 0x6e000000,
1094                0x47000000, 0xf1000000, 0x1a000000, 0x71000000,
1095                0x1d000000, 0x29000000, 0xc5000000, 0x89000000,
1096                0x6f000000, 0xb7000000, 0x62000000, 0x0e000000,
1097                0xaa000000, 0x18000000, 0xbe000000, 0x1b000000,
1098                0xfc000000, 0x56000000, 0x3e000000, 0x4b000000,
1099                0xc6000000, 0xd2000000, 0x79000000, 0x20000000,
1100                0x9a000000, 0xdb000000, 0xc0000000, 0xfe000000,
1101                0x78000000, 0xcd000000, 0x5a000000, 0xf4000000,
1102                0x1f000000, 0xdd000000, 0xa8000000, 0x33000000,
1103                0x88000000, 0x07000000, 0xc7000000, 0x31000000,
1104                0xb1000000, 0x12000000, 0x10000000, 0x59000000,
1105                0x27000000, 0x80000000, 0xec000000, 0x5f000000,
1106                0x60000000, 0x51000000, 0x7f000000, 0xa9000000,
1107                0x19000000, 0xb5000000, 0x4a000000, 0x0d000000,
1108                0x2d000000, 0xe5000000, 0x7a000000, 0x9f000000,
1109                0x93000000, 0xc9000000, 0x9c000000, 0xef000000,
1110                0xa0000000, 0xe0000000, 0x3b000000, 0x4d000000,
1111                0xae000000, 0x2a000000, 0xf5000000, 0xb0000000,
1112                0xc8000000, 0xeb000000, 0xbb000000, 0x3c000000,
1113                0x83000000, 0x53000000, 0x99000000, 0x61000000,
1114                0x17000000, 0x2b000000, 0x04000000, 0x7e000000,
1115                0xba000000, 0x77000000, 0xd6000000, 0x26000000,
1116                0xe1000000, 0x69000000, 0x14000000, 0x63000000,
1117                0x55000000, 0x21000000, 0x0c000000, 0x7d000000,
1118        }
1119};
1120
1121EXPORT_SYMBOL_GPL(crypto_ft_tab);
1122EXPORT_SYMBOL_GPL(crypto_fl_tab);
1123EXPORT_SYMBOL_GPL(crypto_it_tab);
1124EXPORT_SYMBOL_GPL(crypto_il_tab);
1125
1126/* initialise the key schedule from the user supplied key */
1127
1128#define star_x(x) (((x) & 0x7f7f7f7f) << 1) ^ ((((x) & 0x80808080) >> 7) * 0x1b)
1129
1130#define imix_col(y, x)  do {            \
1131        u       = star_x(x);            \
1132        v       = star_x(u);            \
1133        w       = star_x(v);            \
1134        t       = w ^ (x);              \
1135        (y)     = u ^ v ^ w;            \
1136        (y)     ^= ror32(u ^ t, 8) ^    \
1137                ror32(v ^ t, 16) ^      \
1138                ror32(t, 24);           \
1139} while (0)
1140
1141#define ls_box(x)               \
1142        crypto_fl_tab[0][byte(x, 0)] ^  \
1143        crypto_fl_tab[1][byte(x, 1)] ^  \
1144        crypto_fl_tab[2][byte(x, 2)] ^  \
1145        crypto_fl_tab[3][byte(x, 3)]
1146
1147#define loop4(i)        do {            \
1148        t = ror32(t, 8);                \
1149        t = ls_box(t) ^ rco_tab[i];     \
1150        t ^= ctx->key_enc[4 * i];               \
1151        ctx->key_enc[4 * i + 4] = t;            \
1152        t ^= ctx->key_enc[4 * i + 1];           \
1153        ctx->key_enc[4 * i + 5] = t;            \
1154        t ^= ctx->key_enc[4 * i + 2];           \
1155        ctx->key_enc[4 * i + 6] = t;            \
1156        t ^= ctx->key_enc[4 * i + 3];           \
1157        ctx->key_enc[4 * i + 7] = t;            \
1158} while (0)
1159
1160#define loop6(i)        do {            \
1161        t = ror32(t, 8);                \
1162        t = ls_box(t) ^ rco_tab[i];     \
1163        t ^= ctx->key_enc[6 * i];               \
1164        ctx->key_enc[6 * i + 6] = t;            \
1165        t ^= ctx->key_enc[6 * i + 1];           \
1166        ctx->key_enc[6 * i + 7] = t;            \
1167        t ^= ctx->key_enc[6 * i + 2];           \
1168        ctx->key_enc[6 * i + 8] = t;            \
1169        t ^= ctx->key_enc[6 * i + 3];           \
1170        ctx->key_enc[6 * i + 9] = t;            \
1171        t ^= ctx->key_enc[6 * i + 4];           \
1172        ctx->key_enc[6 * i + 10] = t;           \
1173        t ^= ctx->key_enc[6 * i + 5];           \
1174        ctx->key_enc[6 * i + 11] = t;           \
1175} while (0)
1176
1177#define loop8tophalf(i) do {                    \
1178        t = ror32(t, 8);                        \
1179        t = ls_box(t) ^ rco_tab[i];             \
1180        t ^= ctx->key_enc[8 * i];                       \
1181        ctx->key_enc[8 * i + 8] = t;                    \
1182        t ^= ctx->key_enc[8 * i + 1];                   \
1183        ctx->key_enc[8 * i + 9] = t;                    \
1184        t ^= ctx->key_enc[8 * i + 2];                   \
1185        ctx->key_enc[8 * i + 10] = t;                   \
1186        t ^= ctx->key_enc[8 * i + 3];                   \
1187        ctx->key_enc[8 * i + 11] = t;                   \
1188} while (0)
1189
1190#define loop8(i)        do {                            \
1191        loop8tophalf(i);                                \
1192        t  = ctx->key_enc[8 * i + 4] ^ ls_box(t);       \
1193        ctx->key_enc[8 * i + 12] = t;                   \
1194        t ^= ctx->key_enc[8 * i + 5];                   \
1195        ctx->key_enc[8 * i + 13] = t;                   \
1196        t ^= ctx->key_enc[8 * i + 6];                   \
1197        ctx->key_enc[8 * i + 14] = t;                   \
1198        t ^= ctx->key_enc[8 * i + 7];                   \
1199        ctx->key_enc[8 * i + 15] = t;                   \
1200} while (0)
1201
1202/**
1203 * crypto_aes_expand_key - Expands the AES key as described in FIPS-197
1204 * @ctx:        The location where the computed key will be stored.
1205 * @in_key:     The supplied key.
1206 * @key_len:    The length of the supplied key.
1207 *
1208 * Returns 0 on success. The function fails only if an invalid key size (or
1209 * pointer) is supplied.
1210 * The expanded key size is 240 bytes (max of 14 rounds with a unique 16 bytes
1211 * key schedule plus a 16 bytes key which is used before the first round).
1212 * The decryption key is prepared for the "Equivalent Inverse Cipher" as
1213 * described in FIPS-197. The first slot (16 bytes) of each key (enc or dec) is
1214 * for the initial combination, the second slot for the first round and so on.
1215 */
1216int crypto_aes_expand_key(struct crypto_aes_ctx *ctx, const u8 *in_key,
1217                unsigned int key_len)
1218{
1219        const __le32 *key = (const __le32 *)in_key;
1220        u32 i, t, u, v, w, j;
1221
1222        if (key_len != AES_KEYSIZE_128 && key_len != AES_KEYSIZE_192 &&
1223                        key_len != AES_KEYSIZE_256)
1224                return -EINVAL;
1225
1226        ctx->key_length = key_len;
1227
1228        ctx->key_dec[key_len + 24] = ctx->key_enc[0] = le32_to_cpu(key[0]);
1229        ctx->key_dec[key_len + 25] = ctx->key_enc[1] = le32_to_cpu(key[1]);
1230        ctx->key_dec[key_len + 26] = ctx->key_enc[2] = le32_to_cpu(key[2]);
1231        ctx->key_dec[key_len + 27] = ctx->key_enc[3] = le32_to_cpu(key[3]);
1232
1233        switch (key_len) {
1234        case AES_KEYSIZE_128:
1235                t = ctx->key_enc[3];
1236                for (i = 0; i < 10; ++i)
1237                        loop4(i);
1238                break;
1239
1240        case AES_KEYSIZE_192:
1241                ctx->key_enc[4] = le32_to_cpu(key[4]);
1242                t = ctx->key_enc[5] = le32_to_cpu(key[5]);
1243                for (i = 0; i < 8; ++i)
1244                        loop6(i);
1245                break;
1246
1247        case AES_KEYSIZE_256:
1248                ctx->key_enc[4] = le32_to_cpu(key[4]);
1249                ctx->key_enc[5] = le32_to_cpu(key[5]);
1250                ctx->key_enc[6] = le32_to_cpu(key[6]);
1251                t = ctx->key_enc[7] = le32_to_cpu(key[7]);
1252                for (i = 0; i < 6; ++i)
1253                        loop8(i);
1254                loop8tophalf(i);
1255                break;
1256        }
1257
1258        ctx->key_dec[0] = ctx->key_enc[key_len + 24];
1259        ctx->key_dec[1] = ctx->key_enc[key_len + 25];
1260        ctx->key_dec[2] = ctx->key_enc[key_len + 26];
1261        ctx->key_dec[3] = ctx->key_enc[key_len + 27];
1262
1263        for (i = 4; i < key_len + 24; ++i) {
1264                j = key_len + 24 - (i & ~3) + (i & 3);
1265                imix_col(ctx->key_dec[j], ctx->key_enc[i]);
1266        }
1267        return 0;
1268}
1269EXPORT_SYMBOL_GPL(crypto_aes_expand_key);
1270
1271/**
1272 * crypto_aes_set_key - Set the AES key.
1273 * @tfm:        The %crypto_tfm that is used in the context.
1274 * @in_key:     The input key.
1275 * @key_len:    The size of the key.
1276 *
1277 * Returns 0 on success, on failure the %CRYPTO_TFM_RES_BAD_KEY_LEN flag in tfm
1278 * is set. The function uses crypto_aes_expand_key() to expand the key.
1279 * &crypto_aes_ctx _must_ be the private data embedded in @tfm which is
1280 * retrieved with crypto_tfm_ctx().
1281 */
1282int crypto_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
1283                unsigned int key_len)
1284{
1285        struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
1286        u32 *flags = &tfm->crt_flags;
1287        int ret;
1288
1289        ret = crypto_aes_expand_key(ctx, in_key, key_len);
1290        if (!ret)
1291                return 0;
1292
1293        *flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
1294        return -EINVAL;
1295}
1296EXPORT_SYMBOL_GPL(crypto_aes_set_key);
1297
1298/* encrypt a block of text */
1299
1300#define f_rn(bo, bi, n, k)      do {                            \
1301        bo[n] = crypto_ft_tab[0][byte(bi[n], 0)] ^                      \
1302                crypto_ft_tab[1][byte(bi[(n + 1) & 3], 1)] ^            \
1303                crypto_ft_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1304                crypto_ft_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n);  \
1305} while (0)
1306
1307#define f_nround(bo, bi, k)     do {\
1308        f_rn(bo, bi, 0, k);     \
1309        f_rn(bo, bi, 1, k);     \
1310        f_rn(bo, bi, 2, k);     \
1311        f_rn(bo, bi, 3, k);     \
1312        k += 4;                 \
1313} while (0)
1314
1315#define f_rl(bo, bi, n, k)      do {                            \
1316        bo[n] = crypto_fl_tab[0][byte(bi[n], 0)] ^                      \
1317                crypto_fl_tab[1][byte(bi[(n + 1) & 3], 1)] ^            \
1318                crypto_fl_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1319                crypto_fl_tab[3][byte(bi[(n + 3) & 3], 3)] ^ *(k + n);  \
1320} while (0)
1321
1322#define f_lround(bo, bi, k)     do {\
1323        f_rl(bo, bi, 0, k);     \
1324        f_rl(bo, bi, 1, k);     \
1325        f_rl(bo, bi, 2, k);     \
1326        f_rl(bo, bi, 3, k);     \
1327} while (0)
1328
1329static void aes_encrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1330{
1331        const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
1332        const __le32 *src = (const __le32 *)in;
1333        __le32 *dst = (__le32 *)out;
1334        u32 b0[4], b1[4];
1335        const u32 *kp = ctx->key_enc + 4;
1336        const int key_len = ctx->key_length;
1337
1338        b0[0] = le32_to_cpu(src[0]) ^ ctx->key_enc[0];
1339        b0[1] = le32_to_cpu(src[1]) ^ ctx->key_enc[1];
1340        b0[2] = le32_to_cpu(src[2]) ^ ctx->key_enc[2];
1341        b0[3] = le32_to_cpu(src[3]) ^ ctx->key_enc[3];
1342
1343        if (key_len > 24) {
1344                f_nround(b1, b0, kp);
1345                f_nround(b0, b1, kp);
1346        }
1347
1348        if (key_len > 16) {
1349                f_nround(b1, b0, kp);
1350                f_nround(b0, b1, kp);
1351        }
1352
1353        f_nround(b1, b0, kp);
1354        f_nround(b0, b1, kp);
1355        f_nround(b1, b0, kp);
1356        f_nround(b0, b1, kp);
1357        f_nround(b1, b0, kp);
1358        f_nround(b0, b1, kp);
1359        f_nround(b1, b0, kp);
1360        f_nround(b0, b1, kp);
1361        f_nround(b1, b0, kp);
1362        f_lround(b0, b1, kp);
1363
1364        dst[0] = cpu_to_le32(b0[0]);
1365        dst[1] = cpu_to_le32(b0[1]);
1366        dst[2] = cpu_to_le32(b0[2]);
1367        dst[3] = cpu_to_le32(b0[3]);
1368}
1369
1370/* decrypt a block of text */
1371
1372#define i_rn(bo, bi, n, k)      do {                            \
1373        bo[n] = crypto_it_tab[0][byte(bi[n], 0)] ^                      \
1374                crypto_it_tab[1][byte(bi[(n + 3) & 3], 1)] ^            \
1375                crypto_it_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1376                crypto_it_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n);  \
1377} while (0)
1378
1379#define i_nround(bo, bi, k)     do {\
1380        i_rn(bo, bi, 0, k);     \
1381        i_rn(bo, bi, 1, k);     \
1382        i_rn(bo, bi, 2, k);     \
1383        i_rn(bo, bi, 3, k);     \
1384        k += 4;                 \
1385} while (0)
1386
1387#define i_rl(bo, bi, n, k)      do {                    \
1388        bo[n] = crypto_il_tab[0][byte(bi[n], 0)] ^              \
1389        crypto_il_tab[1][byte(bi[(n + 3) & 3], 1)] ^            \
1390        crypto_il_tab[2][byte(bi[(n + 2) & 3], 2)] ^            \
1391        crypto_il_tab[3][byte(bi[(n + 1) & 3], 3)] ^ *(k + n);  \
1392} while (0)
1393
1394#define i_lround(bo, bi, k)     do {\
1395        i_rl(bo, bi, 0, k);     \
1396        i_rl(bo, bi, 1, k);     \
1397        i_rl(bo, bi, 2, k);     \
1398        i_rl(bo, bi, 3, k);     \
1399} while (0)
1400
1401static void aes_decrypt(struct crypto_tfm *tfm, u8 *out, const u8 *in)
1402{
1403        const struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
1404        const __le32 *src = (const __le32 *)in;
1405        __le32 *dst = (__le32 *)out;
1406        u32 b0[4], b1[4];
1407        const int key_len = ctx->key_length;
1408        const u32 *kp = ctx->key_dec + 4;
1409
1410        b0[0] = le32_to_cpu(src[0]) ^  ctx->key_dec[0];
1411        b0[1] = le32_to_cpu(src[1]) ^  ctx->key_dec[1];
1412        b0[2] = le32_to_cpu(src[2]) ^  ctx->key_dec[2];
1413        b0[3] = le32_to_cpu(src[3]) ^  ctx->key_dec[3];
1414
1415        if (key_len > 24) {
1416                i_nround(b1, b0, kp);
1417                i_nround(b0, b1, kp);
1418        }
1419
1420        if (key_len > 16) {
1421                i_nround(b1, b0, kp);
1422                i_nround(b0, b1, kp);
1423        }
1424
1425        i_nround(b1, b0, kp);
1426        i_nround(b0, b1, kp);
1427        i_nround(b1, b0, kp);
1428        i_nround(b0, b1, kp);
1429        i_nround(b1, b0, kp);
1430        i_nround(b0, b1, kp);
1431        i_nround(b1, b0, kp);
1432        i_nround(b0, b1, kp);
1433        i_nround(b1, b0, kp);
1434        i_lround(b0, b1, kp);
1435
1436        dst[0] = cpu_to_le32(b0[0]);
1437        dst[1] = cpu_to_le32(b0[1]);
1438        dst[2] = cpu_to_le32(b0[2]);
1439        dst[3] = cpu_to_le32(b0[3]);
1440}
1441
1442static struct crypto_alg aes_alg = {
1443        .cra_name               =       "aes",
1444        .cra_driver_name        =       "aes-generic",
1445        .cra_priority           =       100,
1446        .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
1447        .cra_blocksize          =       AES_BLOCK_SIZE,
1448        .cra_ctxsize            =       sizeof(struct crypto_aes_ctx),
1449        .cra_alignmask          =       3,
1450        .cra_module             =       THIS_MODULE,
1451        .cra_u                  =       {
1452                .cipher = {
1453                        .cia_min_keysize        =       AES_MIN_KEY_SIZE,
1454                        .cia_max_keysize        =       AES_MAX_KEY_SIZE,
1455                        .cia_setkey             =       crypto_aes_set_key,
1456                        .cia_encrypt            =       aes_encrypt,
1457                        .cia_decrypt            =       aes_decrypt
1458                }
1459        }
1460};
1461
1462static int __init aes_init(void)
1463{
1464        return crypto_register_alg(&aes_alg);
1465}
1466
1467static void __exit aes_fini(void)
1468{
1469        crypto_unregister_alg(&aes_alg);
1470}
1471
1472module_init(aes_init);
1473module_exit(aes_fini);
1474
1475MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
1476MODULE_LICENSE("Dual BSD/GPL");
1477MODULE_ALIAS_CRYPTO("aes");
1478MODULE_ALIAS_CRYPTO("aes-generic");
1479