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