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