Deleted Added
sdiff udiff text old ( 55009 ) new ( 62587 )
full compact
1/* $FreeBSD: head/sys/crypto/des/des_ecb.c 62587 2000-07-04 16:35:15Z itojun $ */
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
54char *libdes_version="libdes v 3.24 - 20-Apr-1996 - eay";
55char *DES_version="DES part of SSLeay 0.6.4 30-Aug-1996";
56
57char *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
73void des_ecb_encrypt(input, output, ks, encrypt)
74des_cblock (*input);
75des_cblock (*output);
76des_key_schedule ks;
77int 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
93void des_encrypt(data, ks, encrypt)
94DES_LONG *data;
95des_key_schedule ks;
96int 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
165void des_encrypt2(data, ks, encrypt)
166DES_LONG *data;
167des_key_schedule ks;
168int 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 }