BeRTOS
|
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 }