root / d3des.c @ 439bcb61
History | View | Annotate | Download (15 kB)
1 |
/*
|
---|---|
2 |
* This is D3DES (V5.09) by Richard Outerbridge with the double and
|
3 |
* triple-length support removed for use in VNC. Also the bytebit[] array
|
4 |
* has been reversed so that the most significant bit in each byte of the
|
5 |
* key is ignored, not the least significant.
|
6 |
*
|
7 |
* These changes are:
|
8 |
* Copyright (C) 1999 AT&T Laboratories Cambridge. All Rights Reserved.
|
9 |
*
|
10 |
* This software is distributed in the hope that it will be useful,
|
11 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
13 |
*/
|
14 |
|
15 |
/* D3DES (V5.09) -
|
16 |
*
|
17 |
* A portable, public domain, version of the Data Encryption Standard.
|
18 |
*
|
19 |
* Written with Symantec's THINK (Lightspeed) C by Richard Outerbridge.
|
20 |
* Thanks to: Dan Hoey for his excellent Initial and Inverse permutation
|
21 |
* code; Jim Gillogly & Phil Karn for the DES key schedule code; Dennis
|
22 |
* Ferguson, Eric Young and Dana How for comparing notes; and Ray Lau,
|
23 |
* for humouring me on.
|
24 |
*
|
25 |
* Copyright (c) 1988,1989,1990,1991,1992 by Richard Outerbridge.
|
26 |
* (GEnie : OUTER; CIS : [71755,204]) Graven Imagery, 1992.
|
27 |
*/
|
28 |
|
29 |
#include "d3des.h" |
30 |
|
31 |
static void scrunch(unsigned char *, unsigned long *); |
32 |
static void unscrun(unsigned long *, unsigned char *); |
33 |
static void desfunc(unsigned long *, unsigned long *); |
34 |
static void cookey(unsigned long *); |
35 |
|
36 |
static unsigned long KnL[32] = { 0L }; |
37 |
|
38 |
static const unsigned short bytebit[8] = { |
39 |
01, 02, 04, 010, 020, 040, 0100, 0200 }; |
40 |
|
41 |
static const unsigned long bigbyte[24] = { |
42 |
0x800000L, 0x400000L, 0x200000L, 0x100000L, |
43 |
0x80000L, 0x40000L, 0x20000L, 0x10000L, |
44 |
0x8000L, 0x4000L, 0x2000L, 0x1000L, |
45 |
0x800L, 0x400L, 0x200L, 0x100L, |
46 |
0x80L, 0x40L, 0x20L, 0x10L, |
47 |
0x8L, 0x4L, 0x2L, 0x1L }; |
48 |
|
49 |
/* Use the key schedule specified in the Standard (ANSI X3.92-1981). */
|
50 |
|
51 |
static const unsigned char pc1[56] = { |
52 |
56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17, |
53 |
9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, |
54 |
62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, |
55 |
13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3 }; |
56 |
|
57 |
static const unsigned char totrot[16] = { |
58 |
1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28 }; |
59 |
|
60 |
static const unsigned char pc2[48] = { |
61 |
13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9, |
62 |
22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1, |
63 |
40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47, |
64 |
43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31 }; |
65 |
|
66 |
/* Thanks to James Gillogly & Phil Karn! */
|
67 |
void deskey(unsigned char *key, int edf) |
68 |
{ |
69 |
register int i, j, l, m, n; |
70 |
unsigned char pc1m[56], pcr[56]; |
71 |
unsigned long kn[32]; |
72 |
|
73 |
for ( j = 0; j < 56; j++ ) { |
74 |
l = pc1[j]; |
75 |
m = l & 07;
|
76 |
pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1 : 0; |
77 |
} |
78 |
for( i = 0; i < 16; i++ ) { |
79 |
if( edf == DE1 ) m = (15 - i) << 1; |
80 |
else m = i << 1; |
81 |
n = m + 1;
|
82 |
kn[m] = kn[n] = 0L;
|
83 |
for( j = 0; j < 28; j++ ) { |
84 |
l = j + totrot[i]; |
85 |
if( l < 28 ) pcr[j] = pc1m[l]; |
86 |
else pcr[j] = pc1m[l - 28]; |
87 |
} |
88 |
for( j = 28; j < 56; j++ ) { |
89 |
l = j + totrot[i]; |
90 |
if( l < 56 ) pcr[j] = pc1m[l]; |
91 |
else pcr[j] = pc1m[l - 28]; |
92 |
} |
93 |
for( j = 0; j < 24; j++ ) { |
94 |
if( pcr[pc2[j]] ) kn[m] |= bigbyte[j];
|
95 |
if( pcr[pc2[j+24]] ) kn[n] |= bigbyte[j]; |
96 |
} |
97 |
} |
98 |
cookey(kn); |
99 |
return;
|
100 |
} |
101 |
|
102 |
static void cookey(register unsigned long *raw1) |
103 |
{ |
104 |
register unsigned long *cook, *raw0; |
105 |
unsigned long dough[32]; |
106 |
register int i; |
107 |
|
108 |
cook = dough; |
109 |
for( i = 0; i < 16; i++, raw1++ ) { |
110 |
raw0 = raw1++; |
111 |
*cook = (*raw0 & 0x00fc0000L) << 6; |
112 |
*cook |= (*raw0 & 0x00000fc0L) << 10; |
113 |
*cook |= (*raw1 & 0x00fc0000L) >> 10; |
114 |
*cook++ |= (*raw1 & 0x00000fc0L) >> 6; |
115 |
*cook = (*raw0 & 0x0003f000L) << 12; |
116 |
*cook |= (*raw0 & 0x0000003fL) << 16; |
117 |
*cook |= (*raw1 & 0x0003f000L) >> 4; |
118 |
*cook++ |= (*raw1 & 0x0000003fL);
|
119 |
} |
120 |
usekey(dough); |
121 |
return;
|
122 |
} |
123 |
|
124 |
void cpkey(register unsigned long *into) |
125 |
{ |
126 |
register unsigned long *from, *endp; |
127 |
|
128 |
from = KnL, endp = &KnL[32];
|
129 |
while( from < endp ) *into++ = *from++;
|
130 |
return;
|
131 |
} |
132 |
|
133 |
void usekey(register unsigned long *from) |
134 |
{ |
135 |
register unsigned long *to, *endp; |
136 |
|
137 |
to = KnL, endp = &KnL[32];
|
138 |
while( to < endp ) *to++ = *from++;
|
139 |
return;
|
140 |
} |
141 |
|
142 |
void des(unsigned char *inblock, unsigned char *outblock) |
143 |
{ |
144 |
unsigned long work[2]; |
145 |
|
146 |
scrunch(inblock, work); |
147 |
desfunc(work, KnL); |
148 |
unscrun(work, outblock); |
149 |
return;
|
150 |
} |
151 |
|
152 |
static void scrunch(register unsigned char *outof, register unsigned long *into) |
153 |
{ |
154 |
*into = (*outof++ & 0xffL) << 24; |
155 |
*into |= (*outof++ & 0xffL) << 16; |
156 |
*into |= (*outof++ & 0xffL) << 8; |
157 |
*into++ |= (*outof++ & 0xffL);
|
158 |
*into = (*outof++ & 0xffL) << 24; |
159 |
*into |= (*outof++ & 0xffL) << 16; |
160 |
*into |= (*outof++ & 0xffL) << 8; |
161 |
*into |= (*outof & 0xffL);
|
162 |
return;
|
163 |
} |
164 |
|
165 |
static void unscrun(register unsigned long *outof, register unsigned char *into) |
166 |
{ |
167 |
*into++ = (unsigned char)((*outof >> 24) & 0xffL); |
168 |
*into++ = (unsigned char)((*outof >> 16) & 0xffL); |
169 |
*into++ = (unsigned char)((*outof >> 8) & 0xffL); |
170 |
*into++ = (unsigned char)(*outof++ & 0xffL); |
171 |
*into++ = (unsigned char)((*outof >> 24) & 0xffL); |
172 |
*into++ = (unsigned char)((*outof >> 16) & 0xffL); |
173 |
*into++ = (unsigned char)((*outof >> 8) & 0xffL); |
174 |
*into = (unsigned char)(*outof & 0xffL); |
175 |
return;
|
176 |
} |
177 |
|
178 |
static const unsigned long SP1[64] = { |
179 |
0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L, |
180 |
0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L, |
181 |
0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L, |
182 |
0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L, |
183 |
0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L, |
184 |
0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L, |
185 |
0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L, |
186 |
0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L, |
187 |
0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L, |
188 |
0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L, |
189 |
0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L, |
190 |
0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L, |
191 |
0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L, |
192 |
0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L, |
193 |
0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L, |
194 |
0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L }; |
195 |
|
196 |
static const unsigned long SP2[64] = { |
197 |
0x80108020L, 0x80008000L, 0x00008000L, 0x00108020L, |
198 |
0x00100000L, 0x00000020L, 0x80100020L, 0x80008020L, |
199 |
0x80000020L, 0x80108020L, 0x80108000L, 0x80000000L, |
200 |
0x80008000L, 0x00100000L, 0x00000020L, 0x80100020L, |
201 |
0x00108000L, 0x00100020L, 0x80008020L, 0x00000000L, |
202 |
0x80000000L, 0x00008000L, 0x00108020L, 0x80100000L, |
203 |
0x00100020L, 0x80000020L, 0x00000000L, 0x00108000L, |
204 |
0x00008020L, 0x80108000L, 0x80100000L, 0x00008020L, |
205 |
0x00000000L, 0x00108020L, 0x80100020L, 0x00100000L, |
206 |
0x80008020L, 0x80100000L, 0x80108000L, 0x00008000L, |
207 |
0x80100000L, 0x80008000L, 0x00000020L, 0x80108020L, |
208 |
0x00108020L, 0x00000020L, 0x00008000L, 0x80000000L, |
209 |
0x00008020L, 0x80108000L, 0x00100000L, 0x80000020L, |
210 |
0x00100020L, 0x80008020L, 0x80000020L, 0x00100020L, |
211 |
0x00108000L, 0x00000000L, 0x80008000L, 0x00008020L, |
212 |
0x80000000L, 0x80100020L, 0x80108020L, 0x00108000L }; |
213 |
|
214 |
static const unsigned long SP3[64] = { |
215 |
0x00000208L, 0x08020200L, 0x00000000L, 0x08020008L, |
216 |
0x08000200L, 0x00000000L, 0x00020208L, 0x08000200L, |
217 |
0x00020008L, 0x08000008L, 0x08000008L, 0x00020000L, |
218 |
0x08020208L, 0x00020008L, 0x08020000L, 0x00000208L, |
219 |
0x08000000L, 0x00000008L, 0x08020200L, 0x00000200L, |
220 |
0x00020200L, 0x08020000L, 0x08020008L, 0x00020208L, |
221 |
0x08000208L, 0x00020200L, 0x00020000L, 0x08000208L, |
222 |
0x00000008L, 0x08020208L, 0x00000200L, 0x08000000L, |
223 |
0x08020200L, 0x08000000L, 0x00020008L, 0x00000208L, |
224 |
0x00020000L, 0x08020200L, 0x08000200L, 0x00000000L, |
225 |
0x00000200L, 0x00020008L, 0x08020208L, 0x08000200L, |
226 |
0x08000008L, 0x00000200L, 0x00000000L, 0x08020008L, |
227 |
0x08000208L, 0x00020000L, 0x08000000L, 0x08020208L, |
228 |
0x00000008L, 0x00020208L, 0x00020200L, 0x08000008L, |
229 |
0x08020000L, 0x08000208L, 0x00000208L, 0x08020000L, |
230 |
0x00020208L, 0x00000008L, 0x08020008L, 0x00020200L }; |
231 |
|
232 |
static const unsigned long SP4[64] = { |
233 |
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, |
234 |
0x00802080L, 0x00800081L, 0x00800001L, 0x00002001L, |
235 |
0x00000000L, 0x00802000L, 0x00802000L, 0x00802081L, |
236 |
0x00000081L, 0x00000000L, 0x00800080L, 0x00800001L, |
237 |
0x00000001L, 0x00002000L, 0x00800000L, 0x00802001L, |
238 |
0x00000080L, 0x00800000L, 0x00002001L, 0x00002080L, |
239 |
0x00800081L, 0x00000001L, 0x00002080L, 0x00800080L, |
240 |
0x00002000L, 0x00802080L, 0x00802081L, 0x00000081L, |
241 |
0x00800080L, 0x00800001L, 0x00802000L, 0x00802081L, |
242 |
0x00000081L, 0x00000000L, 0x00000000L, 0x00802000L, |
243 |
0x00002080L, 0x00800080L, 0x00800081L, 0x00000001L, |
244 |
0x00802001L, 0x00002081L, 0x00002081L, 0x00000080L, |
245 |
0x00802081L, 0x00000081L, 0x00000001L, 0x00002000L, |
246 |
0x00800001L, 0x00002001L, 0x00802080L, 0x00800081L, |
247 |
0x00002001L, 0x00002080L, 0x00800000L, 0x00802001L, |
248 |
0x00000080L, 0x00800000L, 0x00002000L, 0x00802080L }; |
249 |
|
250 |
static const unsigned long SP5[64] = { |
251 |
0x00000100L, 0x02080100L, 0x02080000L, 0x42000100L, |
252 |
0x00080000L, 0x00000100L, 0x40000000L, 0x02080000L, |
253 |
0x40080100L, 0x00080000L, 0x02000100L, 0x40080100L, |
254 |
0x42000100L, 0x42080000L, 0x00080100L, 0x40000000L, |
255 |
0x02000000L, 0x40080000L, 0x40080000L, 0x00000000L, |
256 |
0x40000100L, 0x42080100L, 0x42080100L, 0x02000100L, |
257 |
0x42080000L, 0x40000100L, 0x00000000L, 0x42000000L, |
258 |
0x02080100L, 0x02000000L, 0x42000000L, 0x00080100L, |
259 |
0x00080000L, 0x42000100L, 0x00000100L, 0x02000000L, |
260 |
0x40000000L, 0x02080000L, 0x42000100L, 0x40080100L, |
261 |
0x02000100L, 0x40000000L, 0x42080000L, 0x02080100L, |
262 |
0x40080100L, 0x00000100L, 0x02000000L, 0x42080000L, |
263 |
0x42080100L, 0x00080100L, 0x42000000L, 0x42080100L, |
264 |
0x02080000L, 0x00000000L, 0x40080000L, 0x42000000L, |
265 |
0x00080100L, 0x02000100L, 0x40000100L, 0x00080000L, |
266 |
0x00000000L, 0x40080000L, 0x02080100L, 0x40000100L }; |
267 |
|
268 |
static const unsigned long SP6[64] = { |
269 |
0x20000010L, 0x20400000L, 0x00004000L, 0x20404010L, |
270 |
0x20400000L, 0x00000010L, 0x20404010L, 0x00400000L, |
271 |
0x20004000L, 0x00404010L, 0x00400000L, 0x20000010L, |
272 |
0x00400010L, 0x20004000L, 0x20000000L, 0x00004010L, |
273 |
0x00000000L, 0x00400010L, 0x20004010L, 0x00004000L, |
274 |
0x00404000L, 0x20004010L, 0x00000010L, 0x20400010L, |
275 |
0x20400010L, 0x00000000L, 0x00404010L, 0x20404000L, |
276 |
0x00004010L, 0x00404000L, 0x20404000L, 0x20000000L, |
277 |
0x20004000L, 0x00000010L, 0x20400010L, 0x00404000L, |
278 |
0x20404010L, 0x00400000L, 0x00004010L, 0x20000010L, |
279 |
0x00400000L, 0x20004000L, 0x20000000L, 0x00004010L, |
280 |
0x20000010L, 0x20404010L, 0x00404000L, 0x20400000L, |
281 |
0x00404010L, 0x20404000L, 0x00000000L, 0x20400010L, |
282 |
0x00000010L, 0x00004000L, 0x20400000L, 0x00404010L, |
283 |
0x00004000L, 0x00400010L, 0x20004010L, 0x00000000L, |
284 |
0x20404000L, 0x20000000L, 0x00400010L, 0x20004010L }; |
285 |
|
286 |
static const unsigned long SP7[64] = { |
287 |
0x00200000L, 0x04200002L, 0x04000802L, 0x00000000L, |
288 |
0x00000800L, 0x04000802L, 0x00200802L, 0x04200800L, |
289 |
0x04200802L, 0x00200000L, 0x00000000L, 0x04000002L, |
290 |
0x00000002L, 0x04000000L, 0x04200002L, 0x00000802L, |
291 |
0x04000800L, 0x00200802L, 0x00200002L, 0x04000800L, |
292 |
0x04000002L, 0x04200000L, 0x04200800L, 0x00200002L, |
293 |
0x04200000L, 0x00000800L, 0x00000802L, 0x04200802L, |
294 |
0x00200800L, 0x00000002L, 0x04000000L, 0x00200800L, |
295 |
0x04000000L, 0x00200800L, 0x00200000L, 0x04000802L, |
296 |
0x04000802L, 0x04200002L, 0x04200002L, 0x00000002L, |
297 |
0x00200002L, 0x04000000L, 0x04000800L, 0x00200000L, |
298 |
0x04200800L, 0x00000802L, 0x00200802L, 0x04200800L, |
299 |
0x00000802L, 0x04000002L, 0x04200802L, 0x04200000L, |
300 |
0x00200800L, 0x00000000L, 0x00000002L, 0x04200802L, |
301 |
0x00000000L, 0x00200802L, 0x04200000L, 0x00000800L, |
302 |
0x04000002L, 0x04000800L, 0x00000800L, 0x00200002L }; |
303 |
|
304 |
static const unsigned long SP8[64] = { |
305 |
0x10001040L, 0x00001000L, 0x00040000L, 0x10041040L, |
306 |
0x10000000L, 0x10001040L, 0x00000040L, 0x10000000L, |
307 |
0x00040040L, 0x10040000L, 0x10041040L, 0x00041000L, |
308 |
0x10041000L, 0x00041040L, 0x00001000L, 0x00000040L, |
309 |
0x10040000L, 0x10000040L, 0x10001000L, 0x00001040L, |
310 |
0x00041000L, 0x00040040L, 0x10040040L, 0x10041000L, |
311 |
0x00001040L, 0x00000000L, 0x00000000L, 0x10040040L, |
312 |
0x10000040L, 0x10001000L, 0x00041040L, 0x00040000L, |
313 |
0x00041040L, 0x00040000L, 0x10041000L, 0x00001000L, |
314 |
0x00000040L, 0x10040040L, 0x00001000L, 0x00041040L, |
315 |
0x10001000L, 0x00000040L, 0x10000040L, 0x10040000L, |
316 |
0x10040040L, 0x10000000L, 0x00040000L, 0x10001040L, |
317 |
0x00000000L, 0x10041040L, 0x00040040L, 0x10000040L, |
318 |
0x10040000L, 0x10001000L, 0x10001040L, 0x00000000L, |
319 |
0x10041040L, 0x00041000L, 0x00041000L, 0x00001040L, |
320 |
0x00001040L, 0x00040040L, 0x10000000L, 0x10041000L }; |
321 |
|
322 |
static void desfunc(register unsigned long *block, register unsigned long *keys) |
323 |
{ |
324 |
register unsigned long fval, work, right, leftt; |
325 |
register int round; |
326 |
|
327 |
leftt = block[0];
|
328 |
right = block[1];
|
329 |
work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL; |
330 |
right ^= work; |
331 |
leftt ^= (work << 4);
|
332 |
work = ((leftt >> 16) ^ right) & 0x0000ffffL; |
333 |
right ^= work; |
334 |
leftt ^= (work << 16);
|
335 |
work = ((right >> 2) ^ leftt) & 0x33333333L; |
336 |
leftt ^= work; |
337 |
right ^= (work << 2);
|
338 |
work = ((right >> 8) ^ leftt) & 0x00ff00ffL; |
339 |
leftt ^= work; |
340 |
right ^= (work << 8);
|
341 |
right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL; |
342 |
work = (leftt ^ right) & 0xaaaaaaaaL;
|
343 |
leftt ^= work; |
344 |
right ^= work; |
345 |
leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL; |
346 |
|
347 |
for( round = 0; round < 8; round++ ) { |
348 |
work = (right << 28) | (right >> 4); |
349 |
work ^= *keys++; |
350 |
fval = SP7[ work & 0x3fL];
|
351 |
fval |= SP5[(work >> 8) & 0x3fL]; |
352 |
fval |= SP3[(work >> 16) & 0x3fL]; |
353 |
fval |= SP1[(work >> 24) & 0x3fL]; |
354 |
work = right ^ *keys++; |
355 |
fval |= SP8[ work & 0x3fL];
|
356 |
fval |= SP6[(work >> 8) & 0x3fL]; |
357 |
fval |= SP4[(work >> 16) & 0x3fL]; |
358 |
fval |= SP2[(work >> 24) & 0x3fL]; |
359 |
leftt ^= fval; |
360 |
work = (leftt << 28) | (leftt >> 4); |
361 |
work ^= *keys++; |
362 |
fval = SP7[ work & 0x3fL];
|
363 |
fval |= SP5[(work >> 8) & 0x3fL]; |
364 |
fval |= SP3[(work >> 16) & 0x3fL]; |
365 |
fval |= SP1[(work >> 24) & 0x3fL]; |
366 |
work = leftt ^ *keys++; |
367 |
fval |= SP8[ work & 0x3fL];
|
368 |
fval |= SP6[(work >> 8) & 0x3fL]; |
369 |
fval |= SP4[(work >> 16) & 0x3fL]; |
370 |
fval |= SP2[(work >> 24) & 0x3fL]; |
371 |
right ^= fval; |
372 |
} |
373 |
|
374 |
right = (right << 31) | (right >> 1); |
375 |
work = (leftt ^ right) & 0xaaaaaaaaL;
|
376 |
leftt ^= work; |
377 |
right ^= work; |
378 |
leftt = (leftt << 31) | (leftt >> 1); |
379 |
work = ((leftt >> 8) ^ right) & 0x00ff00ffL; |
380 |
right ^= work; |
381 |
leftt ^= (work << 8);
|
382 |
work = ((leftt >> 2) ^ right) & 0x33333333L; |
383 |
right ^= work; |
384 |
leftt ^= (work << 2);
|
385 |
work = ((right >> 16) ^ leftt) & 0x0000ffffL; |
386 |
leftt ^= work; |
387 |
right ^= (work << 16);
|
388 |
work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL; |
389 |
leftt ^= work; |
390 |
right ^= (work << 4);
|
391 |
*block++ = right; |
392 |
*block = leftt; |
393 |
return;
|
394 |
} |
395 |
|
396 |
/* Validation sets:
|
397 |
*
|
398 |
* Single-length key, single-length plaintext -
|
399 |
* Key : 0123 4567 89ab cdef
|
400 |
* Plain : 0123 4567 89ab cde7
|
401 |
* Cipher : c957 4425 6a5e d31d
|
402 |
*
|
403 |
* Double-length key, single-length plaintext -
|
404 |
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
|
405 |
* Plain : 0123 4567 89ab cde7
|
406 |
* Cipher : 7f1d 0a77 826b 8aff
|
407 |
*
|
408 |
* Double-length key, double-length plaintext -
|
409 |
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210
|
410 |
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
|
411 |
* Cipher : 27a0 8440 406a df60 278f 47cf 42d6 15d7
|
412 |
*
|
413 |
* Triple-length key, single-length plaintext -
|
414 |
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
|
415 |
* Plain : 0123 4567 89ab cde7
|
416 |
* Cipher : de0b 7c06 ae5e 0ed5
|
417 |
*
|
418 |
* Triple-length key, double-length plaintext -
|
419 |
* Key : 0123 4567 89ab cdef fedc ba98 7654 3210 89ab cdef 0123 4567
|
420 |
* Plain : 0123 4567 89ab cdef 0123 4567 89ab cdff
|
421 |
* Cipher : ad0d 1b30 ac17 cf07 0ed1 1c63 81e4 4de5
|
422 |
*
|
423 |
* d3des V5.0a rwo 9208.07 18:44 Graven Imagery
|
424 |
**********************************************************************/
|