in azure-protected-vm-secrets/Windows/WincryptX509.cpp [188:249]
bool WincryptX509::VerifySignature(std::vector<unsigned char> const&signedData, std::vector<unsigned char> const&signature)
{
// Display the certificate
DWORD dwData;
void* pvData;
BCRYPT_KEY_HANDLE hKey;
CryptImportPublicKeyInfoEx2(
this->pLeafCertContext->dwCertEncodingType,
&this->pLeafCertContext->pCertInfo->SubjectPublicKeyInfo,
0,
nullptr,
&hKey
);
if (hKey == NULL)
{
// LibraryError, WinCrypt subclass, certLoadError
throw WinCryptError("CryptImportPublicKeyInfoEx2 failed.", GetLastError(),
ErrorCode::LibraryError_Bcrypt_keyError);
}
BCRYPT_ALG_HANDLE hHashAlg = NULL;
NTSTATUS status = BCryptOpenAlgorithmProvider(&hHashAlg, BCRYPT_SHA256_ALGORITHM, NULL, 0);
if (status != STATUS_SUCCESS)
{
// LibraryError, Bcrypt subclass, providerError
throw BcryptError(status, "BCryptOpenAlgorithmProvider - Hash Algorithm",
ErrorCode::LibraryError_Bcrypt_providerError);
}
PUCHAR pbHash = (PUCHAR)malloc(32);
DWORD cbHash = 32;
status = BCryptHash(hHashAlg, NULL, 0, (PUCHAR)signedData.data(), signedData.size(), pbHash, 32);
if (status != STATUS_SUCCESS)
{
// CryptographyError, Hash subclass, hashError
free(pbHash);
BCryptCloseAlgorithmProvider(hHashAlg, 0);
throw BcryptError(status, "X509 Signature Verification Hash Calculation",
ErrorCode::CryptographyError_Hash_hashError);
}
BCRYPT_PKCS1_PADDING_INFO paddingInfo = { 0 };
paddingInfo.pszAlgId = BCRYPT_SHA256_ALGORITHM;
status = BCryptVerifySignature(hKey, &paddingInfo, pbHash, 32, (PUCHAR)signature.data(), signature.size(), BCRYPT_PAD_PKCS1);
if (status != STATUS_SUCCESS)
{
// CryptographyError, Signing subclass, verificationError
free(pbHash);
BCryptCloseAlgorithmProvider(hHashAlg, 0);
throw BcryptError(status, "X509 Signature Verification",
ErrorCode::CryptographyError_Signing_verifyError);
}
if (pbHash != NULL) {
free(pbHash);
}
BCryptCloseAlgorithmProvider(hHashAlg, 0);
if (hKey != NULL) {
BCryptDestroyKey(hKey);
}
return true;
}