Third phase of EVP cipher overhaul.
authorDr. Stephen Henson <steve@openssl.org>
Sun, 28 May 2000 12:44:46 +0000 (12:44 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Sun, 28 May 2000 12:44:46 +0000 (12:44 +0000)
Remove duplicated code in EVP.

34 files changed:
CHANGES
crypto/evp/e_cbc_3d.c
crypto/evp/e_cbc_bf.c
crypto/evp/e_cbc_c.c
crypto/evp/e_cbc_d.c
crypto/evp/e_cbc_i.c
crypto/evp/e_cbc_r2.c
crypto/evp/e_cbc_r5.c
crypto/evp/e_cfb_3d.c
crypto/evp/e_cfb_bf.c
crypto/evp/e_cfb_c.c
crypto/evp/e_cfb_d.c
crypto/evp/e_cfb_i.c
crypto/evp/e_cfb_r2.c
crypto/evp/e_cfb_r5.c
crypto/evp/e_ecb_3d.c
crypto/evp/e_ecb_bf.c
crypto/evp/e_ecb_c.c
crypto/evp/e_ecb_d.c
crypto/evp/e_ecb_i.c
crypto/evp/e_ecb_r2.c
crypto/evp/e_ecb_r5.c
crypto/evp/e_ofb_3d.c
crypto/evp/e_ofb_bf.c
crypto/evp/e_ofb_c.c
crypto/evp/e_ofb_d.c
crypto/evp/e_ofb_i.c
crypto/evp/e_ofb_r2.c
crypto/evp/e_ofb_r5.c
crypto/evp/e_rc4.c
crypto/evp/e_xcbc_d.c
crypto/evp/evp.h
crypto/evp/evp_enc.c
crypto/evp/evp_err.c

diff --git a/CHANGES b/CHANGES
index e57e0f4fc6d04f4c889900598987cee48965109c..c002077345f53b433ff547036e5954f17ed6a705 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,17 @@
 
  Changes between 0.9.5a and 0.9.6  [xx XXX 2000]
 
+  *) Remove lots of duplicated code from the EVP library. For example *every*
+     cipher init() function handles the 'iv' in the same way according to the
+     cipher mode. They also all do nothing if the 'key' parameter is NULL and
+     for CFB and OFB modes they zero ctx->num.
+
+     By shifting this to the top level EVP_CipherInit() it can be removed from
+     all individual ciphers. If the cipher wants to handle IVs or keys
+     differently it can set the EVP_CIPH_CUSTOM_IV or EVP_CIPH_ALWAYS_CALL_INIT
+     flags.
+     [Steve Henson]
+
   *) In ssl/s2_clnt.c and ssl/s3_clnt.c, call ERR_clear_error() when
      the handshake is continued after ssl_verify_cert_chain();
      otherwise, if SSL_VERIFY_NONE is set, remaining error codes
@@ -23,7 +34,6 @@
      Change lots of functions like EVP_EncryptUpdate() to now return a
      value: although software versions of the algorithms cannot fail
      any installed hardware versions can.
-
      [Steve Henson]
 
   *) Implement SSL_OP_TLS_ROLLBACK_BUG: In ssl3_get_client_key_exchange, if
index 7ee7851c5549a7e11adfe79f885d90f8ab7c18df..bf58d4920d28a2f5810fb9e67a957eddc533f668 100644 (file)
@@ -113,18 +113,11 @@ static int des_cbc_ede_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               memcpy( (char *)ctx->c.des_ede.ks3,
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       memcpy( (char *)ctx->c.des_ede.ks3,
                        (char *)ctx->c.des_ede.ks1,
                        sizeof(ctx->c.des_ede.ks1));
-               }
        return 1;
        }
 
@@ -133,16 +126,10 @@ static int des_cbc_ede3_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
 
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
-               }
        return 1;
        }
 
index feda9e7e02fff79f88427cfcc0834ae8ec5eb146..a2e14132666570decbe73c68e57222f1a3dc9b74 100644 (file)
@@ -89,11 +89,7 @@ EVP_CIPHER *EVP_bf_cbc(void)
 static int bf_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index d910f67cc59fe24a896b820aea741a427efad148..8164f2b1cdded4c711d7d6b17712da882487ac1c 100644 (file)
@@ -90,11 +90,7 @@ EVP_CIPHER *EVP_cast5_cbc(void)
 static int cast_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index 817d354358556cd5557de30ef179fe7af74cbd9b..2c9287b5837abad5c38fb46f62b81564957eeede 100644 (file)
