pkix-verify.cpp revision e5996b7752d36e94746f991da154f641056528d8
/* $Id$ */
/** @file
* IPRT - Crypto - Public Key Infrastructure API, Verification.
*/
/*
* Copyright (C) 2006-2014 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
#ifdef IPRT_WITH_OPENSSL
# include "internal/iprt-openssl.h"
#endif
RTDECL(int) RTCrPkixPubKeyVerifySignature(PCRTASN1OBJID pAlgorithm, PCRTASN1DYNTYPE pParameters, PCRTASN1BITSTRING pPublicKey,
{
/*
* Valid input.
*/
if (pParameters)
{
pParameters = NULL;
}
/*
* Parameters are not currently supported (openssl code path).
*/
if (pParameters)
"Cipher algorithm parameters are not yet supported.");
/*
* Validate using IPRT.
*/
int rcIprt = RTCrPkixSignatureCreateByObjId(&hSignature, pAlgorithm, false /*fSigning*/, pPublicKey, pParameters);
if (RT_FAILURE(rcIprt))
if (RT_SUCCESS(rcIprt))
{
/* Calculate the digest. */
if (RT_SUCCESS(rcIprt))
{
if (RT_FAILURE(rcIprt))
}
else
}
else
#ifdef IPRT_WITH_OPENSSL
/*
* Validate using OpenSSL EVP.
*/
/* Translate the algorithm ID into a EVP message digest type pointer. */
if (!pEvpMdType)
/* Initialize the EVP message digest context. */
/* Create an EVP public key. */
int rcOssl;
if (pEvpPublicKey)
{
{
if (d2i_PublicKey(pEvpPublicKey->type, &pEvpPublicKey, &puchPublicKey, RTASN1BITSTRING_GET_BYTE_SIZE(pPublicKey)))
{
/* Digest the data. */
/* Verify the signature. */
if (EVP_VerifyFinal(&EvpMdCtx,
pEvpPublicKey) > 0)
else
}
else
}
else
/* Cleanup and return.*/
}
else
rcOssl = RTErrInfoSetF(pErrInfo, VERR_NO_MEMORY, "EVP_PKEY_new(%d) failed", pEvpMdType->required_pkey_type[0]);
/*
* Check the result.
*/
return VINF_SUCCESS;
return rcIprt;
if (RT_FAILURE_NP(rcOssl))
return rcOssl;
#endif /* IPRT_WITH_OPENSSL */
return rcIprt;
}