ASN1_item_verify needs to initialize ctx before any "goto err" can
[openssl.git] / crypto / asn1 / a_digest.c
index c838f60b46c5d1bee5ee3aca970673e77fa1d54d..d00d9e22b188708dbad146c02c1955ee5842279d 100644 (file)
 # include <sys/types.h>
 #endif
 
+#include <openssl/err.h>
 #include <openssl/evp.h>
 #include <openssl/buffer.h>
 #include <openssl/x509.h>
 
-int ASN1_digest(int (*i2d)(), EVP_MD *type, char *data, unsigned char *md,
-            unsigned int *len)
+#ifndef NO_ASN1_OLD
+
+int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data,
+               unsigned char *md, unsigned int *len)
        {
-       EVP_MD_CTX ctx;
        int i;
        unsigned char *str,*p;
 
        i=i2d(data,NULL);
-       if ((str=(unsigned char *)Malloc(i)) == NULL) return(0);
+       if ((str=(unsigned char *)OPENSSL_malloc(i)) == NULL)
+               {
+               ASN1err(ASN1_F_ASN1_DIGEST,ERR_R_MALLOC_FAILURE);
+               return(0);
+               }
        p=str;
        i2d(data,&p);
 
-       EVP_DigestInit(&ctx,type);
-       EVP_DigestUpdate(&ctx,str,i);
-       EVP_DigestFinal(&ctx,md,len);
-       Free(str);
+       EVP_Digest(str, i, md, len, type, NULL);
+       OPENSSL_free(str);
+       return(1);
+       }
+
+#endif
+
+
+int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *asn,
+               unsigned char *md, unsigned int *len)
+       {
+       int i;
+       unsigned char *str = NULL;
+
+       i=ASN1_item_i2d(asn,&str, it);
+       if (!str) return(0);
+
+       EVP_Digest(str, i, md, len, type, NULL);
+       OPENSSL_free(str);
        return(1);
        }