xref: /freebsd/sys/crypto/des/des_enc.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
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