@@ -91,11 +91,7 @@ static int des_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               des_set_key_unchecked(deskey,ctx->c.des_ks);
+       des_set_key_unchecked(deskey,ctx->c.des_ks);
        return 1;
        }
 
index 56869b577be228f7c4d7dda950e79e69fc0d924e..c2c023a1b81c24a401a6a95ecdc6df70256fe395 100644 (file)
@@ -90,22 +90,15 @@ EVP_CIPHER *EVP_idea_cbc(void)
 static int idea_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
+       if (enc) idea_set_encrypt_key(key,&(ctx->c.idea_ks));
+       else
                {
-               if (enc)
-                       idea_set_encrypt_key(key,&(ctx->c.idea_ks));
-               else
-                       {
-                       IDEA_KEY_SCHEDULE tmp;
+               IDEA_KEY_SCHEDULE tmp;
 
-                       idea_set_encrypt_key(key,&tmp);
-                       idea_set_decrypt_key(&tmp,&(ctx->c.idea_ks));
-                       memset((unsigned char *)&tmp,0,
+               idea_set_encrypt_key(key,&tmp);
+               idea_set_decrypt_key(&tmp,&(ctx->c.idea_ks));
+               memset((unsigned char *)&tmp,0,
                                sizeof(IDEA_KEY_SCHEDULE));
-                       }
                }
        return 1;
        }
index 5e91c9d21ea2ed098f24ff57e8177a7d32be42ff..3552b67417ccff35683031054ac2af722296d0d1 100644 (file)
@@ -139,11 +139,7 @@ EVP_CIPHER *EVP_rc2_40_cbc(void)
 static int rc2_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
+       RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
                        key,EVP_CIPHER_key_length(ctx->cipher)*8);
        return 1;
        }
index 1639a08cdde11d11bcbe74830fed0250e255326a..616644df273dc253952cce7042bbb0c1c4cb1bc2 100644 (file)
@@ -90,11 +90,7 @@ EVP_CIPHER *EVP_rc5_32_12_16_cbc(void)
 static int r_32_12_16_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,
+       RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,
                        key,RC5_12_ROUNDS);
        return 1;
        }
index b07d90a03635db7c55b6c71379bb1cdbe25a7a8a..140832703a4598703c6d10ae2c5faa68782f27bc 100644 (file)
@@ -113,19 +113,11 @@ static int des_ede_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               memcpy( (char *)ctx->c.des_ede.ks3,
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       memcpy( (char *)ctx->c.des_ede.ks3,
                        (char *)ctx->c.des_ede.ks1,
                        sizeof(ctx->c.des_ede.ks1));
-               }
        return 1;
        }
 
@@ -134,17 +126,9 @@ static int des_ede3_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
-               }
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
        return 1;
        }
 
index c1e7a7c935ec9f177dee7ce149d8fbbfa2fe1a47..b82139ac408550ba052c4675f7be8d1d11a9f6b5 100644 (file)
@@ -89,13 +89,7 @@ EVP_CIPHER *EVP_bf_cfb(void)
 static int bf_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index d29e5948a4ccdbc95e23c4680c941e62405c56b1..bbdeac24f48bf2830a40e10dbb68af9f855315a0 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_cast5_cfb(void)
 static int cast_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index 63d4dff68145d43a03aae0748594ebc02462e3de..72a26e32cfcb1c5d71fd9937820a79daaddb1f16 100644 (file)
@@ -91,13 +91,7 @@ static int des_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               des_set_key_unchecked(deskey,ctx->c.des_ks);
+       des_set_key_unchecked(deskey,ctx->c.des_ks);
        return 1;
        }
 
index d0da6e03823ec4d5c87076e63a7a439b8cfb5814..eb5b8f400dfae0d3ca43b5fda9a5c28d68e59085 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_idea_cfb(void)
 static int idea_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               idea_set_encrypt_key(key,&(ctx->c.idea_ks));
+       idea_set_encrypt_key(key,&(ctx->c.idea_ks));
        return 1;
        }
 
index 2e0fd53763f92539a79da2b10488efc0add864b5..661bfad8b4d8e44d854fac27bf7129d9d04e3dce 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_rc2_cfb(void)
 static int rc2_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
+       RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
                        key,EVP_CIPHER_key_length(ctx->cipher)*8);
        return 1;
        }
