~ubuntu-branches/ubuntu/gutsy/wpasupplicant/gutsy

1.1.9 by Reinhard Tartler
Import upstream version 0.6.0+0.5.8
1
/*
2
 * DES and 3DES-EDE ciphers
3
 *
4
 * Modifications to LibTomCrypt implementation:
5
 * Copyright (c) 2006, Jouni Malinen <j@w1.fi>
6
 *
7
 * This program is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License version 2 as
9
 * published by the Free Software Foundation.
10
 *
11
 * Alternatively, this software may be distributed under the terms of BSD
12
 * license.
13
 *
14
 * See README and COPYING for more details.
15
 */
16
17
#include "includes.h"
18
19
#include "common.h"
20
#include "crypto.h"
21
22
23
#ifdef INTERNAL_DES
24
25
/*
26
 * This implementation is based on a DES implementation included in
27
 * LibTomCrypt. The version here is modified to fit in wpa_supplicant/hostapd
28
 * coding style.
29
 */
30
31
/* LibTomCrypt, modular cryptographic library -- Tom St Denis
32
 *
33
 * LibTomCrypt is a library that provides various cryptographic
34
 * algorithms in a highly modular and flexible manner.
35
 *
36
 * The library is free for all purposes without any express
37
 * guarantee it works.
38
 *
39
 * Tom St Denis, tomstdenis@gmail.com, http://libtomcrypt.com
40
 */
41
42
/**
43
  DES code submitted by Dobes Vandermeer
44
*/
45
46
#define ROLc(x, y) \
47
	((((unsigned long) (x) << (unsigned long) ((y) & 31)) | \
48
	  (((unsigned long) (x) & 0xFFFFFFFFUL) >> \
49
	   (unsigned long) (32 - ((y) & 31)))) & 0xFFFFFFFFUL)
50
#define RORc(x, y) \
51
	(((((unsigned long) (x) & 0xFFFFFFFFUL) >> \
52
	   (unsigned long) ((y) & 31)) | \
53
	  ((unsigned long) (x) << (unsigned long) (32 - ((y) & 31)))) & \
54
	 0xFFFFFFFFUL)
