| 622 | { |
| 623 | public: |
| 624 | std::vector<uint8_t> SignData(const RsaKey& key, const void* data, size_t dataLen) override |
| 625 | { |
| 626 | auto hKey = static_cast<const CngRsaKey&>(key).GetKeyHandle(); |
| 627 | auto [cbHash, pbHash] = HashData(data, dataLen); |
| 628 | auto [cbSignature, pbSignature] = std::tuple<DWORD, PBYTE>(); |
| 629 | try |
| 630 | { |
| 631 | BCRYPT_PKCS1_PADDING_INFO paddingInfo{ BCRYPT_SHA256_ALGORITHM }; |
| 632 | auto status = BCryptSignHash(hKey, &paddingInfo, pbHash, cbHash, NULL, 0, &cbSignature, BCRYPT_PAD_PKCS1); |
| 633 | CngThrowOnBadStatus("BCryptSignHash", status); |
| 634 | pbSignature = reinterpret_cast<PBYTE>(HeapAlloc(GetProcessHeap(), 0, cbSignature)); |
| 635 | ThrowBadAllocOnNull(pbSignature); |
| 636 | status = BCryptSignHash( |
| 637 | hKey, &paddingInfo, pbHash, cbHash, pbSignature, cbSignature, &cbSignature, BCRYPT_PAD_PKCS1); |
| 638 | CngThrowOnBadStatus("BCryptSignHash", status); |
| 639 | |
| 640 | auto result = std::vector<uint8_t>(pbSignature, pbSignature + cbSignature); |
| 641 | HeapFree(GetProcessHeap(), 0, pbSignature); |
| 642 | return result; |
| 643 | } |
| 644 | catch (std::exception&) |
| 645 | { |
| 646 | HeapFree(GetProcessHeap(), 0, pbHash); |
| 647 | HeapFree(GetProcessHeap(), 0, pbSignature); |
| 648 | throw; |
| 649 | } |
| 650 | } |
| 651 | |
| 652 | bool VerifyData(const RsaKey& key, const void* data, size_t dataLen, const void* sig, size_t sigLen) override |
| 653 | { |