1b5a8f767SHajimu UMEMOTO /* $KAME: des_enc.c,v 1.1 2001/09/10 04:03:58 itojun Exp $ */
2b5a8f767SHajimu UMEMOTO
3b5a8f767SHajimu UMEMOTO /* crypto/des/des_enc.c */
48c086620SDavid E. O'Brien
5b5a8f767SHajimu UMEMOTO /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
6b5a8f767SHajimu UMEMOTO * All rights reserved.
7b5a8f767SHajimu UMEMOTO *
8b5a8f767SHajimu UMEMOTO * This package is an SSL implementation written
9b5a8f767SHajimu UMEMOTO * by Eric Young (eay@cryptsoft.com).
10b5a8f767SHajimu UMEMOTO * The implementation was written so as to conform with Netscapes SSL.
11b5a8f767SHajimu UMEMOTO *
12b5a8f767SHajimu UMEMOTO * This library is free for commercial and non-commercial use as long as
13b5a8f767SHajimu UMEMOTO * the following conditions are aheared to. The following conditions
14b5a8f767SHajimu UMEMOTO * apply to all code found in this distribution, be it the RC4, RSA,
15b5a8f767SHajimu UMEMOTO * lhash, DES, etc., code; not just the SSL code. The SSL documentation
16b5a8f767SHajimu UMEMOTO * included with this distribution is covered by the same copyright terms
17b5a8f767SHajimu UMEMOTO * except that the holder is Tim Hudson (tjh@cryptsoft.com).
18b5a8f767SHajimu UMEMOTO *
19b5a8f767SHajimu UMEMOTO * Copyright remains Eric Young's, and as such any Copyright notices in
20b5a8f767SHajimu UMEMOTO * the code are not to be removed.
21b5a8f767SHajimu UMEMOTO * If this package is used in a product, Eric Young should be given attribution
22b5a8f767SHajimu UMEMOTO * as the author of the parts of the library used.
23b5a8f767SHajimu UMEMOTO * This can be in the form of a textual message at program startup or
24b5a8f767SHajimu UMEMOTO * in documentation (online or textual) provided with the package.
25b5a8f767SHajimu UMEMOTO *
26b5a8f767SHajimu UMEMOTO * Redistribution and use in source and binary forms, with or without
27b5a8f767SHajimu UMEMOTO * modification, are permitted provided that the following conditions
28b5a8f767SHajimu UMEMOTO * are met:
29b5a8f767SHajimu UMEMOTO * 1. Redistributions of source code must retain the copyright
30b5a8f767SHajimu UMEMOTO * notice, this list of conditions and the following disclaimer.
31b5a8f767SHajimu UMEMOTO * 2. Redistributions in binary form must reproduce the above copyright
32b5a8f767SHajimu UMEMOTO * notice, this list of conditions and the following disclaimer in the
33b5a8f767SHajimu UMEMOTO * documentation and/or other materials provided with the distribution.
34b5a8f767SHajimu UMEMOTO * 3. All advertising materials mentioning features or use of this software
35b5a8f767SHajimu UMEMOTO * must display the following acknowledgement:
36b5a8f767SHajimu UMEMOTO * "This product includes cryptographic software written by
37b5a8f767SHajimu UMEMOTO * Eric Young (eay@cryptsoft.com)"
38b5a8f767SHajimu UMEMOTO * The word 'cryptographic' can be left out if the rouines from the library
39b5a8f767SHajimu UMEMOTO * being used are not cryptographic related :-).
40b5a8f767SHajimu UMEMOTO * 4. If you include any Windows specific code (or a derivative thereof) from
41b5a8f767SHajimu UMEMOTO * the apps directory (application code) you must include an acknowledgement:
42b5a8f767SHajimu UMEMOTO * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
43b5a8f767SHajimu UMEMOTO *
44b5a8f767SHajimu UMEMOTO * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
45b5a8f767SHajimu UMEMOTO * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46b5a8f767SHajimu UMEMOTO * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47b5a8f767SHajimu UMEMOTO * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
48b5a8f767SHajimu UMEMOTO * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49b5a8f767SHajimu UMEMOTO * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50b5a8f767SHajimu UMEMOTO * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51b5a8f767SHajimu UMEMOTO * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52b5a8f767SHajimu UMEMOTO * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53b5a8f767SHajimu UMEMOTO * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54b5a8f767SHajimu UMEMOTO * SUCH DAMAGE.
55b5a8f767SHajimu UMEMOTO *
56b5a8f767SHajimu UMEMOTO * The licence and distribution terms for any publically available version or
57b5a8f767SHajimu UMEMOTO * derivative of this code cannot be changed. i.e. this code cannot simply be
58b5a8f767SHajimu UMEMOTO * copied and put under another distribution licence
59b5a8f767SHajimu UMEMOTO * [including the GNU Public Licence.]
60b5a8f767SHajimu UMEMOTO */
61b5a8f767SHajimu UMEMOTO
62b5a8f767SHajimu UMEMOTO #include <sys/types.h>
63b5a8f767SHajimu UMEMOTO #include <crypto/des/des_locl.h>
64b5a8f767SHajimu UMEMOTO
65b5a8f767SHajimu UMEMOTO extern const DES_LONG des_SPtrans[8][64];
66b5a8f767SHajimu UMEMOTO
des_encrypt1(DES_LONG * data,des_key_schedule ks,int enc)67b5a8f767SHajimu UMEMOTO void des_encrypt1(DES_LONG *data, des_key_schedule ks, int enc)
68b5a8f767SHajimu UMEMOTO {
69*3e85b721SEd Maste DES_LONG l,r,t,u;
70b5a8f767SHajimu UMEMOTO #ifdef DES_PTR
71*3e85b721SEd Maste const unsigned char *des_SP=(const unsigned char *)des_SPtrans;
72b5a8f767SHajimu UMEMOTO #endif
73b5a8f767SHajimu UMEMOTO #ifndef DES_UNROLL
74*3e85b721SEd Maste int i;
75b5a8f767SHajimu UMEMOTO #endif
76*3e85b721SEd Maste DES_LONG *s;
77b5a8f767SHajimu UMEMOTO
78b5a8f767SHajimu UMEMOTO r=data[0];
79b5a8f767SHajimu UMEMOTO l=data[1];
80b5a8f767SHajimu UMEMOTO
81b5a8f767SHajimu UMEMOTO IP(r,l);
82b5a8f767SHajimu UMEMOTO /* Things have been modified so that the initial rotate is
83b5a8f767SHajimu UMEMOTO * done outside the loop. This required the
84b5a8f767SHajimu UMEMOTO * des_SPtrans values in sp.h to be rotated 1 bit to the right.
85b5a8f767SHajimu UMEMOTO * One perl script later and things have a 5% speed up on a sparc2.
86b5a8f767SHajimu UMEMOTO * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
87b5a8f767SHajimu UMEMOTO * for pointing this out. */
88b5a8f767SHajimu UMEMOTO /* clear the top bits on machines with 8byte longs */
89b5a8f767SHajimu UMEMOTO /* shift left by 2 */
90b5a8f767SHajimu UMEMOTO r=ROTATE(r,29)&0xffffffffL;
91b5a8f767SHajimu UMEMOTO l=ROTATE(l,29)&0xffffffffL;
92b5a8f767SHajimu UMEMOTO
93b5a8f767SHajimu UMEMOTO s=ks->ks.deslong;
94b5a8f767SHajimu UMEMOTO /* I don't know if it is worth the effort of loop unrolling the
95b5a8f767SHajimu UMEMOTO * inner loop */
96b5a8f767SHajimu UMEMOTO if (enc)
97b5a8f767SHajimu UMEMOTO {
98b5a8f767SHajimu UMEMOTO #ifdef DES_UNROLL
99b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 0); /* 1 */
100b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 2); /* 2 */
101b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 4); /* 3 */
102b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 6); /* 4 */
103b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 8); /* 5 */
104b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,10); /* 6 */
105b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,12); /* 7 */
106b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,14); /* 8 */
107b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,16); /* 9 */
108b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,18); /* 10 */
109b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,20); /* 11 */
110b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,22); /* 12 */
111b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,24); /* 13 */
112b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,26); /* 14 */
113b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,28); /* 15 */
114b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,30); /* 16 */
115b5a8f767SHajimu UMEMOTO #else
116b5a8f767SHajimu UMEMOTO for (i=0; i<32; i+=8)
117b5a8f767SHajimu UMEMOTO {
118b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i+0); /* 1 */
119b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i+2); /* 2 */
120b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i+4); /* 3 */
121b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i+6); /* 4 */
122b5a8f767SHajimu UMEMOTO }
123b5a8f767SHajimu UMEMOTO #endif
124b5a8f767SHajimu UMEMOTO }
125b5a8f767SHajimu UMEMOTO else
126b5a8f767SHajimu UMEMOTO {
127b5a8f767SHajimu UMEMOTO #ifdef DES_UNROLL
128b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,30); /* 16 */
129b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,28); /* 15 */
130b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,26); /* 14 */
131b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,24); /* 13 */
132b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,22); /* 12 */
133b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,20); /* 11 */
134b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,18); /* 10 */
135b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,16); /* 9 */
136b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,14); /* 8 */
137b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,12); /* 7 */
138b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,10); /* 6 */
139b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 8); /* 5 */
140b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 6); /* 4 */
141b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 4); /* 3 */
142b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 2); /* 2 */
143b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 0); /* 1 */
144b5a8f767SHajimu UMEMOTO #else
145b5a8f767SHajimu UMEMOTO for (i=30; i>0; i-=8)
146b5a8f767SHajimu UMEMOTO {
147b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i-0); /* 16 */
148b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i-2); /* 15 */
149b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i-4); /* 14 */
150b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i-6); /* 13 */
151b5a8f767SHajimu UMEMOTO }
152b5a8f767SHajimu UMEMOTO #endif
153b5a8f767SHajimu UMEMOTO }
154b5a8f767SHajimu UMEMOTO
155b5a8f767SHajimu UMEMOTO /* rotate and clear the top bits on machines with 8byte longs */
156b5a8f767SHajimu UMEMOTO l=ROTATE(l,3)&0xffffffffL;
157b5a8f767SHajimu UMEMOTO r=ROTATE(r,3)&0xffffffffL;
158b5a8f767SHajimu UMEMOTO
159b5a8f767SHajimu UMEMOTO FP(r,l);
160b5a8f767SHajimu UMEMOTO data[0]=l;
161b5a8f767SHajimu UMEMOTO data[1]=r;
162b5a8f767SHajimu UMEMOTO l=r=t=u=0;
163b5a8f767SHajimu UMEMOTO }
164b5a8f767SHajimu UMEMOTO
des_encrypt2(DES_LONG * data,des_key_schedule ks,int enc)165b5a8f767SHajimu UMEMOTO void des_encrypt2(DES_LONG *data, des_key_schedule ks, int enc)
166b5a8f767SHajimu UMEMOTO {
167*3e85b721SEd Maste DES_LONG l,r,t,u;
168b5a8f767SHajimu UMEMOTO #ifdef DES_PTR
169*3e85b721SEd Maste const unsigned char *des_SP=(const unsigned char *)des_SPtrans;
170b5a8f767SHajimu UMEMOTO #endif
171b5a8f767SHajimu UMEMOTO #ifndef DES_UNROLL
172*3e85b721SEd Maste int i;
173b5a8f767SHajimu UMEMOTO #endif
174*3e85b721SEd Maste DES_LONG *s;
175b5a8f767SHajimu UMEMOTO
176b5a8f767SHajimu UMEMOTO r=data[0];
177b5a8f767SHajimu UMEMOTO l=data[1];
178b5a8f767SHajimu UMEMOTO
179b5a8f767SHajimu UMEMOTO /* Things have been modified so that the initial rotate is
180b5a8f767SHajimu UMEMOTO * done outside the loop. This required the
181b5a8f767SHajimu UMEMOTO * des_SPtrans values in sp.h to be rotated 1 bit to the right.
182b5a8f767SHajimu UMEMOTO * One perl script later and things have a 5% speed up on a sparc2.
183b5a8f767SHajimu UMEMOTO * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
184b5a8f767SHajimu UMEMOTO * for pointing this out. */
185b5a8f767SHajimu UMEMOTO /* clear the top bits on machines with 8byte longs */
186b5a8f767SHajimu UMEMOTO r=ROTATE(r,29)&0xffffffffL;
187b5a8f767SHajimu UMEMOTO l=ROTATE(l,29)&0xffffffffL;
188b5a8f767SHajimu UMEMOTO
189b5a8f767SHajimu UMEMOTO s=ks->ks.deslong;
190b5a8f767SHajimu UMEMOTO /* I don't know if it is worth the effort of loop unrolling the
191b5a8f767SHajimu UMEMOTO * inner loop */
192b5a8f767SHajimu UMEMOTO if (enc)
193b5a8f767SHajimu UMEMOTO {
194b5a8f767SHajimu UMEMOTO #ifdef DES_UNROLL
195b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 0); /* 1 */
196b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 2); /* 2 */
197b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 4); /* 3 */
198b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 6); /* 4 */
199b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 8); /* 5 */
200b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,10); /* 6 */
201b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,12); /* 7 */
202b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,14); /* 8 */
203b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,16); /* 9 */
204b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,18); /* 10 */
205b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,20); /* 11 */
206b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,22); /* 12 */
207b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,24); /* 13 */
208b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,26); /* 14 */
209b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,28); /* 15 */
210b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,30); /* 16 */
211b5a8f767SHajimu UMEMOTO #else
212b5a8f767SHajimu UMEMOTO for (i=0; i<32; i+=8)
213b5a8f767SHajimu UMEMOTO {
214b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i+0); /* 1 */
215b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i+2); /* 2 */
216b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i+4); /* 3 */
217b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i+6); /* 4 */
218b5a8f767SHajimu UMEMOTO }
219b5a8f767SHajimu UMEMOTO #endif
220b5a8f767SHajimu UMEMOTO }
221b5a8f767SHajimu UMEMOTO else
222b5a8f767SHajimu UMEMOTO {
223b5a8f767SHajimu UMEMOTO #ifdef DES_UNROLL
224b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,30); /* 16 */
225b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,28); /* 15 */
226b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,26); /* 14 */
227b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,24); /* 13 */
228b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,22); /* 12 */
229b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,20); /* 11 */
230b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,18); /* 10 */
231b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,16); /* 9 */
232b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,14); /* 8 */
233b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,12); /* 7 */
234b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,10); /* 6 */
235b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 8); /* 5 */
236b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 6); /* 4 */
237b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 4); /* 3 */
238b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r, 2); /* 2 */
239b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l, 0); /* 1 */
240b5a8f767SHajimu UMEMOTO #else
241b5a8f767SHajimu UMEMOTO for (i=30; i>0; i-=8)
242b5a8f767SHajimu UMEMOTO {
243b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i-0); /* 16 */
244b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i-2); /* 15 */
245b5a8f767SHajimu UMEMOTO D_ENCRYPT(l,r,i-4); /* 14 */
246b5a8f767SHajimu UMEMOTO D_ENCRYPT(r,l,i-6); /* 13 */
247b5a8f767SHajimu UMEMOTO }
248b5a8f767SHajimu UMEMOTO #endif
249b5a8f767SHajimu UMEMOTO }
250b5a8f767SHajimu UMEMOTO /* rotate and clear the top bits on machines with 8byte longs */
251b5a8f767SHajimu UMEMOTO data[0]=ROTATE(l,3)&0xffffffffL;
252b5a8f767SHajimu UMEMOTO data[1]=ROTATE(r,3)&0xffffffffL;
253b5a8f767SHajimu UMEMOTO l=r=t=u=0;
254b5a8f767SHajimu UMEMOTO }
255b5a8f767SHajimu UMEMOTO
des_encrypt3(DES_LONG * data,des_key_schedule ks1,des_key_schedule ks2,des_key_schedule ks3)256b5a8f767SHajimu UMEMOTO void des_encrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2,
257b5a8f767SHajimu UMEMOTO des_key_schedule ks3)
258b5a8f767SHajimu UMEMOTO {
259*3e85b721SEd Maste DES_LONG l,r;
260b5a8f767SHajimu UMEMOTO
261b5a8f767SHajimu UMEMOTO l=data[0];
262b5a8f767SHajimu UMEMOTO r=data[1];
263b5a8f767SHajimu UMEMOTO IP(l,r);
264b5a8f767SHajimu UMEMOTO data[0]=l;
265b5a8f767SHajimu UMEMOTO data[1]=r;
266b5a8f767SHajimu UMEMOTO des_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT);
267b5a8f767SHajimu UMEMOTO des_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT);
268b5a8f767SHajimu UMEMOTO des_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT);
269b5a8f767SHajimu UMEMOTO l=data[0];
270b5a8f767SHajimu UMEMOTO r=data[1];
271b5a8f767SHajimu UMEMOTO FP(r,l);
272b5a8f767SHajimu UMEMOTO data[0]=l;
273b5a8f767SHajimu UMEMOTO data[1]=r;
274b5a8f767SHajimu UMEMOTO }
275b5a8f767SHajimu UMEMOTO
des_decrypt3(DES_LONG * data,des_key_schedule ks1,des_key_schedule ks2,des_key_schedule ks3)276b5a8f767SHajimu UMEMOTO void des_decrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2,
277b5a8f767SHajimu UMEMOTO des_key_schedule ks3)
278b5a8f767SHajimu UMEMOTO {
279*3e85b721SEd Maste DES_LONG l,r;
280b5a8f767SHajimu UMEMOTO
281b5a8f767SHajimu UMEMOTO l=data[0];
282b5a8f767SHajimu UMEMOTO r=data[1];
283b5a8f767SHajimu UMEMOTO IP(l,r);
284b5a8f767SHajimu UMEMOTO data[0]=l;
285b5a8f767SHajimu UMEMOTO data[1]=r;
286b5a8f767SHajimu UMEMOTO des_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT);
287b5a8f767SHajimu UMEMOTO des_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT);
288b5a8f767SHajimu UMEMOTO des_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT);
289b5a8f767SHajimu UMEMOTO l=data[0];
290b5a8f767SHajimu UMEMOTO r=data[1];
291b5a8f767SHajimu UMEMOTO FP(r,l);
292b5a8f767SHajimu UMEMOTO data[0]=l;
293b5a8f767SHajimu UMEMOTO data[1]=r;
294b5a8f767SHajimu UMEMOTO }
295