Main Page   Modules   Data Structures   File List   Data Fields   Globals   Related Pages  

beecrypt/aes.c

Go to the documentation of this file.
00001 
00008 /*
00009  * Copyright (c) 2002 Bob Deblier
00010  *
00011  * This library is free software; you can redistribute it and/or
00012  * modify it under the terms of the GNU Lesser General Public
00013  * License as published by the Free Software Foundation; either
00014  * version 2.1 of the License, or (at your option) any later version.
00015  *
00016  * This library is distributed in the hope that it will be useful,
00017  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00018  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019  * Lesser General Public License for more details.
00020  *
00021  * You should have received a copy of the GNU Lesser General Public
00022  * License along with this library; if not, write to the Free Software
00023  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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 /*@-exportheadervar -exportlocal@*/ /* FIX: tables needed by aes asm */
00038 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@observer@*/ /*@unchecked@*/
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 /*@=exportheadervar =exportlocal@*/
00736 
00739 /*@observer@*/ /*@unchecked@*/
00740 static const uint32 _arc[] = {
00741         0x01000000, 0x02000000, 0x04000000, 0x08000000,
00742         0x10000000, 0x20000000, 0x40000000, 0x80000000,
00743         0x1B000000, 0x36000000
00744 };
00745 
00748 /*@observer@*/ /*@unchecked@*/
00749 static const blockMode aesModes[2] =
00750 {
00751         { /* ECB */ (blockModeEncrypt) aesECBEncrypt, (blockModeDecrypt) aesECBDecrypt },
00752         { /* CBC */ (blockModeEncrypt) aesCBCEncrypt, (blockModeDecrypt) aesCBCDecrypt }
00753 };
00754 
00755 /*@-sizeoftype@*/
00756 const blockCipher aes = { "AES", sizeof(aesParam), 16, 128, 256, 64, (blockCipherSetup) aesSetup, (blockCipherSetIV) aesSetIV, (blockCipherEncrypt) aesEncrypt, (blockCipherDecrypt) aesDecrypt, aesModes };
00757 /*@=sizeoftype@*/
00758 
00759 /*@-boundswrite@*/
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                 /* clear fdback/iv */
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 /*@=boundswrite@*/
00890 
00891 #ifndef ASM_AESSETIV
00892 /*@-boundsread@*/
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 /*@=boundsread@*/
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 /*@-boundswrite@*/
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);                /* round 1 */
01014         esft(8);                /* round 2 */
01015         etfs(12);               /* round 3 */
01016         esft(16);               /* round 4 */
01017         etfs(20);               /* round 5 */
01018         esft(24);               /* round 6 */
01019         etfs(28);               /* round 7 */
01020         esft(32);               /* round 8 */
01021         etfs(36);               /* round 9 */
01022 
01023         if (ap->nr > 10)
01024         {
01025                 esft(40);       /* round 10 */
01026                 etfs(44);       /* round 11 */
01027                 if (ap->nr > 12)
01028                 {
01029                         esft(48);       /* round 12 */
01030                         etfs(52);       /* round 13 */
01031                 }
01032         }
01033 
01034         rk += (ap->nr << 2);
01035 
01036         elr(); /* last round */
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 /*@=boundswrite@*/
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 /*@-boundswrite@*/
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);                /* round 1 */
01154         dsft(8);                /* round 2 */
01155         dtfs(12);               /* round 3 */
01156         dsft(16);               /* round 4 */
01157         dtfs(20);               /* round 5 */
01158         dsft(24);               /* round 6 */
01159         dtfs(28);               /* round 7 */
01160         dsft(32);               /* round 8 */
01161         dtfs(36);               /* round 9 */
01162 
01163         if (ap->nr > 10)
01164         {
01165                 dsft(40);       /* round 10 */
01166                 dtfs(44);       /* round 11 */
01167                 if (ap->nr > 12)
01168                 {
01169                         dsft(48);       /* round 12 */
01170                         dtfs(52);       /* round 13 */
01171                 }
01172         }
01173 
01174         rk += (ap->nr << 2);
01175 
01176         dlr(); /* last round */
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 /*@=boundswrite@*/
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 /*@-boundswrite@*/
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 /*@=boundswrite@*/
01268 #endif
01269 
01270 #ifndef ASM_AESCBCDECRYPT
01271 /*@-boundsread@*/
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 /*@=boundsread@*/
01363 #endif

Generated on Wed Sep 4 12:49:47 2002 for rpm by doxygen1.2.14 written by Dimitri van Heesch, © 1997-2002