index bd092b4cd541b27c556442d5c9616eaa73e7cd58..730fcc4fac5dc533251c45717f3ebac8f0826b89 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_rc5_32_12_16_cfb(void)
 static int rc5_32_12_16_cfb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,key,
+       RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,key,
                        RC5_12_ROUNDS);
        return 1;
        }
index 157fb9e6a844c0ba8fb89bd07c638fc39923eed7..f024b0068fb2adfaa8ef40d086903d580ff348d8 100644 (file)
@@ -113,14 +113,11 @@ static int des_ede_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               memcpy( (char *)ctx->c.des_ede.ks3,
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       memcpy( (char *)ctx->c.des_ede.ks3,
                        (char *)ctx->c.des_ede.ks1,
                        sizeof(ctx->c.des_ede.ks1));
-               }
        return 1;
        }
 
@@ -129,12 +126,9 @@ static int des_ede3_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
-               }
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
        return 1;
        }
 
index c38e56d491a2397bc5114647ecc2b853620b9fdf..b63577900d6ba4538551adff05e900eb35ae4929 100644 (file)
@@ -89,8 +89,7 @@ EVP_CIPHER *EVP_bf_ecb(void)
 static int bf_ecb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (key != NULL)
-               BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index 4b18dcc1b7cb5364a5fd58ef3ec3bd8ab38edf45..3d59b89eeba53aed6d9b66f0038a2265ff16fe26 100644 (file)
@@ -90,8 +90,7 @@ EVP_CIPHER *EVP_cast5_ecb(void)
 static int cast_ecb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (key != NULL)
-               CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index fb15670e7ae92ebcdd343ccfb7916afe096af300..deac93b01ae0503b087ec951596d6c9ab1e4c84d 100644 (file)
@@ -91,8 +91,7 @@ static int des_ecb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       if (deskey != NULL)
-               des_set_key_unchecked(deskey,ctx->c.des_ks);
+       des_set_key_unchecked(deskey,ctx->c.des_ks);
        return 1;
        }
 
index a9bc977a5e12bc9279d9a91756fe2f591db3c253..ab8b64e7231f9484db6ed1bd8a8ea1e94198cc76 100644 (file)
@@ -90,19 +90,16 @@ EVP_CIPHER *EVP_idea_ecb(void)
 static int idea_ecb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (key != NULL)
-               {
-               if (enc)
+       if (enc)
                        idea_set_encrypt_key(key,&(ctx->c.idea_ks));
-               else
-                       {
-                       IDEA_KEY_SCHEDULE tmp;
+       else
+               {
+               IDEA_KEY_SCHEDULE tmp;
 
-                       idea_set_encrypt_key(key,&tmp);
-                       idea_set_decrypt_key(&tmp, &(ctx->c.idea_ks));
-                       memset((unsigned char *)&tmp,0,
+               idea_set_encrypt_key(key,&tmp);
+               idea_set_decrypt_key(&tmp, &(ctx->c.idea_ks));
+               memset((unsigned char *)&tmp,0,
                                sizeof(IDEA_KEY_SCHEDULE));
-                       }
                }
        return 1;
        }
index b6ff7b77a524137c2b17f493ffde732ad8b8155e..596b78ba721d489029fea93d55a84eb38d560ddb 100644 (file)
@@ -90,9 +90,8 @@ EVP_CIPHER *EVP_rc2_ecb(void)
 static int rc2_ecb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (key != NULL)
-               RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
-                       key,EVP_CIPHER_key_length(ctx->cipher)*8);
+       RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
+               key,EVP_CIPHER_key_length(ctx->cipher)*8);
        return 1;
        }
 
index ba55e41a6ccb8485b695b49721d8991c704d67c9..1baadb7be5a01dde23bcb1136c0493709034c514 100644 (file)
@@ -90,8 +90,7 @@ EVP_CIPHER *EVP_rc5_32_12_16_ecb(void)
 static int rc5_32_12_16_ecb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (key != NULL)
-               RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,key,
+       RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,key,
                        RC5_12_ROUNDS);
        return 1;
        }
index f8b3141935acb728069e8e34b3bf9230586dd686..14ac11c31e4c6f09cdbefd605fc7232f29242e55 100644 (file)
@@ -113,19 +113,12 @@ static int des_ede_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               memcpy( (char *)ctx->c.des_ede.ks3,
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       memcpy( (char *)ctx->c.des_ede.ks3,
                        (char *)ctx->c.des_ede.ks1,
                        sizeof(ctx->c.des_ede.ks1));
-               }
+
        return 1;
        }
 
