Rename des_SPtrans to DES_SPtrans to differentiate from libdes and avoid certain...
[openssl.git] / crypto / des / des_enc.c
index b04e12dc293662767d2532f01d12e9139ac4531e..1c37ab96d3ded2c158cfe1c351cb26e7ee4fdf20 100644 (file)
@@ -1,5 +1,5 @@
 /* crypto/des/des_enc.c */
-/* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com)
+/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
  * This package is an SSL implementation written
 
 #include "des_locl.h"
 
-void des_encrypt(data, ks, enc)
-DES_LONG *data;
-des_key_schedule ks;
-int enc;
+void DES_encrypt1(DES_LONG *data, DES_key_schedule *ks, int enc)
        {
        register DES_LONG l,r,t,u;
 #ifdef DES_PTR
-       register unsigned char *des_SP=(unsigned char *)des_SPtrans;
+       register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans;
 #endif
 #ifndef DES_UNROLL
        register int i;
@@ -78,7 +75,7 @@ int enc;
        IP(r,l);
        /* Things have been modified so that the initial rotate is
         * done outside the loop.  This required the
-        * des_SPtrans values in sp.h to be rotated 1 bit to the right.
+        * DES_SPtrans values in sp.h to be rotated 1 bit to the right.
         * One perl script later and things have a 5% speed up on a sparc2.
         * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
         * for pointing this out. */
@@ -87,7 +84,7 @@ int enc;
        r=ROTATE(r,29)&0xffffffffL;
        l=ROTATE(l,29)&0xffffffffL;
 
-       s=(DES_LONG *)ks;
+       s=ks->ks->deslong;
        /* I don't know if it is worth the effort of loop unrolling the
         * inner loop */
        if (enc)
@@ -159,14 +156,11 @@ int enc;
        l=r=t=u=0;
        }
 
-void des_encrypt2(data, ks, enc)
-DES_LONG *data;
-des_key_schedule ks;
-int enc;
+void DES_encrypt2(DES_LONG *data, DES_key_schedule *ks, int enc)
        {
        register DES_LONG l,r,t,u;
 #ifdef DES_PTR
-       register unsigned char *des_SP=(unsigned char *)des_SPtrans;
+       register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans;
 #endif
 #ifndef DES_UNROLL
        register int i;
@@ -178,15 +172,15 @@ int enc;
 
        /* Things have been modified so that the initial rotate is
         * done outside the loop.  This required the
-        * des_SPtrans values in sp.h to be rotated 1 bit to the right.
+        * DES_SPtrans values in sp.h to be rotated 1 bit to the right.
         * One perl script later and things have a 5% speed up on a sparc2.
         * Thanks to Richard Outerbridge <71755.204@CompuServe.COM>
         * for pointing this out. */
        /* clear the top bits on machines with 8byte longs */
-       r=ROTATE(r,29)&0xffffffff;
-       l=ROTATE(l,29)&0xffffffff;
+       r=ROTATE(r,29)&0xffffffffL;
+       l=ROTATE(l,29)&0xffffffffL;
 
-       s=(DES_LONG *)ks;
+       s=ks->ks->deslong;
        /* I don't know if it is worth the effort of loop unrolling the
         * inner loop */
        if (enc)
@@ -248,16 +242,13 @@ int enc;
 #endif
                }
        /* rotate and clear the top bits on machines with 8byte longs */
-       data[0]=ROTATE(l,3)&0xffffffff;
-       data[1]=ROTATE(r,3)&0xffffffff;
+       data[0]=ROTATE(l,3)&0xffffffffL;
+       data[1]=ROTATE(r,3)&0xffffffffL;
        l=r=t=u=0;
        }
 
-void des_encrypt3(data,ks1,ks2,ks3)
-DES_LONG *data;
-des_key_schedule ks1;
-des_key_schedule ks2;
-des_key_schedule ks3;
+void DES_encrypt3(DES_LONG *data, DES_key_schedule *ks1,
+                 DES_key_schedule *ks2, DES_key_schedule *ks3)
        {
        register DES_LONG l,r;
 
@@ -266,9 +257,9 @@ des_key_schedule ks3;
        IP(l,r);
        data[0]=l;
        data[1]=r;
-       des_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT);
-       des_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT);
-       des_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT);
+       DES_encrypt2((DES_LONG *)data,ks1,DES_ENCRYPT);
+       DES_encrypt2((DES_LONG *)data,ks2,DES_DECRYPT);
+       DES_encrypt2((DES_LONG *)data,ks3,DES_ENCRYPT);
        l=data[0];
        r=data[1];
        FP(r,l);
