00001
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "system.h"
00028 #include "beecrypt.h"
00029 #include "aesopt.h"
00030 #include "aes.h"
00031 #include "endianness.h"
00032 #include "mp32.h"
00033 #include "debug.h"
00034
00035
00038
00039 const uint32 _ae0[256] = {
00040 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
00041 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
00042 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
00043 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
00044 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
00045 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
00046 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
00047 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
00048 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
00049 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
00050 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
00051 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
00052 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
00053 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
00054 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
00055 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
00056 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
00057 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
00058 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
00059 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
00060 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
00061 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
00062 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
00063 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
00064 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
00065 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
00066 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
00067 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
00068 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
00069 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
00070 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
00071 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
00072 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
00073 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
00074 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
00075 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
00076 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
00077 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
00078 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
00079 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
00080 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
00081 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
00082 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
00083 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
00084 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
00085 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
00086 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
00087 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
00088 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
00089 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
00090 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
00091 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
00092 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
00093 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
00094 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
00095 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
00096 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
00097 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
00098 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
00099 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
00100 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
00101 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
00102 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
00103 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
00104 };
00105
00108
00109 const uint32 _ae1[256] = {
00110 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
00111 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
00112 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
00113 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
00114 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
00115 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
00116 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
00117 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
00118 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
00119 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
00120 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
00121 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
00122 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
00123 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
00124 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
00125 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
00126 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
00127 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
00128 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
00129 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
00130 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
00131 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
00132 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
00133 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
00134 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
00135 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
00136 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
00137 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
00138 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
00139 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
00140 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
00141 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
00142 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
00143 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
00144 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
00145 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
00146 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
00147 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
00148 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
00149 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
00150 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
00151 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
00152 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
00153 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
00154 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
00155 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
00156 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
00157 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
00158 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
00159 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
00160 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
00161 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
00162 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
00163 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
00164 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
00165 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
00166 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
00167 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
00168 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
00169 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
00170 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
00171 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
00172 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
00173 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616
00174 };
00175
00178
00179 const uint32 _ae2[256] = {
00180 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
00181 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
00182 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
00183 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
00184 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
00185 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
00186 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
00187 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
00188 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
00189 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
00190 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
00191 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
00192 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
00193 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
00194 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
00195 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
00196 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
00197 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
00198 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
00199 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
00200 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
00201 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
00202 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
00203 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
00204 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
00205 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
00206 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
00207 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
00208 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
00209 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
00210 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
00211 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
00212 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
00213 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
00214 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
00215 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
00216 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
00217 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
00218 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
00219 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
00220 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
00221 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
00222 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
00223 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
00224 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
00225 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
00226 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
00227 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
00228 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
00229 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
00230 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
00231 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
00232 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
00233 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
00234 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
00235 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
00236 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
00237 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
00238 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
00239 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
00240 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
00241 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
00242 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
00243 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16
00244 };
00245
00248
00249 const uint32 _ae3[256] = {
00250 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
00251 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
00252 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
00253 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
00254 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
00255 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
00256 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
00257 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
00258 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
00259 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
00260 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
00261 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
00262 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
00263 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
00264 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
00265 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
00266 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
00267 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
00268 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
00269 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
00270 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
00271 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
00272 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
00273 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
00274 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
00275 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
00276 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
00277 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
00278 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
00279 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
00280 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
00281 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
00282 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
00283 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
00284 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
00285 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
00286 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
00287 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
00288 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
00289 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
00290 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
00291 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
00292 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
00293 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
00294 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
00295 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
00296 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
00297 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
00298 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
00299 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
00300 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
00301 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
00302 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
00303 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
00304 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
00305 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
00306 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
00307 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
00308 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
00309 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
00310 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
00311 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
00312 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
00313 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c
00314 };
00315
00318
00319 const uint32 _ae4[256] = {
00320 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
00321 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
00322 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
00323 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
00324 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
00325 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
00326 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
00327 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
00328 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
00329 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
00330 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
00331 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
00332 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
00333 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
00334 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
00335 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
00336 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
00337 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
00338 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
00339 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
00340 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
00341 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
00342 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
00343 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
00344 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
00345 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
00346 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
00347 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
00348 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
00349 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
00350 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
00351 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
00352 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
00353 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
00354 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
00355 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
00356 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
00357 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
00358 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
00359 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
00360 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
00361 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
00362 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
00363 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
00364 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
00365 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
00366 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
00367 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
00368 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
00369 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
00370 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
00371 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
00372 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
00373 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
00374 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
00375 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
00376 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
00377 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
00378 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
00379 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
00380 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
00381 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
00382 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
00383 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616
00384 };
00385
00388
00389 const uint32 _ad0[256] = {
00390 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
00391 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
00392 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
00393 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
00394 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
00395 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
00396 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
00397 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
00398 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
00399 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
00400 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
00401 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
00402 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
00403 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
00404 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
00405 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
00406 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
00407 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
00408 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
00409 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
00410 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
00411 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
00412 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
00413 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
00414 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
00415 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
00416 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
00417 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
00418 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
00419 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
00420 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
00421 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
00422 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
00423 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
00424 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
00425 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
00426 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
00427 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
00428 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
00429 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
00430 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
00431 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
00432 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
00433 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
00434 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
00435 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
00436 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
00437 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
00438 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
00439 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
00440 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
00441 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
00442 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
00443 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
00444 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
00445 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
00446 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
00447 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
00448 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
00449 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
00450 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
00451 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
00452 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
00453 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
00454 };
00455
00458
00459 const uint32 _ad1[256] = {
00460 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
00461 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
00462 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
00463 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
00464 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
00465 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
00466 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
00467 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
00468 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
00469 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
00470 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
00471 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
00472 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
00473 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
00474 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
00475 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
00476 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
00477 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
00478 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
00479 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
00480 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
00481 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
00482 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
00483 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
00484 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
00485 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
00486 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
00487 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
00488 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
00489 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
00490 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
00491 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
00492 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
00493 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
00494 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
00495 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
00496 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
00497 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
00498 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
00499 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
00500 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
00501 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
00502 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
00503 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
00504 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
00505 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
00506 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
00507 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
00508 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
00509 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
00510 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
00511 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
00512 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
00513 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
00514 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
00515 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
00516 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
00517 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
00518 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
00519 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
00520 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
00521 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
00522 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
00523 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
00524 };
00525
00528
00529 const uint32 _ad2[256] = {
00530 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
00531 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
00532 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
00533 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
00534 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
00535 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
00536 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
00537 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
00538 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
00539 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
00540 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
00541 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
00542 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
00543 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
00544 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
00545 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
00546 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
00547 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
00548 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
00549 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
00550 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
00551 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
00552 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
00553 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
00554 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
00555 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
00556 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
00557 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
00558 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
00559 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
00560 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
00561 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
00562 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
00563 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
00564 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
00565 0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
00566 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
00567 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
00568 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
00569 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
00570 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
00571 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
00572 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
00573 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
00574 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
00575 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
00576 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
00577 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
00578 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
00579 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
00580 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
00581 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
00582 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
00583 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
00584 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
00585 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
00586 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
00587 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
00588 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
00589 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
00590 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
00591 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
00592 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
00593 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8
00594 };
00595
00598
00599 const uint32 _ad3[256] = {
00600 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
00601 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
00602 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
00603 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
00604 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
00605 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
00606 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
00607 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
00608 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
00609 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
00610 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
00611 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
00612 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
00613 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
00614 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
00615 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
00616 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
00617 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
00618 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
00619 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
00620 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
00621 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
00622 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
00623 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
00624 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
00625 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
00626 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
00627 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
00628 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
00629 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
00630 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
00631 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
00632 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
00633 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
00634 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
00635 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
00636 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
00637 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
00638 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
00639 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
00640 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
00641 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
00642 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
00643 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
00644 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
00645 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
00646 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
00647 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
00648 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
00649 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
00650 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
00651 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
00652 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
00653 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
00654 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
00655 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
00656 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
00657 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
00658 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
00659 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
00660 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
00661 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
00662 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
00663 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0
00664 };
00665
00668
00669 const uint32 _ad4[256] = {
00670 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
00671 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
00672 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
00673 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
00674 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
00675 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
00676 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
00677 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
00678 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
00679 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
00680 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
00681 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
00682 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
00683 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
00684 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
00685 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
00686 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
00687 0x86868686, 0x68686868, 0x98989898, 0x16161616,
00688 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
00689 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
00690 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
00691 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
00692 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
00693 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
00694 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
00695 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
00696 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
00697 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
00698 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
00699 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
00700 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
00701 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
00702 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
00703 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
00704 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
00705 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
00706 0x96969696, 0xacacacac, 0x74747474, 0x22222222,
00707 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
00708 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
00709 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
00710 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
00711 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
00712 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
00713 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
00714 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
00715 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
00716 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
00717 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
00718 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
00719 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
00720 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
00721 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
00722 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
00723 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
00724 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
00725 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
00726 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
00727 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
00728 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
00729 0x83838383, 0x53535353, 0x99999999, 0x61616161,
00730 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
00731 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
00732 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
00733 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d
00734 };
00735
00736
00739
00740 static const uint32 _arc[] = {
00741 0x01000000, 0x02000000, 0x04000000, 0x08000000,
00742 0x10000000, 0x20000000, 0x40000000, 0x80000000,
00743 0x1B000000, 0x36000000
00744 };
00745
00748
00749 static const blockMode aesModes[2] =
00750 {
00751 { (blockModeEncrypt) aesECBEncrypt, (blockModeDecrypt) aesECBDecrypt },
00752 { (blockModeEncrypt) aesCBCEncrypt, (blockModeDecrypt) aesCBCDecrypt }
00753 };
00754
00755
00756 const blockCipher aes = { "AES", sizeof(aesParam), 16, 128, 256, 64, (blockCipherSetup) aesSetup, (blockCipherSetIV) aesSetIV, (blockCipherEncrypt) aesEncrypt, (blockCipherDecrypt) aesDecrypt, aesModes };
00757
00758
00759
00760 int aesSetup(aesParam* ap, const uint32* key, int keybits, cipherOperation op)
00761 {
00762 if (((keybits & 63) == 0) && (keybits >= 128) && (keybits <= 256))
00763 {
00764 register uint32* rk, t, i, j;
00765
00766
00767 ap->fdback[0] = 0;
00768 ap->fdback[1] = 0;
00769 ap->fdback[2] = 0;
00770 ap->fdback[3] = 0;
00771
00772 ap->nr = 6 + ((uint32)keybits >> 5);
00773
00774 mp32copy(((uint32)keybits >> 5), rk = ap->k, key);
00775
00776 i = 0;
00777
00778 if (keybits == 128)
00779 {
00780 while (1)
00781 {
00782 t = rk[3];
00783 rk[4] = rk[0] ^
00784 (_ae4[(t >> 16) & 0xff] & 0xff000000) ^
00785 (_ae4[(t >> 8) & 0xff] & 0x00ff0000) ^
00786 (_ae4[(t ) & 0xff] & 0x0000ff00) ^
00787 (_ae4[(t >> 24) ] & 0x000000ff) ^
00788 _arc[i];
00789 rk[5] = rk[1] ^ rk[4];
00790 rk[6] = rk[2] ^ rk[5];
00791 rk[7] = rk[3] ^ rk[6];
00792 if (++i == 10)
00793 break;
00794 rk += 4;
00795 }
00796 }
00797 else if (keybits == 192)
00798 {
00799 while (1)
00800 {
00801 t = rk[5];
00802 rk[ 6] = rk[0] ^
00803 (_ae4[(t >> 16) & 0xff] & 0xff000000) ^
00804 (_ae4[(t >> 8) & 0xff] & 0x00ff0000) ^
00805 (_ae4[(t ) & 0xff] & 0x0000ff00) ^
00806 (_ae4[(t >> 24) ] & 0x000000ff) ^
00807 _arc[i];
00808 rk[ 7] = rk[1] ^ rk[ 6];
00809 rk[ 8] = rk[2] ^ rk[ 7];
00810 rk[ 9] = rk[3] ^ rk[ 8];
00811 if (++i == 8)
00812 break;
00813 rk[10] = rk[4] ^ rk[ 9];
00814 rk[11] = rk[5] ^ rk[10];
00815 rk += 6;
00816 }
00817 }
00818 else if (keybits == 256)
00819 {
00820 while (1)
00821 {
00822 t = rk[7];
00823 rk[8] = rk[0] ^
00824 (_ae4[(t >> 16) & 0xff] & 0xff000000) ^
00825 (_ae4[(t >> 8) & 0xff] & 0x00ff0000) ^
00826 (_ae4[(t ) & 0xff] & 0x0000ff00) ^
00827 (_ae4[(t >> 24) ] & 0x000000ff) ^
00828 _arc[i];
00829 rk[ 9] = rk[1] ^ rk[ 8];
00830 rk[10] = rk[2] ^ rk[ 9];
00831 rk[11] = rk[3] ^ rk[10];
00832 if (++i == 7)
00833 break;
00834 t = rk[7];
00835 rk[12] = rk[4] ^
00836 (_ae4[(t >> 16) & 0xff] & 0xff000000) ^
00837 (_ae4[(t >> 8) & 0xff] & 0x00ff0000) ^
00838 (_ae4[(t ) & 0xff] & 0x0000ff00) ^
00839 (_ae4[(t >> 24) ] & 0x000000ff);
00840 rk[13] = rk[5] ^ rk[12];
00841 rk[14] = rk[6] ^ rk[13];
00842 rk[15] = rk[7] ^ rk[14];
00843 rk += 8;
00844 }
00845 }
00846 else
00847 {};
00848
00849 if (op == DECRYPT)
00850 {
00851 rk = ap->k;
00852
00853 for (i = 0, j = (ap->nr << 2); i < j; i += 4, j -= 4)
00854 {
00855 t = rk[i ]; rk[i ] = rk[j ]; rk[j ] = t;
00856 t = rk[i+1]; rk[i+1] = rk[j+1]; rk[j+1] = t;
00857 t = rk[i+2]; rk[i+2] = rk[j+2]; rk[j+2] = t;
00858 t = rk[i+3]; rk[i+3] = rk[j+3]; rk[j+3] = t;
00859 }
00860 for (i = 1; i < ap->nr; i++)
00861 {
00862 rk += 4;
00863 rk[0] =
00864 _ad0[_ae4[(rk[0] >> 24) ] & 0xff] ^
00865 _ad1[_ae4[(rk[0] >> 16) & 0xff] & 0xff] ^
00866 _ad2[_ae4[(rk[0] >> 8) & 0xff] & 0xff] ^
00867 _ad3[_ae4[(rk[0] ) & 0xff] & 0xff];
00868 rk[1] =
00869 _ad0[_ae4[(rk[1] >> 24) ] & 0xff] ^
00870 _ad1[_ae4[(rk[1] >> 16) & 0xff] & 0xff] ^
00871 _ad2[_ae4[(rk[1] >> 8) & 0xff] & 0xff] ^
00872 _ad3[_ae4[(rk[1] ) & 0xff] & 0xff];
00873 rk[2] =
00874 _ad0[_ae4[(rk[2] >> 24) ] & 0xff] ^
00875 _ad1[_ae4[(rk[2] >> 16) & 0xff] & 0xff] ^
00876 _ad2[_ae4[(rk[2] >> 8) & 0xff] & 0xff] ^
00877 _ad3[_ae4[(rk[2] ) & 0xff] & 0xff];
00878 rk[3] =
00879 _ad0[_ae4[(rk[3] >> 24) ] & 0xff] ^
00880 _ad1[_ae4[(rk[3] >> 16) & 0xff] & 0xff] ^
00881 _ad2[_ae4[(rk[3] >> 8) & 0xff] & 0xff] ^
00882 _ad3[_ae4[(rk[3] ) & 0xff] & 0xff];
00883 }
00884 }
00885 return 0;
00886 }
00887 return -1;
00888 }
00889
00890
00891 #ifndef ASM_AESSETIV
00892
00893 int aesSetIV(aesParam* ap, const uint32* iv)
00894 {
00895 if (iv)
00896 {
00897 ap->fdback[0] = iv[0];
00898 ap->fdback[1] = iv[1];
00899 ap->fdback[2] = iv[2];
00900 ap->fdback[3] = iv[3];
00901 }
00902 else
00903 {
00904 ap->fdback[0] = 0;
00905 ap->fdback[1] = 0;
00906 ap->fdback[2] = 0;
00907 ap->fdback[3] = 0;
00908 }
00909
00910 return 0;
00911 }
00912
00913 #endif
00914
00915 #define etfs(i) \
00916 t0 = \
00917 _ae0[(s0 >> 24) ] ^ \
00918 _ae1[(s1 >> 16) & 0xff] ^ \
00919 _ae2[(s2 >> 8) & 0xff] ^ \
00920 _ae3[(s3 ) & 0xff] ^ \
00921 rk[i+0]; \
00922 t1 = \
00923 _ae0[(s1 >> 24) ] ^ \
00924 _ae1[(s2 >> 16) & 0xff] ^ \
00925 _ae2[(s3 >> 8) & 0xff] ^ \
00926 _ae3[(s0 ) & 0xff] ^ \
00927 rk[i+1]; \
00928 t2 = \
00929 _ae0[(s2 >> 24) ] ^ \
00930 _ae1[(s3 >> 16) & 0xff] ^ \
00931 _ae2[(s0 >> 8) & 0xff] ^ \
00932 _ae3[(s1 ) & 0xff] ^ \
00933 rk[i+2]; \
00934 t3 = \
00935 _ae0[(s3 >> 24) ] ^ \
00936 _ae1[(s0 >> 16) & 0xff] ^ \
00937 _ae2[(s1 >> 8) & 0xff] ^ \
00938 _ae3[(s2 ) & 0xff] ^ \
00939 rk[i+3];
00940
00941 #define esft(i) \
00942 s0 = \
00943 _ae0[(t0 >> 24) ] ^ \
00944 _ae1[(t1 >> 16) & 0xff] ^ \
00945 _ae2[(t2 >> 8) & 0xff] ^ \
00946 _ae3[(t3 ) & 0xff] ^ \
00947 rk[i+0]; \
00948 s1 = \
00949 _ae0[(t1 >> 24) ] ^ \
00950 _ae1[(t2 >> 16) & 0xff] ^ \
00951 _ae2[(t3 >> 8) & 0xff] ^ \
00952 _ae3[(t0 ) & 0xff] ^ \
00953 rk[i+1]; \
00954 s2 = \
00955 _ae0[(t2 >> 24) ] ^ \
00956 _ae1[(t3 >> 16) & 0xff] ^ \
00957 _ae2[(t0 >> 8) & 0xff] ^ \
00958 _ae3[(t1 ) & 0xff] ^ \
00959 rk[i+2]; \
00960 s3 = \
00961 _ae0[(t3 >> 24) ] ^ \
00962 _ae1[(t0 >> 16) & 0xff] ^ \
00963 _ae2[(t1 >> 8) & 0xff] ^ \
00964 _ae3[(t2 ) & 0xff] ^ \
00965 rk[i+3];
00966
00967 #define elr() \
00968 s0 = \
00969 (_ae4[(t0 >> 24) ] & 0xff000000) ^ \
00970 (_ae4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ \
00971 (_ae4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ \
00972 (_ae4[(t3 ) & 0xff] & 0x000000ff) ^ \
00973 rk[0]; \
00974 s1 = \
00975 (_ae4[(t1 >> 24) ] & 0xff000000) ^ \
00976 (_ae4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ \
00977 (_ae4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ \
00978 (_ae4[(t0 ) & 0xff] & 0x000000ff) ^ \
00979 rk[1]; \
00980 s2 = \
00981 (_ae4[(t2 >> 24) ] & 0xff000000) ^ \
00982 (_ae4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ \
00983 (_ae4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ \
00984 (_ae4[(t1 ) & 0xff] & 0x000000ff) ^ \
00985 rk[2]; \
00986 s3 = \
00987 (_ae4[(t3 >> 24) ] & 0xff000000) ^ \
00988 (_ae4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ \
00989 (_ae4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ \
00990 (_ae4[(t2 ) & 0xff] & 0x000000ff) ^ \
00991 rk[3];
00992
00993 #ifndef ASM_AESENCRYPT
00994
00995 int aesEncrypt(aesParam* ap, uint32* dst, const uint32* src)
00996 {
00997 register uint32 s0, s1, s2, s3;
00998 register uint32 t0, t1, t2, t3;
00999 register uint32* rk = ap->k;
01000
01001 #if WORDS_BIGENDIAN
01002 s0 = src[0] ^ rk[0];
01003 s1 = src[1] ^ rk[1];
01004 s2 = src[2] ^ rk[2];
01005 s3 = src[3] ^ rk[3];
01006 #else
01007 s0 = swapu32(src[0]) ^ rk[0];
01008 s1 = swapu32(src[1]) ^ rk[1];
01009 s2 = swapu32(src[2]) ^ rk[2];
01010 s3 = swapu32(src[3]) ^ rk[3];
01011 #endif
01012
01013 etfs(4);
01014 esft(8);
01015 etfs(12);
01016 esft(16);
01017 etfs(20);
01018 esft(24);
01019 etfs(28);
01020 esft(32);
01021 etfs(36);
01022
01023 if (ap->nr > 10)
01024 {
01025 esft(40);
01026 etfs(44);
01027 if (ap->nr > 12)
01028 {
01029 esft(48);
01030 etfs(52);
01031 }
01032 }
01033
01034 rk += (ap->nr << 2);
01035
01036 elr();
01037
01038 #if WORDS_BIGENDIAN
01039 dst[0] = s0;
01040 dst[1] = s1;
01041 dst[2] = s2;
01042 dst[3] = s3;
01043 #else
01044 dst[0] = swapu32(s0);
01045 dst[1] = swapu32(s1);
01046 dst[2] = swapu32(s2);
01047 dst[3] = swapu32(s3);
01048 #endif
01049
01050 return 0;
01051 }
01052
01053 #endif
01054
01055 #define dtfs(i) \
01056 t0 = \
01057 _ad0[(s0 >> 24) ] ^ \
01058 _ad1[(s3 >> 16) & 0xff] ^ \
01059 _ad2[(s2 >> 8) & 0xff] ^ \
01060 _ad3[(s1 ) & 0xff] ^ \
01061 rk[i+0]; \
01062 t1 = \
01063 _ad0[(s1 >> 24) ] ^ \
01064 _ad1[(s0 >> 16) & 0xff] ^ \
01065 _ad2[(s3 >> 8) & 0xff] ^ \
01066 _ad3[(s2 ) & 0xff] ^ \
01067 rk[i+1]; \
01068 t2 = \
01069 _ad0[(s2 >> 24) ] ^ \
01070 _ad1[(s1 >> 16) & 0xff] ^ \
01071 _ad2[(s0 >> 8) & 0xff] ^ \
01072 _ad3[(s3 ) & 0xff] ^ \
01073 rk[i+2]; \
01074 t3 = \
01075 _ad0[(s3 >> 24) ] ^ \
01076 _ad1[(s2 >> 16) & 0xff] ^ \
01077 _ad2[(s1 >> 8) & 0xff] ^ \
01078 _ad3[(s0 ) & 0xff] ^ \
01079 rk[i+3];
01080
01081 #define dsft(i) \
01082 s0 = \
01083 _ad0[(t0 >> 24) ] ^ \
01084 _ad1[(t3 >> 16) & 0xff] ^ \
01085 _ad2[(t2 >> 8) & 0xff] ^ \
01086 _ad3[(t1 ) & 0xff] ^ \
01087 rk[i+0]; \
01088 s1 = \
01089 _ad0[(t1 >> 24) ] ^ \
01090 _ad1[(t0 >> 16) & 0xff] ^ \
01091 _ad2[(t3 >> 8) & 0xff] ^ \
01092 _ad3[(t2 ) & 0xff] ^ \
01093 rk[i+1]; \
01094 s2 = \
01095 _ad0[(t2 >> 24) ] ^ \
01096 _ad1[(t1 >> 16) & 0xff] ^ \
01097 _ad2[(t0 >> 8) & 0xff] ^ \
01098 _ad3[(t3 ) & 0xff] ^ \
01099 rk[i+2]; \
01100 s3 = \
01101 _ad0[(t3 >> 24) ] ^ \
01102 _ad1[(t2 >> 16) & 0xff] ^ \
01103 _ad2[(t1 >> 8) & 0xff] ^ \
01104 _ad3[(t0 ) & 0xff] ^ \
01105 rk[i+3];
01106
01107 #define dlr() \
01108 s0 = \
01109 (_ad4[(t0 >> 24) ] & 0xff000000) ^ \
01110 (_ad4[(t3 >> 16) & 0xff] & 0x00ff0000) ^ \
01111 (_ad4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ \
01112 (_ad4[(t1 ) & 0xff] & 0x000000ff) ^ \
01113 rk[0]; \
01114 s1 = \
01115 (_ad4[(t1 >> 24) ] & 0xff000000) ^ \
01116 (_ad4[(t0 >> 16) & 0xff] & 0x00ff0000) ^ \
01117 (_ad4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ \
01118 (_ad4[(t2 ) & 0xff] & 0x000000ff) ^ \
01119 rk[1]; \
01120 s2 = \
01121 (_ad4[(t2 >> 24) ] & 0xff000000) ^ \
01122 (_ad4[(t1 >> 16) & 0xff] & 0x00ff0000) ^ \
01123 (_ad4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ \
01124 (_ad4[(t3 ) & 0xff] & 0x000000ff) ^ \
01125 rk[2]; \
01126 s3 = \
01127 (_ad4[(t3 >> 24) ] & 0xff000000) ^ \
01128 (_ad4[(t2 >> 16) & 0xff] & 0x00ff0000) ^ \
01129 (_ad4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ \
01130 (_ad4[(t0 ) & 0xff] & 0x000000ff) ^ \
01131 rk[3];
01132
01133 #ifndef ASM_AESDECRYPT
01134
01135 int aesDecrypt(aesParam* ap, uint32* dst, const uint32* src)
01136 {
01137 register uint32 s0, s1, s2, s3;
01138 register uint32 t0, t1, t2, t3;
01139 register uint32* rk = ap->k;
01140
01141 #if WORDS_BIGENDIAN
01142 s0 = src[0] ^ rk[0];
01143 s1 = src[1] ^ rk[1];
01144 s2 = src[2] ^ rk[2];
01145 s3 = src[3] ^ rk[3];
01146 #else
01147 s0 = swapu32(src[0]) ^ rk[0];
01148 s1 = swapu32(src[1]) ^ rk[1];
01149 s2 = swapu32(src[2]) ^ rk[2];
01150 s3 = swapu32(src[3]) ^ rk[3];
01151 #endif
01152
01153 dtfs(4);
01154 dsft(8);
01155 dtfs(12);
01156 dsft(16);
01157 dtfs(20);
01158 dsft(24);
01159 dtfs(28);
01160 dsft(32);
01161 dtfs(36);
01162
01163 if (ap->nr > 10)
01164 {
01165 dsft(40);
01166 dtfs(44);
01167 if (ap->nr > 12)
01168 {
01169 dsft(48);
01170 dtfs(52);
01171 }
01172 }
01173
01174 rk += (ap->nr << 2);
01175
01176 dlr();
01177
01178 #if WORDS_BIGENDIAN
01179 dst[0] = s0;
01180 dst[1] = s1;
01181 dst[2] = s2;
01182 dst[3] = s3;
01183 #else
01184 dst[0] = swapu32(s0);
01185 dst[1] = swapu32(s1);
01186 dst[2] = swapu32(s2);
01187 dst[3] = swapu32(s3);
01188 #endif
01189
01190 return 0;
01191 }
01192
01193 #endif
01194
01195 #ifndef ASM_AESECBENCRYPT
01196 int aesECBEncrypt(aesParam* ap, int count, uint32* dst, const uint32* src)
01197 {
01198 while (count > 0)
01199 {
01200 (void) aesEncrypt(ap, dst, src);
01201
01202 dst += 4;
01203 src += 4;
01204
01205 count--;
01206 }
01207 return 0;
01208 }
01209 #endif
01210
01211 #ifndef ASM_AESECBDECRYPT
01212 int aesECBDecrypt(aesParam* ap, int count, uint32* dst, const uint32* src)
01213 {
01214 while (count > 0)
01215 {
01216 (void) aesDecrypt(ap, dst, src);
01217
01218 dst += 4;
01219 src += 4;
01220
01221 count--;
01222 }
01223 return 0;
01224 }
01225 #endif
01226
01227 #ifndef ASM_AESCBCENCRYPT
01228
01229 int aesCBCEncrypt(aesParam* ap, int count, uint32* dst, const uint32* src)
01230 {
01231 if (count > 0)
01232 {
01233 dst[0] = src[0] ^ ap->fdback[0];
01234 dst[1] = src[1] ^ ap->fdback[1];
01235 dst[2] = src[2] ^ ap->fdback[2];
01236 dst[3] = src[3] ^ ap->fdback[3];
01237
01238 (void) aesEncrypt(ap, dst, dst);
01239
01240 dst += 4;
01241 src += 4;
01242
01243 count--;
01244
01245 while (count > 0)
01246 {
01247 dst[0] = src[0] ^ dst[-4];
01248 dst[1] = src[1] ^ dst[-3];
01249 dst[2] = src[2] ^ dst[-2];
01250 dst[3] = src[3] ^ dst[-1];
01251
01252 (void) aesEncrypt(ap, dst, dst);
01253
01254 dst += 4;
01255 src += 4;
01256
01257 count--;
01258 }
01259
01260 ap->fdback[0] = dst[-4];
01261 ap->fdback[1] = dst[-3];
01262 ap->fdback[2] = dst[-2];
01263 ap->fdback[3] = dst[-1];
01264 }
01265 return 0;
01266 }
01267
01268 #endif
01269
01270 #ifndef ASM_AESCBCDECRYPT
01271
01272 int aesCBCDecrypt(aesParam* ap, int count, uint32* dst, const uint32* src)
01273 {
01274 if (count > 0)
01275 {
01276 if (src == dst)
01277 {
01278 register uint32 fb0 = src[0];
01279 register uint32 fb1 = src[1];
01280 register uint32 fb2 = src[2];
01281 register uint32 fb3 = src[3];
01282
01283 (void) aesDecrypt(ap, dst, src);
01284
01285 dst[0] ^= ap->fdback[0];
01286 dst[1] ^= ap->fdback[1];
01287 dst[2] ^= ap->fdback[2];
01288 dst[3] ^= ap->fdback[3];
01289
01290 dst += 4;
01291 src += 4;
01292
01293 count--;
01294
01295 while (count > 0)
01296 {
01297 register int src0 = src[0];
01298 register int src1 = src[1];
01299 register int src2 = src[2];
01300 register int src3 = src[3];
01301
01302 (void) aesDecrypt(ap, dst, src);
01303
01304 dst[0] ^= fb0;
01305 dst[1] ^= fb1;
01306 dst[2] ^= fb2;
01307 dst[3] ^= fb3;
01308
01309 fb0 = src0;
01310 fb1 = src1;
01311 fb2 = src2;
01312 fb3 = src3;
01313
01314 dst += 4;
01315 src += 4;
01316
01317 count--;
01318 }
01319
01320 ap->fdback[0] = fb0;
01321 ap->fdback[1] = fb1;
01322 ap->fdback[2] = fb2;
01323 ap->fdback[3] = fb3;
01324 }
01325 else
01326 {
01327 (void) aesDecrypt(ap, dst, src);
01328
01329 dst[0] ^= ap->fdback[0];
01330 dst[1] ^= ap->fdback[1];
01331 dst[0] ^= ap->fdback[0];
01332 dst[1] ^= ap->fdback[1];
01333
01334 dst += 4;
01335 src += 4;
01336
01337 count--;
01338
01339 while (count > 0)
01340 {
01341 (void) aesDecrypt(ap, dst, src);
01342
01343 dst[0] ^= src[-4];
01344 dst[1] ^= src[-3];
01345 dst[2] ^= src[-2];
01346 dst[3] ^= src[-1];
01347
01348 dst += 4;
01349 src += 4;
01350
01351 count--;
01352 }
01353
01354 ap->fdback[0] = src[-4];
01355 ap->fdback[1] = src[-3];
01356 ap->fdback[2] = src[-2];
01357 ap->fdback[3] = src[-1];
01358 }
01359 }
01360 return 0;
01361 }
01362
01363 #endif