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