| 650 | } |
| 651 | |
| 652 | bool VerifyData(const RsaKey& key, const void* data, size_t dataLen, const void* sig, size_t sigLen) override |
| 653 | { |
| 654 | auto hKey = static_cast<const CngRsaKey&>(key).GetKeyHandle(); |
| 655 | auto [cbHash, pbHash] = HashData(data, dataLen); |
| 656 | auto [cbSignature, pbSignature] = ToHeap(sig, sigLen); |
| 657 | |
| 658 | BCRYPT_PKCS1_PADDING_INFO paddingInfo{ BCRYPT_SHA256_ALGORITHM }; |
| 659 | auto status = BCryptVerifySignature(hKey, &paddingInfo, pbHash, cbHash, pbSignature, cbSignature, BCRYPT_PAD_PKCS1); |
| 660 | HeapFree(GetProcessHeap(), 0, pbSignature); |
| 661 | return status == ERROR_SUCCESS; |
| 662 | } |
| 663 | |
| 664 | private: |
| 665 | static std::tuple<DWORD, PBYTE> HashData(const void* data, size_t dataLen) |