55
56
57
static const u32 bytebit[8] =
58
{
59
	0200, 0100, 040, 020, 010, 04, 02, 01 
60
};
61
62
static const u32 bigbyte[24] =
63
{
64
	0x800000UL,  0x400000UL,  0x200000UL,  0x100000UL,
65
	0x80000UL,   0x40000UL,   0x20000UL,   0x10000UL,
66
	0x8000UL,    0x4000UL,    0x2000UL,    0x1000UL,
67
	0x800UL,     0x400UL,     0x200UL,     0x100UL,
68
	0x80UL,      0x40UL,      0x20UL,      0x10UL,
69
	0x8UL,       0x4UL,       0x2UL,       0x1L 
70
};
71
72
/* Use the key schedule specific in the standard (ANSI X3.92-1981) */
73
74
static const u8 pc1[56] = {
75
	56, 48, 40, 32, 24, 16,  8,  0, 57, 49, 41, 33, 25, 17,  
76
	 9,  1, 58, 50, 42, 34, 26, 18, 10,  2, 59, 51, 43, 35, 
77
	62, 54, 46, 38, 30, 22, 14,  6, 61, 53, 45, 37, 29, 21,
78
	13,  5, 60, 52, 44, 36, 28, 20, 12,  4, 27, 19, 11,  3 
79
};
80
81
static const u8 totrot[16] = {
82
	1,   2,  4,  6,
83
	8,  10, 12, 14, 
84
	15, 17, 19, 21, 
85
	23, 25, 27, 28
86
};
87
88
static const u8 pc2[48] = {
89
	13, 16, 10, 23,  0,  4,      2, 27, 14,  5, 20,  9,
90
	22, 18, 11,  3, 25,  7,     15,  6, 26, 19, 12,  1,
91
	40, 51, 30, 36, 46, 54,     29, 39, 50, 44, 32, 47,
92
	43, 48, 38, 55, 33, 52,     45, 41, 49, 35, 28, 31
93
};
94
95
96
static const u32 SP1[64] =
97
{
98
	0x01010400UL, 0x00000000UL, 0x00010000UL, 0x01010404UL,
99
	0x01010004UL, 0x00010404UL, 0x00000004UL, 0x00010000UL,
100
	0x00000400UL, 0x01010400UL, 0x01010404UL, 0x00000400UL,
101
	0x01000404UL, 0x01010004UL, 0x01000000UL, 0x00000004UL,
102
	0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00010400UL,
103
	0x00010400UL, 0x01010000UL, 0x01010000UL, 0x01000404UL,
104
	0x00010004UL, 0x01000004UL, 0x01000004UL, 0x00010004UL,
105
	0x00000000UL, 0x00000404UL, 0x00010404UL, 0x01000000UL,
106
	0x00010000UL, 0x01010404UL, 0x00000004UL, 0x01010000UL,
107
	0x01010400UL, 0x01000000UL, 0x01000000UL, 0x00000400UL,
108
	0x01010004UL, 0x00010000UL, 0x00010400UL, 0x01000004UL,
109
	0x00000400UL, 0x00000004UL, 0x01000404UL, 0x00010404UL,
110
	0x01010404UL, 0x00010004UL, 0x01010000UL, 0x01000404UL,
111
	0x01000004UL, 0x00000404UL, 0x00010404UL, 0x01010400UL,
112
	0x00000404UL, 0x01000400UL, 0x01000400UL, 0x00000000UL,
113
	0x00010004UL, 0x00010400UL, 0x00000000UL, 0x01010004UL
114
};
115
116
static const u32 SP2[64] =
117
{
118
	0x80108020UL, 0x80008000UL, 0x00008000UL, 0x00108020UL,
119
	0x00100000UL, 0x00000020UL, 0x80100020UL, 0x80008020UL,
120
	0x80000020UL, 0x80108020UL, 0x80108000UL, 0x80000000UL,
121
	0x80008000UL, 0x00100000UL, 0x00000020UL, 0x80100020UL,
122
	0x00108000UL, 0x00100020UL, 0x80008020UL, 0x00000000UL,
123
	0x80000000UL, 0x00008000UL, 0x00108020UL, 0x80100000UL,
124
	0x00100020UL, 0x80000020UL, 0x00000000UL, 0x00108000UL,
125
	0x00008020UL, 0x80108000UL, 0x80100000UL, 0x00008020UL,
126
	0x00000000UL, 0x00108020UL, 0x80100020UL, 0x00100000UL,
127
	0x80008020UL, 0x80100000UL, 0x80108000UL, 0x00008000UL,
128
	0x80100000UL, 0x80008000UL, 0x00000020UL, 0x80108020UL,
129
	0x00108020UL, 0x00000020UL, 0x00008000UL, 0x80000000UL,
130
	0x00008020UL, 0x80108000UL, 0x00100000UL, 0x80000020UL,
131
	0x00100020UL, 0x80008020UL, 0x80000020UL, 0x00100020UL,
132
	0x00108000UL, 0x00000000UL, 0x80008000UL, 0x00008020UL,
133
	0x80000000UL, 0x80100020UL, 0x80108020UL, 0x00108000UL
134
};
135
136
static const u32 SP3[64] =
137
{
138
	0x00000208UL, 0x08020200UL, 0x00000000UL, 0x08020008UL,
139
	0x08000200UL, 0x00000000UL, 0x00020208UL, 0x08000200UL,
140
	0x00020008UL, 0x08000008UL, 0x08000008UL, 0x00020000UL,
141
	0x08020208UL, 0x00020008UL, 0x08020000UL, 0x00000208UL,
142
	0x08000000UL, 0x00000008UL, 0x08020200UL, 0x00000200UL,
143
	0x00020200UL, 0x08020000UL, 0x08020008UL, 0x00020208UL,
144
	0x08000208UL, 0x00020200UL, 0x00020000UL, 0x08000208UL,
145
	0x00000008UL, 0x08020208UL, 0x00000200UL, 0x08000000UL,
146
	0x08020200UL, 0x08000000UL, 0x00020008UL, 0x00000208UL,
147
	0x00020000UL, 0x08020200UL, 0x08000200UL, 0x00000000UL,
148
	0x00000200UL, 0x00020008UL, 0x08020208UL, 0x08000200UL,
149
	0x08000008UL, 0x00000200UL, 0x00000000UL, 0x08020008UL,
150
	0x08000208UL, 0x00020000UL, 0x08000000UL, 0x08020208UL,
151
	0x00000008UL, 0x00020208UL, 0x00020200UL, 0x08000008UL,
152
	0x08020000UL, 0x08000208UL, 0x00000208UL, 0x08020000UL,
153
	0x00020208UL, 0x00000008UL, 0x08020008UL, 0x00020200UL
154
};
155
156
static const u32 SP4[64] =
157
{
158
	0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,
159
	0x00802080UL, 0x00800081UL, 0x00800001UL, 0x00002001UL,
160
	0x00000000UL, 0x00802000UL, 0x00802000UL, 0x00802081UL,
161
	0x00000081UL, 0x00000000UL, 0x00800080UL, 0x00800001UL,
162
	0x00000001UL, 0x00002000UL, 0x00800000UL, 0x00802001UL,
163
	0x00000080UL, 0x00800000UL, 0x00002001UL, 0x00002080UL,
164
	0x00800081UL, 0x00000001UL, 0x00002080UL, 0x00800080UL,
165
	0x00002000UL, 0x00802080UL, 0x00802081UL, 0x00000081UL,
166
	0x00800080UL, 0x00800001UL, 0x00802000UL, 0x00802081UL,
167
	0x00000081UL, 0x00000000UL, 0x00000000UL, 0x00802000UL,
168
	0x00002080UL, 0x00800080UL, 0x00800081UL, 0x00000001UL,
169
	0x00802001UL, 0x00002081UL, 0x00002081UL, 0x00000080UL,
170
	0x00802081UL, 0x00000081UL, 0x00000001UL, 0x00002000UL,
171
	0x00800001UL, 0x00002001UL, 0x00802080UL, 0x00800081UL,
172
	0x00002001UL, 0x00002080UL, 0x00800000UL, 0x00802001UL,
173
	0x00000080UL, 0x00800000UL, 0x00002000UL, 0x00802080UL
174
};
175
176
static const u32 SP5[64] =
177
{
178
	0x00000100UL, 0x02080100UL, 0x02080000UL, 0x42000100UL,
179
	0x00080000UL, 0x00000100UL, 0x40000000UL, 0x02080000UL,
180
	0x40080100UL, 0x00080000UL, 0x02000100UL, 0x40080100UL,
181
	0x42000100UL, 0x42080000UL, 0x00080100UL, 0x40000000UL,
182
	0x02000000UL, 0x40080000UL, 0x40080000UL, 0x00000000UL,
183
	0x40000100UL, 0x42080100UL, 0x42080100UL, 0x02000100UL,
184
	0x42080000UL, 0x40000100UL, 0x00000000UL, 0x42000000UL,
185
	0x02080100UL, 0x02000000UL, 0x42000000UL, 0x00080100UL,
186
	0x00080000UL, 0x42000100UL, 0x00000100UL, 0x02000000UL,
187
	0x40000000UL, 0x02080000UL, 0x42000100UL, 0x40080100UL,
188
	0x02000100UL, 0x40000000UL, 0x42080000UL, 0x02080100UL,
189
	0x40080100UL, 0x00000100UL, 0x02000000UL, 0x42080000UL,
190
	0x42080100UL, 0x00080100UL, 0x42000000UL, 0x42080100UL,
191
	0x02080000UL, 0x00000000UL, 0x40080000UL, 0x42000000UL,
192
	0x00080100UL, 0x02000100UL, 0x40000100UL, 0x00080000UL,
193
	0x00000000UL, 0x40080000UL, 0x02080100UL, 0x40000100UL
194
};
195
196
static const u32 SP6[64] =
197
{
198
	0x20000010UL, 0x20400000UL, 0x00004000UL, 0x20404010UL,
199
	0x20400000UL, 0x00000010UL, 0x20404010UL, 0x00400000UL,
200
	0x20004000UL, 0x00404010UL, 0x00400000UL, 0x20000010UL,
201
	0x00400010UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,
202
	0x00000000UL, 0x00400010UL, 0x20004010UL, 0x00004000UL,
203
	0x00404000UL, 0x20004010UL, 0x00000010UL, 0x20400010UL,
204
	0x20400010UL, 0x00000000UL, 0x00404010UL, 0x20404000UL,
205
	0x00004010UL, 0x00404000UL, 0x20404000UL, 0x20000000UL,
206
	0x20004000UL, 0x00000010UL, 0x20400010UL, 0x00404000UL,
207
	0x20404010UL, 0x00400000UL, 0x00004010UL, 0x20000010UL,
208
	0x00400000UL, 0x20004000UL, 0x20000000UL, 0x00004010UL,
209
	0x20000010UL, 0x20404010UL, 0x00404000UL, 0x20400000UL,
210
	0x00404010UL, 0x20404000UL, 0x00000000UL, 0x20400010UL,
211
	0x00000010UL, 0x00004000UL, 0x20400000UL, 0x00404010UL,
212
	0x00004000UL, 0x00400010UL, 0x20004010UL, 0x00000000UL,
213
	0x20404000UL, 0x20000000UL, 0x00400010UL, 0x20004010UL
214
};
215
216
static const u32 SP7[64] =
217
{
218
	0x00200000UL, 0x04200002UL, 0x04000802UL, 0x00000000UL,
219
	0x00000800UL, 0x04000802UL, 0x00200802UL, 0x04200800UL,
220
	0x04200802UL, 0x00200000UL, 0x00000000UL, 0x04000002UL,
221
	0x00000002UL, 0x04000000UL, 0x04200002UL, 0x00000802UL,
222
	0x04000800UL, 0x00200802UL, 0x00200002UL, 0x04000800UL,
223
	0x04000002UL, 0x04200000UL, 0x04200800UL, 0x00200002UL,
224
	0x04200000UL, 0x00000800UL, 0x00000802UL, 0x04200802UL,
225
	0x00200800UL, 0x00000002UL, 0x04000000UL, 0x00200800UL,
226
	0x04000000UL, 0x00200800UL, 0x00200000UL, 0x04000802UL,
227
	0x04000802UL, 0x04200002UL, 0x04200002UL, 0x00000002UL,
228
	0x00200002UL, 0x04000000UL, 0x04000800UL, 0x00200000UL,
229
	0x04200800UL, 0x00000802UL, 0x00200802UL, 0x04200800UL,
230
	0x00000802UL, 0x04000002UL, 0x04200802UL, 0x04200000UL,
231
	0x00200800UL, 0x00000000UL, 0x00000002UL, 0x04200802UL,
232
	0x00000000UL, 0x00200802UL, 0x04200000UL, 0x00000800UL,
233
	0x04000002UL, 0x04000800UL, 0x00000800UL, 0x00200002UL
234
};
235
236
static const u32 SP8[64] =
237
{
238
	0x10001040UL, 0x00001000UL, 0x00040000UL, 0x10041040UL,
239
	0x10000000UL, 0x10001040UL, 0x00000040UL, 0x10000000UL,
240
	0x00040040UL, 0x10040000UL, 0x10041040UL, 0x00041000UL,
241
	0x10041000UL, 0x00041040UL, 0x00001000UL, 0x00000040UL,
242
	0x10040000UL, 0x10000040UL, 0x10001000UL, 0x00001040UL,
243
	0x00041000UL, 0x00040040UL, 0x10040040UL, 0x10041000UL,
244
	0x00001040UL, 0x00000000UL, 0x00000000UL, 0x10040040UL,
245
	0x10000040UL, 0x10001000UL, 0x00041040UL, 0x00040000UL,
246
	0x00041040UL, 0x00040000UL, 0x10041000UL, 0x00001000UL,
247
	0x00000040UL, 0x10040040UL, 0x00001000UL, 0x00041040UL,
248
	0x10001000UL, 0x00000040UL, 0x10000040UL, 0x10040000UL,
249
	0x10040040UL, 0x10000000UL, 0x00040000UL, 0x10001040UL,
250
	0x00000000UL, 0x10041040UL, 0x00040040UL, 0x10000040UL,
251
	0x10040000UL, 0x10001000UL, 0x10001040UL, 0x00000000UL,
252
	0x10041040UL, 0x00041000UL, 0x00041000UL, 0x00001040UL,
253
	0x00001040UL, 0x00040040UL, 0x10000000UL, 0x10041000UL
254
};
255
256
257
static void cookey(const u32 *raw1, u32 *keyout)
258
{
259
	u32 *cook;
260
	const u32 *raw0;
261
	u32 dough[32];
262
	int i;
263
264
	cook = dough;
265
	for (i = 0; i < 16; i++, raw1++) {
266
		raw0 = raw1++;
267
		*cook    = (*raw0 & 0x00fc0000L) << 6;
268
		*cook   |= (*raw0 & 0x00000fc0L) << 10;
269
		*cook   |= (*raw1 & 0x00fc0000L) >> 10;
270
		*cook++ |= (*raw1 & 0x00000fc0L) >> 6;
271
		*cook    = (*raw0 & 0x0003f000L) << 12;
272
		*cook   |= (*raw0 & 0x0000003fL) << 16;
273
		*cook   |= (*raw1 & 0x0003f000L) >> 4;
274
		*cook++ |= (*raw1 & 0x0000003fL);
275
	}
276
277
	os_memcpy(keyout, dough, sizeof(dough));
278
}
279
280
281
static void deskey(const u8 *key, int decrypt, u32 *keyout)
282
{
283
	u32 i, j, l, m, n, kn[32];
284
	u8 pc1m[56], pcr[56];
285
286
	for (j = 0; j < 56; j++) {
287
		l = (u32) pc1[j];
288
		m = l & 7;
289
		pc1m[j] = (u8)
290
			((key[l >> 3U] & bytebit[m]) == bytebit[m] ? 1 : 0);
291
	}
292
293
	for (i = 0; i < 16; i++) {
294
		if (decrypt)
295
			m = (15 - i) << 1;
296
		else
297
			m = i << 1;
298
		n = m + 1;
299
		kn[m] = kn[n] = 0L;
300
		for (j = 0; j < 28; j++) {
301
			l = j + (u32) totrot[i];
302
			if (l < 28)
303
				pcr[j] = pc1m[l];
304
			else
305
				pcr[j] = pc1m[l - 28];
306
		}
307
		for (/* j = 28 */; j < 56; j++) {
308
			l = j + (u32) totrot[i];
309
			if (l < 56)
310
				pcr[j] = pc1m[l];
311
			else
312
				pcr[j] = pc1m[l - 28];
313
		}
314
		for (j = 0; j < 24; j++) {
315
			if ((int) pcr[(int) pc2[j]] != 0)
316
				kn[m] |= bigbyte[j];
317
			if ((int) pcr[(int) pc2[j + 24]] != 0)
318
				kn[n] |= bigbyte[j];
319
		}
320
	}
321
322
	cookey(kn, keyout);
323
}
324
325
326
static void desfunc(u32 *block, const u32 *keys)
327
{
328
	u32 work, right, leftt;
329
	int cur_round;
330
331
	leftt = block[0];
332
	right = block[1];
333
334
	work = ((leftt >> 4)  ^ right) & 0x0f0f0f0fL;
335
	right ^= work;
336
	leftt ^= (work << 4);
337
338
	work = ((leftt >> 16) ^ right) & 0x0000ffffL;
339
	right ^= work;
340
	leftt ^= (work << 16);
341
342
	work = ((right >> 2)  ^ leftt) & 0x33333333L;
343
	leftt ^= work;
344
	right ^= (work << 2);
345
346
	work = ((right >> 8)  ^ leftt) & 0x00ff00ffL;
347
	leftt ^= work;
348
	right ^= (work << 8);
349
350
	right = ROLc(right, 1);
351
	work = (leftt ^ right) & 0xaaaaaaaaL;
352
353
	leftt ^= work;
354
	right ^= work;
355
	leftt = ROLc(leftt, 1);
356
357
	for (cur_round = 0; cur_round < 8; cur_round++) {
358
		work  = RORc(right, 4) ^ *keys++;
359
		leftt ^= SP7[work        & 0x3fL]
360
			^ SP5[(work >>  8) & 0x3fL]
361
			^ SP3[(work >> 16) & 0x3fL]
362
			^ SP1[(work >> 24) & 0x3fL];
363
		work  = right ^ *keys++;
364
		leftt ^= SP8[ work        & 0x3fL]
365
			^  SP6[(work >>  8) & 0x3fL]
366
			^  SP4[(work >> 16) & 0x3fL]
367
			^  SP2[(work >> 24) & 0x3fL];
368
369
		work = RORc(leftt, 4) ^ *keys++;
370
		right ^= SP7[ work        & 0x3fL]
371
			^  SP5[(work >>  8) & 0x3fL]
372
			^  SP3[(work >> 16) & 0x3fL]
373
			^  SP1[(work >> 24) & 0x3fL];
374
		work  = leftt ^ *keys++;
375
		right ^= SP8[ work        & 0x3fL]
376
			^  SP6[(work >>  8) & 0x3fL]
377
			^  SP4[(work >> 16) & 0x3fL]
378
			^  SP2[(work >> 24) & 0x3fL];
379
	}
380
381
	right = RORc(right, 1);
382
	work = (leftt ^ right) & 0xaaaaaaaaL;
383
	leftt ^= work;
384
	right ^= work;
385
	leftt = RORc(leftt, 1);
386
	work = ((leftt >> 8) ^ right) & 0x00ff00ffL;
387
	right ^= work;
388
	leftt ^= (work << 8);
389
	/* -- */
390
	work = ((leftt >> 2) ^ right) & 0x33333333L;
391
	right ^= work;
392
	leftt ^= (work << 2);
393
	work = ((right >> 16) ^ leftt) & 0x0000ffffL;
394
	leftt ^= work;
395
	right ^= (work << 16);
396
	work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;
397
	leftt ^= work;
398
	right ^= (work << 4);
399
400
	block[0] = right;
401
	block[1] = leftt;
402
}
403
404
405
/* wpa_supplicant/hostapd specific wrapper */
406
407
void des_encrypt(const u8 *clear, const u8 *key, u8 *cypher)
408
{
409
	u8 pkey[8], next, tmp;
410
	int i;
411
	u32 ek[32], work[2];
412
413
	/* Add parity bits to the key */
414
	next = 0;
415
	for (i = 0; i < 7; i++) {
416
		tmp = key[i];
417
		pkey[i] = (tmp >> i) | next | 1;
418
		next = tmp << (7 - i);
419
	}
420
	pkey[i] = next | 1;
421
422
	deskey(pkey, 0, ek);
423
424
	work[0] = WPA_GET_BE32(clear);
425
	work[1] = WPA_GET_BE32(clear + 4);
426
	desfunc(work, ek);
427
	WPA_PUT_BE32(cypher, work[0]);
428
	WPA_PUT_BE32(cypher + 4, work[1]);
429
}
430
431
432
struct des3_key_s {
433
	u32 ek[3][32];
434
	u32 dk[3][32];
435
};
436
437
void des3_key_setup(const u8 *key, struct des3_key_s *dkey)
438
{
439
	deskey(key, 0, dkey->ek[0]);
440
	deskey(key + 8, 1, dkey->ek[1]);
441
	deskey(key + 16, 0, dkey->ek[2]);
442
443
	deskey(key, 1, dkey->dk[2]);
444
	deskey(key + 8, 0, dkey->dk[1]);
445
	deskey(key + 16, 1, dkey->dk[0]);
446
}
447
448
449
void des3_encrypt(const u8 *plain, const struct des3_key_s *key, u8 *crypt)
450
{
451
	u32 work[2];
452
453
	work[0] = WPA_GET_BE32(plain);
454
	work[1] = WPA_GET_BE32(plain + 4);
455
	desfunc(work, key->ek[0]);
456
	desfunc(work, key->ek[1]);
457
	desfunc(work, key->ek[2]);
458
	WPA_PUT_BE32(crypt, work[0]);
459
	WPA_PUT_BE32(crypt + 4, work[1]);
460
}
461
462
463
void des3_decrypt(const u8 *crypt, const struct des3_key_s *key, u8 *plain)
464
{
465
	u32 work[2];
466
467
	work[0] = WPA_GET_BE32(crypt);
468
	work[1] = WPA_GET_BE32(crypt + 4);
469
	desfunc(work, key->dk[0]);
470
	desfunc(work, key->dk[1]);
471
	desfunc(work, key->dk[2]);
472
	WPA_PUT_BE32(plain, work[0]);
473
	WPA_PUT_BE32(plain + 4, work[1]);
474
}
475
476
#endif /* INTERNAL_DES */