xref: /freebsd/sys/crypto/des/des_ecb.c (revision b601c69bdbe8755d26570261d7fd4c02ee4eff74)
1 /*	$FreeBSD$	*/
2 /*	$KAME: des_ecb.c,v 1.3 2000/03/27 04:36:33 sumikawa Exp $	*/
3 
4 /* crypto/des/ecb_enc.c */
5 /* Copyright (C) 1995-1996 Eric Young (eay@mincom.oz.au)
6  * All rights reserved.
7  *
8  * This file is part of an SSL implementation written
9  * by Eric Young (eay@mincom.oz.au).
10  * The implementation was written so as to conform with Netscapes SSL
11  * specification.  This library and applications are
12  * FREE FOR COMMERCIAL AND NON-COMMERCIAL USE
13  * as long as the following conditions are aheared to.
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.  If this code is used in a product,
17  * Eric Young should be given attribution as the author of the parts used.
18  * This can be in the form of a textual message at program startup or
19  * in documentation (online or textual) provided with the package.
20  *
21  * Redistribution and use in source and binary forms, with or without
22  * modification, are permitted provided that the following conditions
23  * are met:
24  * 1. Redistributions of source code must retain the copyright
25  *    notice, this list of conditions and the following disclaimer.
26  * 2. Redistributions in binary form must reproduce the above copyright
27  *    notice, this list of conditions and the following disclaimer in the
28  *    documentation and/or other materials provided with the distribution.
29  * 3. All advertising materials mentioning features or use of this software
30  *    must display the following acknowledgement:
31  *    This product includes software developed by Eric Young (eay@mincom.oz.au)
32  *
33  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
34  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
35  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
36  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
37  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
38  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
39  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
40  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
41  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
42  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43  * SUCH DAMAGE.
44  *
45  * The licence and distribution terms for any publically available version or
46  * derivative of this code cannot be changed.  i.e. this code cannot simply be
47  * copied and put under another distribution licence
48  * [including the GNU Public Licence.]
49  */
50 
51 #include <crypto/des/des_locl.h>
52 #include <crypto/des/spr.h>
53 
54 char *libdes_version="libdes v 3.24 - 20-Apr-1996 - eay";
55 char *DES_version="DES part of SSLeay 0.6.4 30-Aug-1996";
56 
57 char *des_options()
58 	{
59 #ifdef DES_PTR
60 	if (sizeof(DES_LONG) != sizeof(long))
61 		return("des(ptr,int)");
62 	else
63 		return("des(ptr,long)");
64 #else
65 	if (sizeof(DES_LONG) != sizeof(long))
66 		return("des(idx,int)");
67 	else
68 		return("des(idx,long)");
69 #endif
70 	}
71 
72 
73 void des_ecb_encrypt(input, output, ks, encrypt)
74 des_cblock (*input);
75 des_cblock (*output);
76 des_key_schedule ks;
77 int encrypt;
78 	{
79 	register DES_LONG l;
80 	register unsigned char *in,*out;
81 	DES_LONG ll[2];
82 
83 	in=(unsigned char *)input;
84 	out=(unsigned char *)output;
85 	c2l(in,l); ll[0]=l;
86 	c2l(in,l); ll[1]=l;
87 	des_encrypt(ll,ks,encrypt);
88 	l=ll[0]; l2c(l,out);
89 	l=ll[1]; l2c(l,out);
90 	l=ll[0]=ll[1]=0;
91 	}
92 
93 void des_encrypt(data, ks, encrypt)
94 DES_LONG *data;
95 des_key_schedule ks;
96 int encrypt;
97 	{
98 	register DES_LONG l,r,t,u;
99 #ifdef DES_PTR
100 	register unsigned char *des_SP=(unsigned char *)des_SPtrans;
101 #endif
102 #ifdef undef
103 	union fudge {
104 		DES_LONG  l;
105 		unsigned short s[2];
106 		unsigned char  c[4];
107 		} U,T;
108 #endif
109 	register int i;
110 	register DES_LONG *s;
111 
112 	u=data[0];
113 	r=data[1];
114 
115 	IP(u,r);
116 	/* Things have been modified so that the initial rotate is
117 	 * done outside the loop.  This required the
118 	 * des_SPtrans values in sp.h to be rotated 1 bit to the right.
119 	 * One perl script later and things have a 5% speed up on a sparc2.
120 	 * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
121 	 * for pointing this out. */
122 	l=(r<<1)|(r>>31);
123 	r=(u<<1)|(u>>31);
124 
125 	/* clear the top bits on machines with 8byte longs */
126 	l&=0xffffffffL;
127 	r&=0xffffffffL;
128 
129 	s=(DES_LONG *)ks;
130 	/* I don't know if it is worth the effort of loop unrolling the
131 	 * inner loop
132 	 */
133 	if (encrypt)
134 		{
135 		for (i=0; i<32; i+=8)
136 			{
137 			D_ENCRYPT(l,r,i+0); /*  1 */
138 			D_ENCRYPT(r,l,i+2); /*  2 */
139 			D_ENCRYPT(l,r,i+4); /*  3 */
140 			D_ENCRYPT(r,l,i+6); /*  4 */
141 			}
142 		}
143 	else
144 		{
145 		for (i=30; i>0; i-=8)
146 			{
147 			D_ENCRYPT(l,r,i-0); /* 16 */
148 			D_ENCRYPT(r,l,i-2); /* 15 */
149 			D_ENCRYPT(l,r,i-4); /* 14 */
150 			D_ENCRYPT(r,l,i-6); /* 13 */
151 			}
152 		}
153 	l=(l>>1)|(l<<31);
154 	r=(r>>1)|(r<<31);
155 	/* clear the top bits on machines with 8byte longs */
156 	l&=0xffffffffL;
157 	r&=0xffffffffL;
158 
159 	FP(r,l);
160 	data[0]=l;
161 	data[1]=r;
162 	l=r=t=u=0;
163 	}
164 
165 void des_encrypt2(data, ks, encrypt)
166 DES_LONG *data;
167 des_key_schedule ks;
168 int encrypt;
169 	{
170 	register DES_LONG l,r,t,u;
171 #ifdef DES_PTR
172 	register unsigned char *des_SP=(unsigned char *)des_SPtrans;
173 #endif
174 #ifdef undef
175 	union fudge {
176 		DES_LONG  l;
177 		unsigned short s[2];
178 		unsigned char  c[4];
179 		} U,T;
180 #endif
181 	register int i;
182 	register DES_LONG *s;
183 
184 	u=data[0];
185 	r=data[1];
186 
187 	/* Things have been modified so that the initial rotate is
188 	 * done outside the loop.  This required the
189 	 * des_SPtrans values in sp.h to be rotated 1 bit to the right.
190 	 * One perl script later and things have a 5% speed up on a sparc2.
191 	 * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
192 	 * for pointing this out. */
193 	l=(r<<1)|(r>>31);
194 	r=(u<<1)|(u>>31);
195 
196 	/* clear the top bits on machines with 8byte longs */
197 	l&=0xffffffffL;
198 	r&=0xffffffffL;
199 
200 	s=(DES_LONG *)ks;
201 	/* I don't know if it is worth the effort of loop unrolling the
202 	 * inner loop */
203 	if (encrypt)
204 		{
205 		for (i=0; i<32; i+=8)
206 			{
207 			D_ENCRYPT(l,r,i+0); /*  1 */
208 			D_ENCRYPT(r,l,i+2); /*  2 */
209 			D_ENCRYPT(l,r,i+4); /*  3 */
210 			D_ENCRYPT(r,l,i+6); /*  4 */
211 			}
212 		}
213 	else
214 		{
215 		for (i=30; i>0; i-=8)
216 			{
217 			D_ENCRYPT(l,r,i-0); /* 16 */
218 			D_ENCRYPT(r,l,i-2); /* 15 */
219 			D_ENCRYPT(l,r,i-4); /* 14 */
220 			D_ENCRYPT(r,l,i-6); /* 13 */
221 			}
222 		}
223 	l=(l>>1)|(l<<31);
224 	r=(r>>1)|(r<<31);
225 	/* clear the top bits on machines with 8byte longs */
226 	l&=0xffffffffL;
227 	r&=0xffffffffL;
228 
229 	data[0]=l;
230 	data[1]=r;
231 	l=r=t=u=0;
232 	}
233