@@ -134,17 +127,10 @@ static int des_ede3_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       ctx->num=0;
+       des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
+       des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
+       des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
 
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(&deskey[0],ctx->c.des_ede.ks1);
-               des_set_key_unchecked(&deskey[1],ctx->c.des_ede.ks2);
-               des_set_key_unchecked(&deskey[2],ctx->c.des_ede.ks3);
-               }
        return 1;
        }
 
index f5507a22f74f5b85dfbaabc74a00567c11b8d5a5..6d4b62a3913f8161e246f55f81d12c356f268f76 100644 (file)
@@ -89,13 +89,7 @@ EVP_CIPHER *EVP_bf_ofb(void)
 static int bf_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       BF_set_key(&(ctx->c.bf_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index b84a42d7f5104e56478ae8cdbd03d52dd722162a..20c843c22f86c758d628c15e193122dd9b4917b6 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_cast5_ofb(void)
 static int cast_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
+       CAST_set_key(&(ctx->c.cast_ks),EVP_CIPHER_CTX_key_length(ctx),key);
        return 1;
        }
 
index b52ebdc016c59635ea33f06a30b3169830ab35bc..0926e9cb7bf728339ec136d492ca98aca116aba3 100644 (file)
@@ -90,14 +90,7 @@ static int des_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
        des_cblock *deskey = (des_cblock *)key;
-
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               des_set_key_unchecked(deskey,ctx->c.des_ks);
+       des_set_key_unchecked(deskey,ctx->c.des_ks);
        return 1;
        }
 
index 36c14b492e1ddb57c5d4b3c81714128bb24f24b4..b6f6aa2f530dee092e4b9e7aceda21d390cac018 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_idea_ofb(void)
 static int idea_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               idea_set_encrypt_key(key,&(ctx->c.idea_ks));
+       idea_set_encrypt_key(key,&(ctx->c.idea_ks));
        return 1;
        }
 
index bfbd60261622abb52e4a5c289a048cfbc432296c..b71cc78bcbc50cbb70fd479f133b8bc432dc7fe4 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_rc2_ofb(void)
 static int rc2_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
+       RC2_set_key(&(ctx->c.rc2_ks),EVP_CIPHER_CTX_key_length(ctx),
                        key,EVP_CIPHER_key_length(ctx->cipher)*8);
        return 1;
        }
index d97d8843a46ca260f6f5f0c280297d28cdce25eb..3eba2790c16349a28184e879eab83a55bf5fe582 100644 (file)
@@ -90,13 +90,7 @@ EVP_CIPHER *EVP_rc5_32_12_16_ofb(void)
 static int rc5_32_12_16_ofb_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       ctx->num=0;
-
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (key != NULL)
-               RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,key,
+       RC5_32_set_key(&(ctx->c.rc5_ks),EVP_RC5_32_12_16_KEY_SIZE,key,
                        RC5_12_ROUNDS);
        return 1;
        }
index bc108f4356d69f082ebe6c294b7fff33fd26951e..42839aef6bcf81001182771e7506aa152baecfa4 100644 (file)
@@ -110,8 +110,7 @@ EVP_CIPHER *EVP_rc4_40(void)
 static int rc4_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
             unsigned char *iv, int enc)
        {
-       if (key != NULL)
-               memcpy(&(ctx->c.rc4.key[0]),key,EVP_CIPHER_CTX_key_length(ctx));
+       memcpy(&(ctx->c.rc4.key[0]),key,EVP_CIPHER_CTX_key_length(ctx));
        RC4_set_key(&(ctx->c.rc4.ks),EVP_CIPHER_CTX_key_length(ctx),
                ctx->c.rc4.key);
        return 1;
index 067b721a0f5dfa066270053690f5f82796771bae..e5dcdebe16f62fef5e651d489d4f0f5da9844008 100644 (file)
@@ -91,15 +91,10 @@ static int desx_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
        {
        des_cblock *deskey = (des_cblock *)key;
 
-       if (iv != NULL)
-               memcpy(&(ctx->oiv[0]),iv,8);
-       memcpy(&(ctx->iv[0]),&(ctx->oiv[0]),8);
-       if (deskey != NULL)
-               {
-               des_set_key_unchecked(deskey,ctx->c.desx_cbc.ks);
-               memcpy(&(ctx->c.desx_cbc.inw[0]),&(key[8]),8);
-               memcpy(&(ctx->c.desx_cbc.outw[0]),&(key[16]),8);
-               }
+       des_set_key_unchecked(deskey,ctx->c.desx_cbc.ks);
+       memcpy(&(ctx->c.desx_cbc.inw[0]),&(key[8]),8);
+       memcpy(&(ctx->c.desx_cbc.outw[0]),&(key[16]),8);
+
        return 1;
        }
 
index 110e02f41bf52ee09b8bd84ac839aa60c5a71189..2c41c7ef0c5cd4f9f780649a1cd899955eb07f5a 100644 (file)
@@ -335,19 +335,25 @@ struct evp_cipher_st
        int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Populate a ASN1_TYPE with parameters */
        int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *); /* Get parameters from a ASN1_TYPE */
        int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr); /* Miscellaneous operations */
