Back to home page

LXR

 
 

    


0001 /*
0002  * Cryptographic API.
0003  *
0004  * AES Cipher Algorithm.
0005  *
0006  * Based on Brian Gladman's code.
0007  *
0008  * Linux developers:
0009  *  Alexander Kjeldaas <astor@fast.no>
0010  *  Herbert Valerio Riedel <hvr@hvrlab.org>
0011  *  Kyle McMartin <kyle@debian.org>
0012  *  Adam J. Richter <adam@yggdrasil.com> (conversion to 2.5 API).
0013  *
0014  * This program is free software; you can redistribute it and/or modify
0015  * it under the terms of the GNU General Public License as published by
0016  * the Free Software Foundation; either version 2 of the License, or
0017  * (at your option) any later version.
0018  *
0019  * ---------------------------------------------------------------------------
0020  * Copyright (c) 2002, Dr Brian Gladman <brg@gladman.me.uk>, Worcester, UK.
0021  * All rights reserved.
0022  *
0023  * LICENSE TERMS
0024  *
0025  * The free distribution and use of this software in both source and binary
0026  * form is allowed (with or without changes) provided that:
0027  *
0028  *   1. distributions of this source code include the above copyright
0029  *      notice, this list of conditions and the following disclaimer;
0030  *
0031  *   2. distributions in binary form include the above copyright
0032  *      notice, this list of conditions and the following disclaimer
0033  *      in the documentation and/or other associated materials;
0034  *
0035  *   3. the copyright holder's name is not used to endorse products
0036  *      built using this software without specific written permission.
0037  *
0038  * ALTERNATIVELY, provided that this notice is retained in full, this product
0039  * may be distributed under the terms of the GNU General Public License (GPL),
0040  * in which case the provisions of the GPL apply INSTEAD OF those given above.
0041  *
0042  * DISCLAIMER
0043  *
0044  * This software is provided 'as is' with no explicit or implied warranties
0045  * in respect of its properties, including, but not limited to, correctness
0046  * and/or fitness for purpose.
0047  * ---------------------------------------------------------------------------
0048  */
0049 
0050 #include <crypto/aes.h>
0051 #include <linux/module.h>
0052 #include <linux/init.h>
0053 #include <linux/types.h>
0054 #include <linux/errno.h>
0055 #include <linux/crypto.h>
0056 #include <asm/byteorder.h>
0057 
0058 static inline u8 byte(const u32 x, const unsigned n)
0059 {
0060     return x >> (n << 3);
0061 }
0062 
0063 static const u32 rco_tab[10] = { 1, 2, 4, 8, 16, 32, 64, 128, 27, 54 };
0064 
0065 __visible const u32 crypto_ft_tab[4][256] = {
0066     {
0067         0xa56363c6, 0x847c7cf8, 0x997777ee, 0x8d7b7bf6,
0068         0x0df2f2ff, 0xbd6b6bd6, 0xb16f6fde, 0x54c5c591,
0069         0x50303060, 0x03010102, 0xa96767ce, 0x7d2b2b56,
0070         0x19fefee7, 0x62d7d7b5, 0xe6abab4d, 0x9a7676ec,
0071         0x45caca8f, 0x9d82821f, 0x40c9c989, 0x877d7dfa,
0072         0x15fafaef, 0xeb5959b2, 0xc947478e, 0x0bf0f0fb,
0073         0xecadad41, 0x67d4d4b3, 0xfda2a25f, 0xeaafaf45,
0074         0xbf9c9c23, 0xf7a4a453, 0x967272e4, 0x5bc0c09b,
0075         0xc2b7b775, 0x1cfdfde1, 0xae93933d, 0x6a26264c,
0076         0x5a36366c, 0x413f3f7e, 0x02f7f7f5, 0x4fcccc83,
0077         0x5c343468, 0xf4a5a551, 0x34e5e5d1, 0x08f1f1f9,
0078         0x937171e2, 0x73d8d8ab, 0x53313162, 0x3f15152a,
0079         0x0c040408, 0x52c7c795, 0x65232346, 0x5ec3c39d,
0080         0x28181830, 0xa1969637, 0x0f05050a, 0xb59a9a2f,
0081         0x0907070e, 0x36121224, 0x9b80801b, 0x3de2e2df,
0082         0x26ebebcd, 0x6927274e, 0xcdb2b27f, 0x9f7575ea,
0083         0x1b090912, 0x9e83831d, 0x742c2c58, 0x2e1a1a34,
0084         0x2d1b1b36, 0xb26e6edc, 0xee5a5ab4, 0xfba0a05b,
0085         0xf65252a4, 0x4d3b3b76, 0x61d6d6b7, 0xceb3b37d,
0086         0x7b292952, 0x3ee3e3dd, 0x712f2f5e, 0x97848413,
0087         0xf55353a6, 0x68d1d1b9, 0x00000000, 0x2cededc1,
0088         0x60202040, 0x1ffcfce3, 0xc8b1b179, 0xed5b5bb6,
0089         0xbe6a6ad4, 0x46cbcb8d, 0xd9bebe67, 0x4b393972,
0090         0xde4a4a94, 0xd44c4c98, 0xe85858b0, 0x4acfcf85,
0091         0x6bd0d0bb, 0x2aefefc5, 0xe5aaaa4f, 0x16fbfbed,
0092         0xc5434386, 0xd74d4d9a, 0x55333366, 0x94858511,
0093         0xcf45458a, 0x10f9f9e9, 0x06020204, 0x817f7ffe,
0094         0xf05050a0, 0x443c3c78, 0xba9f9f25, 0xe3a8a84b,
0095         0xf35151a2, 0xfea3a35d, 0xc0404080, 0x8a8f8f05,
0096         0xad92923f, 0xbc9d9d21, 0x48383870, 0x04f5f5f1,
0097         0xdfbcbc63, 0xc1b6b677, 0x75dadaaf, 0x63212142,
0098         0x30101020, 0x1affffe5, 0x0ef3f3fd, 0x6dd2d2bf,
0099         0x4ccdcd81, 0x140c0c18, 0x35131326, 0x2fececc3,
0100         0xe15f5fbe, 0xa2979735, 0xcc444488, 0x3917172e,
0101         0x57c4c493, 0xf2a7a755, 0x827e7efc, 0x473d3d7a,
0102         0xac6464c8, 0xe75d5dba, 0x2b191932, 0x957373e6,
0103         0xa06060c0, 0x98818119, 0xd14f4f9e, 0x7fdcdca3,
0104         0x66222244, 0x7e2a2a54, 0xab90903b, 0x8388880b,
0105         0xca46468c, 0x29eeeec7, 0xd3b8b86b, 0x3c141428,
0106         0x79dedea7, 0xe25e5ebc, 0x1d0b0b16, 0x76dbdbad,
0107         0x3be0e0db, 0x56323264, 0x4e3a3a74, 0x1e0a0a14,
0108         0xdb494992, 0x0a06060c, 0x6c242448, 0xe45c5cb8,
0109         0x5dc2c29f, 0x6ed3d3bd, 0xefacac43, 0xa66262c4,
0110         0xa8919139, 0xa4959531, 0x37e4e4d3, 0x8b7979f2,
0111         0x32e7e7d5, 0x43c8c88b, 0x5937376e, 0xb76d6dda,
0112         0x8c8d8d01, 0x64d5d5b1, 0xd24e4e9c, 0xe0a9a949,
0113         0xb46c6cd8, 0xfa5656ac, 0x07f4f4f3, 0x25eaeacf,
0114         0xaf6565ca, 0x8e7a7af4, 0xe9aeae47, 0x18080810,
0115         0xd5baba6f, 0x887878f0, 0x6f25254a, 0x722e2e5c,
0116         0x241c1c38, 0xf1a6a657, 0xc7b4b473, 0x51c6c697,
0117         0x23e8e8cb, 0x7cdddda1, 0x9c7474e8, 0x211f1f3e,
0118         0xdd4b4b96, 0xdcbdbd61, 0x868b8b0d, 0x858a8a0f,
0119         0x907070e0, 0x423e3e7c, 0xc4b5b571, 0xaa6666cc,
0120         0xd8484890, 0x05030306, 0x01f6f6f7, 0x120e0e1c,
0121         0xa36161c2, 0x5f35356a, 0xf95757ae, 0xd0b9b969,
0122         0x91868617, 0x58c1c199, 0x271d1d3a, 0xb99e9e27,
0123         0x38e1e1d9, 0x13f8f8eb, 0xb398982b, 0x33111122,
0124         0xbb6969d2, 0x70d9d9a9, 0x898e8e07, 0xa7949433,
0125         0xb69b9b2d, 0x221e1e3c, 0x92878715, 0x20e9e9c9,
0126         0x49cece87, 0xff5555aa, 0x78282850, 0x7adfdfa5,
0127         0x8f8c8c03, 0xf8a1a159, 0x80898909, 0x170d0d1a,
0128         0xdabfbf65, 0x31e6e6d7, 0xc6424284, 0xb86868d0,
0129         0xc3414182, 0xb0999929, 0x772d2d5a, 0x110f0f1e,
0130         0xcbb0b07b, 0xfc5454a8, 0xd6bbbb6d, 0x3a16162c,
0131     }, {
0132         0x6363c6a5, 0x7c7cf884, 0x7777ee99, 0x7b7bf68d,
0133         0xf2f2ff0d, 0x6b6bd6bd, 0x6f6fdeb1, 0xc5c59154,
0134         0x30306050, 0x01010203, 0x6767cea9, 0x2b2b567d,
0135         0xfefee719, 0xd7d7b562, 0xabab4de6, 0x7676ec9a,
0136         0xcaca8f45, 0x82821f9d, 0xc9c98940, 0x7d7dfa87,
0137         0xfafaef15, 0x5959b2eb, 0x47478ec9, 0xf0f0fb0b,
0138         0xadad41ec, 0xd4d4b367, 0xa2a25ffd, 0xafaf45ea,
0139         0x9c9c23bf, 0xa4a453f7, 0x7272e496, 0xc0c09b5b,
0140         0xb7b775c2, 0xfdfde11c, 0x93933dae, 0x26264c6a,
0141         0x36366c5a, 0x3f3f7e41, 0xf7f7f502, 0xcccc834f,
0142         0x3434685c, 0xa5a551f4, 0xe5e5d134, 0xf1f1f908,
0143         0x7171e293, 0xd8d8ab73, 0x31316253, 0x15152a3f,
0144         0x0404080c, 0xc7c79552, 0x23234665, 0xc3c39d5e,
0145         0x18183028, 0x969637a1, 0x05050a0f, 0x9a9a2fb5,
0146         0x07070e09, 0x12122436, 0x80801b9b, 0xe2e2df3d,
0147         0xebebcd26, 0x27274e69, 0xb2b27fcd, 0x7575ea9f,
0148         0x0909121b, 0x83831d9e, 0x2c2c5874, 0x1a1a342e,
0149         0x1b1b362d, 0x6e6edcb2, 0x5a5ab4ee, 0xa0a05bfb,
0150         0x5252a4f6, 0x3b3b764d, 0xd6d6b761, 0xb3b37dce,
0151         0x2929527b, 0xe3e3dd3e, 0x2f2f5e71, 0x84841397,
0152         0x5353a6f5, 0xd1d1b968, 0x00000000, 0xededc12c,
0153         0x20204060, 0xfcfce31f, 0xb1b179c8, 0x5b5bb6ed,
0154         0x6a6ad4be, 0xcbcb8d46, 0xbebe67d9, 0x3939724b,
0155         0x4a4a94de, 0x4c4c98d4, 0x5858b0e8, 0xcfcf854a,
0156         0xd0d0bb6b, 0xefefc52a, 0xaaaa4fe5, 0xfbfbed16,
0157         0x434386c5, 0x4d4d9ad7, 0x33336655, 0x85851194,
0158         0x45458acf, 0xf9f9e910, 0x02020406, 0x7f7ffe81,
0159         0x5050a0f0, 0x3c3c7844, 0x9f9f25ba, 0xa8a84be3,
0160         0x5151a2f3, 0xa3a35dfe, 0x404080c0, 0x8f8f058a,
0161         0x92923fad, 0x9d9d21bc, 0x38387048, 0xf5f5f104,
0162         0xbcbc63df, 0xb6b677c1, 0xdadaaf75, 0x21214263,
0163         0x10102030, 0xffffe51a, 0xf3f3fd0e, 0xd2d2bf6d,
0164         0xcdcd814c, 0x0c0c1814, 0x13132635, 0xececc32f,
0165         0x5f5fbee1, 0x979735a2, 0x444488cc, 0x17172e39,
0166         0xc4c49357, 0xa7a755f2, 0x7e7efc82, 0x3d3d7a47,
0167         0x6464c8ac, 0x5d5dbae7, 0x1919322b, 0x7373e695,
0168         0x6060c0a0, 0x81811998, 0x4f4f9ed1, 0xdcdca37f,
0169         0x22224466, 0x2a2a547e, 0x90903bab, 0x88880b83,
0170         0x46468cca, 0xeeeec729, 0xb8b86bd3, 0x1414283c,
0171         0xdedea779, 0x5e5ebce2, 0x0b0b161d, 0xdbdbad76,
0172         0xe0e0db3b, 0x32326456, 0x3a3a744e, 0x0a0a141e,
0173         0x494992db, 0x06060c0a, 0x2424486c, 0x5c5cb8e4,
0174         0xc2c29f5d, 0xd3d3bd6e, 0xacac43ef, 0x6262c4a6,
0175         0x919139a8, 0x959531a4, 0xe4e4d337, 0x7979f28b,
0176         0xe7e7d532, 0xc8c88b43, 0x37376e59, 0x6d6ddab7,
0177         0x8d8d018c, 0xd5d5b164, 0x4e4e9cd2, 0xa9a949e0,
0178         0x6c6cd8b4, 0x5656acfa, 0xf4f4f307, 0xeaeacf25,
0179         0x6565caaf, 0x7a7af48e, 0xaeae47e9, 0x08081018,
0180         0xbaba6fd5, 0x7878f088, 0x25254a6f, 0x2e2e5c72,
0181         0x1c1c3824, 0xa6a657f1, 0xb4b473c7, 0xc6c69751,
0182         0xe8e8cb23, 0xdddda17c, 0x7474e89c, 0x1f1f3e21,
0183         0x4b4b96dd, 0xbdbd61dc, 0x8b8b0d86, 0x8a8a0f85,
0184         0x7070e090, 0x3e3e7c42, 0xb5b571c4, 0x6666ccaa,
0185         0x484890d8, 0x03030605, 0xf6f6f701, 0x0e0e1c12,
0186         0x6161c2a3, 0x35356a5f, 0x5757aef9, 0xb9b969d0,
0187         0x86861791, 0xc1c19958, 0x1d1d3a27, 0x9e9e27b9,
0188         0xe1e1d938, 0xf8f8eb13, 0x98982bb3, 0x11112233,
0189         0x6969d2bb, 0xd9d9a970, 0x8e8e0789, 0x949433a7,
0190         0x9b9b2db6, 0x1e1e3c22, 0x87871592, 0xe9e9c920,
0191         0xcece8749, 0x5555aaff, 0x28285078, 0xdfdfa57a,
0192         0x8c8c038f, 0xa1a159f8, 0x89890980, 0x0d0d1a17,
0193         0xbfbf65da, 0xe6e6d731, 0x424284c6, 0x6868d0b8,
0194         0x414182c3, 0x999929b0, 0x2d2d5a77, 0x0f0f1e11,
0195         0xb0b07bcb, 0x5454a8fc, 0xbbbb6dd6, 0x16162c3a,
0196     }, {
0197         0x63c6a563, 0x7cf8847c, 0x77ee9977, 0x7bf68d7b,
0198         0xf2ff0df2, 0x6bd6bd6b, 0x6fdeb16f, 0xc59154c5,
0199         0x30605030, 0x01020301, 0x67cea967, 0x2b567d2b,
0200         0xfee719fe, 0xd7b562d7, 0xab4de6ab, 0x76ec9a76,
0201         0xca8f45ca, 0x821f9d82, 0xc98940c9, 0x7dfa877d,
0202         0xfaef15fa, 0x59b2eb59, 0x478ec947, 0xf0fb0bf0,
0203         0xad41ecad, 0xd4b367d4, 0xa25ffda2, 0xaf45eaaf,
0204         0x9c23bf9c, 0xa453f7a4, 0x72e49672, 0xc09b5bc0,
0205         0xb775c2b7, 0xfde11cfd, 0x933dae93, 0x264c6a26,
0206         0x366c5a36, 0x3f7e413f, 0xf7f502f7, 0xcc834fcc,
0207         0x34685c34, 0xa551f4a5, 0xe5d134e5, 0xf1f908f1,
0208         0x71e29371, 0xd8ab73d8, 0x31625331, 0x152a3f15,
0209         0x04080c04, 0xc79552c7, 0x23466523, 0xc39d5ec3,
0210         0x18302818, 0x9637a196, 0x050a0f05, 0x9a2fb59a,
0211         0x070e0907, 0x12243612, 0x801b9b80, 0xe2df3de2,
0212         0xebcd26eb, 0x274e6927, 0xb27fcdb2, 0x75ea9f75,
0213         0x09121b09, 0x831d9e83, 0x2c58742c, 0x1a342e1a,
0214         0x1b362d1b, 0x6edcb26e, 0x5ab4ee5a, 0xa05bfba0,
0215         0x52a4f652, 0x3b764d3b, 0xd6b761d6, 0xb37dceb3,
0216         0x29527b29, 0xe3dd3ee3, 0x2f5e712f, 0x84139784,
0217         0x53a6f553, 0xd1b968d1, 0x00000000, 0xedc12ced,
0218         0x20406020, 0xfce31ffc, 0xb179c8b1, 0x5bb6ed5b,
0219         0x6ad4be6a, 0xcb8d46cb, 0xbe67d9be, 0x39724b39,
0220         0x4a94de4a, 0x4c98d44c, 0x58b0e858, 0xcf854acf,
0221         0xd0bb6bd0, 0xefc52aef, 0xaa4fe5aa, 0xfbed16fb,
0222         0x4386c543, 0x4d9ad74d, 0x33665533, 0x85119485,
0223         0x458acf45, 0xf9e910f9, 0x02040602, 0x7ffe817f,
0224         0x50a0f050, 0x3c78443c, 0x9f25ba9f, 0xa84be3a8,
0225         0x51a2f351, 0xa35dfea3, 0x4080c040, 0x8f058a8f,
0226         0x923fad92, 0x9d21bc9d, 0x38704838, 0xf5f104f5,
0227         0xbc63dfbc, 0xb677c1b6, 0xdaaf75da, 0x21426321,
0228         0x10203010, 0xffe51aff, 0xf3fd0ef3, 0xd2bf6dd2,
0229         0xcd814ccd, 0x0c18140c, 0x13263513, 0xecc32fec,
0230         0x5fbee15f, 0x9735a297, 0x4488cc44, 0x172e3917,
0231         0xc49357c4, 0xa755f2a7, 0x7efc827e, 0x3d7a473d,
0232         0x64c8ac64, 0x5dbae75d, 0x19322b19, 0x73e69573,
0233         0x60c0a060, 0x81199881, 0x4f9ed14f, 0xdca37fdc,
0234         0x22446622, 0x2a547e2a, 0x903bab90, 0x880b8388,
0235         0x468cca46, 0xeec729ee, 0xb86bd3b8, 0x14283c14,
0236         0xdea779de, 0x5ebce25e, 0x0b161d0b, 0xdbad76db,
0237         0xe0db3be0, 0x32645632, 0x3a744e3a, 0x0a141e0a,
0238         0x4992db49, 0x060c0a06, 0x24486c24, 0x5cb8e45c,
0239         0xc29f5dc2, 0xd3bd6ed3, 0xac43efac, 0x62c4a662,
0240         0x9139a891, 0x9531a495, 0xe4d337e4, 0x79f28b79,
0241         0xe7d532e7, 0xc88b43c8, 0x376e5937, 0x6ddab76d,
0242         0x8d018c8d, 0xd5b164d5, 0x4e9cd24e, 0xa949e0a9,
0243         0x6cd8b46c, 0x56acfa56, 0xf4f307f4, 0xeacf25ea,
0244         0x65caaf65, 0x7af48e7a, 0xae47e9ae, 0x08101808,
0245         0xba6fd5ba, 0x78f08878, 0x254a6f25, 0x2e5c722e,
0246         0x1c38241c, 0xa657f1a6, 0xb473c7b4, 0xc69751c6,
0247         0xe8cb23e8, 0xdda17cdd, 0x74e89c74, 0x1f3e211f,
0248         0x4b96dd4b, 0xbd61dcbd, 0x8b0d868b, 0x8a0f858a,
0249         0x70e09070, 0x3e7c423e, 0xb571c4b5, 0x66ccaa66,
0250         0x4890d848, 0x03060503, 0xf6f701f6, 0x0e1c120e,
0251         0x61c2a361, 0x356a5f35, 0x57aef957, 0xb969d0b9,
0252         0x86179186, 0xc19958c1, 0x1d3a271d, 0x9e27b99e,
0253         0xe1d938e1, 0xf8eb13f8, 0x982bb398, 0x11223311,
0254         0x69d2bb69, 0xd9a970d9, 0x8e07898e, 0x9433a794,
0255         0x9b2db69b, 0x1e3c221e, 0x87159287, 0xe9c920e9,
0256         0xce8749ce, 0x55aaff55, 0x28507828, 0xdfa57adf,
0257         0x8c038f8c, 0xa159f8a1, 0x89098089, 0x0d1a170d,
0258         0xbf65dabf, 0xe6d731e6, 0x4284c642, 0x68d0b868,
0259         0x4182c341, 0x9929b099, 0x2d5a772d, 0x0f1e110f,
0260         0xb07bcbb0, 0x54a8fc54, 0xbb6dd6bb, 0x162c3a16,
0261     }, {
0262         0xc6a56363, 0xf8847c7c, 0xee997777, 0xf68d7b7b,
0263         0xff0df2f2, 0xd6bd6b6b, 0xdeb16f6f, 0x9154c5c5,
0264         0x60503030, 0x02030101, 0xcea96767, 0x567d2b2b,
0265         0xe719fefe, 0xb562d7d7, 0x4de6abab, 0xec9a7676,
0266         0x8f45caca, 0x1f9d8282, 0x8940c9c9, 0xfa877d7d,
0267         0xef15fafa, 0xb2eb5959, 0x8ec94747, 0xfb0bf0f0,
0268         0x41ecadad, 0xb367d4d4, 0x5ffda2a2, 0x45eaafaf,
0269         0x23bf9c9c, 0x53f7a4a4, 0xe4967272, 0x9b5bc0c0,
0270         0x75c2b7b7, 0xe11cfdfd, 0x3dae9393, 0x4c6a2626,
0271         0x6c5a3636, 0x7e413f3f, 0xf502f7f7, 0x834fcccc,
0272         0x685c3434, 0x51f4a5a5, 0xd134e5e5, 0xf908f1f1,
0273         0xe2937171, 0xab73d8d8, 0x62533131, 0x2a3f1515,
0274         0x080c0404, 0x9552c7c7, 0x46652323, 0x9d5ec3c3,
0275         0x30281818, 0x37a19696, 0x0a0f0505, 0x2fb59a9a,
0276         0x0e090707, 0x24361212, 0x1b9b8080, 0xdf3de2e2,
0277         0xcd26ebeb, 0x4e692727, 0x7fcdb2b2, 0xea9f7575,
0278         0x121b0909, 0x1d9e8383, 0x58742c2c, 0x342e1a1a,
0279         0x362d1b1b, 0xdcb26e6e, 0xb4ee5a5a, 0x5bfba0a0,
0280         0xa4f65252, 0x764d3b3b, 0xb761d6d6, 0x7dceb3b3,
0281         0x527b2929, 0xdd3ee3e3, 0x5e712f2f, 0x13978484,
0282         0xa6f55353, 0xb968d1d1, 0x00000000, 0xc12ceded,
0283         0x40602020, 0xe31ffcfc, 0x79c8b1b1, 0xb6ed5b5b,
0284         0xd4be6a6a, 0x8d46cbcb, 0x67d9bebe, 0x724b3939,
0285         0x94de4a4a, 0x98d44c4c, 0xb0e85858, 0x854acfcf,
0286         0xbb6bd0d0, 0xc52aefef, 0x4fe5aaaa, 0xed16fbfb,
0287         0x86c54343, 0x9ad74d4d, 0x66553333, 0x11948585,
0288         0x8acf4545, 0xe910f9f9, 0x04060202, 0xfe817f7f,
0289         0xa0f05050, 0x78443c3c, 0x25ba9f9f, 0x4be3a8a8,
0290         0xa2f35151, 0x5dfea3a3, 0x80c04040, 0x058a8f8f,
0291         0x3fad9292, 0x21bc9d9d, 0x70483838, 0xf104f5f5,
0292         0x63dfbcbc, 0x77c1b6b6, 0xaf75dada, 0x42632121,
0293         0x20301010, 0xe51affff, 0xfd0ef3f3, 0xbf6dd2d2,
0294         0x814ccdcd, 0x18140c0c, 0x26351313, 0xc32fecec,
0295         0xbee15f5f, 0x35a29797, 0x88cc4444, 0x2e391717,
0296         0x9357c4c4, 0x55f2a7a7, 0xfc827e7e, 0x7a473d3d,
0297         0xc8ac6464, 0xbae75d5d, 0x322b1919, 0xe6957373,
0298         0xc0a06060, 0x19988181, 0x9ed14f4f, 0xa37fdcdc,
0299         0x44662222, 0x547e2a2a, 0x3bab9090, 0x0b838888,
0300         0x8cca4646, 0xc729eeee, 0x6bd3b8b8, 0x283c1414,
0301         0xa779dede, 0xbce25e5e, 0x161d0b0b, 0xad76dbdb,
0302         0xdb3be0e0, 0x64563232, 0x744e3a3a, 0x141e0a0a,
0303         0x92db4949, 0x0c0a0606, 0x486c2424, 0xb8e45c5c,
0304         0x9f5dc2c2, 0xbd6ed3d3, 0x43efacac, 0xc4a66262,
0305         0x39a89191, 0x31a49595, 0xd337e4e4, 0xf28b7979,
0306         0xd532e7e7, 0x8b43c8c8, 0x6e593737, 0xdab76d6d,
0307         0x018c8d8d, 0xb164d5d5, 0x9cd24e4e, 0x49e0a9a9,
0308         0xd8b46c6c, 0xacfa5656, 0xf307f4f4, 0xcf25eaea,
0309         0xcaaf6565, 0xf48e7a7a, 0x47e9aeae, 0x10180808,
0310         0x6fd5baba, 0xf0887878, 0x4a6f2525, 0x5c722e2e,
0311         0x38241c1c, 0x57f1a6a6, 0x73c7b4b4, 0x9751c6c6,
0312         0xcb23e8e8, 0xa17cdddd, 0xe89c7474, 0x3e211f1f,
0313         0x96dd4b4b, 0x61dcbdbd, 0x0d868b8b, 0x0f858a8a,
0314         0xe0907070, 0x7c423e3e, 0x71c4b5b5, 0xccaa6666,
0315         0x90d84848, 0x06050303, 0xf701f6f6, 0x1c120e0e,
0316         0xc2a36161, 0x6a5f3535, 0xaef95757, 0x69d0b9b9,
0317         0x17918686, 0x9958c1c1, 0x3a271d1d, 0x27b99e9e,
0318         0xd938e1e1, 0xeb13f8f8, 0x2bb39898, 0x22331111,
0319         0xd2bb6969, 0xa970d9d9, 0x07898e8e, 0x33a79494,
0320         0x2db69b9b, 0x3c221e1e, 0x15928787, 0xc920e9e9,
0321         0x8749cece, 0xaaff5555, 0x50782828, 0xa57adfdf,
0322         0x038f8c8c, 0x59f8a1a1, 0x09808989, 0x1a170d0d,
0323         0x65dabfbf, 0xd731e6e6, 0x84c64242, 0xd0b86868,
0324         0x82c34141, 0x29b09999, 0x5a772d2d, 0x1e110f0f,
0325         0x7bcbb0b0, 0xa8fc5454, 0x6dd6bbbb, 0x2c3a1616,
0326     }
0327 };
0328 
0329 __visible const u32 crypto_fl_tab[4][256] = {
0330     {
0331         0x00000063, 0x0000007c, 0x00000077, 0x0000007b,
0332         0x000000f2, 0x0000006b, 0x0000006f, 0x000000c5,
0333         0x00000030, 0x00000001, 0x00000067, 0x0000002b,
0334         0x000000fe, 0x000000d7, 0x000000ab, 0x00000076,
0335         0x000000ca, 0x00000082, 0x000000c9, 0x0000007d,
0336         0x000000fa, 0x00000059, 0x00000047, 0x000000f0,
0337         0x000000ad, 0x000000d4, 0x000000a2, 0x000000af,
0338         0x0000009c, 0x000000a4, 0x00000072, 0x000000c0,
0339         0x000000b7, 0x000000fd, 0x00000093, 0x00000026,
0340         0x00000036, 0x0000003f, 0x000000f7, 0x000000cc,
0341         0x00000034, 0x000000a5, 0x000000e5, 0x000000f1,
0342         0x00000071, 0x000000d8, 0x00000031, 0x00000015,
0343         0x00000004, 0x000000c7, 0x00000023, 0x000000c3,
0344         0x00000018, 0x00000096, 0x00000005, 0x0000009a,
0345         0x00000007, 0x00000012, 0x00000080, 0x000000e2,
0346         0x000000eb, 0x00000027, 0x000000b2, 0x00000075,
0347         0x00000009, 0x00000083, 0x0000002c, 0x0000001a,
0348         0x0000001b, 0x0000006e, 0x0000005a, 0x000000a0,
0349         0x00000052, 0x0000003b, 0x000000d6, 0x000000b3,
0350         0x00000029, 0x000000e3, 0x0000002f, 0x00000084,
0351         0x00000053, 0x000000d1, 0x00000000, 0x000000ed,
0352         0x00000020, 0x000000fc, 0x000000b1, 0x0000005b,
0353         0x0000006a, 0x000000cb, 0x000000be, 0x00000039,
0354         0x0000004a, 0x0000004c, 0x00000058, 0x000000cf,
0355         0x000000d0, 0x000000ef, 0x000000aa, 0x000000fb,
0356         0x00000043, 0x0000004d, 0x00000033, 0x00000085,
0357         0x00000045, 0x000000f9, 0x00000002, 0x0000007f,
0358         0x00000050, 0x0000003c, 0x0000009f, 0x000000a8,
0359         0x00000051, 0x000000a3, 0x00000040, 0x0000008f,
0360         0x00000092, 0x0000009d, 0x00000038, 0x000000f5,
0361         0x000000bc, 0x000000b6, 0x000000da, 0x00000021,
0362         0x00000010, 0x000000ff, 0x000000f3, 0x000000d2,
0363         0x000000cd, 0x0000000c, 0x00000013, 0x000000ec,
0364         0x0000005f, 0x00000097, 0x00000044, 0x00000017,
0365         0x000000c4, 0x000000a7, 0x0000007e, 0x0000003d,
0366         0x00000064, 0x0000005d, 0x00000019, 0x00000073,
0367         0x00000060, 0x00000081, 0x0000004f, 0x000000dc,
0368         0x00000022, 0x0000002a, 0x00000090, 0x00000088,
0369         0x00000046, 0x000000ee, 0x000000b8, 0x00000014,
0370         0x000000de, 0x0000005e, 0x0000000b, 0x000000db,
0371         0x000000e0, 0x00000032, 0x0000003a, 0x0000000a,
0372         0x00000049, 0x00000006, 0x00000024, 0x0000005c,
0373         0x000000c2, 0x000000d3, 0x000000ac, 0x00000062,
0374         0x00000091, 0x00000095, 0x000000e4, 0x00000079,
0375         0x000000e7, 0x000000c8, 0x00000037, 0x0000006d,
0376         0x0000008d, 0x000000d5, 0x0000004e, 0x000000a9,
0377         0x0000006c, 0x00000056, 0x000000f4, 0x000000ea,
0378         0x00000065, 0x0000007a, 0x000000ae, 0x00000008,
0379         0x000000ba, 0x00000078, 0x00000025, 0x0000002e,
0380         0x0000001c, 0x000000a6, 0x000000b4, 0x000000c6,
0381         0x000000e8, 0x000000dd, 0x00000074, 0x0000001f,
0382         0x0000004b, 0x000000bd, 0x0000008b, 0x0000008a,
0383         0x00000070, 0x0000003e, 0x000000b5, 0x00000066,
0384         0x00000048, 0x00000003, 0x000000f6, 0x0000000e,
0385         0x00000061, 0x00000035, 0x00000057, 0x000000b9,
0386         0x00000086, 0x000000c1, 0x0000001d, 0x0000009e,
0387         0x000000e1, 0x000000f8, 0x00000098, 0x00000011,
0388         0x00000069, 0x000000d9, 0x0000008e, 0x00000094,
0389         0x0000009b, 0x0000001e, 0x00000087, 0x000000e9,
0390         0x000000ce, 0x00000055, 0x00000028, 0x000000df,
0391         0x0000008c, 0x000000a1, 0x00000089, 0x0000000d,
0392         0x000000bf, 0x000000e6, 0x00000042, 0x00000068,
0393         0x00000041, 0x00000099, 0x0000002d, 0x0000000f,
0394         0x000000b0, 0x00000054, 0x000000bb, 0x00000016,
0395     }, {
0396         0x00006300, 0x00007c00, 0x00007700, 0x00007b00,
0397         0x0000f200, 0x00006b00, 0x00006f00, 0x0000c500,
0398         0x00003000, 0x00000100, 0x00006700, 0x00002b00,
0399         0x0000fe00, 0x0000d700, 0x0000ab00, 0x00007600,
0400         0x0000ca00, 0x00008200, 0x0000c900, 0x00007d00,
0401         0x0000fa00, 0x00005900, 0x00004700, 0x0000f000,
0402         0x0000ad00, 0x0000d400, 0x0000a200, 0x0000af00,
0403         0x00009c00, 0x0000a400, 0x00007200, 0x0000c000,
0404         0x0000b700, 0x0000fd00, 0x00009300, 0x00002600,
0405         0x00003600, 0x00003f00, 0x0000f700, 0x0000cc00,
0406         0x00003400, 0x0000a500, 0x0000e500, 0x0000f100,
0407         0x00007100, 0x0000d800, 0x00003100, 0x00001500,
0408         0x00000400, 0x0000c700, 0x00002300, 0x0000c300,
0409         0x00001800, 0x00009600, 0x00000500, 0x00009a00,
0410         0x00000700, 0x00001200, 0x00008000, 0x0000e200,
0411         0x0000eb00, 0x00002700, 0x0000b200, 0x00007500,
0412         0x00000900, 0x00008300, 0x00002c00, 0x00001a00,
0413         0x00001b00, 0x00006e00, 0x00005a00, 0x0000a000,
0414         0x00005200, 0x00003b00, 0x0000d600, 0x0000b300,
0415         0x00002900, 0x0000e300, 0x00002f00, 0x00008400,
0416         0x00005300, 0x0000d100, 0x00000000, 0x0000ed00,
0417         0x00002000, 0x0000fc00, 0x0000b100, 0x00005b00,
0418         0x00006a00, 0x0000cb00, 0x0000be00, 0x00003900,
0419         0x00004a00, 0x00004c00, 0x00005800, 0x0000cf00,
0420         0x0000d000, 0x0000ef00, 0x0000aa00, 0x0000fb00,
0421         0x00004300, 0x00004d00, 0x00003300, 0x00008500,
0422         0x00004500, 0x0000f900, 0x00000200, 0x00007f00,
0423         0x00005000, 0x00003c00, 0x00009f00, 0x0000a800,
0424         0x00005100, 0x0000a300, 0x00004000, 0x00008f00,
0425         0x00009200, 0x00009d00, 0x00003800, 0x0000f500,
0426         0x0000bc00, 0x0000b600, 0x0000da00, 0x00002100,
0427         0x00001000, 0x0000ff00, 0x0000f300, 0x0000d200,
0428         0x0000cd00, 0x00000c00, 0x00001300, 0x0000ec00,
0429         0x00005f00, 0x00009700, 0x00004400, 0x00001700,
0430         0x0000c400, 0x0000a700, 0x00007e00, 0x00003d00,
0431         0x00006400, 0x00005d00, 0x00001900, 0x00007300,
0432         0x00006000, 0x00008100, 0x00004f00, 0x0000dc00,
0433         0x00002200, 0x00002a00, 0x00009000, 0x00008800,
0434         0x00004600, 0x0000ee00, 0x0000b800, 0x00001400,
0435         0x0000de00, 0x00005e00, 0x00000b00, 0x0000db00,
0436         0x0000e000, 0x00003200, 0x00003a00, 0x00000a00,
0437         0x00004900, 0x00000600, 0x00002400, 0x00005c00,
0438         0x0000c200, 0x0000d300, 0x0000ac00, 0x00006200,
0439         0x00009100, 0x00009500, 0x0000e400, 0x00007900,
0440         0x0000e700, 0x0000c800, 0x00003700, 0x00006d00,
0441         0x00008d00, 0x0000d500, 0x00004e00, 0x0000a900,
0442         0x00006c00, 0x00005600, 0x0000f400, 0x0000ea00,
0443         0x00006500, 0x00007a00, 0x0000ae00, 0x00000800,
0444         0x0000ba00, 0x00007800, 0x00002500, 0x00002e00,
0445         0x00001c00, 0x0000a600, 0x0000b400, 0x0000c600,
0446         0x0000e800, 0x0000dd00, 0x00007400, 0x00001f00,
0447         0x00004b00, 0x0000bd00, 0x00008b00, 0x00008a00,
0448         0x00007000, 0x00003e00, 0x0000b500, 0x00006600,
0449         0x00004800, 0x00000300, 0x0000f600, 0x00000e00,
0450         0x00006100, 0x00003500, 0x00005700, 0x0000b900,
0451         0x00008600, 0x0000c100, 0x00001d00, 0x00009e00,
0452         0x0000e100, 0x0000f800, 0x00009800, 0x00001100,
0453         0x00006900, 0x0000d900, 0x00008e00, 0x00009400,
0454         0x00009b00, 0x00001e00, 0x00008700, 0x0000e900,
0455         0x0000ce00, 0x00005500, 0x00002800, 0x0000df00,
0456         0x00008c00, 0x0000a100, 0x00008900, 0x00000d00,
0457         0x0000bf00, 0x0000e600, 0x00004200, 0x00006800,
0458         0x00004100, 0x00009900, 0x00002d00, 0x00000f00,
0459         0x0000b000, 0x00005400, 0x0000bb00, 0x00001600,
0460     }, {
0461         0x00630000, 0x007c0000, 0x00770000, 0x007b0000,
0462         0x00f20000, 0x006b0000, 0x006f0000, 0x00c50000,
0463         0x00300000, 0x00010000, 0x00670000, 0x002b0000,
0464         0x00fe0000, 0x00d70000, 0x00ab0000, 0x00760000,
0465         0x00ca0000, 0x00820000, 0x00c90000, 0x007d0000,
0466         0x00fa0000, 0x00590000, 0x00470000, 0x00f00000,
0467         0x00ad0000, 0x00d40000, 0x00a20000, 0x00af0000,
0468         0x009c0000, 0x00a40000, 0x00720000, 0x00c00000,
0469         0x00b70000, 0x00fd0000, 0x00930000, 0x00260000,
0470         0x00360000, 0x003f0000, 0x00f70000, 0x00cc0000,
0471         0x00340000, 0x00a50000, 0x00e50000, 0x00f10000,
0472         0x00710000, 0x00d80000, 0x00310000, 0x00150000,
0473         0x00040000, 0x00c70000, 0x00230000, 0x00c30000,
0474         0x00180000, 0x00960000, 0x00050000, 0x009a0000,
0475         0x00070000, 0x00120000, 0x00800000, 0x00e20000,
0476         0x00eb0000, 0x00270000, 0x00b20000, 0x00750000,
0477         0x00090000, 0x00830000, 0x002c0000, 0x001a0000,
0478         0x001b0000, 0x006e0000, 0x005a0000, 0x00a00000,
0479         0x00520000, 0x003b0000, 0x00d60000, 0x00b30000,
0480         0x00290000, 0x00e30000, 0x002f0000, 0x00840000,
0481         0x00530000, 0x00d10000, 0x00000000, 0x00ed0000,
0482         0x00200000, 0x00fc0000, 0x00b10000, 0x005b0000,
0483         0x006a0000, 0x00cb0000, 0x00be0000, 0x00390000,
0484         0x004a0000, 0x004c0000, 0x00580000, 0x00cf0000,
0485         0x00d00000, 0x00ef0000, 0x00aa0000, 0x00fb0000,
0486         0x00430000, 0x004d0000, 0x00330000, 0x00850000,
0487         0x00450000, 0x00f90000, 0x00020000, 0x007f0000,
0488         0x00500000, 0x003c0000, 0x009f0000, 0x00a80000,
0489         0x00510000, 0x00a30000, 0x00400000, 0x008f0000,
0490         0x00920000, 0x009d0000, 0x00380000, 0x00f50000,
0491         0x00bc0000, 0x00b60000, 0x00da0000, 0x00210000,
0492         0x00100000, 0x00ff0000, 0x00f30000, 0x00d20000,
0493         0x00cd0000, 0x000c0000, 0x00130000, 0x00ec0000,
0494         0x005f0000, 0x00970000, 0x00440000, 0x00170000,
0495         0x00c40000, 0x00a70000, 0x007e0000, 0x003d0000,
0496         0x00640000, 0x005d0000, 0x00190000, 0x00730000,
0497         0x00600000, 0x00810000, 0x004f0000, 0x00dc0000,
0498         0x00220000, 0x002a0000, 0x00900000, 0x00880000,
0499         0x00460000, 0x00ee0000, 0x00b80000, 0x00140000,
0500         0x00de0000, 0x005e0000, 0x000b0000, 0x00db0000,
0501         0x00e00000, 0x00320000, 0x003a0000, 0x000a0000,
0502         0x00490000, 0x00060000, 0x00240000, 0x005c0000,
0503         0x00c20000, 0x00d30000, 0x00ac0000, 0x00620000,
0504         0x00910000, 0x00950000, 0x00e40000, 0x00790000,
0505         0x00e70000, 0x00c80000, 0x00370000, 0x006d0000,
0506         0x008d0000, 0x00d50000, 0x004e0000, 0x00a90000,
0507         0x006c0000, 0x00560000, 0x00f40000, 0x00ea0000,
0508         0x00650000, 0x007a0000, 0x00ae0000, 0x00080000,
0509         0x00ba0000, 0x00780000, 0x00250000, 0x002e0000,
0510         0x001c0000, 0x00a60000, 0x00b40000, 0x00c60000,
0511         0x00e80000, 0x00dd0000, 0x00740000, 0x001f0000,
0512         0x004b0000, 0x00bd0000, 0x008b0000, 0x008a0000,
0513         0x00700000, 0x003e0000, 0x00b50000, 0x00660000,
0514         0x00480000, 0x00030000, 0x00f60000, 0x000e0000,
0515         0x00610000, 0x00350000, 0x00570000, 0x00b90000,
0516         0x00860000, 0x00c10000, 0x001d0000, 0x009e0000,
0517         0x00e10000, 0x00f80000, 0x00980000, 0x00110000,
0518         0x00690000, 0x00d90000, 0x008e0000, 0x00940000,
0519         0x009b0000, 0x001e0000, 0x00870000, 0x00e90000,
0520         0x00ce0000, 0x00550000, 0x00280000, 0x00df0000,
0521         0x008c0000, 0x00a10000, 0x00890000, 0x000d0000,
0522         0x00bf0000, 0x00e60000, 0x00420000, 0x00680000,
0523         0x00410000, 0x00990000, 0x002d0000, 0x000f0000,
0524         0x00b00000, 0x00540000, 0x00bb0000, 0x00160000,
0525     }, {
0526         0x63000000, 0x7c000000, 0x77000000, 0x7b000000,
0527         0xf2000000, 0x6b000000, 0x6f000000, 0xc5000000,
0528         0x30000000, 0x01000000, 0x67000000, 0x2b000000,
0529         0xfe000000, 0xd7000000, 0xab000000, 0x76000000,
0530         0xca000000, 0x82000000, 0xc9000000, 0x7d000000,
0531         0xfa000000, 0x59000000, 0x47000000, 0xf0000000,
0532         0xad000000, 0xd4000000, 0xa2000000, 0xaf000000,
0533         0x9c000000, 0xa4000000, 0x72000000, 0xc0000000,
0534         0xb7000000, 0xfd000000, 0x93000000, 0x26000000,
0535         0x36000000, 0x3f000000, 0xf7000000, 0xcc000000,
0536         0x34000000, 0xa5000000, 0xe5000000, 0xf1000000,
0537         0x71000000, 0xd8000000, 0x31000000, 0x15000000,
0538         0x04000000, 0xc7000000, 0x23000000, 0xc3000000,
0539         0x18000000, 0x96000000, 0x05000000, 0x9a000000,
0540         0x07000000, 0x12000000, 0x80000000, 0xe2000000,
0541         0xeb000000, 0x27000000, 0xb2000000, 0x75000000,
0542         0x09000000, 0x83000000, 0x2c000000, 0x1a000000,
0543         0x1b000000, 0x6e000000, 0x5a000000, 0xa0000000,
0544         0x52000000, 0x3b000000, 0xd6000000, 0xb3000000,
0545         0x29000000, 0xe3000000, 0x2f000000, 0x84000000,
0546         0x53000000, 0xd1000000, 0x00000000, 0xed000000,
0547         0x20000000, 0xfc000000, 0xb1000000, 0x5b000000,
0548         0x6a000000, 0xcb000000, 0xbe000000, 0x39000000,
0549         0x4a000000, 0x4c000000, 0x58000000, 0xcf000000,
0550         0xd0000000, 0xef000000, 0xaa000000, 0xfb000000,
0551         0x43000000, 0x4d000000, 0x33000000, 0x85000000,
0552         0x45000000, 0xf9000000, 0x02000000, 0x7f000000,
0553         0x50000000, 0x3c000000, 0x9f000000, 0xa8000000,
0554         0x51000000, 0xa3000000, 0x40000000, 0x8f000000,
0555         0x92000000, 0x9d000000, 0x38000000, 0xf5000000,
0556         0xbc000000, 0xb6000000, 0xda000000, 0x21000000,
0557         0x10000000, 0xff000000, 0xf3000000, 0xd2000000,
0558         0xcd000000, 0x0c000000, 0x13000000, 0xec000000,
0559         0x5f000000, 0x97000000, 0x44000000, 0x17000000,
0560         0xc4000000, 0xa7000000, 0x7e000000, 0x3d000000,
0561         0x64000000, 0x5d000000, 0x19000000, 0x73000000,
0562         0x60000000, 0x81000000, 0x4f000000, 0xdc000000,
0563         0x22000000, 0x2a000000, 0x90000000, 0x88000000,
0564         0x46000000, 0xee000000, 0xb8000000, 0x14000000,
0565         0xde000000, 0x5e000000, 0x0b000000, 0xdb000000,
0566         0xe0000000, 0x32000000, 0x3a000000, 0x0a000000,
0567         0x49000000, 0x06000000, 0x24000000, 0x5c000000,
0568         0xc2000000, 0xd3000000, 0xac000000, 0x62000000,
0569         0x91000000, 0x95000000, 0xe4000000, 0x79000000,
0570         0xe7000000, 0xc8000000, 0x37000000, 0x6d000000,
0571         0x8d000000, 0xd5000000, 0x4e000000, 0xa9000000,
0572         0x6c000000, 0x56000000, 0xf4000000, 0xea000000,
0573         0x65000000, 0x7a000000, 0xae000000, 0x08000000,
0574         0xba000000, 0x78000000, 0x25000000, 0x2e000000,
0575         0x1c000000, 0xa6000000, 0xb4000000, 0xc6000000,
0576         0xe8000000, 0xdd000000, 0x74000000, 0x1f000000,
0577         0x4b000000, 0xbd000000, 0x8b000000, 0x8a000000,
0578         0x70000000, 0x3e000000, 0xb5000000, 0x66000000,
0579         0x48000000, 0x03000000, 0xf6000000, 0x0e000000,
0580         0x61000000, 0x35000000, 0x57000000, 0xb9000000,
0581         0x86000000, 0xc1000000, 0x1d000000, 0x9e000000,
0582         0xe1000000, 0xf8000000, 0x98000000, 0x11000000,
0583         0x69000000, 0xd9000000, 0x8e000000, 0x94000000,
0584         0x9b000000, 0x1e000000, 0x87000000, 0xe9000000,
0585         0xce000000, 0x55000000, 0x28000000, 0xdf000000,
0586         0x8c000000, 0xa1000000, 0x89000000, 0x0d000000,
0587         0xbf000000, 0xe6000000, 0x42000000, 0x68000000,
0588         0x41000000, 0x99000000, 0x2d000000, 0x0f000000,
0589         0xb0000000, 0x54000000, 0xbb000000, 0x16000000,
0590     }
0591 };
0592 
0593 __visible const u32 crypto_it_tab[4][256] = {
0594     {
0595         0x50a7f451, 0x5365417e, 0xc3a4171a, 0x965e273a,
0596         0xcb6bab3b, 0xf1459d1f, 0xab58faac, 0x9303e34b,
0597         0x55fa3020, 0xf66d76ad, 0x9176cc88, 0x254c02f5,
0598         0xfcd7e54f, 0xd7cb2ac5, 0x80443526, 0x8fa362b5,
0599         0x495ab1de, 0x671bba25, 0x980eea45, 0xe1c0fe5d,
0600         0x02752fc3, 0x12f04c81, 0xa397468d, 0xc6f9d36b,
0601         0xe75f8f03, 0x959c9215, 0xeb7a6dbf, 0xda595295,
0602         0x2d83bed4, 0xd3217458, 0x2969e049, 0x44c8c98e,
0603         0x6a89c275, 0x78798ef4, 0x6b3e5899, 0xdd71b927,
0604         0xb64fe1be, 0x17ad88f0, 0x66ac20c9, 0xb43ace7d,
0605         0x184adf63, 0x82311ae5, 0x60335197, 0x457f5362,
0606         0xe07764b1, 0x84ae6bbb, 0x1ca081fe, 0x942b08f9,
0607         0x58684870, 0x19fd458f, 0x876cde94, 0xb7f87b52,
0608         0x23d373ab, 0xe2024b72, 0x578f1fe3, 0x2aab5566,
0609         0x0728ebb2, 0x03c2b52f, 0x9a7bc586, 0xa50837d3,
0610         0xf2872830, 0xb2a5bf23, 0xba6a0302, 0x5c8216ed,
0611         0x2b1ccf8a, 0x92b479a7, 0xf0f207f3, 0xa1e2694e,
0612         0xcdf4da65, 0xd5be0506, 0x1f6234d1, 0x8afea6c4,
0613         0x9d532e34, 0xa055f3a2, 0x32e18a05, 0x75ebf6a4,
0614         0x39ec830b, 0xaaef6040, 0x069f715e, 0x51106ebd,
0615         0xf98a213e, 0x3d06dd96, 0xae053edd, 0x46bde64d,
0616         0xb58d5491, 0x055dc471, 0x6fd40604, 0xff155060,
0617         0x24fb9819, 0x97e9bdd6, 0xcc434089, 0x779ed967,
0618         0xbd42e8b0, 0x888b8907, 0x385b19e7, 0xdbeec879,
0619         0x470a7ca1, 0xe90f427c, 0xc91e84f8, 0x00000000,
0620         0x83868009, 0x48ed2b32, 0xac70111e, 0x4e725a6c,
0621         0xfbff0efd, 0x5638850f, 0x1ed5ae3d, 0x27392d36,
0622         0x64d90f0a, 0x21a65c68, 0xd1545b9b, 0x3a2e3624,
0623         0xb1670a0c, 0x0fe75793, 0xd296eeb4, 0x9e919b1b,
0624         0x4fc5c080, 0xa220dc61, 0x694b775a, 0x161a121c,
0625         0x0aba93e2, 0xe52aa0c0, 0x43e0223c, 0x1d171b12,
0626         0x0b0d090e, 0xadc78bf2, 0xb9a8b62d, 0xc8a91e14,
0627         0x8519f157, 0x4c0775af, 0xbbdd99ee, 0xfd607fa3,
0628         0x9f2601f7, 0xbcf5725c, 0xc53b6644, 0x347efb5b,
0629         0x7629438b, 0xdcc623cb, 0x68fcedb6, 0x63f1e4b8,
0630         0xcadc31d7, 0x10856342, 0x40229713, 0x2011c684,
0631         0x7d244a85, 0xf83dbbd2, 0x1132f9ae, 0x6da129c7,
0632         0x4b2f9e1d, 0xf330b2dc, 0xec52860d, 0xd0e3c177,
0633         0x6c16b32b, 0x99b970a9, 0xfa489411, 0x2264e947,
0634         0xc48cfca8, 0x1a3ff0a0, 0xd82c7d56, 0xef903322,
0635         0xc74e4987, 0xc1d138d9, 0xfea2ca8c, 0x360bd498,
0636         0xcf81f5a6, 0x28de7aa5, 0x268eb7da, 0xa4bfad3f,
0637         0xe49d3a2c, 0x0d927850, 0x9bcc5f6a, 0x62467e54,
0638         0xc2138df6, 0xe8b8d890, 0x5ef7392e, 0xf5afc382,
0639         0xbe805d9f, 0x7c93d069, 0xa92dd56f, 0xb31225cf,
0640         0x3b99acc8, 0xa77d1810, 0x6e639ce8, 0x7bbb3bdb,
0641         0x097826cd, 0xf418596e, 0x01b79aec, 0xa89a4f83,
0642         0x656e95e6, 0x7ee6ffaa, 0x08cfbc21, 0xe6e815ef,
0643         0xd99be7ba, 0xce366f4a, 0xd4099fea, 0xd67cb029,
0644         0xafb2a431, 0x31233f2a, 0x3094a5c6, 0xc066a235,
0645         0x37bc4e74, 0xa6ca82fc, 0xb0d090e0, 0x15d8a733,
0646         0x4a9804f1, 0xf7daec41, 0x0e50cd7f, 0x2ff69117,
0647         0x8dd64d76, 0x4db0ef43, 0x544daacc, 0xdf0496e4,
0648         0xe3b5d19e, 0x1b886a4c, 0xb81f2cc1, 0x7f516546,
0649         0x04ea5e9d, 0x5d358c01, 0x737487fa, 0x2e410bfb,
0650         0x5a1d67b3, 0x52d2db92, 0x335610e9, 0x1347d66d,
0651         0x8c61d79a, 0x7a0ca137, 0x8e14f859, 0x893c13eb,
0652         0xee27a9ce, 0x35c961b7, 0xede51ce1, 0x3cb1477a,
0653         0x59dfd29c, 0x3f73f255, 0x79ce1418, 0xbf37c773,
0654         0xeacdf753, 0x5baafd5f, 0x146f3ddf, 0x86db4478,
0655         0x81f3afca, 0x3ec468b9, 0x2c342438, 0x5f40a3c2,
0656         0x72c31d16, 0x0c25e2bc, 0x8b493c28, 0x41950dff,
0657         0x7101a839, 0xdeb30c08, 0x9ce4b4d8, 0x90c15664,
0658         0x6184cb7b, 0x70b632d5, 0x745c6c48, 0x4257b8d0,
0659     }, {
0660         0xa7f45150, 0x65417e53, 0xa4171ac3, 0x5e273a96,
0661         0x6bab3bcb, 0x459d1ff1, 0x58faacab, 0x03e34b93,
0662         0xfa302055, 0x6d76adf6, 0x76cc8891, 0x4c02f525,
0663         0xd7e54ffc, 0xcb2ac5d7, 0x44352680, 0xa362b58f,
0664         0x5ab1de49, 0x1bba2567, 0x0eea4598, 0xc0fe5de1,
0665         0x752fc302, 0xf04c8112, 0x97468da3, 0xf9d36bc6,
0666         0x5f8f03e7, 0x9c921595, 0x7a6dbfeb, 0x595295da,
0667         0x83bed42d, 0x217458d3, 0x69e04929, 0xc8c98e44,
0668         0x89c2756a, 0x798ef478, 0x3e58996b, 0x71b927dd,
0669         0x4fe1beb6, 0xad88f017, 0xac20c966, 0x3ace7db4,
0670         0x4adf6318, 0x311ae582, 0x33519760, 0x7f536245,
0671         0x7764b1e0, 0xae6bbb84, 0xa081fe1c, 0x2b08f994,
0672         0x68487058, 0xfd458f19, 0x6cde9487, 0xf87b52b7,
0673         0xd373ab23, 0x024b72e2, 0x8f1fe357, 0xab55662a,
0674         0x28ebb207, 0xc2b52f03, 0x7bc5869a, 0x0837d3a5,
0675         0x872830f2, 0xa5bf23b2, 0x6a0302ba, 0x8216ed5c,
0676         0x1ccf8a2b, 0xb479a792, 0xf207f3f0, 0xe2694ea1,
0677         0xf4da65cd, 0xbe0506d5, 0x6234d11f, 0xfea6c48a,
0678         0x532e349d, 0x55f3a2a0, 0xe18a0532, 0xebf6a475,
0679         0xec830b39, 0xef6040aa, 0x9f715e06, 0x106ebd51,
0680         0x8a213ef9, 0x06dd963d, 0x053eddae, 0xbde64d46,
0681         0x8d5491b5, 0x5dc47105, 0xd406046f, 0x155060ff,
0682         0xfb981924, 0xe9bdd697, 0x434089cc, 0x9ed96777,
0683         0x42e8b0bd, 0x8b890788, 0x5b19e738, 0xeec879db,
0684         0x0a7ca147, 0x0f427ce9, 0x1e84f8c9, 0x00000000,
0685         0x86800983, 0xed2b3248, 0x70111eac, 0x725a6c4e,
0686         0xff0efdfb, 0x38850f56, 0xd5ae3d1e, 0x392d3627,
0687         0xd90f0a64, 0xa65c6821, 0x545b9bd1, 0x2e36243a,
0688         0x670a0cb1, 0xe757930f, 0x96eeb4d2, 0x919b1b9e,
0689         0xc5c0804f, 0x20dc61a2, 0x4b775a69, 0x1a121c16,
0690         0xba93e20a, 0x2aa0c0e5, 0xe0223c43, 0x171b121d,
0691         0x0d090e0b, 0xc78bf2ad, 0xa8b62db9, 0xa91e14c8,
0692         0x19f15785, 0x0775af4c, 0xdd99eebb, 0x607fa3fd,
0693         0x2601f79f, 0xf5725cbc, 0x3b6644c5, 0x7efb5b34,
0694         0x29438b76, 0xc623cbdc, 0xfcedb668, 0xf1e4b863,
0695         0xdc31d7ca, 0x85634210, 0x22971340, 0x11c68420,
0696         0x244a857d, 0x3dbbd2f8, 0x32f9ae11, 0xa129c76d,
0697         0x2f9e1d4b, 0x30b2dcf3, 0x52860dec, 0xe3c177d0,
0698         0x16b32b6c, 0xb970a999, 0x489411fa, 0x64e94722,
0699         0x8cfca8c4, 0x3ff0a01a, 0x2c7d56d8, 0x903322ef,
0700         0x4e4987c7, 0xd138d9c1, 0xa2ca8cfe, 0x0bd49836,
0701         0x81f5a6cf, 0xde7aa528, 0x8eb7da26, 0xbfad3fa4,
0702         0x9d3a2ce4, 0x9278500d, 0xcc5f6a9b, 0x467e5462,
0703         0x138df6c2, 0xb8d890e8, 0xf7392e5e, 0xafc382f5,
0704         0x805d9fbe, 0x93d0697c, 0x2dd56fa9, 0x1225cfb3,
0705         0x99acc83b, 0x7d1810a7, 0x639ce86e, 0xbb3bdb7b,
0706         0x7826cd09, 0x18596ef4, 0xb79aec01, 0x9a4f83a8,
0707         0x6e95e665, 0xe6ffaa7e, 0xcfbc2108, 0xe815efe6,
0708         0x9be7bad9, 0x366f4ace, 0x099fead4, 0x7cb029d6,
0709         0xb2a431af, 0x233f2a31, 0x94a5c630, 0x66a235c0,
0710         0xbc4e7437, 0xca82fca6, 0xd090e0b0, 0xd8a73315,
0711         0x9804f14a, 0xdaec41f7, 0x50cd7f0e, 0xf691172f,
0712         0xd64d768d, 0xb0ef434d, 0x4daacc54, 0x0496e4df,
0713         0xb5d19ee3, 0x886a4c1b, 0x1f2cc1b8, 0x5165467f,
0714         0xea5e9d04, 0x358c015d, 0x7487fa73, 0x410bfb2e,
0715         0x1d67b35a, 0xd2db9252, 0x5610e933, 0x47d66d13,
0716         0x61d79a8c, 0x0ca1377a, 0x14f8598e, 0x3c13eb89,
0717         0x27a9ceee, 0xc961b735, 0xe51ce1ed, 0xb1477a3c,
0718         0xdfd29c59, 0x73f2553f, 0xce141879, 0x37c773bf,
0719         0xcdf753ea, 0xaafd5f5b, 0x6f3ddf14, 0xdb447886,
0720         0xf3afca81, 0xc468b93e, 0x3424382c, 0x40a3c25f,
0721         0xc31d1672, 0x25e2bc0c, 0x493c288b, 0x950dff41,
0722         0x01a83971, 0xb30c08de, 0xe4b4d89c, 0xc1566490,
0723         0x84cb7b61, 0xb632d570, 0x5c6c4874, 0x57b8d042,
0724     }, {
0725         0xf45150a7, 0x417e5365, 0x171ac3a4, 0x273a965e,
0726         0xab3bcb6b, 0x9d1ff145, 0xfaacab58, 0xe34b9303,
0727         0x302055fa, 0x76adf66d, 0xcc889176, 0x02f5254c,
0728         0xe54ffcd7, 0x2ac5d7cb, 0x35268044, 0x62b58fa3,
0729         0xb1de495a, 0xba25671b, 0xea45980e, 0xfe5de1c0,
0730         0x2fc30275, 0x4c8112f0, 0x468da397, 0xd36bc6f9,
0731         0x8f03e75f, 0x9215959c, 0x6dbfeb7a, 0x5295da59,
0732         0xbed42d83, 0x7458d321, 0xe0492969, 0xc98e44c8,
0733         0xc2756a89, 0x8ef47879, 0x58996b3e, 0xb927dd71,
0734         0xe1beb64f, 0x88f017ad, 0x20c966ac, 0xce7db43a,
0735         0xdf63184a, 0x1ae58231, 0x51976033, 0x5362457f,
0736         0x64b1e077, 0x6bbb84ae, 0x81fe1ca0, 0x08f9942b,
0737         0x48705868, 0x458f19fd, 0xde94876c, 0x7b52b7f8,
0738         0x73ab23d3, 0x4b72e202, 0x1fe3578f, 0x55662aab,
0739         0xebb20728, 0xb52f03c2, 0xc5869a7b, 0x37d3a508,
0740         0x2830f287, 0xbf23b2a5, 0x0302ba6a, 0x16ed5c82,
0741         0xcf8a2b1c, 0x79a792b4, 0x07f3f0f2, 0x694ea1e2,
0742         0xda65cdf4, 0x0506d5be, 0x34d11f62, 0xa6c48afe,
0743         0x2e349d53, 0xf3a2a055, 0x8a0532e1, 0xf6a475eb,
0744         0x830b39ec, 0x6040aaef, 0x715e069f, 0x6ebd5110,
0745         0x213ef98a, 0xdd963d06, 0x3eddae05, 0xe64d46bd,
0746         0x5491b58d, 0xc471055d, 0x06046fd4, 0x5060ff15,
0747         0x981924fb, 0xbdd697e9, 0x4089cc43, 0xd967779e,
0748         0xe8b0bd42, 0x8907888b, 0x19e7385b, 0xc879dbee,
0749         0x7ca1470a, 0x427ce90f, 0x84f8c91e, 0x00000000,
0750         0x80098386, 0x2b3248ed, 0x111eac70, 0x5a6c4e72,
0751         0x0efdfbff, 0x850f5638, 0xae3d1ed5, 0x2d362739,
0752         0x0f0a64d9, 0x5c6821a6, 0x5b9bd154, 0x36243a2e,
0753         0x0a0cb167, 0x57930fe7, 0xeeb4d296, 0x9b1b9e91,
0754         0xc0804fc5, 0xdc61a220, 0x775a694b, 0x121c161a,
0755         0x93e20aba, 0xa0c0e52a, 0x223c43e0, 0x1b121d17,
0756         0x090e0b0d, 0x8bf2adc7, 0xb62db9a8, 0x1e14c8a9,
0757         0xf1578519, 0x75af4c07, 0x99eebbdd, 0x7fa3fd60,
0758         0x01f79f26, 0x725cbcf5, 0x6644c53b, 0xfb5b347e,
0759         0x438b7629, 0x23cbdcc6, 0xedb668fc, 0xe4b863f1,
0760         0x31d7cadc, 0x63421085, 0x97134022, 0xc6842011,
0761         0x4a857d24, 0xbbd2f83d, 0xf9ae1132, 0x29c76da1,
0762         0x9e1d4b2f, 0xb2dcf330, 0x860dec52, 0xc177d0e3,
0763         0xb32b6c16, 0x70a999b9, 0x9411fa48, 0xe9472264,
0764         0xfca8c48c, 0xf0a01a3f, 0x7d56d82c, 0x3322ef90,
0765         0x4987c74e, 0x38d9c1d1, 0xca8cfea2, 0xd498360b,
0766         0xf5a6cf81, 0x7aa528de, 0xb7da268e, 0xad3fa4bf,
0767         0x3a2ce49d, 0x78500d92, 0x5f6a9bcc, 0x7e546246,
0768         0x8df6c213, 0xd890e8b8, 0x392e5ef7, 0xc382f5af,
0769         0x5d9fbe80, 0xd0697c93, 0xd56fa92d, 0x25cfb312,
0770         0xacc83b99, 0x1810a77d, 0x9ce86e63, 0x3bdb7bbb,
0771         0x26cd0978, 0x596ef418, 0x9aec01b7, 0x4f83a89a,
0772         0x95e6656e, 0xffaa7ee6, 0xbc2108cf, 0x15efe6e8,
0773         0xe7bad99b, 0x6f4ace36, 0x9fead409, 0xb029d67c,
0774         0xa431afb2, 0x3f2a3123, 0xa5c63094, 0xa235c066,
0775         0x4e7437bc, 0x82fca6ca, 0x90e0b0d0, 0xa73315d8,
0776         0x04f14a98, 0xec41f7da, 0xcd7f0e50, 0x91172ff6,
0777         0x4d768dd6, 0xef434db0, 0xaacc544d, 0x96e4df04,
0778         0xd19ee3b5, 0x6a4c1b88, 0x2cc1b81f, 0x65467f51,
0779         0x5e9d04ea, 0x8c015d35, 0x87fa7374, 0x0bfb2e41,
0780         0x67b35a1d, 0xdb9252d2, 0x10e93356, 0xd66d1347,
0781         0xd79a8c61, 0xa1377a0c, 0xf8598e14, 0x13eb893c,
0782         0xa9ceee27, 0x61b735c9, 0x1ce1ede5, 0x477a3cb1,
0783         0xd29c59df, 0xf2553f73, 0x141879ce, 0xc773bf37,
0784         0xf753eacd, 0xfd5f5baa, 0x3ddf146f, 0x447886db,
0785         0xafca81f3, 0x68b93ec4, 0x24382c34, 0xa3c25f40,
0786         0x1d1672c3, 0xe2bc0c25, 0x3c288b49, 0x0dff4195,
0787         0xa8397101, 0x0c08deb3, 0xb4d89ce4, 0x566490c1,
0788         0xcb7b6184, 0x32d570b6, 0x6c48745c, 0xb8d04257,
0789     }, {
0790         0x5150a7f4, 0x7e536541, 0x1ac3a417, 0x3a965e27,
0791         0x3bcb6bab, 0x1ff1459d, 0xacab58fa, 0x4b9303e3,
0792         0x2055fa30, 0xadf66d76, 0x889176cc, 0xf5254c02,
0793         0x4ffcd7e5, 0xc5d7cb2a, 0x26804435, 0xb58fa362,
0794         0xde495ab1, 0x25671bba, 0x45980eea, 0x5de1c0fe,
0795         0xc302752f, 0x8112f04c, 0x8da39746, 0x6bc6f9d3,
0796         0x03e75f8f, 0x15959c92, 0xbfeb7a6d, 0x95da5952,
0797         0xd42d83be, 0x58d32174, 0x492969e0, 0x8e44c8c9,
0798         0x756a89c2, 0xf478798e, 0x996b3e58, 0x27dd71b9,
0799         0xbeb64fe1, 0xf017ad88, 0xc966ac20, 0x7db43ace,
0800         0x63184adf, 0xe582311a, 0x97603351, 0x62457f53,
0801         0xb1e07764, 0xbb84ae6b, 0xfe1ca081, 0xf9942b08,
0802         0x70586848, 0x8f19fd45, 0x94876cde, 0x52b7f87b,
0803         0xab23d373, 0x72e2024b, 0xe3578f1f, 0x662aab55,
0804         0xb20728eb, 0x2f03c2b5, 0x869a7bc5, 0xd3a50837,
0805         0x30f28728, 0x23b2a5bf, 0x02ba6a03, 0xed5c8216,
0806         0x8a2b1ccf, 0xa792b479, 0xf3f0f207, 0x4ea1e269,
0807         0x65cdf4da, 0x06d5be05, 0xd11f6234, 0xc48afea6,
0808         0x349d532e, 0xa2a055f3, 0x0532e18a, 0xa475ebf6,
0809         0x0b39ec83, 0x40aaef60, 0x5e069f71, 0xbd51106e,
0810         0x3ef98a21, 0x963d06dd, 0xddae053e, 0x4d46bde6,
0811         0x91b58d54, 0x71055dc4, 0x046fd406, 0x60ff1550,
0812         0x1924fb98, 0xd697e9bd, 0x89cc4340, 0x67779ed9,
0813         0xb0bd42e8, 0x07888b89, 0xe7385b19, 0x79dbeec8,
0814         0xa1470a7c, 0x7ce90f42, 0xf8c91e84, 0x00000000,
0815         0x09838680, 0x3248ed2b, 0x1eac7011, 0x6c4e725a,
0816         0xfdfbff0e, 0x0f563885, 0x3d1ed5ae, 0x3627392d,
0817         0x0a64d90f, 0x6821a65c, 0x9bd1545b, 0x243a2e36,
0818         0x0cb1670a, 0x930fe757, 0xb4d296ee, 0x1b9e919b,
0819         0x804fc5c0, 0x61a220dc, 0x5a694b77, 0x1c161a12,
0820         0xe20aba93, 0xc0e52aa0, 0x3c43e022, 0x121d171b,
0821         0x0e0b0d09, 0xf2adc78b, 0x2db9a8b6, 0x14c8a91e,
0822         0x578519f1, 0xaf4c0775, 0xeebbdd99, 0xa3fd607f,
0823         0xf79f2601, 0x5cbcf572, 0x44c53b66, 0x5b347efb,
0824         0x8b762943, 0xcbdcc623, 0xb668fced, 0xb863f1e4,
0825         0xd7cadc31, 0x42108563, 0x13402297, 0x842011c6,
0826         0x857d244a, 0xd2f83dbb, 0xae1132f9, 0xc76da129,
0827         0x1d4b2f9e, 0xdcf330b2, 0x0dec5286, 0x77d0e3c1,
0828         0x2b6c16b3, 0xa999b970, 0x11fa4894, 0x472264e9,
0829         0xa8c48cfc, 0xa01a3ff0, 0x56d82c7d, 0x22ef9033,
0830         0x87c74e49, 0xd9c1d138, 0x8cfea2ca, 0x98360bd4,
0831         0xa6cf81f5, 0xa528de7a, 0xda268eb7, 0x3fa4bfad,
0832         0x2ce49d3a, 0x500d9278, 0x6a9bcc5f, 0x5462467e,
0833         0xf6c2138d, 0x90e8b8d8, 0x2e5ef739, 0x82f5afc3,
0834         0x9fbe805d, 0x697c93d0, 0x6fa92dd5, 0xcfb31225,
0835         0xc83b99ac, 0x10a77d18, 0xe86e639c, 0xdb7bbb3b,
0836         0xcd097826, 0x6ef41859, 0xec01b79a, 0x83a89a4f,
0837         0xe6656e95, 0xaa7ee6ff, 0x2108cfbc, 0xefe6e815,
0838         0xbad99be7, 0x4ace366f, 0xead4099f, 0x29d67cb0,
0839         0x31afb2a4, 0x2a31233f, 0xc63094a5, 0x35c066a2,
0840         0x7437bc4e, 0xfca6ca82, 0xe0b0d090, 0x3315d8a7,
0841         0xf14a9804, 0x41f7daec, 0x7f0e50cd, 0x172ff691,
0842         0x768dd64d, 0x434db0ef, 0xcc544daa, 0xe4df0496,
0843         0x9ee3b5d1, 0x4c1b886a, 0xc1b81f2c, 0x467f5165,
0844         0x9d04ea5e, 0x015d358c, 0xfa737487, 0xfb2e410b,
0845         0xb35a1d67, 0x9252d2db, 0xe9335610, 0x6d1347d6,
0846         0x9a8c61d7, 0x377a0ca1, 0x598e14f8, 0xeb893c13,
0847         0xceee27a9, 0xb735c961, 0xe1ede51c, 0x7a3cb147,
0848         0x9c59dfd2, 0x553f73f2, 0x1879ce14, 0x73bf37c7,
0849         0x53eacdf7, 0x5f5baafd, 0xdf146f3d, 0x7886db44,
0850         0xca81f3af, 0xb93ec468, 0x382c3424, 0xc25f40a3,
0851         0x1672c31d, 0xbc0c25e2, 0x288b493c, 0xff41950d,
0852         0x397101a8, 0x08deb30c, 0xd89ce4b4, 0x6490c156,
0853         0x7b6184cb, 0xd570b632, 0x48745c6c, 0xd04257b8,
0854     }
0855 };
0856 
0857 __visible const u32 crypto_il_tab[4][256] = {
0858     {
0859         0x00000052, 0x00000009, 0x0000006a, 0x000000d5,
0860         0x00000030, 0x00000036, 0x000000a5, 0x00000038,
0861         0x000000bf, 0x00000040, 0x000000a3, 0x0000009e,
0862         0x00000081, 0x000000f3, 0x000000d7, 0x000000fb,
0863         0x0000007c, 0x000000e3, 0x00000039, 0x00000082,
0864         0x0000009b, 0x0000002f, 0x000000ff, 0x00000087,
0865         0x00000034, 0x0000008e, 0x00000043, 0x00000044,
0866         0x000000c4, 0x000000de, 0x000000e9, 0x000000cb,
0867         0x00000054, 0x0000007b, 0x00000094, 0x00000032,
0868         0x000000a6, 0x000000c2, 0x00000023, 0x0000003d,
0869         0x000000ee, 0x0000004c, 0x00000095, 0x0000000b,
0870         0x00000042, 0x000000fa, 0x000000c3, 0x0000004e,
0871         0x00000008, 0x0000002e, 0x000000a1, 0x00000066,
0872         0x00000028, 0x000000d9, 0x00000024, 0x000000b2,
0873         0x00000076, 0x0000005b, 0x000000a2, 0x00000049,
0874         0x0000006d, 0x0000008b, 0x000000d1, 0x00000025,
0875         0x00000072, 0x000000f8, 0x000000f6, 0x00000064,
0876         0x00000086, 0x00000068, 0x00000098, 0x00000016,
0877         0x000000d4, 0x000000a4, 0x0000005c, 0x000000cc,
0878         0x0000005d, 0x00000065, 0x000000b6, 0x00000092,
0879         0x0000006c, 0x00000070, 0x00000048, 0x00000050,
0880         0x000000fd, 0x000000ed, 0x000000b9, 0x000000da,
0881         0x0000005e, 0x00000015, 0x00000046, 0x00000057,
0882         0x000000a7, 0x0000008d, 0x0000009d, 0x00000084,
0883         0x00000090, 0x000000d8, 0x000000ab, 0x00000000,
0884         0x0000008c, 0x000000bc, 0x000000d3, 0x0000000a,
0885         0x000000f7, 0x000000e4, 0x00000058, 0x00000005,
0886         0x000000b8, 0x000000b3, 0x00000045, 0x00000006,
0887         0x000000d0, 0x0000002c, 0x0000001e, 0x0000008f,
0888         0x000000ca, 0x0000003f, 0x0000000f, 0x00000002,
0889         0x000000c1, 0x000000af, 0x000000bd, 0x00000003,
0890         0x00000001, 0x00000013, 0x0000008a, 0x0000006b,
0891         0x0000003a, 0x00000091, 0x00000011, 0x00000041,
0892         0x0000004f, 0x00000067, 0x000000dc, 0x000000ea,
0893         0x00000097, 0x000000f2, 0x000000cf, 0x000000ce,
0894         0x000000f0, 0x000000b4, 0x000000e6, 0x00000073,
0895         0x00000096, 0x000000ac, 0x00000074, 0x00000022,
0896         0x000000e7, 0x000000ad, 0x00000035, 0x00000085,
0897         0x000000e2, 0x000000f9, 0x00000037, 0x000000e8,
0898         0x0000001c, 0x00000075, 0x000000df, 0x0000006e,
0899         0x00000047, 0x000000f1, 0x0000001a, 0x00000071,
0900         0x0000001d, 0x00000029, 0x000000c5, 0x00000089,
0901         0x0000006f, 0x000000b7, 0x00000062, 0x0000000e,
0902         0x000000aa, 0x00000018, 0x000000be, 0x0000001b,
0903         0x000000fc, 0x00000056, 0x0000003e, 0x0000004b,
0904         0x000000c6, 0x000000d2, 0x00000079, 0x00000020,
0905         0x0000009a, 0x000000db, 0x000000c0, 0x000000fe,
0906         0x00000078, 0x000000cd, 0x0000005a, 0x000000f4,
0907         0x0000001f, 0x000000dd, 0x000000a8, 0x00000033,
0908         0x00000088, 0x00000007, 0x000000c7, 0x00000031,
0909         0x000000b1, 0x00000012, 0x00000010, 0x00000059,
0910         0x00000027, 0x00000080, 0x000000ec, 0x0000005f,
0911         0x00000060, 0x00000051, 0x0000007f, 0x000000a9,
0912         0x00000019, 0x000000b5, 0x0000004a, 0x0000000d,
0913         0x0000002d, 0x000000e5, 0x0000007a, 0x0000009f,
0914         0x00000093, 0x000000c9, 0x0000009c, 0x000000ef,
0915         0x000000a0, 0x000000e0, 0x0000003b, 0x0000004d,
0916         0x000000ae, 0x0000002a, 0x000000f5, 0x000000b0,
0917         0x000000c8, 0x000000eb, 0x000000bb, 0x0000003c,
0918         0x00000083, 0x00000053, 0x00000099, 0x00000061,
0919         0x00000017, 0x0000002b, 0x00000004, 0x0000007e,
0920         0x000000ba, 0x00000077, 0x000000d6, 0x00000026,
0921         0x000000e1, 0x00000069, 0x00000014, 0x00000063,
0922         0x00000055, 0x00000021, 0x0000000c, 0x0000007d,
0923     }, {
0924         0x00005200, 0x00000900, 0x00006a00, 0x0000d500,
0925         0x00003000, 0x00003600, 0x0000a500, 0x00003800,
0926         0x0000bf00, 0x00004000, 0x0000a300, 0x00009e00,
0927         0x00008100, 0x0000f300, 0x0000d700, 0x0000fb00,
0928         0x00007c00, 0x0000e300, 0x00003900, 0x00008200,
0929         0x00009b00, 0x00002f00, 0x0000ff00, 0x00008700,
0930         0x00003400, 0x00008e00, 0x00004300, 0x00004400,
0931         0x0000c400, 0x0000de00, 0x0000e900, 0x0000cb00,
0932         0x00005400, 0x00007b00, 0x00009400, 0x00003200,
0933         0x0000a600, 0x0000c200, 0x00002300, 0x00003d00,
0934         0x0000ee00, 0x00004c00, 0x00009500, 0x00000b00,
0935         0x00004200, 0x0000fa00, 0x0000c300, 0x00004e00,
0936         0x00000800, 0x00002e00, 0x0000a100, 0x00006600,
0937         0x00002800, 0x0000d900, 0x00002400, 0x0000b200,
0938         0x00007600, 0x00005b00, 0x0000a200, 0x00004900,
0939         0x00006d00, 0x00008b00, 0x0000d100, 0x00002500,
0940         0x00007200, 0x0000f800, 0x0000f600, 0x00006400,
0941         0x00008600, 0x00006800, 0x00009800, 0x00001600,
0942         0x0000d400, 0x0000a400, 0x00005c00, 0x0000cc00,
0943         0x00005d00, 0x00006500, 0x0000b600, 0x00009200,
0944         0x00006c00, 0x00007000, 0x00004800, 0x00005000,
0945         0x0000fd00, 0x0000ed00, 0x0000b900, 0x0000da00,
0946         0x00005e00, 0x00001500, 0x00004600, 0x00005700,
0947         0x0000a700, 0x00008d00, 0x00009d00, 0x00008400,
0948         0x00009000, 0x0000d800, 0x0000ab00, 0x00000000,
0949         0x00008c00, 0x0000bc00, 0x0000d300, 0x00000a00,
0950         0x0000f700, 0x0000e400, 0x00005800, 0x00000500,
0951         0x0000b800, 0x0000b300, 0x00004500, 0x00000600,
0952         0x0000d000, 0x00002c00, 0x00001e00, 0x00008f00,
0953         0x0000ca00, 0x00003f00, 0x00000f00, 0x00000200,
0954         0x0000c100, 0x0000af00, 0x0000bd00, 0x00000300,
0955         0x00000100, 0x00001300, 0x00008a00, 0x00006b00,
0956         0x00003a00, 0x00009100, 0x00001100, 0x00004100,
0957         0x00004f00, 0x00006700, 0x0000dc00, 0x0000ea00,
0958         0x00009700, 0x0000f200, 0x0000cf00, 0x0000ce00,
0959         0x0000f000, 0x0000b400, 0x0000e600, 0x00007300,
0960         0x00009600, 0x0000ac00, 0x00007400, 0x00002200,
0961         0x0000e700, 0x0000ad00, 0x00003500, 0x00008500,
0962         0x0000e200, 0x0000f900, 0x00003700, 0x0000e800,
0963         0x00001c00, 0x00007500, 0x0000df00, 0x00006e00,
0964         0x00004700, 0x0000f100, 0x00001a00, 0x00007100,
0965         0x00001d00, 0x00002900, 0x0000c500, 0x00008900,
0966         0x00006f00, 0x0000b700, 0x00006200, 0x00000e00,
0967         0x0000aa00, 0x00001800, 0x0000be00, 0x00001b00,
0968         0x0000fc00, 0x00005600, 0x00003e00, 0x00004b00,
0969         0x0000c600, 0x0000d200, 0x00007900, 0x00002000,
0970         0x00009a00, 0x0000db00, 0x0000c000, 0x0000fe00,
0971         0x00007800, 0x0000cd00, 0x00005a00, 0x0000f400,
0972         0x00001f00, 0x0000dd00, 0x0000a800, 0x00003300,
0973         0x00008800, 0x00000700, 0x0000c700, 0x00003100,
0974         0x0000b100, 0x00001200, 0x00001000, 0x00005900,
0975         0x00002700, 0x00008000, 0x0000ec00, 0x00005f00,
0976         0x00006000, 0x00005100, 0x00007f00, 0x0000a900,
0977         0x00001900, 0x0000b500, 0x00004a00, 0x00000d00,
0978         0x00002d00, 0x0000e500, 0x00007a00, 0x00009f00,
0979         0x00009300, 0x0000c900, 0x00009c00, 0x0000ef00,
0980         0x0000a000, 0x0000e000, 0x00003b00, 0x00004d00,
0981         0x0000ae00, 0x00002a00, 0x0000f500, 0x0000b000,
0982         0x0000c800, 0x0000eb00, 0x0000bb00, 0x00003c00,
0983         0x00008300, 0x00005300, 0x00009900, 0x00006100,
0984         0x00001700, 0x00002b00, 0x00000400, 0x00007e00,
0985         0x0000ba00, 0x00007700, 0x0000d600, 0x00002600,
0986         0x0000e100, 0x00006900, 0x00001400, 0x00006300,
0987         0x00005500, 0x00002100, 0x00000c00, 0x00007d00,
0988     }, {
0989         0x00520000, 0x00090000, 0x006a0000, 0x00d50000,
0990         0x00300000, 0x00360000, 0x00a50000, 0x00380000,
0991         0x00bf0000, 0x00400000, 0x00a30000, 0x009e0000,
0992         0x00810000, 0x00f30000, 0x00d70000, 0x00fb0000,
0993         0x007c0000, 0x00e30000, 0x00390000, 0x00820000,
0994         0x009b0000, 0x002f0000, 0x00ff0000, 0x00870000,
0995         0x00340000, 0x008e0000, 0x00430000, 0x00440000,
0996         0x00c40000, 0x00de0000, 0x00e90000, 0x00cb0000,
0997         0x00540000, 0x007b0000, 0x00940000, 0x00320000,
0998         0x00a60000, 0x00c20000, 0x00230000, 0x003d0000,
0999         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 
1121 EXPORT_SYMBOL_GPL(crypto_ft_tab);
1122 EXPORT_SYMBOL_GPL(crypto_fl_tab);
1123 EXPORT_SYMBOL_GPL(crypto_it_tab);
1124 EXPORT_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  */
1216 int 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 }
1269 EXPORT_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  */
1282 int 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 }
1296 EXPORT_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 
1329 static 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 
1401 static 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 
1442 static 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 
1462 static int __init aes_init(void)
1463 {
1464     return crypto_register_alg(&aes_alg);
1465 }
1466 
1467 static void __exit aes_fini(void)
1468 {
1469     crypto_unregister_alg(&aes_alg);
1470 }
1471 
1472 module_init(aes_init);
1473 module_exit(aes_fini);
1474 
1475 MODULE_DESCRIPTION("Rijndael (AES) Cipher Algorithm");
1476 MODULE_LICENSE("Dual BSD/GPL");
1477 MODULE_ALIAS_CRYPTO("aes");
1478 MODULE_ALIAS_CRYPTO("aes-generic");