1 /*
2 * FIPS-46-3 compliant Triple-DES implementation
3 *
4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * This file is part of mbed TLS (https://tls.mbed.org)
20 */
21 /*
22 * DES, on which TDES is based, was originally designed by Horst Feistel
23 * at IBM in 1974, and was adopted as a standard by NIST (formerly NBS).
24 *
25 * http://csrc.nist.gov/publications/fips/fips46-3/fips46-3.pdf
26 */
27
28 #if !defined(MBEDTLS_CONFIG_FILE)
29 #include "mbedtls/config.h"
30 #else
31 #include MBEDTLS_CONFIG_FILE
32 #endif
33
34 #if defined(MBEDTLS_DES_C)
35
36 #include "mbedtls/des.h"
37
38 #include <string.h>
39
40 #if defined(MBEDTLS_SELF_TEST)
41 #if defined(MBEDTLS_PLATFORM_C)
42 #include "mbedtls/platform.h"
43 #else
44 #include <stdio.h>
45 #define mbedtls_printf printf
46 #endif /* MBEDTLS_PLATFORM_C */
47 #endif /* MBEDTLS_SELF_TEST */
48
49 #if !defined(MBEDTLS_DES_ALT)
50
51 /* Implementation that should never be optimized out by the compiler */
mbedtls_zeroize(void * v,size_t n)52 static void mbedtls_zeroize( void *v, size_t n ) {
53 volatile unsigned char *p = (unsigned char*)v; while( n-- ) *p++ = 0;
54 }
55
56 /*
57 * 32-bit integer manipulation macros (big endian)
58 */
59 #ifndef GET_UINT32_BE
60 #define GET_UINT32_BE(n,b,i) \
61 { \
62 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
63 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
64 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
65 | ( (uint32_t) (b)[(i) + 3] ); \
66 }
67 #endif
68
69 #ifndef PUT_UINT32_BE
70 #define PUT_UINT32_BE(n,b,i) \
71 { \
72 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
73 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
74 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
75 (b)[(i) + 3] = (unsigned char) ( (n) ); \
76 }
77 #endif
78
79 /*
80 * Expanded DES S-boxes
81 */
82 static const uint32_t SB1[64] =
83 {
84 0x01010400, 0x00000000, 0x00010000, 0x01010404,
85 0x01010004, 0x00010404, 0x00000004, 0x00010000,
86 0x00000400, 0x01010400, 0x01010404, 0x00000400,
87 0x01000404, 0x01010004, 0x01000000, 0x00000004,
88 0x00000404, 0x01000400, 0x01000400, 0x00010400,
89 0x00010400, 0x01010000, 0x01010000, 0x01000404,
90 0x00010004, 0x01000004, 0x01000004, 0x00010004,
91 0x00000000, 0x00000404, 0x00010404, 0x01000000,
92 0x00010000, 0x01010404, 0x00000004, 0x01010000,
93 0x01010400, 0x01000000, 0x01000000, 0x00000400,
94 0x01010004, 0x00010000, 0x00010400, 0x01000004,
95 0x00000400, 0x00000004, 0x01000404, 0x00010404,
96 0x01010404, 0x00010004, 0x01010000, 0x01000404,
97 0x01000004, 0x00000404, 0x00010404, 0x01010400,
98 0x00000404, 0x01000400, 0x01000400, 0x00000000,
99 0x00010004, 0x00010400, 0x00000000, 0x01010004
100 };
101
102 static const uint32_t SB2[64] =
103 {
104 0x80108020, 0x80008000, 0x00008000, 0x00108020,
105 0x00100000, 0x00000020, 0x80100020, 0x80008020,
106 0x80000020, 0x80108020, 0x80108000, 0x80000000,
107 0x80008000, 0x00100000, 0x00000020, 0x80100020,
108 0x00108000, 0x00100020, 0x80008020, 0x00000000,
109 0x80000000, 0x00008000, 0x00108020, 0x80100000,
110 0x00100020, 0x80000020, 0x00000000, 0x00108000,
111 0x00008020, 0x80108000, 0x80100000, 0x00008020,
112 0x00000000, 0x00108020, 0x80100020, 0x00100000,
113 0x80008020, 0x80100000, 0x80108000, 0x00008000,
114 0x80100000, 0x80008000, 0x00000020, 0x80108020,
115 0x00108020, 0x00000020, 0x00008000, 0x80000000,
116 0x00008020, 0x80108000, 0x00100000, 0x80000020,
117 0x00100020, 0x80008020, 0x80000020, 0x00100020,
118 0x00108000, 0x00000000, 0x80008000, 0x00008020,
119 0x80000000, 0x80100020, 0x80108020, 0x00108000
120 };
121
122 static const uint32_t SB3[64] =
123 {
124 0x00000208, 0x08020200, 0x00000000, 0x08020008,
125 0x08000200, 0x00000000, 0x00020208, 0x08000200,
126 0x00020008, 0x08000008, 0x08000008, 0x00020000,
127 0x08020208, 0x00020008, 0x08020000, 0x00000208,
128 0x08000000, 0x00000008, 0x08020200, 0x00000200,
129 0x00020200, 0x08020000, 0x08020008, 0x00020208,
130 0x08000208, 0x00020200, 0x00020000, 0x08000208,
131 0x00000008, 0x08020208, 0x00000200, 0x08000000,
132 0x08020200, 0x08000000, 0x00020008, 0x00000208,
133 0x00020000, 0x08020200, 0x08000200, 0x00000000,
134 0x00000200, 0x00020008, 0x08020208, 0x08000200,
135 0x08000008, 0x00000200, 0x00000000, 0x08020008,
136 0x08000208, 0x00020000, 0x08000000, 0x08020208,
137 0x00000008, 0x00020208, 0x00020200, 0x08000008,
138 0x08020000, 0x08000208, 0x00000208, 0x08020000,
139 0x00020208, 0x00000008, 0x08020008, 0x00020200
140 };
141
142 static const uint32_t SB4[64] =
143 {
144 0x00802001, 0x00002081, 0x00002081, 0x00000080,
145 0x00802080, 0x00800081, 0x00800001, 0x00002001,
146 0x00000000, 0x00802000, 0x00802000, 0x00802081,
147 0x00000081, 0x00000000, 0x00800080, 0x00800001,
148 0x00000001, 0x00002000, 0x00800000, 0x00802001,
149 0x00000080, 0x00800000, 0x00002001, 0x00002080,
150 0x00800081, 0x00000001, 0x00002080, 0x00800080,
151 0x00002000, 0x00802080, 0x00802081, 0x00000081,
152 0x00800080, 0x00800001, 0x00802000, 0x00802081,
153 0x00000081, 0x00000000, 0x00000000, 0x00802000,
154 0x00002080, 0x00800080, 0x00800081, 0x00000001,
155 0x00802001, 0x00002081, 0x00002081, 0x00000080,
156 0x00802081, 0x00000081, 0x00000001, 0x00002000,
157 0x00800001, 0x00002001, 0x00802080, 0x00800081,
158 0x00002001, 0x00002080, 0x00800000, 0x00802001,
159 0x00000080, 0x00800000, 0x00002000, 0x00802080
160 };
161
162 static const uint32_t SB5[64] =
163 {
164 0x00000100, 0x02080100, 0x02080000, 0x42000100,
165 0x00080000, 0x00000100, 0x40000000, 0x02080000,
166 0x40080100, 0x00080000, 0x02000100, 0x40080100,
167 0x42000100, 0x42080000, 0x00080100, 0x40000000,
168 0x02000000, 0x40080000, 0x40080000, 0x00000000,
169 0x40000100, 0x42080100, 0x42080100, 0x02000100,
170 0x42080000, 0x40000100, 0x00000000, 0x42000000,
171 0x02080100, 0x02000000, 0x42000000, 0x00080100,
172 0x00080000, 0x42000100, 0x00000100, 0x02000000,
173 0x40000000, 0x02080000, 0x42000100, 0x40080100,
174 0x02000100, 0x40000000, 0x42080000, 0x02080100,
175 0x40080100, 0x00000100, 0x02000000, 0x42080000,
176 0x42080100, 0x00080100, 0x42000000, 0x42080100,
177 0x02080000, 0x00000000, 0x40080000, 0x42000000,
178 0x00080100, 0x02000100, 0x40000100, 0x00080000,
179 0x00000000, 0x40080000, 0x02080100, 0x40000100
180 };
181
182 static const uint32_t SB6[64] =
183 {
184 0x20000010, 0x20400000, 0x00004000, 0x20404010,
185 0x20400000, 0x00000010, 0x20404010, 0x00400000,
186 0x20004000, 0x00404010, 0x00400000, 0x20000010,
187 0x00400010, 0x20004000, 0x20000000, 0x00004010,
188 0x00000000, 0x00400010, 0x20004010, 0x00004000,
189 0x00404000, 0x20004010, 0x00000010, 0x20400010,
190 0x20400010, 0x00000000, 0x00404010, 0x20404000,
191 0x00004010, 0x00404000, 0x20404000, 0x20000000,
192 0x20004000, 0x00000010, 0x20400010, 0x00404000,
193 0x20404010, 0x00400000, 0x00004010, 0x20000010,
194 0x00400000, 0x20004000, 0x20000000, 0x00004010,
195 0x20000010, 0x20404010, 0x00404000, 0x20400000,
196 0x00404010, 0x20404000, 0x00000000, 0x20400010,
197 0x00000010, 0x00004000, 0x20400000, 0x00404010,
198 0x00004000, 0x00400010, 0x20004010, 0x00000000,
199 0x20404000, 0x20000000, 0x00400010, 0x20004010
200 };
201
202 static const uint32_t SB7[64] =
203 {
204 0x00200000, 0x04200002, 0x04000802, 0x00000000,
205 0x00000800, 0x04000802, 0x00200802, 0x04200800,
206 0x04200802, 0x00200000, 0x00000000, 0x04000002,
207 0x00000002, 0x04000000, 0x04200002, 0x00000802,
208 0x04000800, 0x00200802, 0x00200002, 0x04000800,
209 0x04000002, 0x04200000, 0x04200800, 0x00200002,
210 0x04200000, 0x00000800, 0x00000802, 0x04200802,
211 0x00200800, 0x00000002, 0x04000000, 0x00200800,
212 0x04000000, 0x00200800, 0x00200000, 0x04000802,
213 0x04000802, 0x04200002, 0x04200002, 0x00000002,
214 0x00200002, 0x04000000, 0x04000800, 0x00200000,
215 0x04200800, 0x00000802, 0x00200802, 0x04200800,
216 0x00000802, 0x04000002, 0x04200802, 0x04200000,
217 0x00200800, 0x00000000, 0x00000002, 0x04200802,
218 0x00000000, 0x00200802, 0x04200000, 0x00000800,
219 0x04000002, 0x04000800, 0x00000800, 0x00200002
220 };
221
222 static const uint32_t SB8[64] =
223 {
224 0x10001040, 0x00001000, 0x00040000, 0x10041040,
225 0x10000000, 0x10001040, 0x00000040, 0x10000000,
226 0x00040040, 0x10040000, 0x10041040, 0x00041000,
227 0x10041000, 0x00041040, 0x00001000, 0x00000040,
228 0x10040000, 0x10000040, 0x10001000, 0x00001040,
229 0x00041000, 0x00040040, 0x10040040, 0x10041000,
230 0x00001040, 0x00000000, 0x00000000, 0x10040040,
231 0x10000040, 0x10001000, 0x00041040, 0x00040000,
232 0x00041040, 0x00040000, 0x10041000, 0x00001000,
233 0x00000040, 0x10040040, 0x00001000, 0x00041040,
234 0x10001000, 0x00000040, 0x10000040, 0x10040000,
235 0x10040040, 0x10000000, 0x00040000, 0x10001040,
236 0x00000000, 0x10041040, 0x00040040, 0x10000040,
237 0x10040000, 0x10001000, 0x10001040, 0x00000000,
238 0x10041040, 0x00041000, 0x00041000, 0x00001040,
239 0x00001040, 0x00040040, 0x10000000, 0x10041000
240 };
241
242 /*
243 * PC1: left and right halves bit-swap
244 */
245 static const uint32_t LHs[16] =
246 {
247 0x00000000, 0x00000001, 0x00000100, 0x00000101,
248 0x00010000, 0x00010001, 0x00010100, 0x00010101,
249 0x01000000, 0x01000001, 0x01000100, 0x01000101,
250 0x01010000, 0x01010001, 0x01010100, 0x01010101
251 };
252
253 static const uint32_t RHs[16] =
254 {
255 0x00000000, 0x01000000, 0x00010000, 0x01010000,
256 0x00000100, 0x01000100, 0x00010100, 0x01010100,
257 0x00000001, 0x01000001, 0x00010001, 0x01010001,
258 0x00000101, 0x01000101, 0x00010101, 0x01010101,
259 };
260
261 /*
262 * Initial Permutation macro
263 */
264 #define DES_IP(X,Y) \
265 { \
266 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
267 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
268 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
269 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
270 Y = ((Y << 1) | (Y >> 31)) & 0xFFFFFFFF; \
271 T = (X ^ Y) & 0xAAAAAAAA; Y ^= T; X ^= T; \
272 X = ((X << 1) | (X >> 31)) & 0xFFFFFFFF; \
273 }
274
275 /*
276 * Final Permutation macro
277 */
278 #define DES_FP(X,Y) \
279 { \
280 X = ((X << 31) | (X >> 1)) & 0xFFFFFFFF; \
281 T = (X ^ Y) & 0xAAAAAAAA; X ^= T; Y ^= T; \
282 Y = ((Y << 31) | (Y >> 1)) & 0xFFFFFFFF; \
283 T = ((Y >> 8) ^ X) & 0x00FF00FF; X ^= T; Y ^= (T << 8); \
284 T = ((Y >> 2) ^ X) & 0x33333333; X ^= T; Y ^= (T << 2); \
285 T = ((X >> 16) ^ Y) & 0x0000FFFF; Y ^= T; X ^= (T << 16); \
286 T = ((X >> 4) ^ Y) & 0x0F0F0F0F; Y ^= T; X ^= (T << 4); \
287 }
288
289 /*
290 * DES round macro
291 */
292 #define DES_ROUND(X,Y) \
293 { \
294 T = *SK++ ^ X; \
295 Y ^= SB8[ (T ) & 0x3F ] ^ \
296 SB6[ (T >> 8) & 0x3F ] ^ \
297 SB4[ (T >> 16) & 0x3F ] ^ \
298 SB2[ (T >> 24) & 0x3F ]; \
299 \
300 T = *SK++ ^ ((X << 28) | (X >> 4)); \
301 Y ^= SB7[ (T ) & 0x3F ] ^ \
302 SB5[ (T >> 8) & 0x3F ] ^ \
303 SB3[ (T >> 16) & 0x3F ] ^ \
304 SB1[ (T >> 24) & 0x3F ]; \
305 }
306
307 #define SWAP(a,b) { uint32_t t = a; a = b; b = t; t = 0; }
308
mbedtls_des_init(mbedtls_des_context * ctx)309 void mbedtls_des_init( mbedtls_des_context *ctx )
310 {
311 memset( ctx, 0, sizeof( mbedtls_des_context ) );
312 }
313
mbedtls_des_free(mbedtls_des_context * ctx)314 void mbedtls_des_free( mbedtls_des_context *ctx )
315 {
316 if( ctx == NULL )
317 return;
318
319 mbedtls_zeroize( ctx, sizeof( mbedtls_des_context ) );
320 }
321
mbedtls_des3_init(mbedtls_des3_context * ctx)322 void mbedtls_des3_init( mbedtls_des3_context *ctx )
323 {
324 memset( ctx, 0, sizeof( mbedtls_des3_context ) );
325 }
326
mbedtls_des3_free(mbedtls_des3_context * ctx)327 void mbedtls_des3_free( mbedtls_des3_context *ctx )
328 {
329 if( ctx == NULL )
330 return;
331
332 mbedtls_zeroize( ctx, sizeof( mbedtls_des3_context ) );
333 }
334
335 static const unsigned char odd_parity_table[128] = { 1, 2, 4, 7, 8,
336 11, 13, 14, 16, 19, 21, 22, 25, 26, 28, 31, 32, 35, 37, 38, 41, 42, 44,
337 47, 49, 50, 52, 55, 56, 59, 61, 62, 64, 67, 69, 70, 73, 74, 76, 79, 81,
338 82, 84, 87, 88, 91, 93, 94, 97, 98, 100, 103, 104, 107, 109, 110, 112,
339 115, 117, 118, 121, 122, 124, 127, 128, 131, 133, 134, 137, 138, 140,
340 143, 145, 146, 148, 151, 152, 155, 157, 158, 161, 162, 164, 167, 168,
341 171, 173, 174, 176, 179, 181, 182, 185, 186, 188, 191, 193, 194, 196,
342 199, 200, 203, 205, 206, 208, 211, 213, 214, 217, 218, 220, 223, 224,
343 227, 229, 230, 233, 234, 236, 239, 241, 242, 244, 247, 248, 251, 253,
344 254 };
345
mbedtls_des_key_set_parity(unsigned char key[MBEDTLS_DES_KEY_SIZE])346 void mbedtls_des_key_set_parity( unsigned char key[MBEDTLS_DES_KEY_SIZE] )
347 {
348 int i;
349
350 for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )
351 key[i] = odd_parity_table[key[i] / 2];
352 }
353
354 /*
355 * Check the given key's parity, returns 1 on failure, 0 on SUCCESS
356 */
mbedtls_des_key_check_key_parity(const unsigned char key[MBEDTLS_DES_KEY_SIZE])357 int mbedtls_des_key_check_key_parity( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
358 {
359 int i;
360
361 for( i = 0; i < MBEDTLS_DES_KEY_SIZE; i++ )
362 if( key[i] != odd_parity_table[key[i] / 2] )
363 return( 1 );
364
365 return( 0 );
366 }
367
368 /*
369 * Table of weak and semi-weak keys
370 *
371 * Source: http://en.wikipedia.org/wiki/Weak_key
372 *
373 * Weak:
374 * Alternating ones + zeros (0x0101010101010101)
375 * Alternating 'F' + 'E' (0xFEFEFEFEFEFEFEFE)
376 * '0xE0E0E0E0F1F1F1F1'
377 * '0x1F1F1F1F0E0E0E0E'
378 *
379 * Semi-weak:
380 * 0x011F011F010E010E and 0x1F011F010E010E01
381 * 0x01E001E001F101F1 and 0xE001E001F101F101
382 * 0x01FE01FE01FE01FE and 0xFE01FE01FE01FE01
383 * 0x1FE01FE00EF10EF1 and 0xE01FE01FF10EF10E
384 * 0x1FFE1FFE0EFE0EFE and 0xFE1FFE1FFE0EFE0E
385 * 0xE0FEE0FEF1FEF1FE and 0xFEE0FEE0FEF1FEF1
386 *
387 */
388
389 #define WEAK_KEY_COUNT 16
390
391 static const unsigned char weak_key_table[WEAK_KEY_COUNT][MBEDTLS_DES_KEY_SIZE] =
392 {
393 { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 },
394 { 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE },
395 { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E },
396 { 0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1 },
397
398 { 0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E },
399 { 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01 },
400 { 0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1 },
401 { 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01 },
402 { 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE },
403 { 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01 },
404 { 0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1 },
405 { 0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E },
406 { 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE },
407 { 0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E },
408 { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE },
409 { 0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1 }
410 };
411
mbedtls_des_key_check_weak(const unsigned char key[MBEDTLS_DES_KEY_SIZE])412 int mbedtls_des_key_check_weak( const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
413 {
414 int i;
415
416 for( i = 0; i < WEAK_KEY_COUNT; i++ )
417 if( memcmp( weak_key_table[i], key, MBEDTLS_DES_KEY_SIZE) == 0 )
418 return( 1 );
419
420 return( 0 );
421 }
422
423 #if !defined(MBEDTLS_DES_SETKEY_ALT)
mbedtls_des_setkey(uint32_t SK[32],const unsigned char key[MBEDTLS_DES_KEY_SIZE])424 void mbedtls_des_setkey( uint32_t SK[32], const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
425 {
426 int i;
427 uint32_t X, Y, T;
428
429 GET_UINT32_BE( X, key, 0 );
430 GET_UINT32_BE( Y, key, 4 );
431
432 /*
433 * Permuted Choice 1
434 */
435 T = ((Y >> 4) ^ X) & 0x0F0F0F0F; X ^= T; Y ^= (T << 4);
436 T = ((Y ) ^ X) & 0x10101010; X ^= T; Y ^= (T );
437
438 X = (LHs[ (X ) & 0xF] << 3) | (LHs[ (X >> 8) & 0xF ] << 2)
439 | (LHs[ (X >> 16) & 0xF] << 1) | (LHs[ (X >> 24) & 0xF ] )
440 | (LHs[ (X >> 5) & 0xF] << 7) | (LHs[ (X >> 13) & 0xF ] << 6)
441 | (LHs[ (X >> 21) & 0xF] << 5) | (LHs[ (X >> 29) & 0xF ] << 4);
442
443 Y = (RHs[ (Y >> 1) & 0xF] << 3) | (RHs[ (Y >> 9) & 0xF ] << 2)
444 | (RHs[ (Y >> 17) & 0xF] << 1) | (RHs[ (Y >> 25) & 0xF ] )
445 | (RHs[ (Y >> 4) & 0xF] << 7) | (RHs[ (Y >> 12) & 0xF ] << 6)
446 | (RHs[ (Y >> 20) & 0xF] << 5) | (RHs[ (Y >> 28) & 0xF ] << 4);
447
448 X &= 0x0FFFFFFF;
449 Y &= 0x0FFFFFFF;
450
451 /*
452 * calculate subkeys
453 */
454 for( i = 0; i < 16; i++ )
455 {
456 if( i < 2 || i == 8 || i == 15 )
457 {
458 X = ((X << 1) | (X >> 27)) & 0x0FFFFFFF;
459 Y = ((Y << 1) | (Y >> 27)) & 0x0FFFFFFF;
460 }
461 else
462 {
463 X = ((X << 2) | (X >> 26)) & 0x0FFFFFFF;
464 Y = ((Y << 2) | (Y >> 26)) & 0x0FFFFFFF;
465 }
466
467 *SK++ = ((X << 4) & 0x24000000) | ((X << 28) & 0x10000000)
468 | ((X << 14) & 0x08000000) | ((X << 18) & 0x02080000)
469 | ((X << 6) & 0x01000000) | ((X << 9) & 0x00200000)
470 | ((X >> 1) & 0x00100000) | ((X << 10) & 0x00040000)
471 | ((X << 2) & 0x00020000) | ((X >> 10) & 0x00010000)
472 | ((Y >> 13) & 0x00002000) | ((Y >> 4) & 0x00001000)
473 | ((Y << 6) & 0x00000800) | ((Y >> 1) & 0x00000400)
474 | ((Y >> 14) & 0x00000200) | ((Y ) & 0x00000100)
475 | ((Y >> 5) & 0x00000020) | ((Y >> 10) & 0x00000010)
476 | ((Y >> 3) & 0x00000008) | ((Y >> 18) & 0x00000004)
477 | ((Y >> 26) & 0x00000002) | ((Y >> 24) & 0x00000001);
478
479 *SK++ = ((X << 15) & 0x20000000) | ((X << 17) & 0x10000000)
480 | ((X << 10) & 0x08000000) | ((X << 22) & 0x04000000)
481 | ((X >> 2) & 0x02000000) | ((X << 1) & 0x01000000)
482 | ((X << 16) & 0x00200000) | ((X << 11) & 0x00100000)
483 | ((X << 3) & 0x00080000) | ((X >> 6) & 0x00040000)
484 | ((X << 15) & 0x00020000) | ((X >> 4) & 0x00010000)
485 | ((Y >> 2) & 0x00002000) | ((Y << 8) & 0x00001000)
486 | ((Y >> 14) & 0x00000808) | ((Y >> 9) & 0x00000400)
487 | ((Y ) & 0x00000200) | ((Y << 7) & 0x00000100)
488 | ((Y >> 7) & 0x00000020) | ((Y >> 3) & 0x00000011)
489 | ((Y << 2) & 0x00000004) | ((Y >> 21) & 0x00000002);
490 }
491 }
492 #endif /* !MBEDTLS_DES_SETKEY_ALT */
493
494 /*
495 * DES key schedule (56-bit, encryption)
496 */
mbedtls_des_setkey_enc(mbedtls_des_context * ctx,const unsigned char key[MBEDTLS_DES_KEY_SIZE])497 int mbedtls_des_setkey_enc( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
498 {
499 mbedtls_des_setkey( ctx->sk, key );
500
501 return( 0 );
502 }
503
504 /*
505 * DES key schedule (56-bit, decryption)
506 */
mbedtls_des_setkey_dec(mbedtls_des_context * ctx,const unsigned char key[MBEDTLS_DES_KEY_SIZE])507 int mbedtls_des_setkey_dec( mbedtls_des_context *ctx, const unsigned char key[MBEDTLS_DES_KEY_SIZE] )
508 {
509 int i;
510
511 mbedtls_des_setkey( ctx->sk, key );
512
513 for( i = 0; i < 16; i += 2 )
514 {
515 SWAP( ctx->sk[i ], ctx->sk[30 - i] );
516 SWAP( ctx->sk[i + 1], ctx->sk[31 - i] );
517 }
518
519 return( 0 );
520 }
521
des3_set2key(uint32_t esk[96],uint32_t dsk[96],const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2])522 static void des3_set2key( uint32_t esk[96],
523 uint32_t dsk[96],
524 const unsigned char key[MBEDTLS_DES_KEY_SIZE*2] )
525 {
526 int i;
527
528 mbedtls_des_setkey( esk, key );
529 mbedtls_des_setkey( dsk + 32, key + 8 );
530
531 for( i = 0; i < 32; i += 2 )
532 {
533 dsk[i ] = esk[30 - i];
534 dsk[i + 1] = esk[31 - i];
535
536 esk[i + 32] = dsk[62 - i];
537 esk[i + 33] = dsk[63 - i];
538
539 esk[i + 64] = esk[i ];
540 esk[i + 65] = esk[i + 1];
541
542 dsk[i + 64] = dsk[i ];
543 dsk[i + 65] = dsk[i + 1];
544 }
545 }
546
547 /*
548 * Triple-DES key schedule (112-bit, encryption)
549 */
mbedtls_des3_set2key_enc(mbedtls_des3_context * ctx,const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2])550 int mbedtls_des3_set2key_enc( mbedtls_des3_context *ctx,
551 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )
552 {
553 uint32_t sk[96];
554
555 des3_set2key( ctx->sk, sk, key );
556 mbedtls_zeroize( sk, sizeof( sk ) );
557
558 return( 0 );
559 }
560
561 /*
562 * Triple-DES key schedule (112-bit, decryption)
563 */
mbedtls_des3_set2key_dec(mbedtls_des3_context * ctx,const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2])564 int mbedtls_des3_set2key_dec( mbedtls_des3_context *ctx,
565 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 2] )
566 {
567 uint32_t sk[96];
568
569 des3_set2key( sk, ctx->sk, key );
570 mbedtls_zeroize( sk, sizeof( sk ) );
571
572 return( 0 );
573 }
574
des3_set3key(uint32_t esk[96],uint32_t dsk[96],const unsigned char key[24])575 static void des3_set3key( uint32_t esk[96],
576 uint32_t dsk[96],
577 const unsigned char key[24] )
578 {
579 int i;
580
581 mbedtls_des_setkey( esk, key );
582 mbedtls_des_setkey( dsk + 32, key + 8 );
583 mbedtls_des_setkey( esk + 64, key + 16 );
584
585 for( i = 0; i < 32; i += 2 )
586 {
587 dsk[i ] = esk[94 - i];
588 dsk[i + 1] = esk[95 - i];
589
590 esk[i + 32] = dsk[62 - i];
591 esk[i + 33] = dsk[63 - i];
592
593 dsk[i + 64] = esk[30 - i];
594 dsk[i + 65] = esk[31 - i];
595 }
596 }
597
598 /*
599 * Triple-DES key schedule (168-bit, encryption)
600 */
mbedtls_des3_set3key_enc(mbedtls_des3_context * ctx,const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3])601 int mbedtls_des3_set3key_enc( mbedtls_des3_context *ctx,
602 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )
603 {
604 uint32_t sk[96];
605
606 des3_set3key( ctx->sk, sk, key );
607 mbedtls_zeroize( sk, sizeof( sk ) );
608
609 return( 0 );
610 }
611
612 /*
613 * Triple-DES key schedule (168-bit, decryption)
614 */
mbedtls_des3_set3key_dec(mbedtls_des3_context * ctx,const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3])615 int mbedtls_des3_set3key_dec( mbedtls_des3_context *ctx,
616 const unsigned char key[MBEDTLS_DES_KEY_SIZE * 3] )
617 {
618 uint32_t sk[96];
619
620 des3_set3key( sk, ctx->sk, key );
621 mbedtls_zeroize( sk, sizeof( sk ) );
622
623 return( 0 );
624 }
625
626 /*
627 * DES-ECB block encryption/decryption
628 */
629 #if !defined(MBEDTLS_DES_CRYPT_ECB_ALT)
mbedtls_des_crypt_ecb(mbedtls_des_context * ctx,const unsigned char input[8],unsigned char output[8])630 int mbedtls_des_crypt_ecb( mbedtls_des_context *ctx,
631 const unsigned char input[8],
632 unsigned char output[8] )
633 {
634 int i;
635 uint32_t X, Y, T, *SK;
636
637 SK = ctx->sk;
638
639 GET_UINT32_BE( X, input, 0 );
640 GET_UINT32_BE( Y, input, 4 );
641
642 DES_IP( X, Y );
643
644 for( i = 0; i < 8; i++ )
645 {
646 DES_ROUND( Y, X );
647 DES_ROUND( X, Y );
648 }
649
650 DES_FP( Y, X );
651
652 PUT_UINT32_BE( Y, output, 0 );
653 PUT_UINT32_BE( X, output, 4 );
654
655 return( 0 );
656 }
657 #endif /* !MBEDTLS_DES_CRYPT_ECB_ALT */
658
659 #if defined(MBEDTLS_CIPHER_MODE_CBC)
660 /*
661 * DES-CBC buffer encryption/decryption
662 */
mbedtls_des_crypt_cbc(mbedtls_des_context * ctx,int mode,size_t length,unsigned char iv[8],const unsigned char * input,unsigned char * output)663 int mbedtls_des_crypt_cbc( mbedtls_des_context *ctx,
664 int mode,
665 size_t length,
666 unsigned char iv[8],
667 const unsigned char *input,
668 unsigned char *output )
669 {
670 int i;
671 unsigned char temp[8];
672
673 if( length % 8 )
674 return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );
675
676 if( mode == MBEDTLS_DES_ENCRYPT )
677 {
678 while( length > 0 )
679 {
680 for( i = 0; i < 8; i++ )
681 output[i] = (unsigned char)( input[i] ^ iv[i] );
682
683 mbedtls_des_crypt_ecb( ctx, output, output );
684 memcpy( iv, output, 8 );
685
686 input += 8;
687 output += 8;
688 length -= 8;
689 }
690 }
691 else /* MBEDTLS_DES_DECRYPT */
692 {
693 while( length > 0 )
694 {
695 memcpy( temp, input, 8 );
696 mbedtls_des_crypt_ecb( ctx, input, output );
697
698 for( i = 0; i < 8; i++ )
699 output[i] = (unsigned char)( output[i] ^ iv[i] );
700
701 memcpy( iv, temp, 8 );
702
703 input += 8;
704 output += 8;
705 length -= 8;
706 }
707 }
708
709 return( 0 );
710 }
711 #endif /* MBEDTLS_CIPHER_MODE_CBC */
712
713 /*
714 * 3DES-ECB block encryption/decryption
715 */
716 #if !defined(MBEDTLS_DES3_CRYPT_ECB_ALT)
mbedtls_des3_crypt_ecb(mbedtls_des3_context * ctx,const unsigned char input[8],unsigned char output[8])717 int mbedtls_des3_crypt_ecb( mbedtls_des3_context *ctx,
718 const unsigned char input[8],
719 unsigned char output[8] )
720 {
721 int i;
722 uint32_t X, Y, T, *SK;
723
724 SK = ctx->sk;
725
726 GET_UINT32_BE( X, input, 0 );
727 GET_UINT32_BE( Y, input, 4 );
728
729 DES_IP( X, Y );
730
731 for( i = 0; i < 8; i++ )
732 {
733 DES_ROUND( Y, X );
734 DES_ROUND( X, Y );
735 }
736
737 for( i = 0; i < 8; i++ )
738 {
739 DES_ROUND( X, Y );
740 DES_ROUND( Y, X );
741 }
742
743 for( i = 0; i < 8; i++ )
744 {
745 DES_ROUND( Y, X );
746 DES_ROUND( X, Y );
747 }
748
749 DES_FP( Y, X );
750
751 PUT_UINT32_BE( Y, output, 0 );
752 PUT_UINT32_BE( X, output, 4 );
753
754 return( 0 );
755 }
756 #endif /* !MBEDTLS_DES3_CRYPT_ECB_ALT */
757
758 #if defined(MBEDTLS_CIPHER_MODE_CBC)
759 /*
760 * 3DES-CBC buffer encryption/decryption
761 */
mbedtls_des3_crypt_cbc(mbedtls_des3_context * ctx,int mode,size_t length,unsigned char iv[8],const unsigned char * input,unsigned char * output)762 int mbedtls_des3_crypt_cbc( mbedtls_des3_context *ctx,
763 int mode,
764 size_t length,
765 unsigned char iv[8],
766 const unsigned char *input,
767 unsigned char *output )
768 {
769 int i;
770 unsigned char temp[8];
771
772 if( length % 8 )
773 return( MBEDTLS_ERR_DES_INVALID_INPUT_LENGTH );
774
775 if( mode == MBEDTLS_DES_ENCRYPT )
776 {
777 while( length > 0 )
778 {
779 for( i = 0; i < 8; i++ )
780 output[i] = (unsigned char)( input[i] ^ iv[i] );
781
782 mbedtls_des3_crypt_ecb( ctx, output, output );
783 memcpy( iv, output, 8 );
784
785 input += 8;
786 output += 8;
787 length -= 8;
788 }
789 }
790 else /* MBEDTLS_DES_DECRYPT */
791 {
792 while( length > 0 )
793 {
794 memcpy( temp, input, 8 );
795 mbedtls_des3_crypt_ecb( ctx, input, output );
796
797 for( i = 0; i < 8; i++ )
798 output[i] = (unsigned char)( output[i] ^ iv[i] );
799
800 memcpy( iv, temp, 8 );
801
802 input += 8;
803 output += 8;
804 length -= 8;
805 }
806 }
807
808 return( 0 );
809 }
810 #endif /* MBEDTLS_CIPHER_MODE_CBC */
811
812 #endif /* !MBEDTLS_DES_ALT */
813
814 #if defined(MBEDTLS_SELF_TEST)
815 /*
816 * DES and 3DES test vectors from:
817 *
818 * http://csrc.nist.gov/groups/STM/cavp/documents/des/tripledes-vectors.zip
819 */
820 static const unsigned char des3_test_keys[24] =
821 {
822 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF,
823 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01,
824 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23
825 };
826
827 static const unsigned char des3_test_buf[8] =
828 {
829 0x4E, 0x6F, 0x77, 0x20, 0x69, 0x73, 0x20, 0x74
830 };
831
832 static const unsigned char des3_test_ecb_dec[3][8] =
833 {
834 { 0xCD, 0xD6, 0x4F, 0x2F, 0x94, 0x27, 0xC1, 0x5D },
835 { 0x69, 0x96, 0xC8, 0xFA, 0x47, 0xA2, 0xAB, 0xEB },
836 { 0x83, 0x25, 0x39, 0x76, 0x44, 0x09, 0x1A, 0x0A }
837 };
838
839 static const unsigned char des3_test_ecb_enc[3][8] =
840 {
841 { 0x6A, 0x2A, 0x19, 0xF4, 0x1E, 0xCA, 0x85, 0x4B },
842 { 0x03, 0xE6, 0x9F, 0x5B, 0xFA, 0x58, 0xEB, 0x42 },
843 { 0xDD, 0x17, 0xE8, 0xB8, 0xB4, 0x37, 0xD2, 0x32 }
844 };
845
846 #if defined(MBEDTLS_CIPHER_MODE_CBC)
847 static const unsigned char des3_test_iv[8] =
848 {
849 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF,
850 };
851
852 static const unsigned char des3_test_cbc_dec[3][8] =
853 {
854 { 0x12, 0x9F, 0x40, 0xB9, 0xD2, 0x00, 0x56, 0xB3 },
855 { 0x47, 0x0E, 0xFC, 0x9A, 0x6B, 0x8E, 0xE3, 0x93 },
856 { 0xC5, 0xCE, 0xCF, 0x63, 0xEC, 0xEC, 0x51, 0x4C }
857 };
858
859 static const unsigned char des3_test_cbc_enc[3][8] =
860 {
861 { 0x54, 0xF1, 0x5A, 0xF6, 0xEB, 0xE3, 0xA4, 0xB4 },
862 { 0x35, 0x76, 0x11, 0x56, 0x5F, 0xA1, 0x8E, 0x4D },
863 { 0xCB, 0x19, 0x1F, 0x85, 0xD1, 0xED, 0x84, 0x39 }
864 };
865 #endif /* MBEDTLS_CIPHER_MODE_CBC */
866
867 /*
868 * Checkup routine
869 */
mbedtls_des_self_test(int verbose)870 int mbedtls_des_self_test( int verbose )
871 {
872 int i, j, u, v, ret = 0;
873 mbedtls_des_context ctx;
874 mbedtls_des3_context ctx3;
875 unsigned char buf[8];
876 #if defined(MBEDTLS_CIPHER_MODE_CBC)
877 unsigned char prv[8];
878 unsigned char iv[8];
879 #endif
880
881 mbedtls_des_init( &ctx );
882 mbedtls_des3_init( &ctx3 );
883 /*
884 * ECB mode
885 */
886 for( i = 0; i < 6; i++ )
887 {
888 u = i >> 1;
889 v = i & 1;
890
891 if( verbose != 0 )
892 mbedtls_printf( " DES%c-ECB-%3d (%s): ",
893 ( u == 0 ) ? ' ' : '3', 56 + u * 56,
894 ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" );
895
896 memcpy( buf, des3_test_buf, 8 );
897
898 switch( i )
899 {
900 case 0:
901 mbedtls_des_setkey_dec( &ctx, des3_test_keys );
902 break;
903
904 case 1:
905 mbedtls_des_setkey_enc( &ctx, des3_test_keys );
906 break;
907
908 case 2:
909 mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );
910 break;
911
912 case 3:
913 mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );
914 break;
915
916 case 4:
917 mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );
918 break;
919
920 case 5:
921 mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );
922 break;
923
924 default:
925 return( 1 );
926 }
927
928 for( j = 0; j < 10000; j++ )
929 {
930 if( u == 0 )
931 mbedtls_des_crypt_ecb( &ctx, buf, buf );
932 else
933 mbedtls_des3_crypt_ecb( &ctx3, buf, buf );
934 }
935
936 if( ( v == MBEDTLS_DES_DECRYPT &&
937 memcmp( buf, des3_test_ecb_dec[u], 8 ) != 0 ) ||
938 ( v != MBEDTLS_DES_DECRYPT &&
939 memcmp( buf, des3_test_ecb_enc[u], 8 ) != 0 ) )
940 {
941 if( verbose != 0 )
942 mbedtls_printf( "failed\n" );
943
944 ret = 1;
945 goto exit;
946 }
947
948 if( verbose != 0 )
949 mbedtls_printf( "passed\n" );
950 }
951
952 if( verbose != 0 )
953 mbedtls_printf( "\n" );
954
955 #if defined(MBEDTLS_CIPHER_MODE_CBC)
956 /*
957 * CBC mode
958 */
959 for( i = 0; i < 6; i++ )
960 {
961 u = i >> 1;
962 v = i & 1;
963
964 if( verbose != 0 )
965 mbedtls_printf( " DES%c-CBC-%3d (%s): ",
966 ( u == 0 ) ? ' ' : '3', 56 + u * 56,
967 ( v == MBEDTLS_DES_DECRYPT ) ? "dec" : "enc" );
968
969 memcpy( iv, des3_test_iv, 8 );
970 memcpy( prv, des3_test_iv, 8 );
971 memcpy( buf, des3_test_buf, 8 );
972
973 switch( i )
974 {
975 case 0:
976 mbedtls_des_setkey_dec( &ctx, des3_test_keys );
977 break;
978
979 case 1:
980 mbedtls_des_setkey_enc( &ctx, des3_test_keys );
981 break;
982
983 case 2:
984 mbedtls_des3_set2key_dec( &ctx3, des3_test_keys );
985 break;
986
987 case 3:
988 mbedtls_des3_set2key_enc( &ctx3, des3_test_keys );
989 break;
990
991 case 4:
992 mbedtls_des3_set3key_dec( &ctx3, des3_test_keys );
993 break;
994
995 case 5:
996 mbedtls_des3_set3key_enc( &ctx3, des3_test_keys );
997 break;
998
999 default:
1000 return( 1 );
1001 }
1002
1003 if( v == MBEDTLS_DES_DECRYPT )
1004 {
1005 for( j = 0; j < 10000; j++ )
1006 {
1007 if( u == 0 )
1008 mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
1009 else
1010 mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
1011 }
1012 }
1013 else
1014 {
1015 for( j = 0; j < 10000; j++ )
1016 {
1017 unsigned char tmp[8];
1018
1019 if( u == 0 )
1020 mbedtls_des_crypt_cbc( &ctx, v, 8, iv, buf, buf );
1021 else
1022 mbedtls_des3_crypt_cbc( &ctx3, v, 8, iv, buf, buf );
1023
1024 memcpy( tmp, prv, 8 );
1025 memcpy( prv, buf, 8 );
1026 memcpy( buf, tmp, 8 );
1027 }
1028
1029 memcpy( buf, prv, 8 );
1030 }
1031
1032 if( ( v == MBEDTLS_DES_DECRYPT &&
1033 memcmp( buf, des3_test_cbc_dec[u], 8 ) != 0 ) ||
1034 ( v != MBEDTLS_DES_DECRYPT &&
1035 memcmp( buf, des3_test_cbc_enc[u], 8 ) != 0 ) )
1036 {
1037 if( verbose != 0 )
1038 mbedtls_printf( "failed\n" );
1039
1040 ret = 1;
1041 goto exit;
1042 }
1043
1044 if( verbose != 0 )
1045 mbedtls_printf( "passed\n" );
1046 }
1047 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1048
1049 if( verbose != 0 )
1050 mbedtls_printf( "\n" );
1051
1052 exit:
1053 mbedtls_des_free( &ctx );
1054 mbedtls_des3_free( &ctx3 );
1055
1056 return( ret );
1057 }
1058
1059 #endif /* MBEDTLS_SELF_TEST */
1060
1061 #endif /* MBEDTLS_DES_C */
1062