MCPcopy Create free account
hub / github.com/OpenRCT2/OpenRCT2 / SignData

Method SignData

src/openrct2/core/Crypt.CNG.cpp:624–650  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

622{
623public:
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 {

Callers 2

TEST_FFunction · 0.45
SignMethod · 0.45

Calls 3

CngThrowOnBadStatusFunction · 0.85
ThrowBadAllocOnNullFunction · 0.85
GetKeyHandleMethod · 0.80

Tested by 1

TEST_FFunction · 0.36