34 #if defined(POLARSSL_DES_C)
42 #define GET_UINT32_BE(n,b,i) \
44 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
45 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
46 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
47 | ( (uint32_t) (b)[(i) + 3] ); \
52 #define PUT_UINT32_BE(n,b,i) \
54 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
55 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
56 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
57 (b)[(i) + 3] = (unsigned char) ( (n) ); \
64 static const uint32_t SB1[64] =
66 0x01010400, 0x00000000, 0x00010000, 0x01010404,
67 0x01010004, 0x00010404, 0x00000004, 0x00010000,
68 0x00000400, 0x01010400, 0x01010404, 0x00000400,
69 0x01000404, 0x01010004, 0x01000000, 0x00000004,
70 0x00000404, 0x01000400, 0x01000400, 0x00010400,
71 0x00010400, 0x01010000, 0x01010000, 0x01000404,
72 0x00010004, 0x01000004, 0x01000004, 0x00010004,
73 0x00000000, 0x00000404, 0x00010404, 0x01000000,
74 0x00010000, 0x01010404, 0x00000004, 0x01010000,
75 0x01010400, 0x01000000, 0x01000000, 0x00000400,
76 0x01010004, 0x00010000, 0x00010400, 0x01000004,
77 0x00000400, 0x00000004, 0x01000404, 0x00010404,
78 0x01010404, 0x00010004, 0x01010000, 0x01000404,
79 0x01000004, 0x00000404, 0x00010404, 0x01010400,
80 0x00000404, 0x01000400, 0x01000400, 0x00000000,
81 0x00010004, 0x00010400, 0x00000000, 0x01010004
84 static const uint32_t SB2[64] =
86 0x80108020, 0x80008000, 0x00008000, 0x00108020,
87 0x00100000, 0x00000020, 0x80100020, 0x80008020,
88 0x80000020, 0x80108020, 0x80108000, 0x80000000,
89 0x80008000, 0x00100000, 0x00000020, 0x80100020,
90 0x00108000, 0x00100020, 0x80008020, 0x00000000,
91 0x80000000, 0x00008000, 0x00108020, 0x80100000,
92 0x00100020, 0x80000020, 0x00000000, 0x00108000,
93 0x00008020, 0x80108000, 0x80100000, 0x00008020,
94 0x00000000, 0x00108020, 0x80100020, 0x00100000,
95 0x80008020, 0x80100000, 0x80108000, 0x00008000,
96 0x80100000, 0x80008000, 0x00000020, 0x80108020,
97 0x00108020, 0x00000020, 0x00008000, 0x80000000,
98 0x00008020, 0x80108000, 0x00100000, 0x80000020,
99 0x00100020, 0x80008020, 0x80000020, 0x00100020,
100 0x00108000, 0x00000000, 0x80008000, 0x00008020,
101 0x80000000, 0x80100020, 0x80108020, 0x00108000
104 static const uint32_t SB3[64] =
106 0x00000208, 0x08020200, 0x00000000, 0x08020008,
107 0x08000200, 0x00000000, 0x00020208, 0x08000200,
108 0x00020008, 0x08000008, 0x08000008, 0x00020000,
109 0x08020208, 0x00020008, 0x08020000, 0x00000208,
110 0x08000000, 0x00000008, 0x08020200, 0x00000200,
111 0x00020200, 0x08020000, 0x08020008, 0x00020208,
112 0x08000208, 0x00020200, 0x00020000, 0x08000208,
113 0x00000008, 0x08020208, 0x00000200, 0x08000000,
114 0x08020200, 0x08000000, 0x00020008, 0x00000208,
115 0x00020000, 0x08020200, 0x08000200, 0x00000000,
116 0x00000200, 0x00020008, 0x08020208, 0x08000200,
117 0x08000008, 0x00000200, 0x00000000, 0x08020008,
118 0x08000208, 0x00020000, 0x08000000, 0x08020208,
119 0x00000008, 0x00020208, 0x00020200, 0x08000008,
120 0x08020000, 0x08000208, 0x00000208, 0x08020000,
121 0x00020208, 0x00000008, 0x08020008, 0x00020200
124 static const uint32_t SB4[64] =
126 0x00802001, 0x00002081, 0x00002081, 0x00000080,
127 0x00802080, 0x00800081, 0x00800001, 0x00002001,
128 0x00000000, 0x00802000, 0x00802000, 0x00802081,
129 0x00000081, 0x00000000, 0x00800080, 0x00800001,
130 0x00000001, 0x00002000, 0x00800000, 0x00802001,
131 0x00000080, 0x00800000, 0x00002001, 0x00002080,
132 0x00800081, 0x00000001, 0x00002080, 0x00800080,
133 0x00002000, 0x00802080, 0x00802081, 0x00000081,
134 0x00800080, 0x00800001, 0x00802000, 0x00802081,
135 0x00000081, 0x00000000, 0x00000000, 0x00802000,
136 0x00002080, 0x00800080, 0x00800081, 0x00000001,
137 0x00802001, 0x00002081, 0x00002081, 0x00000080,
138 0x00802081, 0x00000081, 0x00000001, 0x00002000,
139 0x00800001, 0x00002001, 0x00802080, 0x00800081,
140 0x00002001, 0x00002080, 0x00800000, 0x00802001,
141 0x00000080, 0x00800000, 0x00002000, 0x00802080
144 static const uint32_t SB5[64] =
146 0x00000100, 0x02080100, 0x02080000, 0x42000100,
147 0x00080000, 0x00000100, 0x40000000, 0x02080000,
148 0x40080100, 0x00080000, 0x02000100, 0x40080100,
149 0x42000100, 0x42080000, 0x00080100, 0x40000000,
150 0x02000000, 0x40080000, 0x40080000, 0x00000000,
151 0x40000100, 0x42080100, 0x42080100, 0x02000100,
152 0x42080000, 0x40000100, 0x00000000, 0x42000000,
153 0x02080100, 0x02000000, 0x42000000, 0x00080100,
154 0x00080000, 0x42000100, 0x00000100, 0x02000000,
155 0x40000000, 0x02080000, 0x42000100, 0x40080100,
156 0x02000100, 0x40000000, 0x42080000, 0x02080100,
157 0x40080100, 0x00000100, 0x02000000, 0x42080000,
158 0x42080100, 0x00080100, 0x42000000, 0x42080100,
159 0x02080000, 0x00000000, 0x40080000, 0x42000000,
160 0x00080100, 0x02000100, 0x40000100, 0x00080000,
161 0x00000000, 0x40080000, 0x02080100, 0x40000100
164 static const uint32_t SB6[64] =
166 0x20000010, 0x20400000, 0x00004000, 0x20404010,
167 0x20400000, 0x00000010, 0x20404010, 0x00400000,
168 0x20004000, 0x00404010, 0x00400000, 0x20000010,
169 0x00400010, 0x20004000, 0x20000000, 0x00004010,
170 0x00000000, 0x00400010, 0x20004010, 0x00004000,
171 0x00404000, 0x20004010, 0x00000010, 0x20400010,
172 0x20400010, 0x00000000, 0x00404010, 0x20404000,
173 0x00004010, 0x00404000, 0x20404000, 0x20000000,
174 0x20004000, 0x00000010, 0x20400010, 0x00404000,
175 0x20404010, 0x00400000, 0x00004010, 0x20000010,
176 0x00400000, 0x20004000, 0x20000000, 0x00004010,
177 0x20000010, 0x20404010, 0x00404000, 0x20400000,
178 0x00404010, 0x20404000, 0x00000000, 0x20400010,
179 0x00000010, 0x00004000, 0x20400000, 0x00404010,
180 0x00004000, 0x00400010, 0x20004010, 0x00000000,
181 0x20404000, 0x20000000, 0x00400010, 0x20004010
184 static const uint32_t SB7[64] =
186 0x00200000, 0x04200002, 0x04000802, 0x00000000,
187 0x00000800, 0x04000802, 0x00200802, 0x04200800,
188 0x04200802, 0x00200000, 0x00000000, 0x04000002,
189 0x00000002, 0x04000000, 0x04200002, 0x00000802,
190 0x04000800, 0x00200802, 0x00200002, 0x04000800,
191 0x04000002, 0x04200000, 0x04200800, 0x00200002,
192 0x04200000, 0x00000800, 0x00000802, 0x04200802,
193 0x00200800, 0x00000002, 0x04000000, 0x00200800,
194 0x04000000, 0x00200800, 0x00200000, 0x04000802,
195 0x04000802, 0x04200002, 0x04200002, 0x00000002,
196 0x00200002, 0x04000000, 0x04000800, 0x00200000,
197 0x04200800, 0x00000802, 0x00200802, 0x04200800,
198 0x00000802, 0x04000002, 0x04200802, 0x04200000,
199 0x00200800, 0x00000000, 0x00000002, 0x04200802,
200 0x00000000, 0x00200802, 0x04200000, 0x00000800,
201 0x04000002, 0x04000800, 0x00000800, 0x00200002
204 static const uint32_t SB8[64] =
206 0x10001040, 0x00001000, 0x00040000, 0x10041040,
207 0x10000000, 0x10001040, 0x00000040, 0x10000000,
208 0x00040040, 0x10040000, 0x10041040, 0x00041000,
209 0x10041000, 0x00041040, 0x00001000, 0x00000040,
210 0x10040000, 0x10000040, 0x10001000, 0x00001040,
211 0x00041000, 0x00040040, 0x10040040, 0x10041000,
212 0x00001040, 0x00000000, 0x00000000, 0x10040040,
213 0x10000040, 0x10001000, 0x00041040, 0x00040000,
214 0x00041040, 0x00040000, 0x10041000, 0x00001000,
215 0x00000040, 0x10040040, 0x00001000, 0x00041040,
216 0x10001000, 0x00000040, 0x10000040, 0x10040000,
217 0x10040040, 0x10000000, 0x00040000, 0x10001040,
218 0x00000000, 0x10041040, 0x00040040, 0x10000040,
219 0x10040000, 0x10001000, 0x10001040, 0x00000000,
220 0x10041040, 0x00041000, 0x00041000, 0x00001040,
221 0x00001040, 0x00040040, 0x10000000, 0x10041000
227 static const uint32_t LHs[16] =
229 0x00000000, 0x00000001, 0x00000100, 0x00000101,
230 0x00010000, 0x00010001, 0x00010100, 0x00010101,
231 0x01000000, 0x01000001, 0x01000100, 0x01000101,
232 0x01010000, 0x01010001, 0x01010100, 0x01010101
235 static const uint32_t RHs[16] =
237 0x00000000, 0x01000000, 0x00010000, 0x01010000,
238 0x00000100, 0x01000100, 0x00010100, 0x01010100,
239 0x00000001, 0x01000001, 0x00010001, 0x01010001,
240 0x00000101, 0x01000101, 0x00010101, 0x01010101,
246 #define DES_IP(X,Y) \
248 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
249 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
250 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
251 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
252 Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \
253 T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \
254 X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \
260 #define DES_FP(X,Y) \
262 X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \
263 T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \
264 Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \
265 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
266 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
267 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
268 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
274 #define DES_ROUND(X,Y) \
277 Y ^= SB8[ (T ) & 0x3F ] ^ \
278 SB6[ (T >> 8) & 0x3F ] ^ \
279 SB4[ (T >> 16) & 0x3F ] ^ \
280 SB2[ (T >> 24) & 0x3F ]; \
282 T = *SK++ ^ ((X << 28) | (X >> 4)); \
283 Y ^= SB7[ (T ) & 0x3F ] ^ \
284 SB5[ (T >> 8) & 0x3F ] ^ \
285 SB3[ (T >> 16) & 0x3F ] ^ \
286 SB1[ (T >> 24) & 0x3F ]; \
289 #define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; }
291 static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8,
292 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44,
293 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81,
294 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112,
295 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140,
296 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168,
297 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196,
298 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224,
299 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253,
307 key[i] = odd_parity_table[key[i] / 2];
318 if ( key[i] != odd_parity_table[key[i] / 2] )
345 #define WEAK_KEY_COUNT 16
347 static const unsigned char weak_key_table[WEAK_KEY_COUNT][
DES_KEY_SIZE] =
349 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
350 { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
351 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
352 { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },
354 { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },
355 { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },
356 { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },
357 { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },
358 { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },
359 { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },
360 { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },
361 { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },
362 { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
363 { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },
364 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
365 { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }
372 for( i = 0; i < WEAK_KEY_COUNT; i++ )
373 if( memcmp( weak_key_table[i], key, DES_KEY_SIZE) == 0)
379 static void des_setkey( uint32_t SK[32],
const unsigned char key[DES_KEY_SIZE] )
384 GET_UINT32_BE( X, key, 0 );
385 GET_UINT32_BE( Y, key, 4 );
390 T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4);
391 T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T );
393 X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2)
394 | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] )
395 | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)
396 | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);
398 Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2)
399 | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] )
400 | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)
401 | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);
409 for( i = 0; i < 16; i++ )
411 if( i < 2 || i == 8 || i == 15 )
413 X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF;
414 Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF;
418 X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF;
419 Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF;
422 *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000)
423 | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)
424 | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000)
425 | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000)
426 | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000)
427 | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000)
428 | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400)
429 | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100)
430 | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010)
431 | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004)
432 | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);
434 *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)
435 | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)
436 | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000)
437 | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)
438 | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000)
439 | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000)
440 | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000)
441 | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400)
442 | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100)
443 | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011)
444 | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002);
453 des_setkey( ctx->
sk, key );
465 des_setkey( ctx->
sk, key );
467 for( i = 0; i < 16; i += 2 )
469 SWAP( ctx->
sk[i ], ctx->
sk[30 - i] );
470 SWAP( ctx->
sk[i + 1], ctx->
sk[31 - i] );
476 static void des3_set2key( uint32_t esk[96],
478 const unsigned char key[DES_KEY_SIZE*2] )
482 des_setkey( esk, key );
483 des_setkey( dsk + 32, key + 8 );
485 for( i = 0; i < 32; i += 2 )
487 dsk[i ] = esk[30 - i];
488 dsk[i + 1] = esk[31 - i];
490 esk[i + 32] = dsk[62 - i];
491 esk[i + 33] = dsk[63 - i];
493 esk[i + 64] = esk[i ];
494 esk[i + 65] = esk[i + 1];
496 dsk[i + 64] = dsk[i ];
497 dsk[i + 65] = dsk[i + 1];
508 des3_set2key( ctx->
sk, sk, key );
509 memset( sk, 0,
sizeof( sk ) );
521 des3_set2key( sk, ctx->
sk, key );
522 memset( sk, 0,
sizeof( sk ) );
527 static void des3_set3key( uint32_t esk[96],
529 const unsigned char key[24] )
533 des_setkey( esk, key );
534 des_setkey( dsk + 32, key + 8 );
535 des_setkey( esk + 64, key + 16 );
537 for( i = 0; i < 32; i += 2 )
539 dsk[i ] = esk[94 - i];
540 dsk[i + 1] = esk[95 - i];
542 esk[i + 32] = dsk[62 - i];
543 esk[i + 33] = dsk[63 - i];
545 dsk[i + 64] = esk[30 - i];
546 dsk[i + 65] = esk[31 - i];
557 des3_set3key( ctx->
sk, sk, key );
558 memset( sk, 0,
sizeof( sk ) );
570 des3_set3key( sk, ctx->
sk, key );
571 memset( sk, 0,
sizeof( sk ) );
580 const unsigned char input[8],
581 unsigned char output[8] )
584 uint32_t X, Y, T, *SK;
588 GET_UINT32_BE( X, input, 0 );
589 GET_UINT32_BE( Y, input, 4 );
593 for( i = 0; i < 8; i++ )
601 PUT_UINT32_BE( Y, output, 0 );
602 PUT_UINT32_BE( X, output, 4 );
614 const unsigned char *input,
615 unsigned char *output )
618 unsigned char temp[8];
627 for( i = 0; i < 8; i++ )
628 output[i] = (
unsigned char)( input[i] ^ iv[i] );
631 memcpy( iv, output, 8 );
642 memcpy( temp, input, 8 );
645 for( i = 0; i < 8; i++ )
646 output[i] = (
unsigned char)( output[i] ^ iv[i] );
648 memcpy( iv, temp, 8 );
663 const unsigned char input[8],
664 unsigned char output[8] )
667 uint32_t X, Y, T, *SK;
671 GET_UINT32_BE( X, input, 0 );
672 GET_UINT32_BE( Y, input, 4 );
676 for( i = 0; i < 8; i++ )
682 for( i = 0; i < 8; i++ )
688 for( i = 0; i < 8; i++ )
696 PUT_UINT32_BE( Y, output, 0 );
697 PUT_UINT32_BE( X, output, 4 );
709 const unsigned char *input,
710 unsigned char *output )
713 unsigned char temp[8];
722 for( i = 0; i < 8; i++ )
723 output[i] = (
unsigned char)( input[i] ^ iv[i] );
726 memcpy( iv, output, 8 );
737 memcpy( temp, input, 8 );
740 for( i = 0; i < 8; i++ )
741 output[i] = (
unsigned char)( output[i] ^ iv[i] );
743 memcpy( iv, temp, 8 );
754 #if defined(POLARSSL_SELF_TEST)
763 static const unsigned char des3_test_keys[24] =
765 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
766 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,
767 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23
770 static const unsigned char des3_test_iv[8] =
772 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF,
775 static const unsigned char des3_test_buf[8] =
777 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74
780 static const unsigned char des3_test_ecb_dec[3][8] =
782 { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D },
783 { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB },
784 { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A }
787 static const unsigned char des3_test_ecb_enc[3][8] =
789 { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B },
790 { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 },
791 { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 }
794 static const unsigned char des3_test_cbc_dec[3][8] =
796 { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 },
797 { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 },
798 { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C }
801 static const unsigned char des3_test_cbc_enc[3][8] =
803 { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 },
804 { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D },
805 { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 }
816 unsigned char key[24];
817 unsigned char buf[8];
818 unsigned char prv[8];
821 memset( key, 0, 24 );
826 for( i = 0; i < 6; i++ )
832 printf(
" DES%c-ECB-%3d (%s): ",
833 ( u == 0 ) ?
' ' :
'3', 56 + u * 56,
836 memcpy( buf, des3_test_buf, 8 );
868 for( j = 0; j < 10000; j++ )
877 memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) ||
879 memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) )
882 printf(
"failed\n" );
888 printf(
"passed\n" );
897 for( i = 0; i < 6; i++ )
903 printf(
" DES%c-CBC-%3d (%s): ",
904 ( u == 0 ) ?
' ' :
'3', 56 + u * 56,
907 memcpy( iv, des3_test_iv, 8 );
908 memcpy( prv, des3_test_iv, 8 );
909 memcpy( buf, des3_test_buf, 8 );
943 for( j = 0; j < 10000; j++ )
953 for( j = 0; j < 10000; j++ )
955 unsigned char tmp[8];
962 memcpy( tmp, prv, 8 );
963 memcpy( prv, buf, 8 );
964 memcpy( buf, tmp, 8 );
967 memcpy( buf, prv, 8 );
971 memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) ||
973 memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) )
976 printf(
"failed\n" );
982 printf(
"passed\n" );