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#include <stdio.h> 11#include "internal/cryptlib.h" 12#include <openssl/evp.h> 13#include <openssl/objects.h> 14#include <openssl/x509.h> 15#include "crypto/evp.h" 16 17int EVP_VerifyFinal_ex(EVP_MD_CTX *ctx, const unsigned char *sigbuf, 18 unsigned int siglen, EVP_PKEY *pkey, OSSL_LIB_CTX *libctx, 19 const char *propq) 20{ 21 unsigned char m[EVP_MAX_MD_SIZE]; 22 unsigned int m_len = 0; 23 int i = 0; 24 EVP_PKEY_CTX *pkctx = NULL; 25 26 if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_FINALISE)) { 27 if (!EVP_DigestFinal_ex(ctx, m, &m_len)) 28 goto err; 29 } else { 30 int rv = 0; 31 EVP_MD_CTX *tmp_ctx = EVP_MD_CTX_new(); 32 33 if (tmp_ctx == NULL) { 34 ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE); 35 return 0; 36 } 37 rv = EVP_MD_CTX_copy_ex(tmp_ctx, ctx); 38 if (rv) 39 rv = EVP_DigestFinal_ex(tmp_ctx, m, &m_len); 40 EVP_MD_CTX_free(tmp_ctx); 41 if (!rv) 42 return 0; 43 } 44 45 i = -1; 46 pkctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, propq); 47 if (pkctx == NULL) 48 goto err; 49 if (EVP_PKEY_verify_init(pkctx) <= 0) 50 goto err; 51 if (EVP_PKEY_CTX_set_signature_md(pkctx, EVP_MD_CTX_get0_md(ctx)) <= 0) 52 goto err; 53 i = EVP_PKEY_verify(pkctx, sigbuf, siglen, m, m_len); 54 err: 55 EVP_PKEY_CTX_free(pkctx); 56 return i; 57} 58 59int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf, 60 unsigned int siglen, EVP_PKEY *pkey) 61{ 62 return EVP_VerifyFinal_ex(ctx, sigbuf, siglen, pkey, NULL, NULL); 63} 64