From bdb8337ecb6c58ac4bb97c2ec8f01d945473a163 Mon Sep 17 00:00:00 2001 From: Aidan Lee Date: Sun, 11 Aug 2024 16:25:43 +0100 Subject: [PATCH] simplify getProperty --- src/hx/libs/ssl/windows/Cng.h | 56 +++++++++++++++++------------- src/hx/libs/ssl/windows/Digest.cpp | 6 ++-- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/hx/libs/ssl/windows/Cng.h b/src/hx/libs/ssl/windows/Cng.h index cf3dc993b..21c485826 100644 --- a/src/hx/libs/ssl/windows/Cng.h +++ b/src/hx/libs/ssl/windows/Cng.h @@ -10,38 +10,46 @@ namespace hx { namespace windows { - template - T getProperty(BCRYPT_HANDLE handle, const wchar_t* prop) + struct CngObject { - hx::EnterGCFreeZone(); + BCRYPT_HANDLE handle; - auto result = DWORD{ 0 }; - auto size = ULONG{ 0 }; - if (!BCRYPT_SUCCESS(result = BCryptGetProperty(handle, prop, nullptr, 0, &size, 0))) - { - hx::ExitGCFreeZone(); - hx::Throw(HX_CSTRING("Failed to get property size : ") + hx::ssl::windows::utils::NTStatusErrorToString(result)); - } + virtual ~CngObject() = 0; + + CngObject(BCRYPT_HANDLE inHandle) : handle(inHandle) {} - auto buffer = std::vector(size); - if (!BCRYPT_SUCCESS(result = BCryptGetProperty(handle, prop, buffer.data(), buffer.size(), &size, 0))) + template + T getProperty(const wchar_t* prop) const { + hx::EnterGCFreeZone(); + + auto result = DWORD{ 0 }; + auto cb = ULONG{ 0 }; + + auto buffer = T(); + if (!BCRYPT_SUCCESS(result = BCryptGetProperty(handle, prop, reinterpret_cast(&buffer), sizeof(T), &cb, 0))) + { + hx::ExitGCFreeZone(); + hx::Throw(HX_CSTRING("Failed to get property : ") + hx::ssl::windows::utils::NTStatusErrorToString(result)); + } + hx::ExitGCFreeZone(); - hx::Throw(HX_CSTRING("Failed to get property : ") + hx::ssl::windows::utils::NTStatusErrorToString(result)); + + return buffer; } - hx::ExitGCFreeZone(); + void setProperty(const wchar_t* prop) const + { - return static_cast(buffer[0]); - } + } + }; - struct CngHash + struct CngHash : CngObject { - BCRYPT_HASH_HANDLE handle; std::unique_ptr> object; CngHash(BCRYPT_HASH_HANDLE inHandle, std::unique_ptr> inObject) - : handle(inHandle) + : CngObject(inHandle) , object(std::move(inObject)) { // @@ -97,7 +105,7 @@ namespace hx Array finish() const { auto result = DWORD{ 0 }; - auto length = getProperty(handle, BCRYPT_HASH_LENGTH); + auto length = getProperty(BCRYPT_HASH_LENGTH); auto output = Array(length, length); hx::EnterGCFreeZone(); @@ -114,9 +122,9 @@ namespace hx } }; - struct CngAlgorithm + struct CngAlgorithm : CngObject { - CngAlgorithm(BCRYPT_ALG_HANDLE inHandle) : handle(inHandle) {} + CngAlgorithm(BCRYPT_ALG_HANDLE inHandle) : CngObject(inHandle) {} public: BCRYPT_ALG_HANDLE handle; @@ -126,13 +134,13 @@ namespace hx BCryptCloseAlgorithmProvider(handle, 0); } - std::unique_ptr hash() + std::unique_ptr hash() const { hx::EnterGCFreeZone(); auto result = DWORD{ 0 }; auto hHash = BCRYPT_HASH_HANDLE(); - auto object = std::make_unique>(getProperty(handle, BCRYPT_OBJECT_LENGTH)); + auto object = std::make_unique>(getProperty(BCRYPT_OBJECT_LENGTH)); if (!BCRYPT_SUCCESS(result = BCryptCreateHash(handle, &hHash, object->data(), object->size(), nullptr, 0, BCRYPT_HASH_REUSABLE_FLAG))) { diff --git a/src/hx/libs/ssl/windows/Digest.cpp b/src/hx/libs/ssl/windows/Digest.cpp index 8842c4993..c08ec09f5 100644 --- a/src/hx/libs/ssl/windows/Digest.cpp +++ b/src/hx/libs/ssl/windows/Digest.cpp @@ -9,7 +9,7 @@ Array _hx_ssl_dgst_make(Array buffer, String algId hx::strbuf buf; auto algorithm = hx::ssl::windows::CngAlgorithm::create(algId.wchar_str(&buf)); - auto hash = algorithm->hash(); + auto hash = algorithm->hash(); hash->hash(buffer); @@ -24,7 +24,7 @@ Array _hx_ssl_dgst_sign(Array buffer, Dynamic hpke auto algorithm = algId.wchar_str(&buf); auto alg = hx::ssl::windows::CngAlgorithm::create(algorithm); auto hash = alg->hash(); - auto hashed = std::vector(hx::ssl::windows::getProperty(hash->handle, BCRYPT_HASH_LENGTH)); + auto hashed = std::vector(hash->getProperty(BCRYPT_HASH_LENGTH)); hash->hash(buffer); hash->finish(hashed.data(), hashed.size()); @@ -63,7 +63,7 @@ bool _hx_ssl_dgst_verify(Array buffer, Array sign, auto algorithm = algId.wchar_str(&buf); auto alg = hx::ssl::windows::CngAlgorithm::create(algorithm); auto hash = alg->hash(); - auto hashed = std::vector(hx::ssl::windows::getProperty(hash->handle, BCRYPT_HASH_LENGTH)); + auto hashed = std::vector(hash->getProperty(BCRYPT_HASH_LENGTH)); hash->hash(buffer); hash->finish(hashed.data(), hashed.size());