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_SignFinal_ex(EVP_MD_CTX *ctx, unsigned char *sigret, 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 size_t sltmp; 25 EVP_PKEY_CTX *pkctx = NULL; 26 27 *siglen = 0; 28 if (EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_FINALISE)) { 29 if (!EVP_DigestFinal_ex(ctx, m, &m_len)) 30 goto err; 31 } else { 32 int rv = 0; 33 EVP_MD_CTX *tmp_ctx = EVP_MD_CTX_new(); 34 35 if (tmp_ctx == NULL) { 36 ERR_raise(ERR_LIB_EVP, ERR_R_MALLOC_FAILURE); 37 return 0; 38 } 39 rv = EVP_MD_CTX_copy_ex(tmp_ctx, ctx); 40 if (rv) 41 rv = EVP_DigestFinal_ex(tmp_ctx, m, &m_len); 42 EVP_MD_CTX_free(tmp_ctx); 43 if (!rv) 44 return 0; 45 } 46 47 sltmp = (size_t)EVP_PKEY_get_size(pkey); 48 i = 0; 49 pkctx = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, propq); 50 if (pkctx == NULL) 51 goto err; 52 if (EVP_PKEY_sign_init(pkctx) <= 0) 53 goto err; 54 if (EVP_PKEY_CTX_set_signature_md(pkctx, EVP_MD_CTX_get0_md(ctx)) <= 0) 55 goto err; 56 if (EVP_PKEY_sign(pkctx, sigret, &sltmp, m, m_len) <= 0) 57 goto err; 58 *siglen = sltmp; 59 i = 1; 60 err: 61 EVP_PKEY_CTX_free(pkctx); 62 return i; 63} 64 65int EVP_SignFinal(EVP_MD_CTX *ctx, unsigned char *sigret, 66 unsigned int *siglen, EVP_PKEY *pkey) 67{ 68 return EVP_SignFinal_ex(ctx, sigret, siglen, pkey, NULL, NULL); 69} 70