Algorithm parameter support.
[openssl.git] / crypto / evp / e_xcbc_d.c
index ab94630fd207af07fa81ee3ea653adf09658abc7..250e88c8c5d7520b8698a33b5fd84f8c758078a2 100644 (file)
  * [including the GNU Public Licence.]
  */
 
-#ifndef OPENSSL_NO_DES
 #include <stdio.h>
 #include "cryptlib.h"
+
+#ifndef OPENSSL_NO_DES
+
 #include <openssl/evp.h>
 #include <openssl/objects.h>
+#include "evp_locl.h"
 #include <openssl/des.h>
 
 static int desx_cbc_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                             const unsigned char *iv,int enc);
 static int desx_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
-                          const unsigned char *in, unsigned int inl);
+                          const unsigned char *in, size_t inl);
 
 
 typedef struct
     {
-    des_key_schedule ks;/* key schedule */
-    des_cblock inw;
-    des_cblock outw;
+    DES_key_schedule ks;/* key schedule */
+    DES_cblock inw;
+    DES_cblock outw;
     } DESX_CBC_KEY;
 
 #define data(ctx) ((DESX_CBC_KEY *)(ctx)->cipher_data)
@@ -89,6 +92,7 @@ static const EVP_CIPHER d_xcbc_cipher=
        sizeof(DESX_CBC_KEY),
        EVP_CIPHER_set_asn1_iv,
        EVP_CIPHER_get_asn1_iv,
+       NULL,
        NULL
        };
 
@@ -100,9 +104,9 @@ const EVP_CIPHER *EVP_desx_cbc(void)
 static int desx_cbc_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
                             const unsigned char *iv, int enc)
        {
-       des_cblock *deskey = (des_cblock *)key;
+       DES_cblock *deskey = (DES_cblock *)key;
 
-       des_set_key_unchecked(deskey,&data(ctx)->ks);
+       DES_set_key_unchecked(deskey,&data(ctx)->ks);
        memcpy(&data(ctx)->inw[0],&key[8],8);
        memcpy(&data(ctx)->outw[0],&key[16],8);
 
@@ -110,13 +114,25 @@ static int desx_cbc_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
        }
 
 static int desx_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
-                          const unsigned char *in, unsigned int inl)
+                          const unsigned char *in, size_t inl)
        {
-       des_xcbc_encrypt(in,out,inl,&data(ctx)->ks,
-                        (des_cblock *)&(ctx->iv[0]),
+       while (inl>=EVP_MAXCHUNK)
+               {
+               DES_xcbc_encrypt(in,out,(long)EVP_MAXCHUNK,&data(ctx)->ks,
+                        (DES_cblock *)&(ctx->iv[0]),
                         &data(ctx)->inw,
                         &data(ctx)->outw,
                         ctx->encrypt);
+               inl-=EVP_MAXCHUNK;
+               in +=EVP_MAXCHUNK;
+               out+=EVP_MAXCHUNK;
+               }
+       if (inl)
+               DES_xcbc_encrypt(in,out,(long)inl,&data(ctx)->ks,
+                       (DES_cblock *)&(ctx->iv[0]),
+                       &data(ctx)->inw,
+                       &data(ctx)->outw,
+                       ctx->encrypt);
        return 1;
        }
 #endif