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