aboutsummaryrefslogtreecommitdiffstats
path: root/crypto/evp/e_cbc_r2.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/evp/e_cbc_r2.c')
-rw-r--r--crypto/evp/e_cbc_r2.c107
1 files changed, 105 insertions, 2 deletions
diff --git a/crypto/evp/e_cbc_r2.c b/crypto/evp/e_cbc_r2.c
index 4f8002f16d..9175e53550 100644
--- a/crypto/evp/e_cbc_r2.c
+++ b/crypto/evp/e_cbc_r2.c
@@ -68,11 +68,25 @@ static void rc2_cbc_init_key(EVP_CIPHER_CTX *ctx, unsigned char *key,
unsigned char *iv,int enc);
static void rc2_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
unsigned char *in, unsigned int inl);
+static int rc2_meth_to_magic(EVP_CIPHER *e);
+static EVP_CIPHER *rc2_magic_to_meth(int i);
+static int rc2_set_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
+static int rc2_get_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
+
#else
+
static void rc2_cbc_init_key();
static void rc2_cbc_cipher();
+static int rc2_meth_to_magic();
+static EVP_CIPHER *rc2_magic_to_meth();
+static int rc2_set_asn1_type_and_iv();
+static int rc2_get_asn1_type_and_iv();
#endif
+#define RC2_40_MAGIC 0xa0
+#define RC2_64_MAGIC 0x78
+#define RC2_128_MAGIC 0x3a
+
static EVP_CIPHER r2_cbc_cipher=
{
NID_rc2_cbc,
@@ -82,8 +96,21 @@ static EVP_CIPHER r2_cbc_cipher=
NULL,
sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)),
- EVP_CIPHER_get_asn1_iv,
- EVP_CIPHER_set_asn1_iv,
+ rc2_set_asn1_type_and_iv,
+ rc2_get_asn1_type_and_iv,
+ };
+
+static EVP_CIPHER r2_64_cbc_cipher=
+ {
+ NID_rc2_40_cbc,
+ 8,8 /* 64 bit */,8,
+ rc2_cbc_init_key,
+ rc2_cbc_cipher,
+ NULL,
+ sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
+ sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)),
+ rc2_set_asn1_type_and_iv,
+ rc2_get_asn1_type_and_iv,
};
static EVP_CIPHER r2_40_cbc_cipher=
@@ -95,6 +122,8 @@ static EVP_CIPHER r2_40_cbc_cipher=
NULL,
sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+
sizeof((((EVP_CIPHER_CTX *)NULL)->c.rc2_ks)),
+ rc2_set_asn1_type_and_iv,
+ rc2_get_asn1_type_and_iv,
};
EVP_CIPHER *EVP_rc2_cbc()
@@ -102,6 +131,11 @@ EVP_CIPHER *EVP_rc2_cbc()
return(&r2_cbc_cipher);
}
+EVP_CIPHER *EVP_rc2_64_cbc()
+ {
+ return(&r2_64_cbc_cipher);
+ }
+
EVP_CIPHER *EVP_rc2_40_cbc()
{
return(&r2_40_cbc_cipher);
@@ -133,4 +167,73 @@ unsigned int inl;
ctx->encrypt);
}
+static int rc2_meth_to_magic(e)
+EVP_CIPHER *e;
+ {
+ int i;
+
+ i=EVP_CIPHER_key_length(e);
+ if (i == 128) return(RC2_128_MAGIC);
+ else if (i == 64) return(RC2_64_MAGIC);
+ else if (i == 40) return(RC2_40_MAGIC);
+ else return(0);
+ }
+
+static EVP_CIPHER *rc2_magic_to_meth(i)
+int i;
+ {
+ if (i == RC2_128_MAGIC) return(EVP_rc2_cbc());
+ else if (i == RC2_64_MAGIC) return(EVP_rc2_64_cbc());
+ else if (i == RC2_40_MAGIC) return(EVP_rc2_40_cbc());
+ else
+ {
+ EVPerr(EVP_F_RC2_MAGIC_TO_METH,EVP_R_UNSUPPORTED_KEY_SIZE);
+ return(NULL);
+ }
+ }
+
+int rc2_get_asn1_type_and_iv(c,type)
+EVP_CIPHER_CTX *c;
+ASN1_TYPE *type;
+ {
+ long num=0;
+ int i=0,l;
+ EVP_CIPHER *e;
+
+ if (type != NULL)
+ {
+ l=EVP_CIPHER_CTX_iv_length(c);
+ i=ASN1_TYPE_get_int_octetstring(type,&num,c->oiv,l);
+ if (i != l)
+ return(-1);
+ else if (i > 0)
+ memcpy(c->iv,c->oiv,l);
+ e=rc2_magic_to_meth((int)num);
+ if (e == NULL)
+ return(-1);
+ if (e != EVP_CIPHER_CTX_cipher(c))
+ {
+ EVP_CIPHER_CTX_cipher(c)=e;
+ rc2_cbc_init_key(c,NULL,NULL,1);
+ }
+ }
+ return(i);
+ }
+
+static int rc2_set_asn1_type_and_iv(c,type)
+EVP_CIPHER_CTX *c;
+ASN1_TYPE *type;
+ {
+ long num;
+ int i=0,j;
+
+ if (type != NULL)
+ {
+ num=rc2_meth_to_magic(EVP_CIPHER_CTX_cipher(c));
+ j=EVP_CIPHER_CTX_iv_length(c);
+ i=ASN1_TYPE_set_int_octetstring(type,num,c->oiv,j);
+ }
+ return(i);
+ }
+
#endif