reinclude crypto.h: this is needed in HEAD only to get the __fips_constseg definition
[openssl.git] / crypto / des / des_enc.c
index 3a30e64e568d5b57f01032514573e9ca4d5f6689..efe35aa3c589070ffc02db2798505fb220710edd 100644 (file)
  * [including the GNU Public Licence.]
  */
 
+#include <openssl/crypto.h>
 #include "des_locl.h"
+#include "spr.h"
 
-void des_encrypt(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 const unsigned char *des_SP=(const unsigned char *)des_SPtrans;
+       register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans;
 #endif
 #ifndef DES_UNROLL
        register int i;
@@ -75,7 +77,7 @@ void des_encrypt(DES_LONG *data, des_key_schedule ks, 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. */
@@ -84,7 +86,7 @@ void des_encrypt(DES_LONG *data, des_key_schedule ks, 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)
@@ -107,12 +109,10 @@ void des_encrypt(DES_LONG *data, des_key_schedule ks, int enc)
                D_ENCRYPT(l,r,28); /*  15 */
                D_ENCRYPT(r,l,30); /*  16 */
 #else
-               for (i=0; i<32; i+=8)
+               for (i=0; i<32; i+=4)
                        {
                        D_ENCRYPT(l,r,i+0); /*  1 */
                        D_ENCRYPT(r,l,i+2); /*  2 */
-                       D_ENCRYPT(l,r,i+4); /*  3 */
-                       D_ENCRYPT(r,l,i+6); /*  4 */
                        }
 #endif
                }
@@ -136,12 +136,10 @@ void des_encrypt(DES_LONG *data, des_key_schedule ks, int enc)
                D_ENCRYPT(l,r, 2); /*  2 */
                D_ENCRYPT(r,l, 0); /*  1 */
 #else
-               for (i=30; i>0; i-=8)
+               for (i=30; i>0; i-=4)
                        {
                        D_ENCRYPT(l,r,i-0); /* 16 */
                        D_ENCRYPT(r,l,i-2); /* 15 */
-                       D_ENCRYPT(l,r,i-4); /* 14 */
-                       D_ENCRYPT(r,l,i-6); /* 13 */
                        }
 #endif
                }
@@ -156,11 +154,11 @@ void des_encrypt(DES_LONG *data, des_key_schedule ks, int enc)
        l=r=t=u=0;
        }
 
-void des_encrypt2(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 const unsigned char *des_SP=(const unsigned char *)des_SPtrans;
+       register const unsigned char *des_SP=(const unsigned char *)DES_SPtrans;
 #endif
 #ifndef DES_UNROLL
        register int i;
@@ -172,7 +170,7 @@ void des_encrypt2(DES_LONG *data, des_key_schedule ks, 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. */
@@ -180,7 +178,7 @@ void des_encrypt2(DES_LONG *data, des_key_schedule ks, 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)
@@ -203,12 +201,10 @@ void des_encrypt2(DES_LONG *data, des_key_schedule ks, int enc)
                D_ENCRYPT(l,r,28); /*  15 */
                D_ENCRYPT(r,l,30); /*  16 */
 #else
-               for (i=0; i<32; i+=8)
+               for (i=0; i<32; i+=4)
                        {
                        D_ENCRYPT(l,r,i+0); /*  1 */
                        D_ENCRYPT(r,l,i+2); /*  2 */
-                       D_ENCRYPT(l,r,i+4); /*  3 */
-                       D_ENCRYPT(r,l,i+6); /*  4 */
                        }
 #endif
                }
@@ -232,12 +228,10 @@ void des_encrypt2(DES_LONG *data, des_key_schedule ks, int enc)
                D_ENCRYPT(l,r, 2); /*  2 */
                D_ENCRYPT(r,l, 0); /*  1 */
 #else
-               for (i=30; i>0; i-=8)
+               for (i=30; i>0; i-=4)
                        {
                        D_ENCRYPT(l,r,i-0); /* 16 */
                        D_ENCRYPT(r,l,i-2); /* 15 */
-                       D_ENCRYPT(l,r,i-4); /* 14 */
-                       D_ENCRYPT(r,l,i-6); /* 13 */
                        }
 #endif
                }
