Add the missing parts for DES CFB1 and CFB8.
[openssl.git] / crypto / evp / evp_lib.c
index 69784eb5554019757912c64b9f1d95d7b223de3d..b532c45de304ab2f9c8c4cb757d5df5dff833e74 100644 (file)
 
 #include <stdio.h>
 #include "cryptlib.h"
-#include "evp.h"
-#include "objects.h"
+#include <openssl/evp.h>
+#include <openssl/objects.h>
 
-int EVP_CIPHER_param_to_asn1(c,type)
-EVP_CIPHER_CTX *c;
-ASN1_TYPE *type;
+int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
        {
        int ret;
 
@@ -74,9 +72,7 @@ ASN1_TYPE *type;
        return(ret);
        }
 
-int EVP_CIPHER_asn1_to_param(c,type)
-EVP_CIPHER_CTX *c;
-ASN1_TYPE *type;
+int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
        {
        int ret;
 
@@ -87,31 +83,88 @@ ASN1_TYPE *type;
        return(ret);
        }
 
-int EVP_CIPHER_get_asn1_iv(c,type)
-EVP_CIPHER_CTX *c;
-ASN1_TYPE *type;
+int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
        {
-       int i=0,l;
+       int i=0;
+       unsigned int l;
 
        if (type != NULL) 
                {
                l=EVP_CIPHER_CTX_iv_length(c);
+               OPENSSL_assert(l <= sizeof(c->iv));
                i=ASN1_TYPE_get_octetstring(type,c->oiv,l);
-               memcpy(c->iv,c->oiv,l);
+               if (i != (int)l)
+                       return(-1);
+               else if (i > 0)
+                       memcpy(c->iv,c->oiv,l);
                }
        return(i);
        }
 
-int EVP_CIPHER_set_asn1_iv(c,type)
-EVP_CIPHER_CTX *c;
-ASN1_TYPE *type;
+int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
        {
-       int i=0,j;
+       int i=0;
+       unsigned int j;
 
        if (type != NULL)
                {
                j=EVP_CIPHER_CTX_iv_length(c);
+               OPENSSL_assert(j <= sizeof(c->iv));
                i=ASN1_TYPE_set_octetstring(type,c->oiv,j);
                }
        return(i);
        }
+
+/* Convert the various cipher NIDs and dummies to a proper OID NID */
+int EVP_CIPHER_type(const EVP_CIPHER *ctx)
+{
+       int nid;
+       ASN1_OBJECT *otmp;
+       nid = EVP_CIPHER_nid(ctx);
+
+       switch(nid) {
+
+               case NID_rc2_cbc:
+               case NID_rc2_64_cbc:
+               case NID_rc2_40_cbc:
+
+               return NID_rc2_cbc;
+
+               case NID_rc4:
+               case NID_rc4_40:
+
+               return NID_rc4;
+
+               case NID_aes_128_cfb128:
+               case NID_aes_128_cfb8:
+               case NID_aes_128_cfb1:
+
+               return NID_aes_128_cfb128;
+
+               case NID_aes_192_cfb128:
+               case NID_aes_192_cfb8:
+               case NID_aes_192_cfb1:
+
+               return NID_aes_192_cfb128;
+
+               case NID_aes_256_cfb128:
+               case NID_aes_256_cfb8:
+               case NID_aes_256_cfb1:
+
+               return NID_aes_256_cfb128;
+
+               case NID_des_cfb64:
+               case NID_des_cfb8:
+               case NID_des_cfb1:
+
+               return NID_des_cfb64;
+
+               default:
+               /* Check it has an OID and it is valid */
+               otmp = OBJ_nid2obj(nid);
+               if(!otmp || !otmp->data) nid = NID_undef;
+               ASN1_OBJECT_free(otmp);
+               return nid;
+       }
+}
+