+       void *app_data;         /* Application data */
        };
 
 /* Values for cipher flags */
 
-/* Modes for block ciphers */
+/* Modes for ciphers */
 
+#define                EVP_CIPH_STREAM_CIPHER          0x0
 #define                EVP_CIPH_ECB_MODE               0x1
 #define                EVP_CIPH_CBC_MODE               0x2
 #define                EVP_CIPH_CFB_MODE               0x3
 #define                EVP_CIPH_OFB_MODE               0x4
-#define        EVP_CIPH_BLOCK_MODES            0x7
+#define        EVP_CIPH_MODE                   0x7
 /* Set if variable length cipher */
 #define        EVP_CIPH_VARIABLE_LENGTH        0x8
+/* Set if the iv handling should be done by the cipher itself */
+#define        EVP_CIPH_CUSTOM_IV              0x10
+/* Set if the cipher's init() function should be called if key is NULL */
+#define        EVP_CIPH_ALWAYS_CALL_INIT       0x20
 
 
 typedef struct evp_cipher_info_st
@@ -455,6 +461,8 @@ typedef int (EVP_PBE_KEYGEN)(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
 #define EVP_CIPHER_block_size(e)       ((e)->block_size)
 #define EVP_CIPHER_key_length(e)       ((e)->key_len)
 #define EVP_CIPHER_iv_length(e)                ((e)->iv_len)
+#define EVP_CIPHER_flags(e)            ((e)->flags)
+#define EVP_CIPHER_mode(e)             ((e)->flags) & EVP_CIPH_MODE)
 
 #define EVP_CIPHER_CTX_cipher(e)       ((e)->cipher)
 #define EVP_CIPHER_CTX_nid(e)          ((e)->cipher->nid)
@@ -464,6 +472,8 @@ typedef int (EVP_PBE_KEYGEN)(EVP_CIPHER_CTX *ctx, const char *pass, int passlen,
 #define EVP_CIPHER_CTX_get_app_data(e) ((e)->app_data)
 #define EVP_CIPHER_CTX_set_app_data(e,d) ((e)->app_data=(char *)(d))
 #define EVP_CIPHER_CTX_type(c)         EVP_CIPHER_type(EVP_CIPHER_CTX_cipher(c))
+#define EVP_CIPHER_CTX_flags(e)                ((e)->cipher->flags)
+#define EVP_CIPHER_CTX_mode(e)         ((e)->cipher->flags & EVP_CIPH_MODE)
 
 #define EVP_ENCODE_LENGTH(l)   (((l+2)/3*4)+(l/48+1)*2+80)
 #define EVP_DECODE_LENGTH(l)   ((l+3)/4*3+80)
@@ -709,6 +719,7 @@ void EVP_PBE_cleanup(void);
 
 /* Function codes. */
 #define EVP_F_D2I_PKEY                                  100
+#define EVP_F_EVP_CIPHERINIT                            123
 #define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH             122
 #define EVP_F_EVP_DECRYPTFINAL                          101
 #define EVP_F_EVP_MD_CTX_COPY                           110
@@ -748,6 +759,7 @@ void EVP_PBE_cleanup(void);
 #define EVP_R_IV_TOO_LARGE                              102
 #define EVP_R_KEYGEN_FAILURE                            120
 #define EVP_R_MISSING_PARAMETERS                        103
+#define EVP_R_NO_CIPHER_SET                             131
 #define EVP_R_NO_DSA_PARAMETERS                                 116
 #define EVP_R_NO_SIGN_FUNCTION_CONFIGURED               104
 #define EVP_R_NO_VERIFY_FUNCTION_CONFIGURED             105
index dc1116ebbcfa7236903b0211a467b5622d3663a1..09f7d7ea5ec16e505bedebb07149cb456127a430 100644 (file)
@@ -69,11 +69,47 @@ void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx)
        /* ctx->cipher=NULL; */
        }
 
