Home | History | Annotate | Line # | Download | only in evp
      1 /*
      2  * Copyright 1995-2023 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 
     17 int 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_EVP_LIB);
     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         else
     41             rv = EVP_DigestFinal_ex(ctx, m, &m_len);
     42         EVP_MD_CTX_free(tmp_ctx);
     43         if (!rv)
     44             return 0;
     45     }
     46 
     47     i = -1;
     48     pkctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, propq);
     49     if (pkctx == NULL)
     50         goto err;
     51     if (EVP_PKEY_verify_init(pkctx) <= 0)
     52         goto err;
     53     if (EVP_PKEY_CTX_set_signature_md(pkctx, EVP_MD_CTX_get0_md(ctx)) <= 0)
     54         goto err;
     55     i = EVP_PKEY_verify(pkctx, sigbuf, siglen, m, m_len);
     56 err:
     57     EVP_PKEY_CTX_free(pkctx);
     58     return i;
     59 }
     60 
     61 int EVP_VerifyFinal(EVP_MD_CTX *ctx, const unsigned char *sigbuf,
     62     unsigned int siglen, EVP_PKEY *pkey)
     63 {
     64     return EVP_VerifyFinal_ex(ctx, sigbuf, siglen, pkey, NULL, NULL);
     65 }
     66