@@ -276,11 +267,8 @@ des_key_schedule ks3;
        data[1]=r;
        }
 
-void des_decrypt3(data,ks1,ks2,ks3)
-DES_LONG *data;
-des_key_schedule ks1;
-des_key_schedule ks2;
-des_key_schedule ks3;
+void DES_decrypt3(DES_LONG *data, DES_key_schedule *ks1,
+                 DES_key_schedule *ks2, DES_key_schedule *ks3)
        {
        register DES_LONG l,r;
 
@@ -289,9 +277,9 @@ des_key_schedule ks3;
        IP(l,r);
        data[0]=l;
        data[1]=r;
-       des_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT);
-       des_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT);
-       des_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT);
+       DES_encrypt2((DES_LONG *)data,ks3,DES_DECRYPT);
+       DES_encrypt2((DES_LONG *)data,ks2,DES_ENCRYPT);
+       DES_encrypt2((DES_LONG *)data,ks1,DES_DECRYPT);
        l=data[0];
        r=data[1];
        FP(r,l);
@@ -299,3 +287,121 @@ des_key_schedule ks3;
        data[1]=r;
        }
 
+#ifndef DES_DEFAULT_OPTIONS
+
+#undef CBC_ENC_C__DONT_UPDATE_IV
+#include "ncbc_enc.c" /* DES_ncbc_encrypt */
+
+void DES_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
+                         long length, DES_key_schedule *ks1,
+                         DES_key_schedule *ks2, DES_key_schedule *ks3,
+                         DES_cblock *ivec, int enc)
+       {
+       register DES_LONG tin0,tin1;
+       register DES_LONG tout0,tout1,xor0,xor1;
+       register const unsigned char *in;
+       unsigned char *out;
+       register long l=length;
+       DES_LONG tin[2];
+       unsigned char *iv;
+
+       in=input;
+       out=output;
+       iv = &(*ivec)[0];
+
+       if (enc)
+               {
+               c2l(iv,tout0);
+               c2l(iv,tout1);
+               for (l-=8; l>=0; l-=8)
+                       {
+                       c2l(in,tin0);
+                       c2l(in,tin1);
+                       tin0^=tout0;
+                       tin1^=tout1;
+
+                       tin[0]=tin0;
+                       tin[1]=tin1;
+                       DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       tout0=tin[0];
+                       tout1=tin[1];
+
+                       l2c(tout0,out);
+                       l2c(tout1,out);
+                       }
+               if (l != -8)
+                       {
+                       c2ln(in,tin0,tin1,l+8);
+                       tin0^=tout0;
+                       tin1^=tout1;
+
+                       tin[0]=tin0;
+                       tin[1]=tin1;
+                       DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       tout0=tin[0];
+                       tout1=tin[1];
+
+                       l2c(tout0,out);
+                       l2c(tout1,out);
+                       }
+               iv = &(*ivec)[0];
+               l2c(tout0,iv);
+               l2c(tout1,iv);
+               }
+       else
+               {
+               register DES_LONG t0,t1;
+
+               c2l(iv,xor0);
+               c2l(iv,xor1);
+               for (l-=8; l>=0; l-=8)
+                       {
+                       c2l(in,tin0);
+                       c2l(in,tin1);
+
+                       t0=tin0;
+                       t1=tin1;
+
+                       tin[0]=tin0;
+                       tin[1]=tin1;
+                       DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       tout0=tin[0];
+                       tout1=tin[1];
+
+                       tout0^=xor0;
+                       tout1^=xor1;
+                       l2c(tout0,out);
+                       l2c(tout1,out);
+                       xor0=t0;
+                       xor1=t1;
+                       }
+               if (l != -8)
+                       {
+                       c2l(in,tin0);
+                       c2l(in,tin1);
+                       
+                       t0=tin0;
+                       t1=tin1;
+
+                       tin[0]=tin0;
+                       tin[1]=tin1;
+                       DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       tout0=tin[0];
+                       tout1=tin[1];
+               
+                       tout0^=xor0;
+                       tout1^=xor1;
+                       l2cn(tout0,tout1,out,l+8);
+                       xor0=t0;
+                       xor1=t1;
+                       }
+
+               iv = &(*ivec)[0];
+               l2c(xor0,iv);
+               l2c(xor1,iv);
+               }
+       tin0=tin1=tout0=tout1=xor0=xor1=0;
+       tin[0]=tin[1]=0;
+       }
+
+#endif /* DES_DEFAULT_OPTIONS */