blob: 7da3269d2bcad4d4615f6dcede938df365cdda3b [file] [log] [blame]
Paul Bakker5121ce52009-01-03 21:22:43 +00001/*
2 * FIPS-46-3 compliant Triple-DES implementation
3 *
Paul Bakker7dc4c442014-02-01 22:50:26 +01004 * Copyright (C) 2006-2014, Brainspark B.V.
Paul Bakkerb96f1542010-07-18 20:36:00 +00005 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
Paul Bakker84f12b72010-07-18 10:13:04 +00007 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
Paul Bakkerb96f1542010-07-18 20:36:00 +00008 *
Paul Bakker77b385e2009-07-28 17:23:11 +00009 * All rights reserved.
Paul Bakkere0ccd0a2009-01-04 16:27:10 +000010 *
Paul Bakker5121ce52009-01-03 21:22:43 +000011 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25/*
26 * DES, on which TDES is based, was originally designed by Horst Feistel
27 * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS).
28 *
29 * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf
30 */
31
Paul Bakker40e46942009-01-03 21:51:57 +000032#include "polarssl/config.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000033
Paul Bakker40e46942009-01-03 21:51:57 +000034#if defined(POLARSSL_DES_C)
Paul Bakker5121ce52009-01-03 21:22:43 +000035
Paul Bakker40e46942009-01-03 21:51:57 +000036#include "polarssl/des.h"
Paul Bakker5121ce52009-01-03 21:22:43 +000037
Paul Bakker7dc4c442014-02-01 22:50:26 +010038#if defined(POLARSSL_PLATFORM_C)
39#include "polarssl/platform.h"
40#else
41#define polarssl_printf printf
42#endif
43
Paul Bakker90995b52013-06-24 19:20:35 +020044#if !defined(POLARSSL_DES_ALT)
45
Paul Bakker5121ce52009-01-03 21:22:43 +000046/*
47 * 32-bit integer manipulation macros (big endian)
48 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000049#ifndef GET_UINT32_BE
50#define GET_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000051{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000052 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
53 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
54 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
55 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakker5121ce52009-01-03 21:22:43 +000056}
57#endif
58
Paul Bakker5c2364c2012-10-01 14:41:15 +000059#ifndef PUT_UINT32_BE
60#define PUT_UINT32_BE(n,b,i) \
Paul Bakker5121ce52009-01-03 21:22:43 +000061{ \
62 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
63 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
64 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
65 (b)[(i) + 3] = (unsigned char) ( (n) ); \
66}
67#endif
68
69/*
70 * Expanded DES S-boxes
71 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000072static const uint32_t SB1[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +000073{
74 0x01010400, 0x00000000, 0x00010000, 0x01010404,
75 0x01010004, 0x00010404, 0x00000004, 0x00010000,
76 0x00000400, 0x01010400, 0x01010404, 0x00000400,
77 0x01000404, 0x01010004, 0x01000000, 0x00000004,
78 0x00000404, 0x01000400, 0x01000400, 0x00010400,
79 0x00010400, 0x01010000, 0x01010000, 0x01000404,
80 0x00010004, 0x01000004, 0x01000004, 0x00010004,
81 0x00000000, 0x00000404, 0x00010404, 0x01000000,
82 0x00010000, 0x01010404, 0x00000004, 0x01010000,
83 0x01010400, 0x01000000, 0x01000000, 0x00000400,
84 0x01010004, 0x00010000, 0x00010400, 0x01000004,
85 0x00000400, 0x00000004, 0x01000404, 0x00010404,
86 0x01010404, 0x00010004, 0x01010000, 0x01000404,
87 0x01000004, 0x00000404, 0x00010404, 0x01010400,
88 0x00000404, 0x01000400, 0x01000400, 0x00000000,
89 0x00010004, 0x00010400, 0x00000000, 0x01010004
90};
91
Paul Bakker5c2364c2012-10-01 14:41:15 +000092static const uint32_t SB2[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +000093{
94 0x80108020, 0x80008000, 0x00008000, 0x00108020,
95 0x00100000, 0x00000020, 0x80100020, 0x80008020,
96 0x80000020, 0x80108020, 0x80108000, 0x80000000,
97 0x80008000, 0x00100000, 0x00000020, 0x80100020,
98 0x00108000, 0x00100020, 0x80008020, 0x00000000,
99 0x80000000, 0x00008000, 0x00108020, 0x80100000,
100 0x00100020, 0x80000020, 0x00000000, 0x00108000,
101 0x00008020, 0x80108000, 0x80100000, 0x00008020,
102 0x00000000, 0x00108020, 0x80100020, 0x00100000,
103 0x80008020, 0x80100000, 0x80108000, 0x00008000,
104 0x80100000, 0x80008000, 0x00000020, 0x80108020,
105 0x00108020, 0x00000020, 0x00008000, 0x80000000,
106 0x00008020, 0x80108000, 0x00100000, 0x80000020,
107 0x00100020, 0x80008020, 0x80000020, 0x00100020,
108 0x00108000, 0x00000000, 0x80008000, 0x00008020,
109 0x80000000, 0x80100020, 0x80108020, 0x00108000
110};
111
Paul Bakker5c2364c2012-10-01 14:41:15 +0000112static const uint32_t SB3[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000113{
114 0x00000208, 0x08020200, 0x00000000, 0x08020008,
115 0x08000200, 0x00000000, 0x00020208, 0x08000200,
116 0x00020008, 0x08000008, 0x08000008, 0x00020000,
117 0x08020208, 0x00020008, 0x08020000, 0x00000208,
118 0x08000000, 0x00000008, 0x08020200, 0x00000200,
119 0x00020200, 0x08020000, 0x08020008, 0x00020208,
120 0x08000208, 0x00020200, 0x00020000, 0x08000208,
121 0x00000008, 0x08020208, 0x00000200, 0x08000000,
122 0x08020200, 0x08000000, 0x00020008, 0x00000208,
123 0x00020000, 0x08020200, 0x08000200, 0x00000000,
124 0x00000200, 0x00020008, 0x08020208, 0x08000200,
125 0x08000008, 0x00000200, 0x00000000, 0x08020008,
126 0x08000208, 0x00020000, 0x08000000, 0x08020208,
127 0x00000008, 0x00020208, 0x00020200, 0x08000008,
128 0x08020000, 0x08000208, 0x00000208, 0x08020000,
129 0x00020208, 0x00000008, 0x08020008, 0x00020200
130};
131
Paul Bakker5c2364c2012-10-01 14:41:15 +0000132static const uint32_t SB4[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000133{
134 0x00802001, 0x00002081, 0x00002081, 0x00000080,
135 0x00802080, 0x00800081, 0x00800001, 0x00002001,
136 0x00000000, 0x00802000, 0x00802000, 0x00802081,
137 0x00000081, 0x00000000, 0x00800080, 0x00800001,
138 0x00000001, 0x00002000, 0x00800000, 0x00802001,
139 0x00000080, 0x00800000, 0x00002001, 0x00002080,
140 0x00800081, 0x00000001, 0x00002080, 0x00800080,
141 0x00002000, 0x00802080, 0x00802081, 0x00000081,
142 0x00800080, 0x00800001, 0x00802000, 0x00802081,
143 0x00000081, 0x00000000, 0x00000000, 0x00802000,
144 0x00002080, 0x00800080, 0x00800081, 0x00000001,
145 0x00802001, 0x00002081, 0x00002081, 0x00000080,
146 0x00802081, 0x00000081, 0x00000001, 0x00002000,
147 0x00800001, 0x00002001, 0x00802080, 0x00800081,
148 0x00002001, 0x00002080, 0x00800000, 0x00802001,
149 0x00000080, 0x00800000, 0x00002000, 0x00802080
150};
151
Paul Bakker5c2364c2012-10-01 14:41:15 +0000152static const uint32_t SB5[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000153{
154 0x00000100, 0x02080100, 0x02080000, 0x42000100,
155 0x00080000, 0x00000100, 0x40000000, 0x02080000,
156 0x40080100, 0x00080000, 0x02000100, 0x40080100,
157 0x42000100, 0x42080000, 0x00080100, 0x40000000,
158 0x02000000, 0x40080000, 0x40080000, 0x00000000,
159 0x40000100, 0x42080100, 0x42080100, 0x02000100,
160 0x42080000, 0x40000100, 0x00000000, 0x42000000,
161 0x02080100, 0x02000000, 0x42000000, 0x00080100,
162 0x00080000, 0x42000100, 0x00000100, 0x02000000,
163 0x40000000, 0x02080000, 0x42000100, 0x40080100,
164 0x02000100, 0x40000000, 0x42080000, 0x02080100,
165 0x40080100, 0x00000100, 0x02000000, 0x42080000,
166 0x42080100, 0x00080100, 0x42000000, 0x42080100,
167 0x02080000, 0x00000000, 0x40080000, 0x42000000,
168 0x00080100, 0x02000100, 0x40000100, 0x00080000,
169 0x00000000, 0x40080000, 0x02080100, 0x40000100
170};
171
Paul Bakker5c2364c2012-10-01 14:41:15 +0000172static const uint32_t SB6[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000173{
174 0x20000010, 0x20400000, 0x00004000, 0x20404010,
175 0x20400000, 0x00000010, 0x20404010, 0x00400000,
176 0x20004000, 0x00404010, 0x00400000, 0x20000010,
177 0x00400010, 0x20004000, 0x20000000, 0x00004010,
178 0x00000000, 0x00400010, 0x20004010, 0x00004000,
179 0x00404000, 0x20004010, 0x00000010, 0x20400010,
180 0x20400010, 0x00000000, 0x00404010, 0x20404000,
181 0x00004010, 0x00404000, 0x20404000, 0x20000000,
182 0x20004000, 0x00000010, 0x20400010, 0x00404000,
183 0x20404010, 0x00400000, 0x00004010, 0x20000010,
184 0x00400000, 0x20004000, 0x20000000, 0x00004010,
185 0x20000010, 0x20404010, 0x00404000, 0x20400000,
186 0x00404010, 0x20404000, 0x00000000, 0x20400010,
187 0x00000010, 0x00004000, 0x20400000, 0x00404010,
188 0x00004000, 0x00400010, 0x20004010, 0x00000000,
189 0x20404000, 0x20000000, 0x00400010, 0x20004010
190};
191
Paul Bakker5c2364c2012-10-01 14:41:15 +0000192static const uint32_t SB7[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000193{
194 0x00200000, 0x04200002, 0x04000802, 0x00000000,
195 0x00000800, 0x04000802, 0x00200802, 0x04200800,
196 0x04200802, 0x00200000, 0x00000000, 0x04000002,
197 0x00000002, 0x04000000, 0x04200002, 0x00000802,
198 0x04000800, 0x00200802, 0x00200002, 0x04000800,
199 0x04000002, 0x04200000, 0x04200800, 0x00200002,
200 0x04200000, 0x00000800, 0x00000802, 0x04200802,
201 0x00200800, 0x00000002, 0x04000000, 0x00200800,
202 0x04000000, 0x00200800, 0x00200000, 0x04000802,
203 0x04000802, 0x04200002, 0x04200002, 0x00000002,
204 0x00200002, 0x04000000, 0x04000800, 0x00200000,
205 0x04200800, 0x00000802, 0x00200802, 0x04200800,
206 0x00000802, 0x04000002, 0x04200802, 0x04200000,
207 0x00200800, 0x00000000, 0x00000002, 0x04200802,
208 0x00000000, 0x00200802, 0x04200000, 0x00000800,
209 0x04000002, 0x04000800, 0x00000800, 0x00200002
210};
211
Paul Bakker5c2364c2012-10-01 14:41:15 +0000212static const uint32_t SB8[64] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000213{
214 0x10001040, 0x00001000, 0x00040000, 0x10041040,
215 0x10000000, 0x10001040, 0x00000040, 0x10000000,
216 0x00040040, 0x10040000, 0x10041040, 0x00041000,
217 0x10041000, 0x00041040, 0x00001000, 0x00000040,
218 0x10040000, 0x10000040, 0x10001000, 0x00001040,
219 0x00041000, 0x00040040, 0x10040040, 0x10041000,
220 0x00001040, 0x00000000, 0x00000000, 0x10040040,
221 0x10000040, 0x10001000, 0x00041040, 0x00040000,
222 0x00041040, 0x00040000, 0x10041000, 0x00001000,
223 0x00000040, 0x10040040, 0x00001000, 0x00041040,
224 0x10001000, 0x00000040, 0x10000040, 0x10040000,
225 0x10040040, 0x10000000, 0x00040000, 0x10001040,
226 0x00000000, 0x10041040, 0x00040040, 0x10000040,
227 0x10040000, 0x10001000, 0x10001040, 0x00000000,
228 0x10041040, 0x00041000, 0x00041000, 0x00001040,
229 0x00001040, 0x00040040, 0x10000000, 0x10041000
230};
231
232/*
233 * PC1: left and right halves bit-swap
234 */
Paul Bakker5c2364c2012-10-01 14:41:15 +0000235static const uint32_t LHs[16] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000236{
237 0x00000000, 0x00000001, 0x00000100, 0x00000101,
238 0x00010000, 0x00010001, 0x00010100, 0x00010101,
239 0x01000000, 0x01000001, 0x01000100, 0x01000101,
240 0x01010000, 0x01010001, 0x01010100, 0x01010101
241};
242
Paul Bakker5c2364c2012-10-01 14:41:15 +0000243static const uint32_t RHs[16] =
Paul Bakker5121ce52009-01-03 21:22:43 +0000244{
245 0x00000000, 0x01000000, 0x00010000, 0x01010000,
246 0x00000100, 0x01000100, 0x00010100, 0x01010100,
247 0x00000001, 0x01000001, 0x00010001, 0x01010001,
248 0x00000101, 0x01000101, 0x00010101, 0x01010101,
249};
250
251/*
252 * Initial Permutation macro
253 */
254#define DES_IP(X,Y) \
255{ \
256 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
257 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
258 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
259 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
260 Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \
261 T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \
262 X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \
263}
264
265/*
266 * Final Permutation macro
267 */
268#define DES_FP(X,Y) \
269{ \
270 X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \
271 T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \
272 Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \
273 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
274 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
275 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
276 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
277}
278
279/*
280 * DES round macro
281 */
282#define DES_ROUND(X,Y) \
283{ \
284 T = *SK++ ^ X; \
285 Y ^= SB8[ (T ) & 0x3F ] ^ \
286 SB6[ (T >> 8) & 0x3F ] ^ \
287 SB4[ (T >> 16) & 0x3F ] ^ \
288 SB2[ (T >> 24) & 0x3F ]; \
289 \
290 T = *SK++ ^ ((X << 28) | (X >> 4)); \
291 Y ^= SB7[ (T ) & 0x3F ] ^ \
292 SB5[ (T >> 8) & 0x3F ] ^ \
293 SB3[ (T >> 16) & 0x3F ] ^ \
294 SB1[ (T >> 24) & 0x3F ]; \
295}
296
Paul Bakker5c2364c2012-10-01 14:41:15 +0000297#define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; }
Paul Bakker5121ce52009-01-03 21:22:43 +0000298
Paul Bakker1f87fb62011-01-15 17:32:24 +0000299static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8,
300 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44,
301 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81,
302 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112,
303 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140,
304 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168,
305 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196,
306 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224,
307 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253,
308 254 };
309
310void des_key_set_parity( unsigned char key[DES_KEY_SIZE] )
311{
312 int i;
313
314 for( i = 0; i < DES_KEY_SIZE; i++ )
315 key[i] = odd_parity_table[key[i] / 2];
316}
317
318/*
319 * Check the given key's parity, returns 1 on failure, 0 on SUCCESS
320 */
321int des_key_check_key_parity( const unsigned char key[DES_KEY_SIZE] )
322{
323 int i;
324
325 for( i = 0; i < DES_KEY_SIZE; i++ )
326 if ( key[i] != odd_parity_table[key[i] / 2] )
327 return( 1 );
328
329 return( 0 );
330}
331
332/*
333 * Table of weak and semi-weak keys
334 *
335 * Source: http://en.wikipedia.org/wiki/Weak_key
336 *
337 * Weak:
338 * Alternating ones + zeros (0x0101010101010101)
339 * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE)
340 * '0xE0E0E0E0F1F1F1F1'
341 * '0x1F1F1F1F0E0E0E0E'
342 *
343 * Semi-weak:
344 * 0x011F011F010E010E and 0x1F011F010E010E01
345 * 0x01E001E001F101F1 and 0xE001E001F101F101
346 * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01
347 * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E
348 * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E
349 * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1
350 *
351 */
352
353#define WEAK_KEY_COUNT 16
354
355static const unsigned char weak_key_table[WEAK_KEY_COUNT][DES_KEY_SIZE] =
356{
357 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
358 { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
359 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
360 { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },
361
362 { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },
363 { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },
364 { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },
365 { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },
366 { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },
367 { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },
368 { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },
369 { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },
370 { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
371 { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },
372 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
373 { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }
374};
375
376int des_key_check_weak( const unsigned char key[DES_KEY_SIZE] )
377{
378 int i;
379
380 for( i = 0; i < WEAK_KEY_COUNT; i++ )
381 if( memcmp( weak_key_table[i], key, DES_KEY_SIZE) == 0)
Paul Bakker73206952011-07-06 14:37:33 +0000382 return( 1 );
Paul Bakker1f87fb62011-01-15 17:32:24 +0000383
Paul Bakker73206952011-07-06 14:37:33 +0000384 return( 0 );
Paul Bakker1f87fb62011-01-15 17:32:24 +0000385}
386
Paul Bakker5c2364c2012-10-01 14:41:15 +0000387static void des_setkey( uint32_t SK[32], const unsigned char key[DES_KEY_SIZE] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000388{
389 int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000390 uint32_t X, Y, T;
Paul Bakker5121ce52009-01-03 21:22:43 +0000391
Paul Bakker5c2364c2012-10-01 14:41:15 +0000392 GET_UINT32_BE( X, key, 0 );
393 GET_UINT32_BE( Y, key, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000394
395 /*
396 * Permuted Choice 1
397 */
398 T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4);
399 T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T );
400
401 X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2)
402 | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] )
403 | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)
404 | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);
405
406 Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2)
407 | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] )
408 | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)
409 | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);
410
411 X &= 0x0FFFFFFF;
412 Y &= 0x0FFFFFFF;
413
414 /*
415 * calculate subkeys
416 */
417 for( i = 0; i < 16; i++ )
418 {
419 if( i < 2 || i == 8 || i == 15 )
420 {
421 X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF;
422 Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF;
423 }
424 else
425 {
426 X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF;
427 Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF;
428 }
429
430 *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000)
431 | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)
432 | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000)
433 | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000)
434 | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000)
435 | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000)
436 | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400)
437 | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100)
438 | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010)
439 | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004)
440 | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);
441
442 *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)
443 | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)
444 | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000)
445 | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)
446 | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000)
447 | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000)
448 | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000)
449 | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400)
450 | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100)
451 | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011)
452 | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002);
453 }
454}
455
456/*
457 * DES key schedule (56-bit, encryption)
458 */
Paul Bakker1f87fb62011-01-15 17:32:24 +0000459int des_setkey_enc( des_context *ctx, const unsigned char key[DES_KEY_SIZE] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000460{
461 des_setkey( ctx->sk, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000462
463 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000464}
465
466/*
467 * DES key schedule (56-bit, decryption)
468 */
Paul Bakker1f87fb62011-01-15 17:32:24 +0000469int des_setkey_dec( des_context *ctx, const unsigned char key[DES_KEY_SIZE] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000470{
471 int i;
472
473 des_setkey( ctx->sk, key );
474
475 for( i = 0; i < 16; i += 2 )
476 {
477 SWAP( ctx->sk[i ], ctx->sk[30 - i] );
478 SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );
479 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000480
481 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000482}
483
Paul Bakker5c2364c2012-10-01 14:41:15 +0000484static void des3_set2key( uint32_t esk[96],
485 uint32_t dsk[96],
Paul Bakker1f87fb62011-01-15 17:32:24 +0000486 const unsigned char key[DES_KEY_SIZE*2] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000487{
488 int i;
489
490 des_setkey( esk, key );
491 des_setkey( dsk + 32, key + 8 );
492
493 for( i = 0; i < 32; i += 2 )
494 {
495 dsk[i ] = esk[30 - i];
496 dsk[i + 1] = esk[31 - i];
497
498 esk[i + 32] = dsk[62 - i];
499 esk[i + 33] = dsk[63 - i];
500
501 esk[i + 64] = esk[i ];
502 esk[i + 65] = esk[i + 1];
503
504 dsk[i + 64] = dsk[i ];
505 dsk[i + 65] = dsk[i + 1];
506 }
507}
508
509/*
510 * Triple-DES key schedule (112-bit, encryption)
511 */
Paul Bakker1f87fb62011-01-15 17:32:24 +0000512int des3_set2key_enc( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 2] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000513{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000514 uint32_t sk[96];
Paul Bakker5121ce52009-01-03 21:22:43 +0000515
516 des3_set2key( ctx->sk, sk, key );
517 memset( sk, 0, sizeof( sk ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000518
519 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000520}
521
522/*
523 * Triple-DES key schedule (112-bit, decryption)
524 */
Paul Bakker1f87fb62011-01-15 17:32:24 +0000525int des3_set2key_dec( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 2] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000526{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000527 uint32_t sk[96];
Paul Bakker5121ce52009-01-03 21:22:43 +0000528
529 des3_set2key( sk, ctx->sk, key );
530 memset( sk, 0, sizeof( sk ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000531
532 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000533}
534
Paul Bakker5c2364c2012-10-01 14:41:15 +0000535static void des3_set3key( uint32_t esk[96],
536 uint32_t dsk[96],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000537 const unsigned char key[24] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000538{
539 int i;
540
541 des_setkey( esk, key );
542 des_setkey( dsk + 32, key + 8 );
543 des_setkey( esk + 64, key + 16 );
544
545 for( i = 0; i < 32; i += 2 )
546 {
547 dsk[i ] = esk[94 - i];
548 dsk[i + 1] = esk[95 - i];
549
550 esk[i + 32] = dsk[62 - i];
551 esk[i + 33] = dsk[63 - i];
552
553 dsk[i + 64] = esk[30 - i];
554 dsk[i + 65] = esk[31 - i];
555 }
556}
557
558/*
559 * Triple-DES key schedule (168-bit, encryption)
560 */
Paul Bakker1f87fb62011-01-15 17:32:24 +0000561int des3_set3key_enc( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 3] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000562{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000563 uint32_t sk[96];
Paul Bakker5121ce52009-01-03 21:22:43 +0000564
565 des3_set3key( ctx->sk, sk, key );
566 memset( sk, 0, sizeof( sk ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000567
568 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000569}
570
571/*
572 * Triple-DES key schedule (168-bit, decryption)
573 */
Paul Bakker1f87fb62011-01-15 17:32:24 +0000574int des3_set3key_dec( des3_context *ctx, const unsigned char key[DES_KEY_SIZE * 3] )
Paul Bakker5121ce52009-01-03 21:22:43 +0000575{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000576 uint32_t sk[96];
Paul Bakker5121ce52009-01-03 21:22:43 +0000577
578 des3_set3key( sk, ctx->sk, key );
579 memset( sk, 0, sizeof( sk ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000580
581 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000582}
583
584/*
585 * DES-ECB block encryption/decryption
586 */
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000587int des_crypt_ecb( des_context *ctx,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000588 const unsigned char input[8],
Paul Bakker5121ce52009-01-03 21:22:43 +0000589 unsigned char output[8] )
590{
591 int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000592 uint32_t X, Y, T, *SK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000593
594 SK = ctx->sk;
595
Paul Bakker5c2364c2012-10-01 14:41:15 +0000596 GET_UINT32_BE( X, input, 0 );
597 GET_UINT32_BE( Y, input, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000598
599 DES_IP( X, Y );
600
601 for( i = 0; i < 8; i++ )
602 {
603 DES_ROUND( Y, X );
604 DES_ROUND( X, Y );
605 }
606
607 DES_FP( Y, X );
608
Paul Bakker5c2364c2012-10-01 14:41:15 +0000609 PUT_UINT32_BE( Y, output, 0 );
610 PUT_UINT32_BE( X, output, 4 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000611
612 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000613}
614
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200615#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +0000616/*
617 * DES-CBC buffer encryption/decryption
618 */
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000619int des_crypt_cbc( des_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000620 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000621 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +0000622 unsigned char iv[8],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000623 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000624 unsigned char *output )
625{
626 int i;
627 unsigned char temp[8];
628
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000629 if( length % 8 )
630 return( POLARSSL_ERR_DES_INVALID_INPUT_LENGTH );
631
Paul Bakker5121ce52009-01-03 21:22:43 +0000632 if( mode == DES_ENCRYPT )
633 {
634 while( length > 0 )
635 {
636 for( i = 0; i < 8; i++ )
637 output[i] = (unsigned char)( input[i] ^ iv[i] );
638
639 des_crypt_ecb( ctx, output, output );
640 memcpy( iv, output, 8 );
641
642 input += 8;
643 output += 8;
644 length -= 8;
645 }
646 }
647 else /* DES_DECRYPT */
648 {
649 while( length > 0 )
650 {
651 memcpy( temp, input, 8 );
652 des_crypt_ecb( ctx, input, output );
653
654 for( i = 0; i < 8; i++ )
655 output[i] = (unsigned char)( output[i] ^ iv[i] );
656
657 memcpy( iv, temp, 8 );
658
659 input += 8;
660 output += 8;
661 length -= 8;
662 }
663 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000664
665 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000666}
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200667#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +0000668
669/*
670 * 3DES-ECB block encryption/decryption
671 */
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000672int des3_crypt_ecb( des3_context *ctx,
Paul Bakkerff60ee62010-03-16 21:09:09 +0000673 const unsigned char input[8],
Paul Bakker5121ce52009-01-03 21:22:43 +0000674 unsigned char output[8] )
675{
676 int i;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000677 uint32_t X, Y, T, *SK;
Paul Bakker5121ce52009-01-03 21:22:43 +0000678
679 SK = ctx->sk;
680
Paul Bakker5c2364c2012-10-01 14:41:15 +0000681 GET_UINT32_BE( X, input, 0 );
682 GET_UINT32_BE( Y, input, 4 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000683
684 DES_IP( X, Y );
685
686 for( i = 0; i < 8; i++ )
687 {
688 DES_ROUND( Y, X );
689 DES_ROUND( X, Y );
690 }
691
692 for( i = 0; i < 8; i++ )
693 {
694 DES_ROUND( X, Y );
695 DES_ROUND( Y, X );
696 }
697
698 for( i = 0; i < 8; i++ )
699 {
700 DES_ROUND( Y, X );
701 DES_ROUND( X, Y );
702 }
703
704 DES_FP( Y, X );
705
Paul Bakker5c2364c2012-10-01 14:41:15 +0000706 PUT_UINT32_BE( Y, output, 0 );
707 PUT_UINT32_BE( X, output, 4 );
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000708
709 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000710}
711
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200712#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +0000713/*
714 * 3DES-CBC buffer encryption/decryption
715 */
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000716int des3_crypt_cbc( des3_context *ctx,
Paul Bakker5121ce52009-01-03 21:22:43 +0000717 int mode,
Paul Bakker23986e52011-04-24 08:57:21 +0000718 size_t length,
Paul Bakker5121ce52009-01-03 21:22:43 +0000719 unsigned char iv[8],
Paul Bakkerff60ee62010-03-16 21:09:09 +0000720 const unsigned char *input,
Paul Bakker5121ce52009-01-03 21:22:43 +0000721 unsigned char *output )
722{
723 int i;
724 unsigned char temp[8];
725
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000726 if( length % 8 )
727 return( POLARSSL_ERR_DES_INVALID_INPUT_LENGTH );
728
Paul Bakker5121ce52009-01-03 21:22:43 +0000729 if( mode == DES_ENCRYPT )
730 {
731 while( length > 0 )
732 {
733 for( i = 0; i < 8; i++ )
734 output[i] = (unsigned char)( input[i] ^ iv[i] );
735
736 des3_crypt_ecb( ctx, output, output );
737 memcpy( iv, output, 8 );
738
739 input += 8;
740 output += 8;
741 length -= 8;
742 }
743 }
744 else /* DES_DECRYPT */
745 {
746 while( length > 0 )
747 {
748 memcpy( temp, input, 8 );
749 des3_crypt_ecb( ctx, input, output );
750
751 for( i = 0; i < 8; i++ )
752 output[i] = (unsigned char)( output[i] ^ iv[i] );
753
754 memcpy( iv, temp, 8 );
755
756 input += 8;
757 output += 8;
758 length -= 8;
759 }
760 }
Paul Bakkerf3ccc682010-03-18 21:21:02 +0000761
762 return( 0 );
Paul Bakker5121ce52009-01-03 21:22:43 +0000763}
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200764#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +0000765
Paul Bakker90995b52013-06-24 19:20:35 +0200766#endif /* !POLARSSL_DES_ALT */
767
Paul Bakker40e46942009-01-03 21:51:57 +0000768#if defined(POLARSSL_SELF_TEST)
Paul Bakker5121ce52009-01-03 21:22:43 +0000769
770#include <stdio.h>
771
772/*
773 * DES and 3DES test vectors from:
774 *
775 * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip
776 */
777static const unsigned char des3_test_keys[24] =
778{
779 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
780 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,
781 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23
782};
783
Paul Bakker5121ce52009-01-03 21:22:43 +0000784static const unsigned char des3_test_buf[8] =
785{
786 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74
787};
788
789static const unsigned char des3_test_ecb_dec[3][8] =
790{
791 { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D },
792 { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB },
793 { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A }
794};
795
796static const unsigned char des3_test_ecb_enc[3][8] =
797{
798 { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B },
799 { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 },
800 { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 }
801};
802
Manuel Pégourié-Gonnard29dcc0b2014-03-10 11:32:07 +0100803#if defined(POLARSSL_CIPHER_MODE_CBC)
804static const unsigned char des3_test_iv[8] =
805{
806 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF,
807};
808
Paul Bakker5121ce52009-01-03 21:22:43 +0000809static const unsigned char des3_test_cbc_dec[3][8] =
810{
811 { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 },
812 { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 },
813 { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C }
814};
815
816static const unsigned char des3_test_cbc_enc[3][8] =
817{
818 { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 },
819 { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D },
820 { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 }
821};
Manuel Pégourié-Gonnard29dcc0b2014-03-10 11:32:07 +0100822#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +0000823
824/*
825 * Checkup routine
826 */
827int des_self_test( int verbose )
828{
829 int i, j, u, v;
830 des_context ctx;
831 des3_context ctx3;
832 unsigned char key[24];
833 unsigned char buf[8];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200834#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +0000835 unsigned char prv[8];
836 unsigned char iv[8];
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200837#endif
Paul Bakker5121ce52009-01-03 21:22:43 +0000838
839 memset( key, 0, 24 );
840
841 /*
842 * ECB mode
843 */
844 for( i = 0; i < 6; i++ )
845 {
846 u = i >> 1;
847 v = i & 1;
848
849 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100850 polarssl_printf( " DES%c-ECB-%3d (%s): ",
851 ( u == 0 ) ? ' ' : '3', 56 + u * 56,
852 ( v == DES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000853
854 memcpy( buf, des3_test_buf, 8 );
855
856 switch( i )
857 {
858 case 0:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200859 des_setkey_dec( &ctx, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000860 break;
861
862 case 1:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200863 des_setkey_enc( &ctx, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000864 break;
865
866 case 2:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200867 des3_set2key_dec( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000868 break;
869
870 case 3:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200871 des3_set2key_enc( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000872 break;
873
874 case 4:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200875 des3_set3key_dec( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000876 break;
877
878 case 5:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200879 des3_set3key_enc( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000880 break;
881
882 default:
883 return( 1 );
884 }
885
886 for( j = 0; j < 10000; j++ )
887 {
888 if( u == 0 )
889 des_crypt_ecb( &ctx, buf, buf );
890 else
891 des3_crypt_ecb( &ctx3, buf, buf );
892 }
893
894 if( ( v == DES_DECRYPT &&
895 memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) ||
896 ( v != DES_DECRYPT &&
897 memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) )
898 {
899 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100900 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000901
902 return( 1 );
903 }
904
905 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100906 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000907 }
908
909 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100910 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000911
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +0200912#if defined(POLARSSL_CIPHER_MODE_CBC)
Paul Bakker5121ce52009-01-03 21:22:43 +0000913 /*
914 * CBC mode
915 */
916 for( i = 0; i < 6; i++ )
917 {
918 u = i >> 1;
919 v = i & 1;
920
921 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100922 polarssl_printf( " DES%c-CBC-%3d (%s): ",
923 ( u == 0 ) ? ' ' : '3', 56 + u * 56,
924 ( v == DES_DECRYPT ) ? "dec" : "enc" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000925
926 memcpy( iv, des3_test_iv, 8 );
927 memcpy( prv, des3_test_iv, 8 );
928 memcpy( buf, des3_test_buf, 8 );
929
930 switch( i )
931 {
932 case 0:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200933 des_setkey_dec( &ctx, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000934 break;
935
936 case 1:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200937 des_setkey_enc( &ctx, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000938 break;
939
940 case 2:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200941 des3_set2key_dec( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000942 break;
943
944 case 3:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200945 des3_set2key_enc( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000946 break;
947
948 case 4:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200949 des3_set3key_dec( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000950 break;
951
952 case 5:
Paul Bakker3c2122f2013-06-24 19:03:14 +0200953 des3_set3key_enc( &ctx3, des3_test_keys );
Paul Bakker5121ce52009-01-03 21:22:43 +0000954 break;
955
956 default:
957 return( 1 );
958 }
959
960 if( v == DES_DECRYPT )
961 {
962 for( j = 0; j < 10000; j++ )
963 {
964 if( u == 0 )
965 des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
966 else
967 des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
968 }
969 }
970 else
971 {
972 for( j = 0; j < 10000; j++ )
973 {
974 unsigned char tmp[8];
975
976 if( u == 0 )
977 des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
978 else
979 des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
980
981 memcpy( tmp, prv, 8 );
982 memcpy( prv, buf, 8 );
983 memcpy( buf, tmp, 8 );
984 }
985
986 memcpy( buf, prv, 8 );
987 }
988
989 if( ( v == DES_DECRYPT &&
990 memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) ||
991 ( v != DES_DECRYPT &&
992 memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) )
993 {
994 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +0100995 polarssl_printf( "failed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +0000996
997 return( 1 );
998 }
999
1000 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001001 polarssl_printf( "passed\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001002 }
Manuel Pégourié-Gonnard92cb1d32013-09-13 16:24:20 +02001003#endif /* POLARSSL_CIPHER_MODE_CBC */
Paul Bakker5121ce52009-01-03 21:22:43 +00001004
1005 if( verbose != 0 )
Paul Bakker7dc4c442014-02-01 22:50:26 +01001006 polarssl_printf( "\n" );
Paul Bakker5121ce52009-01-03 21:22:43 +00001007
1008 return( 0 );
1009}
1010
1011#endif
1012
1013#endif