BeRTOS
aes_f32.h
Go to the documentation of this file.
00001 
00039 /*****************************************************************************/
00040 // ENCRYPTION TABLES
00041 /*****************************************************************************/
00042 
00043 static const uint32_t TE0[256] =
00044 {
00045     be32_to_cpu(0xc66363a5UL), be32_to_cpu(0xf87c7c84UL), be32_to_cpu(0xee777799UL), be32_to_cpu(0xf67b7b8dUL),
00046     be32_to_cpu(0xfff2f20dUL), be32_to_cpu(0xd66b6bbdUL), be32_to_cpu(0xde6f6fb1UL), be32_to_cpu(0x91c5c554UL),
00047     be32_to_cpu(0x60303050UL), be32_to_cpu(0x02010103UL), be32_to_cpu(0xce6767a9UL), be32_to_cpu(0x562b2b7dUL),
00048     be32_to_cpu(0xe7fefe19UL), be32_to_cpu(0xb5d7d762UL), be32_to_cpu(0x4dababe6UL), be32_to_cpu(0xec76769aUL),
00049     be32_to_cpu(0x8fcaca45UL), be32_to_cpu(0x1f82829dUL), be32_to_cpu(0x89c9c940UL), be32_to_cpu(0xfa7d7d87UL),
00050     be32_to_cpu(0xeffafa15UL), be32_to_cpu(0xb25959ebUL), be32_to_cpu(0x8e4747c9UL), be32_to_cpu(0xfbf0f00bUL),
00051     be32_to_cpu(0x41adadecUL), be32_to_cpu(0xb3d4d467UL), be32_to_cpu(0x5fa2a2fdUL), be32_to_cpu(0x45afafeaUL),
00052     be32_to_cpu(0x239c9cbfUL), be32_to_cpu(0x53a4a4f7UL), be32_to_cpu(0xe4727296UL), be32_to_cpu(0x9bc0c05bUL),
00053     be32_to_cpu(0x75b7b7c2UL), be32_to_cpu(0xe1fdfd1cUL), be32_to_cpu(0x3d9393aeUL), be32_to_cpu(0x4c26266aUL),
00054     be32_to_cpu(0x6c36365aUL), be32_to_cpu(0x7e3f3f41UL), be32_to_cpu(0xf5f7f702UL), be32_to_cpu(0x83cccc4fUL),
00055     be32_to_cpu(0x6834345cUL), be32_to_cpu(0x51a5a5f4UL), be32_to_cpu(0xd1e5e534UL), be32_to_cpu(0xf9f1f108UL),
00056     be32_to_cpu(0xe2717193UL), be32_to_cpu(0xabd8d873UL), be32_to_cpu(0x62313153UL), be32_to_cpu(0x2a15153fUL),
00057     be32_to_cpu(0x0804040cUL), be32_to_cpu(0x95c7c752UL), be32_to_cpu(0x46232365UL), be32_to_cpu(0x9dc3c35eUL),
00058     be32_to_cpu(0x30181828UL), be32_to_cpu(0x379696a1UL), be32_to_cpu(0x0a05050fUL), be32_to_cpu(0x2f9a9ab5UL),
00059     be32_to_cpu(0x0e070709UL), be32_to_cpu(0x24121236UL), be32_to_cpu(0x1b80809bUL), be32_to_cpu(0xdfe2e23dUL),
00060     be32_to_cpu(0xcdebeb26UL), be32_to_cpu(0x4e272769UL), be32_to_cpu(0x7fb2b2cdUL), be32_to_cpu(0xea75759fUL),
00061     be32_to_cpu(0x1209091bUL), be32_to_cpu(0x1d83839eUL), be32_to_cpu(0x582c2c74UL), be32_to_cpu(0x341a1a2eUL),
00062     be32_to_cpu(0x361b1b2dUL), be32_to_cpu(0xdc6e6eb2UL), be32_to_cpu(0xb45a5aeeUL), be32_to_cpu(0x5ba0a0fbUL),
00063     be32_to_cpu(0xa45252f6UL), be32_to_cpu(0x763b3b4dUL), be32_to_cpu(0xb7d6d661UL), be32_to_cpu(0x7db3b3ceUL),
00064     be32_to_cpu(0x5229297bUL), be32_to_cpu(0xdde3e33eUL), be32_to_cpu(0x5e2f2f71UL), be32_to_cpu(0x13848497UL),
00065     be32_to_cpu(0xa65353f5UL), be32_to_cpu(0xb9d1d168UL), be32_to_cpu(0x00000000UL), be32_to_cpu(0xc1eded2cUL),
00066     be32_to_cpu(0x40202060UL), be32_to_cpu(0xe3fcfc1fUL), be32_to_cpu(0x79b1b1c8UL), be32_to_cpu(0xb65b5bedUL),
00067     be32_to_cpu(0xd46a6abeUL), be32_to_cpu(0x8dcbcb46UL), be32_to_cpu(0x67bebed9UL), be32_to_cpu(0x7239394bUL),
00068     be32_to_cpu(0x944a4adeUL), be32_to_cpu(0x984c4cd4UL), be32_to_cpu(0xb05858e8UL), be32_to_cpu(0x85cfcf4aUL),
00069     be32_to_cpu(0xbbd0d06bUL), be32_to_cpu(0xc5efef2aUL), be32_to_cpu(0x4faaaae5UL), be32_to_cpu(0xedfbfb16UL),
00070     be32_to_cpu(0x864343c5UL), be32_to_cpu(0x9a4d4dd7UL), be32_to_cpu(0x66333355UL), be32_to_cpu(0x11858594UL),
00071     be32_to_cpu(0x8a4545cfUL), be32_to_cpu(0xe9f9f910UL), be32_to_cpu(0x04020206UL), be32_to_cpu(0xfe7f7f81UL),
00072     be32_to_cpu(0xa05050f0UL), be32_to_cpu(0x783c3c44UL), be32_to_cpu(0x259f9fbaUL), be32_to_cpu(0x4ba8a8e3UL),
00073     be32_to_cpu(0xa25151f3UL), be32_to_cpu(0x5da3a3feUL), be32_to_cpu(0x804040c0UL), be32_to_cpu(0x058f8f8aUL),
00074     be32_to_cpu(0x3f9292adUL), be32_to_cpu(0x219d9dbcUL), be32_to_cpu(0x70383848UL), be32_to_cpu(0xf1f5f504UL),
00075     be32_to_cpu(0x63bcbcdfUL), be32_to_cpu(0x77b6b6c1UL), be32_to_cpu(0xafdada75UL), be32_to_cpu(0x42212163UL),
00076     be32_to_cpu(0x20101030UL), be32_to_cpu(0xe5ffff1aUL), be32_to_cpu(0xfdf3f30eUL), be32_to_cpu(0xbfd2d26dUL),
00077     be32_to_cpu(0x81cdcd4cUL), be32_to_cpu(0x180c0c14UL), be32_to_cpu(0x26131335UL), be32_to_cpu(0xc3ecec2fUL),
00078     be32_to_cpu(0xbe5f5fe1UL), be32_to_cpu(0x359797a2UL), be32_to_cpu(0x884444ccUL), be32_to_cpu(0x2e171739UL),
00079     be32_to_cpu(0x93c4c457UL), be32_to_cpu(0x55a7a7f2UL), be32_to_cpu(0xfc7e7e82UL), be32_to_cpu(0x7a3d3d47UL),
00080     be32_to_cpu(0xc86464acUL), be32_to_cpu(0xba5d5de7UL), be32_to_cpu(0x3219192bUL), be32_to_cpu(0xe6737395UL),
00081     be32_to_cpu(0xc06060a0UL), be32_to_cpu(0x19818198UL), be32_to_cpu(0x9e4f4fd1UL), be32_to_cpu(0xa3dcdc7fUL),
00082     be32_to_cpu(0x44222266UL), be32_to_cpu(0x542a2a7eUL), be32_to_cpu(0x3b9090abUL), be32_to_cpu(0x0b888883UL),
00083     be32_to_cpu(0x8c4646caUL), be32_to_cpu(0xc7eeee29UL), be32_to_cpu(0x6bb8b8d3UL), be32_to_cpu(0x2814143cUL),
00084     be32_to_cpu(0xa7dede79UL), be32_to_cpu(0xbc5e5ee2UL), be32_to_cpu(0x160b0b1dUL), be32_to_cpu(0xaddbdb76UL),
00085     be32_to_cpu(0xdbe0e03bUL), be32_to_cpu(0x64323256UL), be32_to_cpu(0x743a3a4eUL), be32_to_cpu(0x140a0a1eUL),
00086     be32_to_cpu(0x924949dbUL), be32_to_cpu(0x0c06060aUL), be32_to_cpu(0x4824246cUL), be32_to_cpu(0xb85c5ce4UL),
00087     be32_to_cpu(0x9fc2c25dUL), be32_to_cpu(0xbdd3d36eUL), be32_to_cpu(0x43acacefUL), be32_to_cpu(0xc46262a6UL),
00088     be32_to_cpu(0x399191a8UL), be32_to_cpu(0x319595a4UL), be32_to_cpu(0xd3e4e437UL), be32_to_cpu(0xf279798bUL),
00089     be32_to_cpu(0xd5e7e732UL), be32_to_cpu(0x8bc8c843UL), be32_to_cpu(0x6e373759UL), be32_to_cpu(0xda6d6db7UL),
00090     be32_to_cpu(0x018d8d8cUL), be32_to_cpu(0xb1d5d564UL), be32_to_cpu(0x9c4e4ed2UL), be32_to_cpu(0x49a9a9e0UL),
00091     be32_to_cpu(0xd86c6cb4UL), be32_to_cpu(0xac5656faUL), be32_to_cpu(0xf3f4f407UL), be32_to_cpu(0xcfeaea25UL),
00092     be32_to_cpu(0xca6565afUL), be32_to_cpu(0xf47a7a8eUL), be32_to_cpu(0x47aeaee9UL), be32_to_cpu(0x10080818UL),
00093     be32_to_cpu(0x6fbabad5UL), be32_to_cpu(0xf0787888UL), be32_to_cpu(0x4a25256fUL), be32_to_cpu(0x5c2e2e72UL),
00094     be32_to_cpu(0x381c1c24UL), be32_to_cpu(0x57a6a6f1UL), be32_to_cpu(0x73b4b4c7UL), be32_to_cpu(0x97c6c651UL),
00095     be32_to_cpu(0xcbe8e823UL), be32_to_cpu(0xa1dddd7cUL), be32_to_cpu(0xe874749cUL), be32_to_cpu(0x3e1f1f21UL),
00096     be32_to_cpu(0x964b4bddUL), be32_to_cpu(0x61bdbddcUL), be32_to_cpu(0x0d8b8b86UL), be32_to_cpu(0x0f8a8a85UL),
00097     be32_to_cpu(0xe0707090UL), be32_to_cpu(0x7c3e3e42UL), be32_to_cpu(0x71b5b5c4UL), be32_to_cpu(0xcc6666aaUL),
00098     be32_to_cpu(0x904848d8UL), be32_to_cpu(0x06030305UL), be32_to_cpu(0xf7f6f601UL), be32_to_cpu(0x1c0e0e12UL),
00099     be32_to_cpu(0xc26161a3UL), be32_to_cpu(0x6a35355fUL), be32_to_cpu(0xae5757f9UL), be32_to_cpu(0x69b9b9d0UL),
00100     be32_to_cpu(0x17868691UL), be32_to_cpu(0x99c1c158UL), be32_to_cpu(0x3a1d1d27UL), be32_to_cpu(0x279e9eb9UL),
00101     be32_to_cpu(0xd9e1e138UL), be32_to_cpu(0xebf8f813UL), be32_to_cpu(0x2b9898b3UL), be32_to_cpu(0x22111133UL),
00102     be32_to_cpu(0xd26969bbUL), be32_to_cpu(0xa9d9d970UL), be32_to_cpu(0x078e8e89UL), be32_to_cpu(0x339494a7UL),
00103     be32_to_cpu(0x2d9b9bb6UL), be32_to_cpu(0x3c1e1e22UL), be32_to_cpu(0x15878792UL), be32_to_cpu(0xc9e9e920UL),
00104     be32_to_cpu(0x87cece49UL), be32_to_cpu(0xaa5555ffUL), be32_to_cpu(0x50282878UL), be32_to_cpu(0xa5dfdf7aUL),
00105     be32_to_cpu(0x038c8c8fUL), be32_to_cpu(0x59a1a1f8UL), be32_to_cpu(0x09898980UL), be32_to_cpu(0x1a0d0d17UL),
00106     be32_to_cpu(0x65bfbfdaUL), be32_to_cpu(0xd7e6e631UL), be32_to_cpu(0x844242c6UL), be32_to_cpu(0xd06868b8UL),
00107     be32_to_cpu(0x824141c3UL), be32_to_cpu(0x299999b0UL), be32_to_cpu(0x5a2d2d77UL), be32_to_cpu(0x1e0f0f11UL),
00108     be32_to_cpu(0x7bb0b0cbUL), be32_to_cpu(0xa85454fcUL), be32_to_cpu(0x6dbbbbd6UL), be32_to_cpu(0x2c16163aUL),
00109 };
00110 
00111 static const uint8_t TE4[256] =
00112 {
00113     0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
00114     0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
00115     0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
00116     0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
00117     0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
00118     0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
00119     0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
00120     0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
00121     0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
00122     0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
00123     0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
00124     0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
00125     0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
00126     0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
00127     0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
00128     0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
00129     0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
00130     0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
00131     0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
00132     0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
00133     0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
00134     0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
00135     0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
00136     0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
00137     0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
00138     0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
00139     0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
00140     0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
00141     0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
00142     0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
00143     0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
00144     0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
00145 };
00146 
00147 static const uint8_t rcon[10] =
00148 {
00149     0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,
00150     /* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
00151 };
00152 
00153 #if CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN
00154 
00155 #define Te0(x) TE0[x&0xFF]
00156 #define Te1(x) ROTL(TE0[(x>>8)&0xFF], 8)
00157 #define Te2(x) ROTL(TE0[(x>>16)&0xFF], 16)
00158 #define Te3(x) ROTL(TE0[x>>24], 24)
00159 
00160 #define Te4_0(x)  ((uint32_t)TE4[x>>24] << 24)
00161 #define Te4_1(x)  ((uint32_t)TE4[(x>>16)&0xFF] << 16)
00162 #define Te4_2(x)  ((uint32_t)TE4[(x>>8)&0xFF] << 8)
00163 #define Te4_3(x)  ((uint32_t)TE4[x&0xFF])
00164 
00165 #define RCON(x)   ((uint32_t)rcon[x])
00166 
00167 #define TeKeyMix(x)  \
00168     (((uint32_t)TE4[(x>>8)&0xFF]) ^ \
00169     ((uint32_t)TE4[(x>>16)&0xFF] << 8) ^ \
00170     ((uint32_t)TE4[x>>24] << 16) ^ \
00171     ((uint32_t)TE4[x&0xFF]) << 24)
00172 
00173 #define TeKeyMix2(x) TeKeyMix(ROTL(x, 8))
00174 
00175 #else
00176 
00177 #define Te0(x) TE0[x>>24]
00178 #define Te1(x) ROTR(TE0[(x>>16)&0xFF], 8)
00179 #define Te2(x) ROTR(TE0[(x>>8)&0xFF], 16)
00180 #define Te3(x) ROTR(TE0[x&0xFF], 24)
00181 
00182 #define Te4_0(x)  ((uint32_t)TE4[x&0xFF])
00183 #define Te4_1(x)  ((uint32_t)TE4[(x>>8)&0xFF] << 8)
00184 #define Te4_2(x)  ((uint32_t)TE4[(x>>16)&0xFF] << 16)
00185 #define Te4_3(x)  ((uint32_t)TE4[x>>24] << 24)
00186 
00187 #define TeKeyMix(x)  \
00188     ((TE4[(x>>16)&0xFF] << 24) ^ \
00189     (TE4[(x>>8)&0xFF] << 16) ^ \
00190     (TE4[x&0xFF] << 8) ^ \
00191     (TE4[x>>24]))
00192 
00193 #define TeKeyMix2(x) TeKeyMix(ROTR(x, 8))
00194 
00195 #define RCON(x)   (((uint32_t)rcon[x])<<24)
00196 
00197 #endif
00198 
00199 
00200 /*****************************************************************************/
00201 // DECRYPTION TABLES
00202 /*****************************************************************************/
00203 
00204 static const uint32_t TD0[256] =
00205 {
00206     be32_to_cpu(0x51f4a750UL), be32_to_cpu(0x7e416553UL), be32_to_cpu(0x1a17a4c3UL), be32_to_cpu(0x3a275e96UL),
00207     be32_to_cpu(0x3bab6bcbUL), be32_to_cpu(0x1f9d45f1UL), be32_to_cpu(0xacfa58abUL), be32_to_cpu(0x4be30393UL),
00208     be32_to_cpu(0x2030fa55UL), be32_to_cpu(0xad766df6UL), be32_to_cpu(0x88cc7691UL), be32_to_cpu(0xf5024c25UL),
00209     be32_to_cpu(0x4fe5d7fcUL), be32_to_cpu(0xc52acbd7UL), be32_to_cpu(0x26354480UL), be32_to_cpu(0xb562a38fUL),
00210     be32_to_cpu(0xdeb15a49UL), be32_to_cpu(0x25ba1b67UL), be32_to_cpu(0x45ea0e98UL), be32_to_cpu(0x5dfec0e1UL),
00211     be32_to_cpu(0xc32f7502UL), be32_to_cpu(0x814cf012UL), be32_to_cpu(0x8d4697a3UL), be32_to_cpu(0x6bd3f9c6UL),
00212     be32_to_cpu(0x038f5fe7UL), be32_to_cpu(0x15929c95UL), be32_to_cpu(0xbf6d7aebUL), be32_to_cpu(0x955259daUL),
00213     be32_to_cpu(0xd4be832dUL), be32_to_cpu(0x587421d3UL), be32_to_cpu(0x49e06929UL), be32_to_cpu(0x8ec9c844UL),
00214     be32_to_cpu(0x75c2896aUL), be32_to_cpu(0xf48e7978UL), be32_to_cpu(0x99583e6bUL), be32_to_cpu(0x27b971ddUL),
00215     be32_to_cpu(0xbee14fb6UL), be32_to_cpu(0xf088ad17UL), be32_to_cpu(0xc920ac66UL), be32_to_cpu(0x7dce3ab4UL),
00216     be32_to_cpu(0x63df4a18UL), be32_to_cpu(0xe51a3182UL), be32_to_cpu(0x97513360UL), be32_to_cpu(0x62537f45UL),
00217     be32_to_cpu(0xb16477e0UL), be32_to_cpu(0xbb6bae84UL), be32_to_cpu(0xfe81a01cUL), be32_to_cpu(0xf9082b94UL),
00218     be32_to_cpu(0x70486858UL), be32_to_cpu(0x8f45fd19UL), be32_to_cpu(0x94de6c87UL), be32_to_cpu(0x527bf8b7UL),
00219     be32_to_cpu(0xab73d323UL), be32_to_cpu(0x724b02e2UL), be32_to_cpu(0xe31f8f57UL), be32_to_cpu(0x6655ab2aUL),
00220     be32_to_cpu(0xb2eb2807UL), be32_to_cpu(0x2fb5c203UL), be32_to_cpu(0x86c57b9aUL), be32_to_cpu(0xd33708a5UL),
00221     be32_to_cpu(0x302887f2UL), be32_to_cpu(0x23bfa5b2UL), be32_to_cpu(0x02036abaUL), be32_to_cpu(0xed16825cUL),
00222     be32_to_cpu(0x8acf1c2bUL), be32_to_cpu(0xa779b492UL), be32_to_cpu(0xf307f2f0UL), be32_to_cpu(0x4e69e2a1UL),
00223     be32_to_cpu(0x65daf4cdUL), be32_to_cpu(0x0605bed5UL), be32_to_cpu(0xd134621fUL), be32_to_cpu(0xc4a6fe8aUL),
00224     be32_to_cpu(0x342e539dUL), be32_to_cpu(0xa2f355a0UL), be32_to_cpu(0x058ae132UL), be32_to_cpu(0xa4f6eb75UL),
00225     be32_to_cpu(0x0b83ec39UL), be32_to_cpu(0x4060efaaUL), be32_to_cpu(0x5e719f06UL), be32_to_cpu(0xbd6e1051UL),
00226     be32_to_cpu(0x3e218af9UL), be32_to_cpu(0x96dd063dUL), be32_to_cpu(0xdd3e05aeUL), be32_to_cpu(0x4de6bd46UL),
00227     be32_to_cpu(0x91548db5UL), be32_to_cpu(0x71c45d05UL), be32_to_cpu(0x0406d46fUL), be32_to_cpu(0x605015ffUL),
00228     be32_to_cpu(0x1998fb24UL), be32_to_cpu(0xd6bde997UL), be32_to_cpu(0x894043ccUL), be32_to_cpu(0x67d99e77UL),
00229     be32_to_cpu(0xb0e842bdUL), be32_to_cpu(0x07898b88UL), be32_to_cpu(0xe7195b38UL), be32_to_cpu(0x79c8eedbUL),
00230     be32_to_cpu(0xa17c0a47UL), be32_to_cpu(0x7c420fe9UL), be32_to_cpu(0xf8841ec9UL), be32_to_cpu(0x00000000UL),
00231     be32_to_cpu(0x09808683UL), be32_to_cpu(0x322bed48UL), be32_to_cpu(0x1e1170acUL), be32_to_cpu(0x6c5a724eUL),
00232     be32_to_cpu(0xfd0efffbUL), be32_to_cpu(0x0f853856UL), be32_to_cpu(0x3daed51eUL), be32_to_cpu(0x362d3927UL),
00233     be32_to_cpu(0x0a0fd964UL), be32_to_cpu(0x685ca621UL), be32_to_cpu(0x9b5b54d1UL), be32_to_cpu(0x24362e3aUL),
00234     be32_to_cpu(0x0c0a67b1UL), be32_to_cpu(0x9357e70fUL), be32_to_cpu(0xb4ee96d2UL), be32_to_cpu(0x1b9b919eUL),
00235     be32_to_cpu(0x80c0c54fUL), be32_to_cpu(0x61dc20a2UL), be32_to_cpu(0x5a774b69UL), be32_to_cpu(0x1c121a16UL),
00236     be32_to_cpu(0xe293ba0aUL), be32_to_cpu(0xc0a02ae5UL), be32_to_cpu(0x3c22e043UL), be32_to_cpu(0x121b171dUL),
00237     be32_to_cpu(0x0e090d0bUL), be32_to_cpu(0xf28bc7adUL), be32_to_cpu(0x2db6a8b9UL), be32_to_cpu(0x141ea9c8UL),
00238     be32_to_cpu(0x57f11985UL), be32_to_cpu(0xaf75074cUL), be32_to_cpu(0xee99ddbbUL), be32_to_cpu(0xa37f60fdUL),
00239     be32_to_cpu(0xf701269fUL), be32_to_cpu(0x5c72f5bcUL), be32_to_cpu(0x44663bc5UL), be32_to_cpu(0x5bfb7e34UL),
00240     be32_to_cpu(0x8b432976UL), be32_to_cpu(0xcb23c6dcUL), be32_to_cpu(0xb6edfc68UL), be32_to_cpu(0xb8e4f163UL),
00241     be32_to_cpu(0xd731dccaUL), be32_to_cpu(0x42638510UL), be32_to_cpu(0x13972240UL), be32_to_cpu(0x84c61120UL),
00242     be32_to_cpu(0x854a247dUL), be32_to_cpu(0xd2bb3df8UL), be32_to_cpu(0xaef93211UL), be32_to_cpu(0xc729a16dUL),
00243     be32_to_cpu(0x1d9e2f4bUL), be32_to_cpu(0xdcb230f3UL), be32_to_cpu(0x0d8652ecUL), be32_to_cpu(0x77c1e3d0UL),
00244     be32_to_cpu(0x2bb3166cUL), be32_to_cpu(0xa970b999UL), be32_to_cpu(0x119448faUL), be32_to_cpu(0x47e96422UL),
00245     be32_to_cpu(0xa8fc8cc4UL), be32_to_cpu(0xa0f03f1aUL), be32_to_cpu(0x567d2cd8UL), be32_to_cpu(0x223390efUL),
00246     be32_to_cpu(0x87494ec7UL), be32_to_cpu(0xd938d1c1UL), be32_to_cpu(0x8ccaa2feUL), be32_to_cpu(0x98d40b36UL),
00247     be32_to_cpu(0xa6f581cfUL), be32_to_cpu(0xa57ade28UL), be32_to_cpu(0xdab78e26UL), be32_to_cpu(0x3fadbfa4UL),
00248     be32_to_cpu(0x2c3a9de4UL), be32_to_cpu(0x5078920dUL), be32_to_cpu(0x6a5fcc9bUL), be32_to_cpu(0x547e4662UL),
00249     be32_to_cpu(0xf68d13c2UL), be32_to_cpu(0x90d8b8e8UL), be32_to_cpu(0x2e39f75eUL), be32_to_cpu(0x82c3aff5UL),
00250     be32_to_cpu(0x9f5d80beUL), be32_to_cpu(0x69d0937cUL), be32_to_cpu(0x6fd52da9UL), be32_to_cpu(0xcf2512b3UL),
00251     be32_to_cpu(0xc8ac993bUL), be32_to_cpu(0x10187da7UL), be32_to_cpu(0xe89c636eUL), be32_to_cpu(0xdb3bbb7bUL),
00252     be32_to_cpu(0xcd267809UL), be32_to_cpu(0x6e5918f4UL), be32_to_cpu(0xec9ab701UL), be32_to_cpu(0x834f9aa8UL),
00253     be32_to_cpu(0xe6956e65UL), be32_to_cpu(0xaaffe67eUL), be32_to_cpu(0x21bccf08UL), be32_to_cpu(0xef15e8e6UL),
00254     be32_to_cpu(0xbae79bd9UL), be32_to_cpu(0x4a6f36ceUL), be32_to_cpu(0xea9f09d4UL), be32_to_cpu(0x29b07cd6UL),
00255     be32_to_cpu(0x31a4b2afUL), be32_to_cpu(0x2a3f2331UL), be32_to_cpu(0xc6a59430UL), be32_to_cpu(0x35a266c0UL),
00256     be32_to_cpu(0x744ebc37UL), be32_to_cpu(0xfc82caa6UL), be32_to_cpu(0xe090d0b0UL), be32_to_cpu(0x33a7d815UL),
00257     be32_to_cpu(0xf104984aUL), be32_to_cpu(0x41ecdaf7UL), be32_to_cpu(0x7fcd500eUL), be32_to_cpu(0x1791f62fUL),
00258     be32_to_cpu(0x764dd68dUL), be32_to_cpu(0x43efb04dUL), be32_to_cpu(0xccaa4d54UL), be32_to_cpu(0xe49604dfUL),
00259     be32_to_cpu(0x9ed1b5e3UL), be32_to_cpu(0x4c6a881bUL), be32_to_cpu(0xc12c1fb8UL), be32_to_cpu(0x4665517fUL),
00260     be32_to_cpu(0x9d5eea04UL), be32_to_cpu(0x018c355dUL), be32_to_cpu(0xfa877473UL), be32_to_cpu(0xfb0b412eUL),
00261     be32_to_cpu(0xb3671d5aUL), be32_to_cpu(0x92dbd252UL), be32_to_cpu(0xe9105633UL), be32_to_cpu(0x6dd64713UL),
00262     be32_to_cpu(0x9ad7618cUL), be32_to_cpu(0x37a10c7aUL), be32_to_cpu(0x59f8148eUL), be32_to_cpu(0xeb133c89UL),
00263     be32_to_cpu(0xcea927eeUL), be32_to_cpu(0xb761c935UL), be32_to_cpu(0xe11ce5edUL), be32_to_cpu(0x7a47b13cUL),
00264     be32_to_cpu(0x9cd2df59UL), be32_to_cpu(0x55f2733fUL), be32_to_cpu(0x1814ce79UL), be32_to_cpu(0x73c737bfUL),
00265     be32_to_cpu(0x53f7cdeaUL), be32_to_cpu(0x5ffdaa5bUL), be32_to_cpu(0xdf3d6f14UL), be32_to_cpu(0x7844db86UL),
00266     be32_to_cpu(0xcaaff381UL), be32_to_cpu(0xb968c43eUL), be32_to_cpu(0x3824342cUL), be32_to_cpu(0xc2a3405fUL),
00267     be32_to_cpu(0x161dc372UL), be32_to_cpu(0xbce2250cUL), be32_to_cpu(0x283c498bUL), be32_to_cpu(0xff0d9541UL),
00268     be32_to_cpu(0x39a80171UL), be32_to_cpu(0x080cb3deUL), be32_to_cpu(0xd8b4e49cUL), be32_to_cpu(0x6456c190UL),
00269     be32_to_cpu(0x7bcb8461UL), be32_to_cpu(0xd532b670UL), be32_to_cpu(0x486c5c74UL), be32_to_cpu(0xd0b85742UL),
00270 };
00271 
00272 static const uint8_t TD4[256] =
00273 {
00274     0x52, 0x09, 0x6a, 0xd5,
00275     0x30, 0x36, 0xa5, 0x38,
00276     0xbf, 0x40, 0xa3, 0x9e,
00277     0x81, 0xf3, 0xd7, 0xfb,
00278     0x7c, 0xe3, 0x39, 0x82,
00279     0x9b, 0x2f, 0xff, 0x87,
00280     0x34, 0x8e, 0x43, 0x44,
00281     0xc4, 0xde, 0xe9, 0xcb,
00282     0x54, 0x7b, 0x94, 0x32,
00283     0xa6, 0xc2, 0x23, 0x3d,
00284     0xee, 0x4c, 0x95, 0x0b,
00285     0x42, 0xfa, 0xc3, 0x4e,
00286     0x08, 0x2e, 0xa1, 0x66,
00287     0x28, 0xd9, 0x24, 0xb2,
00288     0x76, 0x5b, 0xa2, 0x49,
00289     0x6d, 0x8b, 0xd1, 0x25,
00290     0x72, 0xf8, 0xf6, 0x64,
00291     0x86, 0x68, 0x98, 0x16,
00292     0xd4, 0xa4, 0x5c, 0xcc,
00293     0x5d, 0x65, 0xb6, 0x92,
00294     0x6c, 0x70, 0x48, 0x50,
00295     0xfd, 0xed, 0xb9, 0xda,
00296     0x5e, 0x15, 0x46, 0x57,
00297     0xa7, 0x8d, 0x9d, 0x84,
00298     0x90, 0xd8, 0xab, 0x00,
00299     0x8c, 0xbc, 0xd3, 0x0a,
00300     0xf7, 0xe4, 0x58, 0x05,
00301     0xb8, 0xb3, 0x45, 0x06,
00302     0xd0, 0x2c, 0x1e, 0x8f,
00303     0xca, 0x3f, 0x0f, 0x02,
00304     0xc1, 0xaf, 0xbd, 0x03,
00305     0x01, 0x13, 0x8a, 0x6b,
00306     0x3a, 0x91, 0x11, 0x41,
00307     0x4f, 0x67, 0xdc, 0xea,
00308     0x97, 0xf2, 0xcf, 0xce,
00309     0xf0, 0xb4, 0xe6, 0x73,
00310     0x96, 0xac, 0x74, 0x22,
00311     0xe7, 0xad, 0x35, 0x85,
00312     0xe2, 0xf9, 0x37, 0xe8,
00313     0x1c, 0x75, 0xdf, 0x6e,
00314     0x47, 0xf1, 0x1a, 0x71,
00315     0x1d, 0x29, 0xc5, 0x89,
00316     0x6f, 0xb7, 0x62, 0x0e,
00317     0xaa, 0x18, 0xbe, 0x1b,
00318     0xfc, 0x56, 0x3e, 0x4b,
00319     0xc6, 0xd2, 0x79, 0x20,
00320     0x9a, 0xdb, 0xc0, 0xfe,
00321     0x78, 0xcd, 0x5a, 0xf4,
00322     0x1f, 0xdd, 0xa8, 0x33,
00323     0x88, 0x07, 0xc7, 0x31,
00324     0xb1, 0x12, 0x10, 0x59,
00325     0x27, 0x80, 0xec, 0x5f,
00326     0x60, 0x51, 0x7f, 0xa9,
00327     0x19, 0xb5, 0x4a, 0x0d,
00328     0x2d, 0xe5, 0x7a, 0x9f,
00329     0x93, 0xc9, 0x9c, 0xef,
00330     0xa0, 0xe0, 0x3b, 0x4d,
00331     0xae, 0x2a, 0xf5, 0xb0,
00332     0xc8, 0xeb, 0xbb, 0x3c,
00333     0x83, 0x53, 0x99, 0x61,
00334     0x17, 0x2b, 0x04, 0x7e,
00335     0xba, 0x77, 0xd6, 0x26,
00336     0xe1, 0x69, 0x14, 0x63,
00337     0x55, 0x21, 0x0c, 0x7d,
00338 };
00339 
00340 
00341 #if CPU_BYTE_ORDER == CPU_LITTLE_ENDIAN
00342 
00343 #define XTd0(x) TD0[x]
00344 #define XTd1(x) ROTL(TD0[x], 8)
00345 #define XTd2(x) ROTL(TD0[x], 16)
00346 #define XTd3(x) ROTL(TD0[x], 24)
00347 
00348 #define Td0(x)  XTd0(x&0xff)
00349 #define Td1(x)  XTd1((x>>8)&0xff)
00350 #define Td2(x)  XTd2((x>>16)&0xff)
00351 #define Td3(x)  XTd3(x>>24)
00352 
00353 #define TdMix_0(x)  TE4[x&0xFF]
00354 #define TdMix_1(x)  TE4[(x>>8)&0xFF]
00355 #define TdMix_2(x)  TE4[(x>>16)&0xFF]
00356 #define TdMix_3(x)  TE4[x>>24]
00357 
00358 #define Td4_0(x)  ((uint32_t)TD4[x&0xFF])
00359 #define Td4_1(x)  ((uint32_t)TD4[(x>>8)&0xFF] << 8)
00360 #define Td4_2(x)  ((uint32_t)TD4[(x>>16)&0xFF] << 16)
00361 #define Td4_3(x)  ((uint32_t)TD4[x>>24] << 24)
00362 
00363 #else
00364 
00365 #define XTd0(x) TD0[x]
00366 #define XTd1(x) ROTR(TD0[x], 8)
00367 #define XTd2(x) ROTR(TD0[x], 16)
00368 #define XTd3(x) ROTR(TD0[x], 24)
00369 
00370 #define Td0(x)  XTd0(x>>24)
00371 #define Td1(x)  XTd1((x>>16)&0xff)
00372 #define Td2(x)  XTd2((x>>8)&0xff)
00373 #define Td3(x)  XTd3(x&0xff)
00374 
00375 #define TdMix_0(x)  TE4[x>>24]
00376 #define TdMix_1(x)  TE4[(x>>16)&0xFF]
00377 #define TdMix_2(x)  TE4[(x>>8)&0xFF]
00378 #define TdMix_3(x)  TE4[x&0xFF]
00379 
00380 #define Td4_0(x)  ((uint32_t)TD4[x>>24] << 24)
00381 #define Td4_1(x)  ((uint32_t)TD4[(x>>16)&0xFF] << 16)
00382 #define Td4_2(x)  ((uint32_t)TD4[(x>>8)&0xFF] << 8)
00383 #define Td4_3(x)  ((uint32_t)TD4[x&0xFF])
00384 
00385 #endif
00386 
00387 
00388 /*****************************************************************************/
00389 // CODE
00390 /*****************************************************************************/
00391 
00392 static void lazy_expandKeyEnc128(uint32_t *k)
00393 {
00394     int i = 0;
00395     while (1)
00396     {
00397         k[4] = k[0] ^ TeKeyMix(k[3]) ^ RCON(i);
00398         k[5] = k[1] ^ k[4];
00399         k[6] = k[2] ^ k[5];
00400         k[7] = k[3] ^ k[6];
00401         if (++i == 10)
00402            break;
00403         k += 4;
00404     }
00405 }
00406 
00407 static void lazy_expandKeyEnc192(uint32_t *k)
00408 {
00409     int i = 0;
00410     while (1)
00411     {
00412         k[ 6] = k[ 0] ^ TeKeyMix(k[5]) ^ RCON(i);
00413         k[ 7] = k[ 1] ^ k[ 6];
00414         k[ 8] = k[ 2] ^ k[ 7];
00415         k[ 9] = k[ 3] ^ k[ 8];
00416         if (++i == 8)
00417             break;
00418         k[10] = k[ 4] ^ k[ 9];
00419         k[11] = k[ 5] ^ k[10];
00420         k += 6;
00421     }
00422 }
00423 
00424 static void lazy_expandKeyEnc256(uint32_t *k)
00425 {
00426     int i = 0;
00427     for (;;)
00428     {
00429         k[ 8] = k[ 0] ^ TeKeyMix(k[7]) ^ RCON(i);
00430         k[ 9] = k[ 1] ^ k[ 8];
00431         k[10] = k[ 2] ^ k[ 9];
00432         k[11] = k[ 3] ^ k[10];
00433         if (++i == 7)
00434             break;
00435         k[12] = k[ 4] ^ TeKeyMix2(k[11]);
00436         k[13] = k[ 5] ^ k[12];
00437         k[14] = k[ 6] ^ k[13];
00438         k[15] = k[ 7] ^ k[14];
00439         k += 8;
00440     }
00441 }
00442 
00443 typedef void (*lazy_expand_handler)(uint32_t *);
00444 
00445 static const lazy_expand_handler lazy_expandKeyEnc[3] =
00446 {
00447     lazy_expandKeyEnc128, lazy_expandKeyEnc192, lazy_expandKeyEnc256,
00448 };
00449 
00450 static void lazy_expandKeyDec(uint32_t *k, int len)
00451 {
00452     k += len-5;
00453     for (int i=0;i<len-8;++i)
00454     {
00455         k[0] = XTd0(TdMix_0(k[0])) ^ XTd1(TdMix_1(k[0])) ^ XTd2(TdMix_2(k[0])) ^ XTd3(TdMix_3(k[0]));
00456         --k;
00457     }
00458 }
00459 
00460 static void AES_expandKey(BlockCipher *c_, const void *key, size_t len)
00461 {
00462     AES_Context *c = (AES_Context *)c_;
00463     ASSERT(len == c->c.key_len);
00464 
00465     memcpy (c->expkey, key, c->c.key_len);
00466     c->key_status = 0;
00467 }
00468 
00469 static void AES_encrypt(BlockCipher *c_, void *block)
00470 {
00471     AES_Context *c = (AES_Context *)c_;
00472     uint32_t *k = c->expkey;
00473     uint32_t t0, t1, t2, t3, s0, s1, s2, s3;
00474     int Nr = c->num_rounds;
00475 
00476     if (c->key_status <= 0)
00477     {
00478         lazy_expandKeyEnc[(Nr-10U)/2](k);
00479         c->key_status = 1;
00480     }
00481 
00482     s0 = ((uint32_t*)block)[0];
00483     s1 = ((uint32_t*)block)[1];
00484     s2 = ((uint32_t*)block)[2];
00485     s3 = ((uint32_t*)block)[3];
00486 
00487     s0 ^= k[0];
00488     s1 ^= k[1];
00489     s2 ^= k[2];
00490     s3 ^= k[3];
00491 
00492     int r = 0;
00493     while (1)
00494     {
00495         k += 4;
00496         t0 = Te0(s0)^Te1(s1)^Te2(s2)^Te3(s3)^k[0];
00497         t1 = Te0(s1)^Te1(s2)^Te2(s3)^Te3(s0)^k[1];
00498         t2 = Te0(s2)^Te1(s3)^Te2(s0)^Te3(s1)^k[2];
00499         t3 = Te0(s3)^Te1(s0)^Te2(s1)^Te3(s2)^k[3];
00500         if (r == Nr-2)
00501             break;
00502         s0 = t0; s1 = t1; s2 = t2; s3 = t3;
00503         ++r;
00504     }
00505     k += 4;
00506 
00507     s0 = Te4_3(t0)^Te4_2(t1)^Te4_1(t2)^Te4_0(t3)^k[0];
00508     s1 = Te4_3(t1)^Te4_2(t2)^Te4_1(t3)^Te4_0(t0)^k[1];
00509     s2 = Te4_3(t2)^Te4_2(t3)^Te4_1(t0)^Te4_0(t1)^k[2];
00510     s3 = Te4_3(t3)^Te4_2(t0)^Te4_1(t1)^Te4_0(t2)^k[3];
00511 
00512     ((uint32_t*)block)[0] = s0;
00513     ((uint32_t*)block)[1] = s1;
00514     ((uint32_t*)block)[2] = s2;
00515     ((uint32_t*)block)[3] = s3;
00516 }
00517 
00518 
00519 static void AES_decrypt(BlockCipher *c_, void *block)
00520 {
00521     AES_Context *c = (AES_Context *)c_;
00522     uint32_t *k = c->expkey;
00523     uint32_t t0, t1, t2, t3, s0, s1, s2, s3;
00524     uint8_t Nr = c->num_rounds;
00525     int klen = (Nr+1)*4;
00526 
00527     if (c->key_status >= 0)
00528     {
00529         if (c->key_status == 0)
00530             lazy_expandKeyEnc[(Nr-10U)/2](k);
00531         lazy_expandKeyDec(k, klen);
00532         c->key_status = -1;
00533     }
00534 
00535     k += klen-4;
00536 
00537     s0 = ((uint32_t*)block)[0] ^ k[0];
00538     s1 = ((uint32_t*)block)[1] ^ k[1];
00539     s2 = ((uint32_t*)block)[2] ^ k[2];
00540     s3 = ((uint32_t*)block)[3] ^ k[3];
00541 
00542     int r = 0;
00543     while (1)
00544     {
00545         k -= 4;
00546 
00547         t0 = Td0(s0)^Td1(s3)^Td2(s2)^Td3(s1)^k[0];
00548         t1 = Td0(s1)^Td1(s0)^Td2(s3)^Td3(s2)^k[1];
00549         t2 = Td0(s2)^Td1(s1)^Td2(s0)^Td3(s3)^k[2];
00550         t3 = Td0(s3)^Td1(s2)^Td2(s1)^Td3(s0)^k[3];
00551 
00552         if (r == Nr-2)
00553             break;
00554         s0 = t0; s1 = t1; s2 = t2; s3 = t3;
00555         ++r;
00556     }
00557 
00558     k -= 4;
00559     s0 = Td4_0(t0)^Td4_1(t3)^Td4_2(t2)^Td4_3(t1)^k[0];
00560     s1 = Td4_0(t1)^Td4_1(t0)^Td4_2(t3)^Td4_3(t2)^k[1];
00561     s2 = Td4_0(t2)^Td4_1(t1)^Td4_2(t0)^Td4_3(t3)^k[2];
00562     s3 = Td4_0(t3)^Td4_1(t2)^Td4_2(t1)^Td4_3(t0)^k[3];
00563 
00564     ((uint32_t*)block)[0] = s0;
00565     ((uint32_t*)block)[1] = s1;
00566     ((uint32_t*)block)[2] = s2;
00567     ((uint32_t*)block)[3] = s3;
00568 }