dev_crypto_md5_copy: return error if allocating to_md->data fails
[oweals/openssl.git] / crypto / evp / evp_lib.c
index 096e4a459e4e347ad36ba65fb51e256babc413f8..2a87570b9e4fdd31b5a9f10a6903056ed614e828 100644 (file)
@@ -67,6 +67,16 @@ int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
 
        if (c->cipher->set_asn1_parameters != NULL)
                ret=c->cipher->set_asn1_parameters(c,type);
+       else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
+               {
+               if (EVP_CIPHER_CTX_mode(c) == EVP_CIPH_WRAP_MODE)
+                       {
+                       ASN1_TYPE_set(type, V_ASN1_NULL, NULL);
+                       ret = 1;
+                       }
+               else
+                       ret=EVP_CIPHER_set_asn1_iv(c, type);
+               }
        else
                ret=-1;
        return(ret);
@@ -78,6 +88,12 @@ int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
 
        if (c->cipher->get_asn1_parameters != NULL)
                ret=c->cipher->get_asn1_parameters(c,type);
+       else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1)
+               {
+               if (EVP_CIPHER_CTX_mode(c) == EVP_CIPH_WRAP_MODE)
+                       return 1;
+               ret=EVP_CIPHER_get_asn1_iv(c, type);
+               }
        else
                ret=-1;
        return(ret);
@@ -159,6 +175,12 @@ int EVP_CIPHER_type(const EVP_CIPHER *ctx)
 
                return NID_des_cfb64;
 
+               case NID_des_ede3_cfb64:
+               case NID_des_ede3_cfb8:
+               case NID_des_ede3_cfb1:
+
+               return NID_des_cfb64;
+
                default:
                /* Check it has an OID and it is valid */
                otmp = OBJ_nid2obj(nid);
@@ -168,18 +190,17 @@ int EVP_CIPHER_type(const EVP_CIPHER *ctx)
        }
 }
 
-size_t EVP_CIPHER_block_size(const EVP_CIPHER *e)
+int EVP_CIPHER_block_size(const EVP_CIPHER *e)
        {
        return e->block_size;
        }
 
-size_t EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
+int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
        {
        return ctx->cipher->block_size;
        }
 
-size_t EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
-                 const unsigned char *in, size_t inl)
+int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl)
        {
        return ctx->cipher->do_cipher(ctx,out,in,inl);
        }
@@ -209,22 +230,22 @@ void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
        ctx->app_data = data;
        }
 
-size_t EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
+int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
        {
        return cipher->iv_len;
        }
 
-size_t EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
+int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
        {
        return ctx->cipher->iv_len;
        }
 
-size_t EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
+int EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
        {
        return cipher->key_len;
        }
 
-size_t EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
+int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
        {
        return ctx->key_len;
        }
@@ -239,7 +260,7 @@ int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
        return ctx->cipher->nid;
        }
 
-size_t EVP_MD_block_size(const EVP_MD *md) 
+int EVP_MD_block_size(const EVP_MD *md) 
        {
        return md->block_size;
        }
@@ -254,13 +275,21 @@ int EVP_MD_pkey_type(const EVP_MD *md)
        return md->pkey_type;
        }
 
-size_t EVP_MD_size(const EVP_MD *md)
+int EVP_MD_size(const EVP_MD *md)
        {
        if (!md)
+               {
+               EVPerr(EVP_F_EVP_MD_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL);
                return -1;
+               }
        return md->md_size;
        }
 
+unsigned long EVP_MD_flags(const EVP_MD *md)
+       {
+       return md->flags;
+       }
+
 const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
        {
        if (!ctx)
@@ -282,3 +311,18 @@ int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
        {
        return (ctx->flags & flags);
        }
+
+void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
+       {
+       ctx->flags |= flags;
+       }
+
+void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
+       {
+       ctx->flags &= ~flags;
+       }
+
+int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
+       {
+       return (ctx->flags & flags);
+       }