des_ecb.c revision 1.3 1 /* $NetBSD: des_ecb.c,v 1.3 2000/11/06 14:11:41 itojun Exp $ */
2 /* $KAME: des_ecb.c,v 1.5 2000/11/06 13:58:08 itojun Exp $ */
3
4 /* crypto/des/ecb_enc.c */
5 /* Copyright (C) 1995-1996 Eric Young (eay (at) mincom.oz.au)
6 * All rights reserved.
7 *
8 * This file is part of an SSL implementation written
9 * by Eric Young (eay (at) 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 (at) 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 <sys/param.h>
52 #ifdef _KERNEL
53 #include <sys/systm.h>
54 #else
55 #include <string.h>
56 #endif
57 #include <crypto/des/des_locl.h>
58 #include <crypto/des/spr.h>
59
60 char *libdes_version="libdes v 3.24 - 20-Apr-1996 - eay";
61 char *DES_version="DES part of SSLeay 0.6.4 30-Aug-1996";
62
63 char *des_options()
64 {
65 #ifdef DES_PTR
66 if (sizeof(DES_LONG) != sizeof(long))
67 return("des(ptr,int)");
68 else
69 return("des(ptr,long)");
70 #else
71 if (sizeof(DES_LONG) != sizeof(long))
72 return("des(idx,int)");
73 else
74 return("des(idx,long)");
75 #endif
76 }
77
78
79 void des_ecb_encrypt(input, output, ks, encrypt)
80 des_cblock (*input);
81 des_cblock (*output);
82 des_key_schedule ks;
83 int encrypt;
84 {
85 register DES_LONG l;
86 register unsigned char *in,*out;
87 DES_LONG ll[2];
88
89 in=(unsigned char *)input;
90 out=(unsigned char *)output;
91 c2l(in,l); ll[0]=l;
92 c2l(in,l); ll[1]=l;
93 des_encrypt(ll,ks,encrypt);
94 l=ll[0]; l2c(l,out);
95 l=ll[1]; l2c(l,out);
96 l=ll[0]=ll[1]=0;
97 }
98
99 void des_encrypt(data, ks, encrypt)
100 DES_LONG *data;
101 des_key_schedule ks;
102 int encrypt;
103 {
104 register DES_LONG l,r,t,u;
105 #ifdef DES_PTR
106 register unsigned char *des_SP=(unsigned char *)des_SPtrans;
107 #endif
108 #ifdef undef
109 union fudge {
110 DES_LONG l;
111 unsigned short s[2];
112 unsigned char c[4];
113 } U,T;
114 #endif
115 register int i;
116 register DES_LONG *s;
117
118 u=data[0];
119 r=data[1];
120
121 IP(u,r);
122 /* Things have been modified so that the initial rotate is
123 * done outside the loop. This required the
124 * des_SPtrans values in sp.h to be rotated 1 bit to the right.
125 * One perl script later and things have a 5% speed up on a sparc2.
126 * Thanks to Richard Outerbridge <71755.204 (at) CompuServe.COM>
127 * for pointing this out. */
128 l=(r<<1)|(r>>31);
129 r=(u<<1)|(u>>31);
130
131 /* clear the top bits on machines with 8byte longs */
132 l&=0xffffffffL;
133 r&=0xffffffffL;
134
135 s=(DES_LONG *)ks;
136 /* I don't know if it is worth the effort of loop unrolling the
137 * inner loop
138 */
139 if (encrypt)
140 {
141 for (i=0; i<32; i+=8)
142 {
143 D_ENCRYPT(l,r,i+0); /* 1 */
144 D_ENCRYPT(r,l,i+2); /* 2 */
145 D_ENCRYPT(l,r,i+4); /* 3 */
146 D_ENCRYPT(r,l,i+6); /* 4 */
147 }
148 }
149 else
150 {
151 for (i=30; i>0; i-=8)
152 {
153 D_ENCRYPT(l,r,i-0); /* 16 */
154 D_ENCRYPT(r,l,i-2); /* 15 */
155 D_ENCRYPT(l,r,i-4); /* 14 */
156 D_ENCRYPT(r,l,i-6); /* 13 */
157 }
158 }
159 l=(l>>1)|(l<<31);
160 r=(r>>1)|(r<<31);
161 /* clear the top bits on machines with 8byte longs */
162 l&=0xffffffffL;
163 r&=0xffffffffL;
164
165 FP(r,l);
166 data[0]=l;
167 data[1]=r;
168 l=r=t=u=0;
169 }
170
171 void des_encrypt2(data, ks, encrypt)
172 DES_LONG *data;
173 des_key_schedule ks;
174 int encrypt;
175 {
176 register DES_LONG l,r,t,u;
177 #ifdef DES_PTR
178 register unsigned char *des_SP=(unsigned char *)des_SPtrans;
179 #endif
180 #ifdef undef
181 union fudge {
182 DES_LONG l;
183 unsigned short s[2];
184 unsigned char c[4];
185 } U,T;
186 #endif
187 register int i;
188 register DES_LONG *s;
189
190 u=data[0];
191 r=data[1];
192
193 /* Things have been modified so that the initial rotate is
194 * done outside the loop. This required the
195 * des_SPtrans values in sp.h to be rotated 1 bit to the right.
196 * One perl script later and things have a 5% speed up on a sparc2.
197 * Thanks to Richard Outerbridge <71755.204 (at) CompuServe.COM>
198 * for pointing this out. */
199 l=(r<<1)|(r>>31);
200 r=(u<<1)|(u>>31);
201
202 /* clear the top bits on machines with 8byte longs */
203 l&=0xffffffffL;
204 r&=0xffffffffL;
205
206 s=(DES_LONG *)ks;
207 /* I don't know if it is worth the effort of loop unrolling the
208 * inner loop */
209 if (encrypt)
210 {
211 for (i=0; i<32; i+=8)
212 {
213 D_ENCRYPT(l,r,i+0); /* 1 */
214 D_ENCRYPT(r,l,i+2); /* 2 */
215 D_ENCRYPT(l,r,i+4); /* 3 */
216 D_ENCRYPT(r,l,i+6); /* 4 */
217 }
218 }
219 else
220 {
221 for (i=30; i>0; i-=8)
222 {
223 D_ENCRYPT(l,r,i-0); /* 16 */
224 D_ENCRYPT(r,l,i-2); /* 15 */
225 D_ENCRYPT(l,r,i-4); /* 14 */
226 D_ENCRYPT(r,l,i-6); /* 13 */
227 }
228 }
229 l=(l>>1)|(l<<31);
230 r=(r>>1)|(r<<31);
231 /* clear the top bits on machines with 8byte longs */
232 l&=0xffffffffL;
233 r&=0xffffffffL;
234
235 data[0]=l;
236 data[1]=r;
237 l=r=t=u=0;
238 }
239