1 /* 2 * Copyright 1995-2021 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* We need to use some engine deprecated APIs */ 11 #define OPENSSL_SUPPRESS_DEPRECATED 12 13 #include <stdio.h> 14 #include <time.h> 15 #include <sys/types.h> 16 17 #include "internal/cryptlib.h" 18 19 #include <openssl/engine.h> 20 #include <openssl/err.h> 21 #include <openssl/evp.h> 22 #include <openssl/buffer.h> 23 #include <openssl/x509.h> 24 #include "crypto/x509.h" 25 26 #ifndef OPENSSL_NO_DEPRECATED_3_0 27 28 int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data, 29 unsigned char *md, unsigned int *len) 30 { 31 int inl; 32 unsigned char *str, *p; 33 34 inl = i2d(data, NULL); 35 if (inl <= 0) { 36 ERR_raise(ERR_LIB_ASN1, ERR_R_INTERNAL_ERROR); 37 return 0; 38 } 39 if ((str = OPENSSL_malloc(inl)) == NULL) 40 return 0; 41 p = str; 42 i2d(data, &p); 43 44 if (!EVP_Digest(str, inl, md, len, type, NULL)) { 45 OPENSSL_free(str); 46 return 0; 47 } 48 OPENSSL_free(str); 49 return 1; 50 } 51 52 #endif 53 54 int ossl_asn1_item_digest_ex(const ASN1_ITEM *it, const EVP_MD *md, void *asn, 55 unsigned char *data, unsigned int *len, 56 OSSL_LIB_CTX *libctx, const char *propq) 57 { 58 int i, ret = 0; 59 unsigned char *str = NULL; 60 EVP_MD *fetched_md = (EVP_MD *)md; 61 62 i = ASN1_item_i2d(asn, &str, it); 63 if (i < 0 || str == NULL) 64 return 0; 65 66 if (EVP_MD_get0_provider(md) == NULL) { 67 #if !defined(OPENSSL_NO_ENGINE) 68 ENGINE *tmpeng = ENGINE_get_digest_engine(EVP_MD_get_type(md)); 69 70 if (tmpeng != NULL) 71 ENGINE_finish(tmpeng); 72 else 73 #endif 74 fetched_md = EVP_MD_fetch(libctx, EVP_MD_get0_name(md), propq); 75 } 76 if (fetched_md == NULL) 77 goto err; 78 79 ret = EVP_Digest(str, i, data, len, fetched_md, NULL); 80 err: 81 OPENSSL_free(str); 82 if (fetched_md != md) 83 EVP_MD_free(fetched_md); 84 return ret; 85 } 86 87 int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *md, void *asn, 88 unsigned char *data, unsigned int *len) 89 { 90 return ossl_asn1_item_digest_ex(it, md, asn, data, len, NULL, NULL); 91 } 92 93