CyaSSL is an SSL library for devices like mbed.
Fork of CyaSSL by
Embed:
(wiki syntax)
Show/hide line numbers
aes.c
00001 /* aes.c 00002 * 00003 * Copyright (C) 2006-2009 Sawtooth Consulting Ltd. 00004 * 00005 * This file is part of CyaSSL. 00006 * 00007 * CyaSSL is free software; you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published by 00009 * the Free Software Foundation; either version 2 of the License, or 00010 * (at your option) any later version. 00011 * 00012 * CyaSSL is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00015 * GNU General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU General Public License 00018 * along with this program; if not, write to the Free Software 00019 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA 00020 */ 00021 00022 #ifndef NO_AES 00023 00024 #include "ctc_aes.h" 00025 #ifdef NO_INLINE 00026 #include "misc.h" 00027 #else 00028 #include "misc.c" 00029 #endif 00030 00031 00032 static const word32 rcon[] = { 00033 0x01000000, 0x02000000, 0x04000000, 0x08000000, 00034 0x10000000, 0x20000000, 0x40000000, 0x80000000, 00035 0x1B000000, 0x36000000, 00036 /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */ 00037 }; 00038 00039 00040 static const word32 Te[5][256] = { 00041 { 00042 0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 00043 0xfff2f20dU, 0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 00044 0x60303050U, 0x02010103U, 0xce6767a9U, 0x562b2b7dU, 00045 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U, 0xec76769aU, 00046 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U, 00047 0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 00048 0x41adadecU, 0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 00049 0x239c9cbfU, 0x53a4a4f7U, 0xe4727296U, 0x9bc0c05bU, 00050 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU, 0x4c26266aU, 00051 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU, 00052 0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 00053 0xe2717193U, 0xabd8d873U, 0x62313153U, 0x2a15153fU, 00054 0x0804040cU, 0x95c7c752U, 0x46232365U, 0x9dc3c35eU, 00055 0x30181828U, 0x379696a1U, 0x0a05050fU, 0x2f9a9ab5U, 00056 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU, 00057 0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 00058 0x1209091bU, 0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 00059 0x361b1b2dU, 0xdc6e6eb2U, 0xb45a5aeeU, 0x5ba0a0fbU, 00060 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U, 0x7db3b3ceU, 00061 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U, 00062 0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 00063 0x40202060U, 0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 00064 0xd46a6abeU, 0x8dcbcb46U, 0x67bebed9U, 0x7239394bU, 00065 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U, 0x85cfcf4aU, 00066 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U, 00067 0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 00068 0x8a4545cfU, 0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 00069 0xa05050f0U, 0x783c3c44U, 0x259f9fbaU, 0x4ba8a8e3U, 00070 0xa25151f3U, 0x5da3a3feU, 0x804040c0U, 0x058f8f8aU, 00071 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U, 00072 0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 00073 0x20101030U, 0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 00074 0x81cdcd4cU, 0x180c0c14U, 0x26131335U, 0xc3ecec2fU, 00075 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU, 0x2e171739U, 00076 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U, 00077 0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 00078 0xc06060a0U, 0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 00079 0x44222266U, 0x542a2a7eU, 0x3b9090abU, 0x0b888883U, 00080 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U, 0x2814143cU, 00081 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U, 00082 0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 00083 0x924949dbU, 0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 00084 0x9fc2c25dU, 0xbdd3d36eU, 0x43acacefU, 0xc46262a6U, 00085 0x399191a8U, 0x319595a4U, 0xd3e4e437U, 0xf279798bU, 00086 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U, 00087 0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 00088 0xd86c6cb4U, 0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 00089 0xca6565afU, 0xf47a7a8eU, 0x47aeaee9U, 0x10080818U, 00090 0x6fbabad5U, 0xf0787888U, 0x4a25256fU, 0x5c2e2e72U, 00091 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U, 00092 0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 00093 0x964b4bddU, 0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 00094 0xe0707090U, 0x7c3e3e42U, 0x71b5b5c4U, 0xcc6666aaU, 00095 0x904848d8U, 0x06030305U, 0xf7f6f601U, 0x1c0e0e12U, 00096 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U, 00097 0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 00098 0xd9e1e138U, 0xebf8f813U, 0x2b9898b3U, 0x22111133U, 00099 0xd26969bbU, 0xa9d9d970U, 0x078e8e89U, 0x339494a7U, 00100 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U, 0xc9e9e920U, 00101 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU, 00102 0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 00103 0x65bfbfdaU, 0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 00104 0x824141c3U, 0x299999b0U, 0x5a2d2d77U, 0x1e0f0f11U, 00105 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U, 0x2c16163aU, 00106 }, 00107 { 00108 0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 00109 0x0dfff2f2U, 0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 00110 0x50603030U, 0x03020101U, 0xa9ce6767U, 0x7d562b2bU, 00111 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU, 0x9aec7676U, 00112 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU, 00113 0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 00114 0xec41adadU, 0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 00115 0xbf239c9cU, 0xf753a4a4U, 0x96e47272U, 0x5b9bc0c0U, 00116 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U, 0x6a4c2626U, 00117 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU, 00118 0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 00119 0x93e27171U, 0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 00120 0x0c080404U, 0x5295c7c7U, 0x65462323U, 0x5e9dc3c3U, 00121 0x28301818U, 0xa1379696U, 0x0f0a0505U, 0xb52f9a9aU, 00122 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U, 00123 0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 00124 0x1b120909U, 0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 00125 0x2d361b1bU, 0xb2dc6e6eU, 0xeeb45a5aU, 0xfb5ba0a0U, 00126 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U, 0xce7db3b3U, 00127 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U, 00128 0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 00129 0x60402020U, 0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 00130 0xbed46a6aU, 0x468dcbcbU, 0xd967bebeU, 0x4b723939U, 00131 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U, 0x4a85cfcfU, 00132 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU, 00133 0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 00134 0xcf8a4545U, 0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 00135 0xf0a05050U, 0x44783c3cU, 0xba259f9fU, 0xe34ba8a8U, 00136 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U, 0x8a058f8fU, 00137 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U, 00138 0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 00139 0x30201010U, 0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 00140 0x4c81cdcdU, 0x14180c0cU, 0x35261313U, 0x2fc3ececU, 00141 0xe1be5f5fU, 0xa2359797U, 0xcc884444U, 0x392e1717U, 00142 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU, 00143 0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 00144 0xa0c06060U, 0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 00145 0x66442222U, 0x7e542a2aU, 0xab3b9090U, 0x830b8888U, 00146 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U, 0x3c281414U, 00147 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU, 00148 0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 00149 0xdb924949U, 0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 00150 0x5d9fc2c2U, 0x6ebdd3d3U, 0xef43acacU, 0xa6c46262U, 00151 0xa8399191U, 0xa4319595U, 0x37d3e4e4U, 0x8bf27979U, 00152 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU, 00153 0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 00154 0xb4d86c6cU, 0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 00155 0xafca6565U, 0x8ef47a7aU, 0xe947aeaeU, 0x18100808U, 00156 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U, 0x725c2e2eU, 00157 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U, 00158 0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 00159 0xdd964b4bU, 0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 00160 0x90e07070U, 0x427c3e3eU, 0xc471b5b5U, 0xaacc6666U, 00161 0xd8904848U, 0x05060303U, 0x01f7f6f6U, 0x121c0e0eU, 00162 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U, 00163 0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 00164 0x38d9e1e1U, 0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 00165 0xbbd26969U, 0x70a9d9d9U, 0x89078e8eU, 0xa7339494U, 00166 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U, 0x20c9e9e9U, 00167 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU, 00168 0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 00169 0xda65bfbfU, 0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 00170 0xc3824141U, 0xb0299999U, 0x775a2d2dU, 0x111e0f0fU, 00171 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU, 0x3a2c1616U, 00172 }, 00173 { 00174 0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 00175 0xf20dfff2U, 0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 00176 0x30506030U, 0x01030201U, 0x67a9ce67U, 0x2b7d562bU, 00177 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU, 0x769aec76U, 00178 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU, 00179 0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 00180 0xadec41adU, 0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 00181 0x9cbf239cU, 0xa4f753a4U, 0x7296e472U, 0xc05b9bc0U, 00182 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U, 0x266a4c26U, 00183 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU, 00184 0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 00185 0x7193e271U, 0xd873abd8U, 0x31536231U, 0x153f2a15U, 00186 0x040c0804U, 0xc75295c7U, 0x23654623U, 0xc35e9dc3U, 00187 0x18283018U, 0x96a13796U, 0x050f0a05U, 0x9ab52f9aU, 00188 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U, 00189 0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 00190 0x091b1209U, 0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 00191 0x1b2d361bU, 0x6eb2dc6eU, 0x5aeeb45aU, 0xa0fb5ba0U, 00192 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U, 0xb3ce7db3U, 00193 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U, 00194 0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 00195 0x20604020U, 0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 00196 0x6abed46aU, 0xcb468dcbU, 0xbed967beU, 0x394b7239U, 00197 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U, 0xcf4a85cfU, 00198 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU, 00199 0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 00200 0x45cf8a45U, 0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 00201 0x50f0a050U, 0x3c44783cU, 0x9fba259fU, 0xa8e34ba8U, 00202 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U, 0x8f8a058fU, 00203 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U, 00204 0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 00205 0x10302010U, 0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 00206 0xcd4c81cdU, 0x0c14180cU, 0x13352613U, 0xec2fc3ecU, 00207 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U, 0x17392e17U, 00208 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU, 00209 0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 00210 0x60a0c060U, 0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 00211 0x22664422U, 0x2a7e542aU, 0x90ab3b90U, 0x88830b88U, 00212 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U, 0x143c2814U, 00213 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU, 00214 0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 00215 0x49db9249U, 0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 00216 0xc25d9fc2U, 0xd36ebdd3U, 0xacef43acU, 0x62a6c462U, 00217 0x91a83991U, 0x95a43195U, 0xe437d3e4U, 0x798bf279U, 00218 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU, 00219 0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 00220 0x6cb4d86cU, 0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 00221 0x65afca65U, 0x7a8ef47aU, 0xaee947aeU, 0x08181008U, 00222 0xbad56fbaU, 0x7888f078U, 0x256f4a25U, 0x2e725c2eU, 00223 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U, 00224 0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 00225 0x4bdd964bU, 0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 00226 0x7090e070U, 0x3e427c3eU, 0xb5c471b5U, 0x66aacc66U, 00227 0x48d89048U, 0x03050603U, 0xf601f7f6U, 0x0e121c0eU, 00228 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U, 00229 0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 00230 0xe138d9e1U, 0xf813ebf8U, 0x98b32b98U, 0x11332211U, 00231 0x69bbd269U, 0xd970a9d9U, 0x8e89078eU, 0x94a73394U, 00232 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U, 0xe920c9e9U, 00233 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU, 00234 0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 00235 0xbfda65bfU, 0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 00236 0x41c38241U, 0x99b02999U, 0x2d775a2dU, 0x0f111e0fU, 00237 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU, 0x163a2c16U, 00238 }, 00239 { 00240 0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 00241 0xf2f20dffU, 0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 00242 0x30305060U, 0x01010302U, 0x6767a9ceU, 0x2b2b7d56U, 00243 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU, 0x76769aecU, 00244 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU, 00245 0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 00246 0xadadec41U, 0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 00247 0x9c9cbf23U, 0xa4a4f753U, 0x727296e4U, 0xc0c05b9bU, 00248 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU, 0x26266a4cU, 00249 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U, 00250 0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 00251 0x717193e2U, 0xd8d873abU, 0x31315362U, 0x15153f2aU, 00252 0x04040c08U, 0xc7c75295U, 0x23236546U, 0xc3c35e9dU, 00253 0x18182830U, 0x9696a137U, 0x05050f0aU, 0x9a9ab52fU, 00254 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU, 00255 0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 00256 0x09091b12U, 0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 00257 0x1b1b2d36U, 0x6e6eb2dcU, 0x5a5aeeb4U, 0xa0a0fb5bU, 00258 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U, 0xb3b3ce7dU, 00259 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U, 00260 0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 00261 0x20206040U, 0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 00262 0x6a6abed4U, 0xcbcb468dU, 0xbebed967U, 0x39394b72U, 00263 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U, 0xcfcf4a85U, 00264 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU, 00265 0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 00266 0x4545cf8aU, 0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 00267 0x5050f0a0U, 0x3c3c4478U, 0x9f9fba25U, 0xa8a8e34bU, 00268 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U, 0x8f8f8a05U, 00269 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U, 00270 0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 00271 0x10103020U, 0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 00272 0xcdcd4c81U, 0x0c0c1418U, 0x13133526U, 0xecec2fc3U, 00273 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U, 0x1717392eU, 00274 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU, 00275 0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 00276 0x6060a0c0U, 0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 00277 0x22226644U, 0x2a2a7e54U, 0x9090ab3bU, 0x8888830bU, 00278 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU, 0x14143c28U, 00279 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU, 00280 0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 00281 0x4949db92U, 0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 00282 0xc2c25d9fU, 0xd3d36ebdU, 0xacacef43U, 0x6262a6c4U, 00283 0x9191a839U, 0x9595a431U, 0xe4e437d3U, 0x79798bf2U, 00284 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU, 00285 0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 00286 0x6c6cb4d8U, 0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 00287 0x6565afcaU, 0x7a7a8ef4U, 0xaeaee947U, 0x08081810U, 00288 0xbabad56fU, 0x787888f0U, 0x25256f4aU, 0x2e2e725cU, 00289 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U, 00290 0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 00291 0x4b4bdd96U, 0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 00292 0x707090e0U, 0x3e3e427cU, 0xb5b5c471U, 0x6666aaccU, 00293 0x4848d890U, 0x03030506U, 0xf6f601f7U, 0x0e0e121cU, 00294 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U, 00295 0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 00296 0xe1e138d9U, 0xf8f813ebU, 0x9898b32bU, 0x11113322U, 00297 0x6969bbd2U, 0xd9d970a9U, 0x8e8e8907U, 0x9494a733U, 00298 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U, 0xe9e920c9U, 00299 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U, 00300 0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 00301 0xbfbfda65U, 0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 00302 0x4141c382U, 0x9999b029U, 0x2d2d775aU, 0x0f0f111eU, 00303 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU, 0x16163a2cU, 00304 }, 00305 { 00306 0x63636363U, 0x7c7c7c7cU, 0x77777777U, 0x7b7b7b7bU, 00307 0xf2f2f2f2U, 0x6b6b6b6bU, 0x6f6f6f6fU, 0xc5c5c5c5U, 00308 0x30303030U, 0x01010101U, 0x67676767U, 0x2b2b2b2bU, 00309 0xfefefefeU, 0xd7d7d7d7U, 0xababababU, 0x76767676U, 00310 0xcacacacaU, 0x82828282U, 0xc9c9c9c9U, 0x7d7d7d7dU, 00311 0xfafafafaU, 0x59595959U, 0x47474747U, 0xf0f0f0f0U, 00312 0xadadadadU, 0xd4d4d4d4U, 0xa2a2a2a2U, 0xafafafafU, 00313 0x9c9c9c9cU, 0xa4a4a4a4U, 0x72727272U, 0xc0c0c0c0U, 00314 0xb7b7b7b7U, 0xfdfdfdfdU, 0x93939393U, 0x26262626U, 00315 0x36363636U, 0x3f3f3f3fU, 0xf7f7f7f7U, 0xccccccccU, 00316 0x34343434U, 0xa5a5a5a5U, 0xe5e5e5e5U, 0xf1f1f1f1U, 00317 0x71717171U, 0xd8d8d8d8U, 0x31313131U, 0x15151515U, 00318 0x04040404U, 0xc7c7c7c7U, 0x23232323U, 0xc3c3c3c3U, 00319 0x18181818U, 0x96969696U, 0x05050505U, 0x9a9a9a9aU, 00320 0x07070707U, 0x12121212U, 0x80808080U, 0xe2e2e2e2U, 00321 0xebebebebU, 0x27272727U, 0xb2b2b2b2U, 0x75757575U, 00322 0x09090909U, 0x83838383U, 0x2c2c2c2cU, 0x1a1a1a1aU, 00323 0x1b1b1b1bU, 0x6e6e6e6eU, 0x5a5a5a5aU, 0xa0a0a0a0U, 00324 0x52525252U, 0x3b3b3b3bU, 0xd6d6d6d6U, 0xb3b3b3b3U, 00325 0x29292929U, 0xe3e3e3e3U, 0x2f2f2f2fU, 0x84848484U, 00326 0x53535353U, 0xd1d1d1d1U, 0x00000000U, 0xededededU, 00327 0x20202020U, 0xfcfcfcfcU, 0xb1b1b1b1U, 0x5b5b5b5bU, 00328 0x6a6a6a6aU, 0xcbcbcbcbU, 0xbebebebeU, 0x39393939U, 00329 0x4a4a4a4aU, 0x4c4c4c4cU, 0x58585858U, 0xcfcfcfcfU, 00330 0xd0d0d0d0U, 0xefefefefU, 0xaaaaaaaaU, 0xfbfbfbfbU, 00331 0x43434343U, 0x4d4d4d4dU, 0x33333333U, 0x85858585U, 00332 0x45454545U, 0xf9f9f9f9U, 0x02020202U, 0x7f7f7f7fU, 00333 0x50505050U, 0x3c3c3c3cU, 0x9f9f9f9fU, 0xa8a8a8a8U, 00334 0x51515151U, 0xa3a3a3a3U, 0x40404040U, 0x8f8f8f8fU, 00335 0x92929292U, 0x9d9d9d9dU, 0x38383838U, 0xf5f5f5f5U, 00336 0xbcbcbcbcU, 0xb6b6b6b6U, 0xdadadadaU, 0x21212121U, 00337 0x10101010U, 0xffffffffU, 0xf3f3f3f3U, 0xd2d2d2d2U, 00338 0xcdcdcdcdU, 0x0c0c0c0cU, 0x13131313U, 0xececececU, 00339 0x5f5f5f5fU, 0x97979797U, 0x44444444U, 0x17171717U, 00340 0xc4c4c4c4U, 0xa7a7a7a7U, 0x7e7e7e7eU, 0x3d3d3d3dU, 00341 0x64646464U, 0x5d5d5d5dU, 0x19191919U, 0x73737373U, 00342 0x60606060U, 0x81818181U, 0x4f4f4f4fU, 0xdcdcdcdcU, 00343 0x22222222U, 0x2a2a2a2aU, 0x90909090U, 0x88888888U, 00344 0x46464646U, 0xeeeeeeeeU, 0xb8b8b8b8U, 0x14141414U, 00345 0xdedededeU, 0x5e5e5e5eU, 0x0b0b0b0bU, 0xdbdbdbdbU, 00346 0xe0e0e0e0U, 0x32323232U, 0x3a3a3a3aU, 0x0a0a0a0aU, 00347 0x49494949U, 0x06060606U, 0x24242424U, 0x5c5c5c5cU, 00348 0xc2c2c2c2U, 0xd3d3d3d3U, 0xacacacacU, 0x62626262U, 00349 0x91919191U, 0x95959595U, 0xe4e4e4e4U, 0x79797979U, 00350 0xe7e7e7e7U, 0xc8c8c8c8U, 0x37373737U, 0x6d6d6d6dU, 00351 0x8d8d8d8dU, 0xd5d5d5d5U, 0x4e4e4e4eU, 0xa9a9a9a9U, 00352 0x6c6c6c6cU, 0x56565656U, 0xf4f4f4f4U, 0xeaeaeaeaU, 00353 0x65656565U, 0x7a7a7a7aU, 0xaeaeaeaeU, 0x08080808U, 00354 0xbabababaU, 0x78787878U, 0x25252525U, 0x2e2e2e2eU, 00355 0x1c1c1c1cU, 0xa6a6a6a6U, 0xb4b4b4b4U, 0xc6c6c6c6U, 00356 0xe8e8e8e8U, 0xddddddddU, 0x74747474U, 0x1f1f1f1fU, 00357 0x4b4b4b4bU, 0xbdbdbdbdU, 0x8b8b8b8bU, 0x8a8a8a8aU, 00358 0x70707070U, 0x3e3e3e3eU, 0xb5b5b5b5U, 0x66666666U, 00359 0x48484848U, 0x03030303U, 0xf6f6f6f6U, 0x0e0e0e0eU, 00360 0x61616161U, 0x35353535U, 0x57575757U, 0xb9b9b9b9U, 00361 0x86868686U, 0xc1c1c1c1U, 0x1d1d1d1dU, 0x9e9e9e9eU, 00362 0xe1e1e1e1U, 0xf8f8f8f8U, 0x98989898U, 0x11111111U, 00363 0x69696969U, 0xd9d9d9d9U, 0x8e8e8e8eU, 0x94949494U, 00364 0x9b9b9b9bU, 0x1e1e1e1eU, 0x87878787U, 0xe9e9e9e9U, 00365 0xcecececeU, 0x55555555U, 0x28282828U, 0xdfdfdfdfU, 00366 0x8c8c8c8cU, 0xa1a1a1a1U, 0x89898989U, 0x0d0d0d0dU, 00367 0xbfbfbfbfU, 0xe6e6e6e6U, 0x42424242U, 0x68686868U, 00368 0x41414141U, 0x99999999U, 0x2d2d2d2dU, 0x0f0f0f0fU, 00369 0xb0b0b0b0U, 0x54545454U, 0xbbbbbbbbU, 0x16161616U, 00370 } 00371 }; 00372 00373 00374 static const word32 Td[5][256] = { 00375 { 00376 0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 00377 0x3bab6bcbU, 0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 00378 0x2030fa55U, 0xad766df6U, 0x88cc7691U, 0xf5024c25U, 00379 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U, 0xb562a38fU, 00380 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U, 00381 0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 00382 0x038f5fe7U, 0x15929c95U, 0xbf6d7aebU, 0x955259daU, 00383 0xd4be832dU, 0x587421d3U, 0x49e06929U, 0x8ec9c844U, 00384 0x75c2896aU, 0xf48e7978U, 0x99583e6bU, 0x27b971ddU, 00385 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U, 00386 0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 00387 0xb16477e0U, 0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 00388 0x70486858U, 0x8f45fd19U, 0x94de6c87U, 0x527bf8b7U, 00389 0xab73d323U, 0x724b02e2U, 0xe31f8f57U, 0x6655ab2aU, 00390 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U, 00391 0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 00392 0x8acf1c2bU, 0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 00393 0x65daf4cdU, 0x0605bed5U, 0xd134621fU, 0xc4a6fe8aU, 00394 0x342e539dU, 0xa2f355a0U, 0x058ae132U, 0xa4f6eb75U, 00395 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U, 00396 0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 00397 0x91548db5U, 0x71c45d05U, 0x0406d46fU, 0x605015ffU, 00398 0x1998fb24U, 0xd6bde997U, 0x894043ccU, 0x67d99e77U, 00399 0xb0e842bdU, 0x07898b88U, 0xe7195b38U, 0x79c8eedbU, 00400 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U, 00401 0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 00402 0xfd0efffbU, 0x0f853856U, 0x3daed51eU, 0x362d3927U, 00403 0x0a0fd964U, 0x685ca621U, 0x9b5b54d1U, 0x24362e3aU, 00404 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U, 0x1b9b919eU, 00405 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U, 00406 0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 00407 0x0e090d0bU, 0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 00408 0x57f11985U, 0xaf75074cU, 0xee99ddbbU, 0xa37f60fdU, 00409 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U, 0x5bfb7e34U, 00410 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U, 00411 0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 00412 0x854a247dU, 0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 00413 0x1d9e2f4bU, 0xdcb230f3U, 0x0d8652ecU, 0x77c1e3d0U, 00414 0x2bb3166cU, 0xa970b999U, 0x119448faU, 0x47e96422U, 00415 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU, 00416 0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 00417 0xa6f581cfU, 0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 00418 0x2c3a9de4U, 0x5078920dU, 0x6a5fcc9bU, 0x547e4662U, 00419 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU, 0x82c3aff5U, 00420 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U, 00421 0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 00422 0xcd267809U, 0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 00423 0xe6956e65U, 0xaaffe67eU, 0x21bccf08U, 0xef15e8e6U, 00424 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U, 0x29b07cd6U, 00425 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U, 00426 0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 00427 0xf104984aU, 0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 00428 0x764dd68dU, 0x43efb04dU, 0xccaa4d54U, 0xe49604dfU, 00429 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U, 0x4665517fU, 00430 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU, 00431 0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 00432 0x9ad7618cU, 0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 00433 0xcea927eeU, 0xb761c935U, 0xe11ce5edU, 0x7a47b13cU, 00434 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U, 0x73c737bfU, 00435 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U, 00436 0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 00437 0x161dc372U, 0xbce2250cU, 0x283c498bU, 0xff0d9541U, 00438 0x39a80171U, 0x080cb3deU, 0xd8b4e49cU, 0x6456c190U, 00439 0x7bcb8461U, 0xd532b670U, 0x486c5c74U, 0xd0b85742U, 00440 }, 00441 { 00442 0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 00443 0xcb3bab6bU, 0xf11f9d45U, 0xabacfa58U, 0x934be303U, 00444 0x552030faU, 0xf6ad766dU, 0x9188cc76U, 0x25f5024cU, 00445 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U, 0x8fb562a3U, 00446 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U, 00447 0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 00448 0xe7038f5fU, 0x9515929cU, 0xebbf6d7aU, 0xda955259U, 00449 0x2dd4be83U, 0xd3587421U, 0x2949e069U, 0x448ec9c8U, 00450 0x6a75c289U, 0x78f48e79U, 0x6b99583eU, 0xdd27b971U, 00451 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU, 00452 0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 00453 0xe0b16477U, 0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 00454 0x58704868U, 0x198f45fdU, 0x8794de6cU, 0xb7527bf8U, 00455 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU, 0x2a6655abU, 00456 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U, 00457 0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 00458 0x2b8acf1cU, 0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 00459 0xcd65daf4U, 0xd50605beU, 0x1fd13462U, 0x8ac4a6feU, 00460 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U, 0x75a4f6ebU, 00461 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U, 00462 0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 00463 0xb591548dU, 0x0571c45dU, 0x6f0406d4U, 0xff605015U, 00464 0x241998fbU, 0x97d6bde9U, 0xcc894043U, 0x7767d99eU, 00465 0xbdb0e842U, 0x8807898bU, 0x38e7195bU, 0xdb79c8eeU, 00466 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U, 00467 0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 00468 0xfbfd0effU, 0x560f8538U, 0x1e3daed5U, 0x27362d39U, 00469 0x640a0fd9U, 0x21685ca6U, 0xd19b5b54U, 0x3a24362eU, 00470 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U, 0x9e1b9b91U, 00471 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU, 00472 0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 00473 0x0b0e090dU, 0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 00474 0x8557f119U, 0x4caf7507U, 0xbbee99ddU, 0xfda37f60U, 00475 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU, 0x345bfb7eU, 00476 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U, 00477 0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 00478 0x7d854a24U, 0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 00479 0x4b1d9e2fU, 0xf3dcb230U, 0xec0d8652U, 0xd077c1e3U, 00480 0x6c2bb316U, 0x99a970b9U, 0xfa119448U, 0x2247e964U, 00481 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U, 00482 0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 00483 0xcfa6f581U, 0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 00484 0xe42c3a9dU, 0x0d507892U, 0x9b6a5fccU, 0x62547e46U, 00485 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U, 0xf582c3afU, 00486 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U, 00487 0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 00488 0x09cd2678U, 0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 00489 0x65e6956eU, 0x7eaaffe6U, 0x0821bccfU, 0xe6ef15e8U, 00490 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U, 0xd629b07cU, 00491 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U, 00492 0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 00493 0x4af10498U, 0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 00494 0x8d764dd6U, 0x4d43efb0U, 0x54ccaa4dU, 0xdfe49604U, 00495 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU, 0x7f466551U, 00496 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U, 00497 0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 00498 0x8c9ad761U, 0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 00499 0xeecea927U, 0x35b761c9U, 0xede11ce5U, 0x3c7a47b1U, 00500 0x599cd2dfU, 0x3f55f273U, 0x791814ceU, 0xbf73c737U, 00501 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU, 00502 0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 00503 0x72161dc3U, 0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 00504 0x7139a801U, 0xde080cb3U, 0x9cd8b4e4U, 0x906456c1U, 00505 0x617bcb84U, 0x70d532b6U, 0x74486c5cU, 0x42d0b857U, 00506 }, 00507 { 00508 0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 00509 0x6bcb3babU, 0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 00510 0xfa552030U, 0x6df6ad76U, 0x769188ccU, 0x4c25f502U, 00511 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U, 0xa38fb562U, 00512 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU, 00513 0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 00514 0x5fe7038fU, 0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 00515 0x832dd4beU, 0x21d35874U, 0x692949e0U, 0xc8448ec9U, 00516 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U, 0x71dd27b9U, 00517 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU, 00518 0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 00519 0x77e0b164U, 0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 00520 0x68587048U, 0xfd198f45U, 0x6c8794deU, 0xf8b7527bU, 00521 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU, 0xab2a6655U, 00522 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U, 00523 0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 00524 0x1c2b8acfU, 0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 00525 0xf4cd65daU, 0xbed50605U, 0x621fd134U, 0xfe8ac4a6U, 00526 0x539d342eU, 0x55a0a2f3U, 0xe132058aU, 0xeb75a4f6U, 00527 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU, 00528 00529 0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 00530 0x8db59154U, 0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 00531 0xfb241998U, 0xe997d6bdU, 0x43cc8940U, 0x9e7767d9U, 00532 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U, 0xeedb79c8U, 00533 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U, 00534 0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 00535 0xfffbfd0eU, 0x38560f85U, 0xd51e3daeU, 0x3927362dU, 00536 0xd9640a0fU, 0xa621685cU, 0x54d19b5bU, 0x2e3a2436U, 00537 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU, 0x919e1b9bU, 00538 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U, 00539 0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 00540 0x0d0b0e09U, 0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 00541 0x198557f1U, 0x074caf75U, 0xddbbee99U, 0x60fda37fU, 00542 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U, 0x7e345bfbU, 00543 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U, 00544 0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 00545 0x247d854aU, 0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 00546 0x2f4b1d9eU, 0x30f3dcb2U, 0x52ec0d86U, 0xe3d077c1U, 00547 0x166c2bb3U, 0xb999a970U, 0x48fa1194U, 0x642247e9U, 00548 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U, 00549 0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 00550 0x81cfa6f5U, 0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 00551 0x9de42c3aU, 0x920d5078U, 0xcc9b6a5fU, 0x4662547eU, 00552 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U, 0xaff582c3U, 00553 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U, 00554 0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 00555 0x7809cd26U, 0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 00556 0x6e65e695U, 0xe67eaaffU, 0xcf0821bcU, 0xe8e6ef15U, 00557 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU, 0x7cd629b0U, 00558 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U, 00559 0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 00560 0x984af104U, 0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 00561 0xd68d764dU, 0xb04d43efU, 0x4d54ccaaU, 0x04dfe496U, 00562 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU, 0x517f4665U, 00563 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU, 00564 0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 00565 0x618c9ad7U, 0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 00566 0x27eecea9U, 0xc935b761U, 0xe5ede11cU, 0xb13c7a47U, 00567 0xdf599cd2U, 0x733f55f2U, 0xce791814U, 0x37bf73c7U, 00568 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U, 00569 0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 00570 0xc372161dU, 0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 00571 0x017139a8U, 0xb3de080cU, 0xe49cd8b4U, 0xc1906456U, 00572 0x84617bcbU, 0xb670d532U, 0x5c74486cU, 0x5742d0b8U, 00573 }, 00574 { 00575 0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 00576 0xab6bcb3bU, 0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 00577 0x30fa5520U, 0x766df6adU, 0xcc769188U, 0x024c25f5U, 00578 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U, 0x62a38fb5U, 00579 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU, 00580 0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 00581 0x8f5fe703U, 0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 00582 0xbe832dd4U, 0x7421d358U, 0xe0692949U, 0xc9c8448eU, 00583 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U, 0xb971dd27U, 00584 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU, 00585 0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 00586 0x6477e0b1U, 0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 00587 0x48685870U, 0x45fd198fU, 0xde6c8794U, 0x7bf8b752U, 00588 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U, 0x55ab2a66U, 00589 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U, 00590 0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 00591 0xcf1c2b8aU, 0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 00592 0xdaf4cd65U, 0x05bed506U, 0x34621fd1U, 0xa6fe8ac4U, 00593 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U, 0xf6eb75a4U, 00594 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU, 00595 0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 00596 0x548db591U, 0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 00597 0x98fb2419U, 0xbde997d6U, 0x4043cc89U, 0xd99e7767U, 00598 0xe842bdb0U, 0x898b8807U, 0x195b38e7U, 0xc8eedb79U, 00599 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U, 00600 0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 00601 0x0efffbfdU, 0x8538560fU, 0xaed51e3dU, 0x2d392736U, 00602 0x0fd9640aU, 0x5ca62168U, 0x5b54d19bU, 0x362e3a24U, 00603 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U, 0x9b919e1bU, 00604 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU, 00605 0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 00606 0x090d0b0eU, 0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 00607 0xf1198557U, 0x75074cafU, 0x99ddbbeeU, 0x7f60fda3U, 00608 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U, 0xfb7e345bU, 00609 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U, 00610 0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 00611 0x4a247d85U, 0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 00612 0x9e2f4b1dU, 0xb230f3dcU, 0x8652ec0dU, 0xc1e3d077U, 00613 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U, 0xe9642247U, 00614 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U, 00615 0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 00616 0xf581cfa6U, 0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 00617 0x3a9de42cU, 0x78920d50U, 0x5fcc9b6aU, 0x7e466254U, 00618 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU, 0xc3aff582U, 00619 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU, 00620 0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 00621 0x267809cdU, 0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 00622 0x956e65e6U, 0xffe67eaaU, 0xbccf0821U, 0x15e8e6efU, 00623 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU, 0xb07cd629U, 00624 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U, 00625 0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 00626 0x04984af1U, 0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 00627 0x4dd68d76U, 0xefb04d43U, 0xaa4d54ccU, 0x9604dfe4U, 00628 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U, 0x65517f46U, 00629 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU, 00630 0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 00631 0xd7618c9aU, 0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 00632 0xa927eeceU, 0x61c935b7U, 0x1ce5ede1U, 0x47b13c7aU, 00633 0xd2df599cU, 0xf2733f55U, 0x14ce7918U, 0xc737bf73U, 00634 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U, 00635 0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 00636 0x1dc37216U, 0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 00637 0xa8017139U, 0x0cb3de08U, 0xb4e49cd8U, 0x56c19064U, 00638 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U, 0xb85742d0U, 00639 }, 00640 { 00641 0x52525252U, 0x09090909U, 0x6a6a6a6aU, 0xd5d5d5d5U, 00642 0x30303030U, 0x36363636U, 0xa5a5a5a5U, 0x38383838U, 00643 0xbfbfbfbfU, 0x40404040U, 0xa3a3a3a3U, 0x9e9e9e9eU, 00644 0x81818181U, 0xf3f3f3f3U, 0xd7d7d7d7U, 0xfbfbfbfbU, 00645 0x7c7c7c7cU, 0xe3e3e3e3U, 0x39393939U, 0x82828282U, 00646 0x9b9b9b9bU, 0x2f2f2f2fU, 0xffffffffU, 0x87878787U, 00647 0x34343434U, 0x8e8e8e8eU, 0x43434343U, 0x44444444U, 00648 0xc4c4c4c4U, 0xdedededeU, 0xe9e9e9e9U, 0xcbcbcbcbU, 00649 0x54545454U, 0x7b7b7b7bU, 0x94949494U, 0x32323232U, 00650 0xa6a6a6a6U, 0xc2c2c2c2U, 0x23232323U, 0x3d3d3d3dU, 00651 0xeeeeeeeeU, 0x4c4c4c4cU, 0x95959595U, 0x0b0b0b0bU, 00652 0x42424242U, 0xfafafafaU, 0xc3c3c3c3U, 0x4e4e4e4eU, 00653 0x08080808U, 0x2e2e2e2eU, 0xa1a1a1a1U, 0x66666666U, 00654 0x28282828U, 0xd9d9d9d9U, 0x24242424U, 0xb2b2b2b2U, 00655 0x76767676U, 0x5b5b5b5bU, 0xa2a2a2a2U, 0x49494949U, 00656 0x6d6d6d6dU, 0x8b8b8b8bU, 0xd1d1d1d1U, 0x25252525U, 00657 0x72727272U, 0xf8f8f8f8U, 0xf6f6f6f6U, 0x64646464U, 00658 0x86868686U, 0x68686868U, 0x98989898U, 0x16161616U, 00659 0xd4d4d4d4U, 0xa4a4a4a4U, 0x5c5c5c5cU, 0xccccccccU, 00660 0x5d5d5d5dU, 0x65656565U, 0xb6b6b6b6U, 0x92929292U, 00661 0x6c6c6c6cU, 0x70707070U, 0x48484848U, 0x50505050U, 00662 0xfdfdfdfdU, 0xededededU, 0xb9b9b9b9U, 0xdadadadaU, 00663 0x5e5e5e5eU, 0x15151515U, 0x46464646U, 0x57575757U, 00664 0xa7a7a7a7U, 0x8d8d8d8dU, 0x9d9d9d9dU, 0x84848484U, 00665 0x90909090U, 0xd8d8d8d8U, 0xababababU, 0x00000000U, 00666 0x8c8c8c8cU, 0xbcbcbcbcU, 0xd3d3d3d3U, 0x0a0a0a0aU, 00667 0xf7f7f7f7U, 0xe4e4e4e4U, 0x58585858U, 0x05050505U, 00668 0xb8b8b8b8U, 0xb3b3b3b3U, 0x45454545U, 0x06060606U, 00669 0xd0d0d0d0U, 0x2c2c2c2cU, 0x1e1e1e1eU, 0x8f8f8f8fU, 00670 0xcacacacaU, 0x3f3f3f3fU, 0x0f0f0f0fU, 0x02020202U, 00671 0xc1c1c1c1U, 0xafafafafU, 0xbdbdbdbdU, 0x03030303U, 00672 0x01010101U, 0x13131313U, 0x8a8a8a8aU, 0x6b6b6b6bU, 00673 0x3a3a3a3aU, 0x91919191U, 0x11111111U, 0x41414141U, 00674 0x4f4f4f4fU, 0x67676767U, 0xdcdcdcdcU, 0xeaeaeaeaU, 00675 0x97979797U, 0xf2f2f2f2U, 0xcfcfcfcfU, 0xcecececeU, 00676 0xf0f0f0f0U, 0xb4b4b4b4U, 0xe6e6e6e6U, 0x73737373U, 00677 0x96969696U, 0xacacacacU, 0x74747474U, 0x22222222U, 00678 0xe7e7e7e7U, 0xadadadadU, 0x35353535U, 0x85858585U, 00679 0xe2e2e2e2U, 0xf9f9f9f9U, 0x37373737U, 0xe8e8e8e8U, 00680 0x1c1c1c1cU, 0x75757575U, 0xdfdfdfdfU, 0x6e6e6e6eU, 00681 0x47474747U, 0xf1f1f1f1U, 0x1a1a1a1aU, 0x71717171U, 00682 0x1d1d1d1dU, 0x29292929U, 0xc5c5c5c5U, 0x89898989U, 00683 0x6f6f6f6fU, 0xb7b7b7b7U, 0x62626262U, 0x0e0e0e0eU, 00684 0xaaaaaaaaU, 0x18181818U, 0xbebebebeU, 0x1b1b1b1bU, 00685 0xfcfcfcfcU, 0x56565656U, 0x3e3e3e3eU, 0x4b4b4b4bU, 00686 0xc6c6c6c6U, 0xd2d2d2d2U, 0x79797979U, 0x20202020U, 00687 0x9a9a9a9aU, 0xdbdbdbdbU, 0xc0c0c0c0U, 0xfefefefeU, 00688 0x78787878U, 0xcdcdcdcdU, 0x5a5a5a5aU, 0xf4f4f4f4U, 00689 0x1f1f1f1fU, 0xddddddddU, 0xa8a8a8a8U, 0x33333333U, 00690 0x88888888U, 0x07070707U, 0xc7c7c7c7U, 0x31313131U, 00691 0xb1b1b1b1U, 0x12121212U, 0x10101010U, 0x59595959U, 00692 0x27272727U, 0x80808080U, 0xececececU, 0x5f5f5f5fU, 00693 0x60606060U, 0x51515151U, 0x7f7f7f7fU, 0xa9a9a9a9U, 00694 0x19191919U, 0xb5b5b5b5U, 0x4a4a4a4aU, 0x0d0d0d0dU, 00695 0x2d2d2d2dU, 0xe5e5e5e5U, 0x7a7a7a7aU, 0x9f9f9f9fU, 00696 0x93939393U, 0xc9c9c9c9U, 0x9c9c9c9cU, 0xefefefefU, 00697 0xa0a0a0a0U, 0xe0e0e0e0U, 0x3b3b3b3bU, 0x4d4d4d4dU, 00698 0xaeaeaeaeU, 0x2a2a2a2aU, 0xf5f5f5f5U, 0xb0b0b0b0U, 00699 0xc8c8c8c8U, 0xebebebebU, 0xbbbbbbbbU, 0x3c3c3c3cU, 00700 0x83838383U, 0x53535353U, 0x99999999U, 0x61616161U, 00701 0x17171717U, 0x2b2b2b2bU, 0x04040404U, 0x7e7e7e7eU, 00702 0xbabababaU, 0x77777777U, 0xd6d6d6d6U, 0x26262626U, 00703 0xe1e1e1e1U, 0x69696969U, 0x14141414U, 0x63636363U, 00704 0x55555555U, 0x21212121U, 0x0c0c0c0cU, 0x7d7d7d7dU, 00705 } 00706 }; 00707 00708 00709 00710 #define GETBYTE(x, y) (word32)((byte)((x) >> (8 * (y)))) 00711 00712 00713 #ifdef CYASSL_AESNI 00714 00715 #define cpuid(func,ax,bx,cx,dx)\ 00716 __asm__ __volatile__ ("cpuid":\ 00717 "=a" (ax), "=b" (bx), "=c" (cx), "=d" (dx) : "a" (func)); 00718 00719 static int Check_CPU_support_AES() 00720 { 00721 unsigned int a,b,c,d; 00722 cpuid(1,a,b,c,d); 00723 00724 if (c & 0x2000000) 00725 return 1; 00726 00727 return 0; 00728 } 00729 00730 static int checkAESNI = 0; 00731 static int haveAESNI = 0; 00732 00733 00734 void AES_CBC_encrypt(const unsigned char* in, unsigned char* out, 00735 unsigned char* ivec, unsigned long length, 00736 const unsigned char* KS, int nr); 00737 00738 00739 void AES_CBC_decrypt(const unsigned char* in, unsigned char* out, 00740 unsigned char* ivec, unsigned long length, 00741 const unsigned char* KS, int nr); 00742 00743 void AES_128_Key_Expansion(const unsigned char* userkey, 00744 unsigned char* key_schedule); 00745 00746 void AES_192_Key_Expansion(const unsigned char* userkey, 00747 unsigned char* key_schedule); 00748 00749 void AES_256_Key_Expansion(const unsigned char* userkey, 00750 unsigned char* key_schedule); 00751 00752 00753 int AES_set_encrypt_key (const unsigned char *userKey, const int bits, 00754 Aes* aes) 00755 { 00756 if (!userKey || !aes) 00757 return -1; 00758 00759 if (bits == 128) { 00760 AES_128_Key_Expansion (userKey,(byte*)aes->key); aes->rounds = 10; 00761 return 0; 00762 } 00763 else if (bits == 192) { 00764 AES_192_Key_Expansion (userKey,(byte*)aes->key); aes->rounds = 12; 00765 return 0; 00766 } 00767 else if (bits == 256) { 00768 AES_256_Key_Expansion (userKey,(byte*)aes->key); aes->rounds = 14; 00769 return 0; 00770 } 00771 return -1; 00772 } 00773 00774 00775 int AES_set_decrypt_key (const unsigned char* userKey, const int bits, 00776 Aes* aes) 00777 { 00778 int nr; 00779 Aes temp_key; 00780 __m128i *Key_Schedule = (__m128i*)aes->key; 00781 __m128i *Temp_Key_Schedule = (__m128i*)temp_key.key; 00782 00783 if (!userKey || !aes) 00784 return -1; 00785 00786 if (AES_set_encrypt_key(userKey,bits,&temp_key) == -1) 00787 return -1; 00788 00789 nr = temp_key.rounds; 00790 aes->rounds = nr; 00791 00792 Key_Schedule[nr] = Temp_Key_Schedule[0]; 00793 Key_Schedule[nr-1] = _mm_aesimc_si128(Temp_Key_Schedule[1]); 00794 Key_Schedule[nr-2] = _mm_aesimc_si128(Temp_Key_Schedule[2]); 00795 Key_Schedule[nr-3] = _mm_aesimc_si128(Temp_Key_Schedule[3]); 00796 Key_Schedule[nr-4] = _mm_aesimc_si128(Temp_Key_Schedule[4]); 00797 Key_Schedule[nr-5] = _mm_aesimc_si128(Temp_Key_Schedule[5]); 00798 Key_Schedule[nr-6] = _mm_aesimc_si128(Temp_Key_Schedule[6]); 00799 Key_Schedule[nr-7] = _mm_aesimc_si128(Temp_Key_Schedule[7]); 00800 Key_Schedule[nr-8] = _mm_aesimc_si128(Temp_Key_Schedule[8]); 00801 Key_Schedule[nr-9] = _mm_aesimc_si128(Temp_Key_Schedule[9]); 00802 00803 if(nr>10) { 00804 Key_Schedule[nr-10] = _mm_aesimc_si128(Temp_Key_Schedule[10]); 00805 Key_Schedule[nr-11] = _mm_aesimc_si128(Temp_Key_Schedule[11]); 00806 } 00807 00808 if(nr>12) { 00809 Key_Schedule[nr-12] = _mm_aesimc_si128(Temp_Key_Schedule[12]); 00810 Key_Schedule[nr-13] = _mm_aesimc_si128(Temp_Key_Schedule[13]); 00811 } 00812 00813 Key_Schedule[0] = Temp_Key_Schedule[nr]; 00814 00815 return 0; 00816 } 00817 00818 00819 00820 #endif /* CYASSL_AESNI */ 00821 00822 00823 int AesSetKey(Aes* aes, const byte* userKey, word32 keylen, const byte* iv, 00824 int dir) 00825 { 00826 word32 temp, *rk = aes->key; 00827 unsigned int i = 0; 00828 00829 if (!((keylen == 16) || (keylen == 24) || (keylen == 32))) 00830 return -1; 00831 00832 #ifdef CYASSL_AESNI 00833 if (checkAESNI == 0) { 00834 haveAESNI = Check_CPU_support_AES(); 00835 checkAESNI = 1; 00836 } 00837 if (haveAESNI) { 00838 XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); 00839 if (dir == AES_ENCRYPTION) 00840 return AES_set_encrypt_key(userKey, keylen * 8, aes); 00841 else 00842 return AES_set_decrypt_key(userKey, keylen * 8, aes); 00843 } 00844 #endif /* CYASSL_AESNI */ 00845 00846 aes->rounds = keylen/4 + 6; 00847 00848 XMEMCPY(rk, userKey, keylen); 00849 #ifdef LITTLE_ENDIAN_ORDER 00850 ByteReverseWords(rk, rk, keylen); 00851 #endif 00852 00853 switch(keylen) 00854 { 00855 case 16: 00856 while (1) 00857 { 00858 temp = rk[3]; 00859 rk[4] = rk[0] ^ 00860 (Te[4][GETBYTE(temp, 2)] & 0xff000000) ^ 00861 (Te[4][GETBYTE(temp, 1)] & 0x00ff0000) ^ 00862 (Te[4][GETBYTE(temp, 0)] & 0x0000ff00) ^ 00863 (Te[4][GETBYTE(temp, 3)] & 0x000000ff) ^ 00864 rcon[i]; 00865 rk[5] = rk[1] ^ rk[4]; 00866 rk[6] = rk[2] ^ rk[5]; 00867 rk[7] = rk[3] ^ rk[6]; 00868 if (++i == 10) 00869 break; 00870 rk += 4; 00871 } 00872 break; 00873 00874 case 24: 00875 while (1) /* for (;;) here triggers a bug in VC60 SP4 w/ Pro Pack */ 00876 { 00877 temp = rk[ 5]; 00878 rk[ 6] = rk[ 0] ^ 00879 (Te[4][GETBYTE(temp, 2)] & 0xff000000) ^ 00880 (Te[4][GETBYTE(temp, 1)] & 0x00ff0000) ^ 00881 (Te[4][GETBYTE(temp, 0)] & 0x0000ff00) ^ 00882 (Te[4][GETBYTE(temp, 3)] & 0x000000ff) ^ 00883 rcon[i]; 00884 rk[ 7] = rk[ 1] ^ rk[ 6]; 00885 rk[ 8] = rk[ 2] ^ rk[ 7]; 00886 rk[ 9] = rk[ 3] ^ rk[ 8]; 00887 if (++i == 8) 00888 break; 00889 rk[10] = rk[ 4] ^ rk[ 9]; 00890 rk[11] = rk[ 5] ^ rk[10]; 00891 rk += 6; 00892 } 00893 break; 00894 00895 case 32: 00896 while (1) 00897 { 00898 temp = rk[ 7]; 00899 rk[ 8] = rk[ 0] ^ 00900 (Te[4][GETBYTE(temp, 2)] & 0xff000000) ^ 00901 (Te[4][GETBYTE(temp, 1)] & 0x00ff0000) ^ 00902 (Te[4][GETBYTE(temp, 0)] & 0x0000ff00) ^ 00903 (Te[4][GETBYTE(temp, 3)] & 0x000000ff) ^ 00904 rcon[i]; 00905 rk[ 9] = rk[ 1] ^ rk[ 8]; 00906 rk[10] = rk[ 2] ^ rk[ 9]; 00907 rk[11] = rk[ 3] ^ rk[10]; 00908 if (++i == 7) 00909 break; 00910 temp = rk[11]; 00911 rk[12] = rk[ 4] ^ 00912 (Te[4][GETBYTE(temp, 3)] & 0xff000000) ^ 00913 (Te[4][GETBYTE(temp, 2)] & 0x00ff0000) ^ 00914 (Te[4][GETBYTE(temp, 1)] & 0x0000ff00) ^ 00915 (Te[4][GETBYTE(temp, 0)] & 0x000000ff); 00916 rk[13] = rk[ 5] ^ rk[12]; 00917 rk[14] = rk[ 6] ^ rk[13]; 00918 rk[15] = rk[ 7] ^ rk[14]; 00919 00920 rk += 8; 00921 } 00922 break; 00923 } 00924 00925 if (dir == AES_DECRYPTION) 00926 { 00927 unsigned int i, j; 00928 rk = aes->key; 00929 00930 /* invert the order of the round keys: */ 00931 for (i = 0, j = 4* aes->rounds; i < j; i += 4, j -= 4) { 00932 temp = rk[i ]; rk[i ] = rk[j ]; rk[j ] = temp; 00933 temp = rk[i + 1]; rk[i + 1] = rk[j + 1]; rk[j + 1] = temp; 00934 temp = rk[i + 2]; rk[i + 2] = rk[j + 2]; rk[j + 2] = temp; 00935 temp = rk[i + 3]; rk[i + 3] = rk[j + 3]; rk[j + 3] = temp; 00936 } 00937 /* apply the inverse MixColumn transform to all round keys but the 00938 first and the last: */ 00939 for (i = 1; i < aes->rounds; i++) { 00940 rk += 4; 00941 rk[0] = 00942 Td[0][Te[4][GETBYTE(rk[0], 3)] & 0xff] ^ 00943 Td[1][Te[4][GETBYTE(rk[0], 2)] & 0xff] ^ 00944 Td[2][Te[4][GETBYTE(rk[0], 1)] & 0xff] ^ 00945 Td[3][Te[4][GETBYTE(rk[0], 0)] & 0xff]; 00946 rk[1] = 00947 Td[0][Te[4][GETBYTE(rk[1], 3)] & 0xff] ^ 00948 Td[1][Te[4][GETBYTE(rk[1], 2)] & 0xff] ^ 00949 Td[2][Te[4][GETBYTE(rk[1], 1)] & 0xff] ^ 00950 Td[3][Te[4][GETBYTE(rk[1], 0)] & 0xff]; 00951 rk[2] = 00952 Td[0][Te[4][GETBYTE(rk[2], 3)] & 0xff] ^ 00953 Td[1][Te[4][GETBYTE(rk[2], 2)] & 0xff] ^ 00954 Td[2][Te[4][GETBYTE(rk[2], 1)] & 0xff] ^ 00955 Td[3][Te[4][GETBYTE(rk[2], 0)] & 0xff]; 00956 rk[3] = 00957 Td[0][Te[4][GETBYTE(rk[3], 3)] & 0xff] ^ 00958 Td[1][Te[4][GETBYTE(rk[3], 2)] & 0xff] ^ 00959 Td[2][Te[4][GETBYTE(rk[3], 1)] & 0xff] ^ 00960 Td[3][Te[4][GETBYTE(rk[3], 0)] & 0xff]; 00961 } 00962 } 00963 XMEMCPY(aes->reg, iv, AES_BLOCK_SIZE); 00964 00965 return 0; 00966 } 00967 00968 00969 void AesEncrypt(Aes* aes, const byte* inBlock, byte* outBlock) 00970 { 00971 word32 s0, s1, s2, s3; 00972 word32 t0, t1, t2, t3; 00973 word32 r = aes->rounds >> 1; 00974 00975 const word32* rk = aes->key; 00976 /* 00977 * map byte array block to cipher state 00978 * and add initial round key: 00979 */ 00980 XMEMCPY(&s0, inBlock, sizeof(s0)); 00981 XMEMCPY(&s1, inBlock + sizeof(s0), sizeof(s1)); 00982 XMEMCPY(&s2, inBlock + 2 * sizeof(s0), sizeof(s2)); 00983 XMEMCPY(&s3, inBlock + 3 * sizeof(s0), sizeof(s3)); 00984 00985 #ifdef LITTLE_ENDIAN_ORDER 00986 s0 = ByteReverseWord32(s0); 00987 s1 = ByteReverseWord32(s1); 00988 s2 = ByteReverseWord32(s2); 00989 s3 = ByteReverseWord32(s3); 00990 #endif 00991 00992 s0 ^= rk[0]; 00993 s1 ^= rk[1]; 00994 s2 ^= rk[2]; 00995 s3 ^= rk[3]; 00996 00997 /* 00998 * Nr - 1 full rounds: 00999 */ 01000 01001 for (;;) { 01002 t0 = 01003 Te[0][GETBYTE(s0, 3)] ^ 01004 Te[1][GETBYTE(s1, 2)] ^ 01005 Te[2][GETBYTE(s2, 1)] ^ 01006 Te[3][GETBYTE(s3, 0)] ^ 01007 rk[4]; 01008 t1 = 01009 Te[0][GETBYTE(s1, 3)] ^ 01010 Te[1][GETBYTE(s2, 2)] ^ 01011 Te[2][GETBYTE(s3, 1)] ^ 01012 Te[3][GETBYTE(s0, 0)] ^ 01013 rk[5]; 01014 t2 = 01015 Te[0][GETBYTE(s2, 3)] ^ 01016 Te[1][GETBYTE(s3, 2)] ^ 01017 Te[2][GETBYTE(s0, 1)] ^ 01018 Te[3][GETBYTE(s1, 0)] ^ 01019 rk[6]; 01020 t3 = 01021 Te[0][GETBYTE(s3, 3)] ^ 01022 Te[1][GETBYTE(s0, 2)] ^ 01023 Te[2][GETBYTE(s1, 1)] ^ 01024 Te[3][GETBYTE(s2, 0)] ^ 01025 rk[7]; 01026 01027 rk += 8; 01028 if (--r == 0) { 01029 break; 01030 } 01031 01032 s0 = 01033 Te[0][GETBYTE(t0, 3)] ^ 01034 Te[1][GETBYTE(t1, 2)] ^ 01035 Te[2][GETBYTE(t2, 1)] ^ 01036 Te[3][GETBYTE(t3, 0)] ^ 01037 rk[0]; 01038 s1 = 01039 Te[0][GETBYTE(t1, 3)] ^ 01040 Te[1][GETBYTE(t2, 2)] ^ 01041 Te[2][GETBYTE(t3, 1)] ^ 01042 Te[3][GETBYTE(t0, 0)] ^ 01043 rk[1]; 01044 s2 = 01045 Te[0][GETBYTE(t2, 3)] ^ 01046 Te[1][GETBYTE(t3, 2)] ^ 01047 Te[2][GETBYTE(t0, 1)] ^ 01048 Te[3][GETBYTE(t1, 0)] ^ 01049 rk[2]; 01050 s3 = 01051 Te[0][GETBYTE(t3, 3)] ^ 01052 Te[1][GETBYTE(t0, 2)] ^ 01053 Te[2][GETBYTE(t1, 1)] ^ 01054 Te[3][GETBYTE(t2, 0)] ^ 01055 rk[3]; 01056 } 01057 01058 /* 01059 * apply last round and 01060 * map cipher state to byte array block: 01061 */ 01062 01063 s0 = 01064 (Te[4][GETBYTE(t0, 3)] & 0xff000000) ^ 01065 (Te[4][GETBYTE(t1, 2)] & 0x00ff0000) ^ 01066 (Te[4][GETBYTE(t2, 1)] & 0x0000ff00) ^ 01067 (Te[4][GETBYTE(t3, 0)] & 0x000000ff) ^ 01068 rk[0]; 01069 s1 = 01070 (Te[4][GETBYTE(t1, 3)] & 0xff000000) ^ 01071 (Te[4][GETBYTE(t2, 2)] & 0x00ff0000) ^ 01072 (Te[4][GETBYTE(t3, 1)] & 0x0000ff00) ^ 01073 (Te[4][GETBYTE(t0, 0)] & 0x000000ff) ^ 01074 rk[1]; 01075 s2 = 01076 (Te[4][GETBYTE(t2, 3)] & 0xff000000) ^ 01077 (Te[4][GETBYTE(t3, 2)] & 0x00ff0000) ^ 01078 (Te[4][GETBYTE(t0, 1)] & 0x0000ff00) ^ 01079 (Te[4][GETBYTE(t1, 0)] & 0x000000ff) ^ 01080 rk[2]; 01081 s3 = 01082 (Te[4][GETBYTE(t3, 3)] & 0xff000000) ^ 01083 (Te[4][GETBYTE(t0, 2)] & 0x00ff0000) ^ 01084 (Te[4][GETBYTE(t1, 1)] & 0x0000ff00) ^ 01085 (Te[4][GETBYTE(t2, 0)] & 0x000000ff) ^ 01086 rk[3]; 01087 01088 /* write out */ 01089 #ifdef LITTLE_ENDIAN_ORDER 01090 s0 = ByteReverseWord32(s0); 01091 s1 = ByteReverseWord32(s1); 01092 s2 = ByteReverseWord32(s2); 01093 s3 = ByteReverseWord32(s3); 01094 #endif 01095 01096 XMEMCPY(outBlock, &s0, sizeof(s0)); 01097 XMEMCPY(outBlock + sizeof(s0), &s1, sizeof(s1)); 01098 XMEMCPY(outBlock + 2 * sizeof(s0), &s2, sizeof(s2)); 01099 XMEMCPY(outBlock + 3 * sizeof(s0), &s3, sizeof(s3)); 01100 } 01101 01102 01103 void AesDecrypt(Aes* aes, const byte* inBlock, byte* outBlock) 01104 { 01105 word32 s0, s1, s2, s3; 01106 word32 t0, t1, t2, t3; 01107 word32 r = aes->rounds >> 1; 01108 01109 const word32* rk = aes->key; 01110 /* 01111 * map byte array block to cipher state 01112 * and add initial round key: 01113 */ 01114 XMEMCPY(&s0, inBlock, sizeof(s0)); 01115 XMEMCPY(&s1, inBlock + sizeof(s0), sizeof(s1)); 01116 XMEMCPY(&s2, inBlock + 2 * sizeof(s0), sizeof(s2)); 01117 XMEMCPY(&s3, inBlock + 3 * sizeof(s0), sizeof(s3)); 01118 01119 #ifdef LITTLE_ENDIAN_ORDER 01120 s0 = ByteReverseWord32(s0); 01121 s1 = ByteReverseWord32(s1); 01122 s2 = ByteReverseWord32(s2); 01123 s3 = ByteReverseWord32(s3); 01124 #endif 01125 01126 s0 ^= rk[0]; 01127 s1 ^= rk[1]; 01128 s2 ^= rk[2]; 01129 s3 ^= rk[3]; 01130 01131 /* 01132 * Nr - 1 full rounds: 01133 */ 01134 01135 for (;;) { 01136 t0 = 01137 Td[0][GETBYTE(s0, 3)] ^ 01138 Td[1][GETBYTE(s3, 2)] ^ 01139 Td[2][GETBYTE(s2, 1)] ^ 01140 Td[3][GETBYTE(s1, 0)] ^ 01141 rk[4]; 01142 t1 = 01143 Td[0][GETBYTE(s1, 3)] ^ 01144 Td[1][GETBYTE(s0, 2)] ^ 01145 Td[2][GETBYTE(s3, 1)] ^ 01146 Td[3][GETBYTE(s2, 0)] ^ 01147 rk[5]; 01148 t2 = 01149 Td[0][GETBYTE(s2, 3)] ^ 01150 Td[1][GETBYTE(s1, 2)] ^ 01151 Td[2][GETBYTE(s0, 1)] ^ 01152 Td[3][GETBYTE(s3, 0)] ^ 01153 rk[6]; 01154 t3 = 01155 Td[0][GETBYTE(s3, 3)] ^ 01156 Td[1][GETBYTE(s2, 2)] ^ 01157 Td[2][GETBYTE(s1, 1)] ^ 01158 Td[3][GETBYTE(s0, 0)] ^ 01159 rk[7]; 01160 01161 rk += 8; 01162 if (--r == 0) { 01163 break; 01164 } 01165 01166 s0 = 01167 Td[0][GETBYTE(t0, 3)] ^ 01168 Td[1][GETBYTE(t3, 2)] ^ 01169 Td[2][GETBYTE(t2, 1)] ^ 01170 Td[3][GETBYTE(t1, 0)] ^ 01171 rk[0]; 01172 s1 = 01173 Td[0][GETBYTE(t1, 3)] ^ 01174 Td[1][GETBYTE(t0, 2)] ^ 01175 Td[2][GETBYTE(t3, 1)] ^ 01176 Td[3][GETBYTE(t2, 0)] ^ 01177 rk[1]; 01178 s2 = 01179 Td[0][GETBYTE(t2, 3)] ^ 01180 Td[1][GETBYTE(t1, 2)] ^ 01181 Td[2][GETBYTE(t0, 1)] ^ 01182 Td[3][GETBYTE(t3, 0)] ^ 01183 rk[2]; 01184 s3 = 01185 Td[0][GETBYTE(t3, 3)] ^ 01186 Td[1][GETBYTE(t2, 2)] ^ 01187 Td[2][GETBYTE(t1, 1)] ^ 01188 Td[3][GETBYTE(t0, 0)] ^ 01189 rk[3]; 01190 } 01191 /* 01192 * apply last round and 01193 * map cipher state to byte array block: 01194 */ 01195 s0 = 01196 (Td[4][GETBYTE(t0, 3)] & 0xff000000) ^ 01197 (Td[4][GETBYTE(t3, 2)] & 0x00ff0000) ^ 01198 (Td[4][GETBYTE(t2, 1)] & 0x0000ff00) ^ 01199 (Td[4][GETBYTE(t1, 0)] & 0x000000ff) ^ 01200 rk[0]; 01201 s1 = 01202 (Td[4][GETBYTE(t1, 3)] & 0xff000000) ^ 01203 (Td[4][GETBYTE(t0, 2)] & 0x00ff0000) ^ 01204 (Td[4][GETBYTE(t3, 1)] & 0x0000ff00) ^ 01205 (Td[4][GETBYTE(t2, 0)] & 0x000000ff) ^ 01206 rk[1]; 01207 s2 = 01208 (Td[4][GETBYTE(t2, 3)] & 0xff000000) ^ 01209 (Td[4][GETBYTE(t1, 2)] & 0x00ff0000) ^ 01210 (Td[4][GETBYTE(t0, 1)] & 0x0000ff00) ^ 01211 (Td[4][GETBYTE(t3, 0)] & 0x000000ff) ^ 01212 rk[2]; 01213 s3 = 01214 (Td[4][GETBYTE(t3, 3)] & 0xff000000) ^ 01215 (Td[4][GETBYTE(t2, 2)] & 0x00ff0000) ^ 01216 (Td[4][GETBYTE(t1, 1)] & 0x0000ff00) ^ 01217 (Td[4][GETBYTE(t0, 0)] & 0x000000ff) ^ 01218 rk[3]; 01219 01220 /* write out */ 01221 #ifdef LITTLE_ENDIAN_ORDER 01222 s0 = ByteReverseWord32(s0); 01223 s1 = ByteReverseWord32(s1); 01224 s2 = ByteReverseWord32(s2); 01225 s3 = ByteReverseWord32(s3); 01226 #endif 01227 01228 XMEMCPY(outBlock, &s0, sizeof(s0)); 01229 XMEMCPY(outBlock + sizeof(s0), &s1, sizeof(s1)); 01230 XMEMCPY(outBlock + 2 * sizeof(s0), &s2, sizeof(s2)); 01231 XMEMCPY(outBlock + 3 * sizeof(s0), &s3, sizeof(s3)); 01232 } 01233 01234 01235 void AesCbcEncrypt(Aes* aes, byte* out, const byte* in, word32 sz) 01236 { 01237 word32 blocks = sz / AES_BLOCK_SIZE; 01238 01239 #ifdef CYASSL_AESNI 01240 if (haveAESNI) { 01241 #ifdef DEBUG_AESNI 01242 printf("about to aes cbc encrypt\n"); 01243 printf("in = %p\n", in); 01244 printf("out = %p\n", out); 01245 printf("aes->key = %p\n", aes->key); 01246 printf("aes->reg = %p\n", aes->reg); 01247 printf("aes->rounds = %d\n", aes->rounds); 01248 printf("sz = %d\n", sz); 01249 #endif 01250 AES_CBC_encrypt(in, out, (byte*)aes->reg, sz, (byte*)aes->key, 01251 aes->rounds); 01252 /* store iv for next call */ 01253 XMEMCPY(aes->reg, out + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); 01254 return; 01255 } 01256 #endif 01257 01258 while (blocks--) { 01259 xorbuf((byte*)aes->reg, in, AES_BLOCK_SIZE); 01260 AesEncrypt(aes, (byte*)aes->reg, (byte*)aes->reg); 01261 XMEMCPY(out, aes->reg, AES_BLOCK_SIZE); 01262 01263 out += AES_BLOCK_SIZE; 01264 in += AES_BLOCK_SIZE; 01265 } 01266 } 01267 01268 01269 void AesCbcDecrypt(Aes* aes, byte* out, const byte* in, word32 sz) 01270 { 01271 word32 blocks = sz / AES_BLOCK_SIZE; 01272 01273 #ifdef CYASSL_AESNI 01274 if (haveAESNI) { 01275 #ifdef DEBUG_AESNI 01276 printf("about to aes cbc decrypt\n"); 01277 printf("in = %p\n", in); 01278 printf("out = %p\n", out); 01279 printf("aes->key = %p\n", aes->key); 01280 printf("aes->reg = %p\n", aes->reg); 01281 printf("aes->rounds = %d\n", aes->rounds); 01282 printf("sz = %d\n", sz); 01283 #endif 01284 01285 /* if input and output same will overwirte input iv */ 01286 XMEMCPY(aes->tmp, in + sz - AES_BLOCK_SIZE, AES_BLOCK_SIZE); 01287 AES_CBC_decrypt(in, out, (byte*)aes->reg, sz, (byte*)aes->key, 01288 aes->rounds); 01289 /* store iv for next call */ 01290 XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); 01291 return; 01292 } 01293 #endif 01294 01295 while (blocks--) { 01296 XMEMCPY(aes->tmp, in, AES_BLOCK_SIZE); 01297 AesDecrypt(aes, (byte*)aes->tmp, out); 01298 xorbuf(out, (byte*)aes->reg, AES_BLOCK_SIZE); 01299 XMEMCPY(aes->reg, aes->tmp, AES_BLOCK_SIZE); 01300 01301 out += AES_BLOCK_SIZE; 01302 in += AES_BLOCK_SIZE; 01303 } 01304 } 01305 01306 01307 #endif /* NO_AES */ 01308
Generated on Wed Jul 13 2022 00:57:02 by 1.7.2