Statistics
| Branch: | Revision:

root / ui / d3des.c @ 7fee199c

History | View | Annotate | Download (15 kB)

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