@@ -247,8 +241,8 @@ void des_encrypt2(DES_LONG *data, des_key_schedule ks, int enc)
        l=r=t=u=0;
        }
 
-void des_encrypt3(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;
 
@@ -257,9 +251,9 @@ void des_encrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2,
        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);
@@ -267,8 +261,8 @@ void des_encrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2,
        data[1]=r;
        }
 
-void des_decrypt3(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;
 
@@ -277,9 +271,9 @@ void des_decrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2,
        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);
@@ -289,83 +283,13 @@ void des_decrypt3(DES_LONG *data, des_key_schedule ks1, des_key_schedule ks2,
 
 #ifndef DES_DEFAULT_OPTIONS
 
-void des_ncbc_encrypt(const unsigned char *in, unsigned char *out, long length,
-            des_key_schedule schedule, des_cblock *ivec, int enc)
-       {
-       register DES_LONG tin0,tin1;
-       register DES_LONG tout0,tout1,xor0,xor1;
-       register long l=length;
-       DES_LONG tin[2];
-       unsigned char *iv;
-
-       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; tin[0]=tin0;
-                       tin1^=tout1; tin[1]=tin1;
-                       des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
-                       tout0=tin[0]; l2c(tout0,out);
-                       tout1=tin[1]; l2c(tout1,out);
-                       }
-               if (l != -8)
-                       {
-                       c2ln(in,tin0,tin1,l+8);
-                       tin0^=tout0; tin[0]=tin0;
-                       tin1^=tout1; tin[1]=tin1;
-                       des_encrypt((DES_LONG *)tin,schedule,DES_ENCRYPT);
-                       tout0=tin[0]; l2c(tout0,out);
-                       tout1=tin[1]; l2c(tout1,out);
-                       }
-               iv = &(*ivec)[0];
-               l2c(tout0,iv);
-               l2c(tout1,iv);
-               }
-       else
-               {
-               c2l(iv,xor0);
-               c2l(iv,xor1);
-               for (l-=8; l>=0; l-=8)
-                       {
-                       c2l(in,tin0); tin[0]=tin0;
-                       c2l(in,tin1); tin[1]=tin1;
-                       des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
-                       tout0=tin[0]^xor0;
-                       tout1=tin[1]^xor1;
-                       l2c(tout0,out);
-                       l2c(tout1,out);
-                       xor0=tin0;
-                       xor1=tin1;
-                       }
-               if (l != -8)
-                       {
-                       c2l(in,tin0); tin[0]=tin0;
-                       c2l(in,tin1); tin[1]=tin1;
-                       des_encrypt((DES_LONG *)tin,schedule,DES_DECRYPT);
-                       tout0=tin[0]^xor0;
-                       tout1=tin[1]^xor1;
-                       l2cn(tout0,tout1,out,l+8);
-                       xor0=tin0;
-                       xor1=tin1;
-                       }
-
-               iv = &(*ivec)[0];
-               l2c(xor0,iv);
-               l2c(xor1,iv);
-               }
-       tin0=tin1=tout0=tout1=xor0=xor1=0;
-       tin[0]=tin[1]=0;
-       }
+#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)
+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;
@@ -392,7 +316,7 @@ void des_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
 
                        tin[0]=tin0;
                        tin[1]=tin1;
-                       des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                        tout0=tin[0];
                        tout1=tin[1];
 
@@ -407,7 +331,7 @@ void des_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
 
                        tin[0]=tin0;
                        tin[1]=tin1;
-                       des_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       DES_encrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                        tout0=tin[0];
                        tout1=tin[1];
 
@@ -434,7 +358,7 @@ void des_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
 
                        tin[0]=tin0;
                        tin[1]=tin1;
-                       des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                        tout0=tin[0];
                        tout1=tin[1];
 
@@ -455,7 +379,7 @@ void des_ede3_cbc_encrypt(const unsigned char *input, unsigned char *output,
 
                        tin[0]=tin0;
                        tin[1]=tin1;
-                       des_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
+                       DES_decrypt3((DES_LONG *)tin,ks1,ks2,ks3);
                        tout0=tin[0];
                        tout1=tin[1];