-int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *data,
+int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
             unsigned char *key, unsigned char *iv, int enc)
        {
-       if (enc) return EVP_EncryptInit(ctx,data,key,iv);
-       else return EVP_DecryptInit(ctx,data,key,iv);
+       if(enc) enc = 1;
+       if (cipher) {
+               ctx->cipher=cipher;
+               ctx->key_len = cipher->key_len;
+       } else if(!ctx->cipher) {
+               EVPerr(EVP_F_EVP_CIPHERINIT, EVP_R_NO_CIPHER_SET);
+               return 0;
+       }
+       if(!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
+               switch(EVP_CIPHER_CTX_mode(ctx)) {
+
+                       case EVP_CIPH_STREAM_CIPHER:
+                       case EVP_CIPH_ECB_MODE:
+                       break;
+
+                       case EVP_CIPH_CFB_MODE:
+                       case EVP_CIPH_OFB_MODE:
+
+                       ctx->num = 0;
+
+                       case EVP_CIPH_CBC_MODE:
+
+                       if(iv) memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
+                       memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
+                       break;
+
+                       default:
+                       return 0;
+                       break;
+               }
+       }
+
+       if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
+               if(!ctx->cipher->init(ctx,key,iv,enc)) return 0;
+       }
+       ctx->encrypt=enc;
+       ctx->buf_len=0;
+       return 1;
        }
 
 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
@@ -94,29 +130,13 @@ int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
 int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
             unsigned char *key, unsigned char *iv)
        {
-       if (cipher != NULL)
-               {
-               ctx->cipher=cipher;
-               ctx->key_len = cipher->key_len;
-               }
-       if(!ctx->cipher->init(ctx,key,iv,1)) return 0;
-       ctx->encrypt=1;
-       ctx->buf_len=0;
-       return 1;
+       return EVP_CipherInit(ctx, cipher, key, iv, 1);
        }
 
 int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
             unsigned char *key, unsigned char *iv)
        {
-       if (cipher != NULL)
-               {
-               ctx->cipher=cipher;
-               ctx->key_len = cipher->key_len;
-               }
-       if(!ctx->cipher->init(ctx,key,iv,0)) return 0;
-       ctx->encrypt=0;
-       ctx->buf_len=0;
-       return 1;
+       return EVP_CipherInit(ctx, cipher, key, iv, 0);
        }
 
 
index 335466bfc2a6fe6deb2edac5ed90b61dbbaba116..d48d9442b2b8c319f21c74cfe4387cd0f6befc38 100644 (file)
@@ -67,6 +67,7 @@
 static ERR_STRING_DATA EVP_str_functs[]=
        {
 {ERR_PACK(0,EVP_F_D2I_PKEY,0), "D2I_PKEY"},
+{ERR_PACK(0,EVP_F_EVP_CIPHERINIT,0),   "EVP_CipherInit"},
 {ERR_PACK(0,EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH,0),    "EVP_CIPHER_CTX_set_key_length"},
 {ERR_PACK(0,EVP_F_EVP_DECRYPTFINAL,0), "EVP_DecryptFinal"},
 {ERR_PACK(0,EVP_F_EVP_MD_CTX_COPY,0),  "EVP_MD_CTX_copy"},
@@ -109,6 +110,7 @@ static ERR_STRING_DATA EVP_str_reasons[]=
 {EVP_R_IV_TOO_LARGE                      ,"iv too large"},
 {EVP_R_KEYGEN_FAILURE                    ,"keygen failure"},
 {EVP_R_MISSING_PARAMETERS                ,"missing parameters"},
+{EVP_R_NO_CIPHER_SET                     ,"no cipher set"},
 {EVP_R_NO_DSA_PARAMETERS                 ,"no dsa parameters"},
 {EVP_R_NO_SIGN_FUNCTION_CONFIGURED       ,"no sign function configured"},
 {EVP_R_NO_VERIFY_FUNCTION_CONFIGURED     ,"no verify function configured"},