in kmscng/main/bridge.cc [280:327]
absl::Status GetKeyProperty(__in NCRYPT_PROV_HANDLE hProvider,
__in NCRYPT_KEY_HANDLE hKey,
__in LPCWSTR pszProperty,
__out_bcount_part_opt(cbOutput, *pcbResult)
PBYTE pbOutput,
__in DWORD cbOutput, __out DWORD* pcbResult,
__in DWORD dwFlags) {
LOG_IF(INFO, std::getenv(kVerboseLoggingEnvVariable))
<< "GetKeyProperty invoked\n"
<< "Provider: " << hProvider << "\n"
<< "Key: " << hKey << "\n"
<< "Property name: " << WideToString(std::wstring(pszProperty)) << "\n"
<< "Output: " << uintptr_t(pbOutput) << "\n"
<< "Output size: " << cbOutput << "\n"
<< "Output result size: " << uintptr_t(pcbResult) << "\n"
<< "Flags: " << dwFlags << "\n\n";
ASSIGN_OR_RETURN(Object * object, ValidateKeyHandle(hProvider, hKey));
if (!pszProperty) {
return NewInvalidArgumentError("pszProperty cannot be null",
NTE_INVALID_PARAMETER, SOURCE_LOCATION);
}
if (!pcbResult) {
return NewInvalidArgumentError("pcbResult cannot be null",
NTE_INVALID_PARAMETER, SOURCE_LOCATION);
}
RETURN_IF_ERROR(ValidateFlags(dwFlags));
ASSIGN_OR_RETURN(std::string_view property_value,
object->GetProperty(pszProperty));
*pcbResult = property_value.size();
// Return size required to hold the property value if output buffer is null.
if (!pbOutput) {
return absl::OkStatus();
}
// Check provided buffer size to ensure the property value fits.
if (cbOutput < property_value.size()) {
return NewOutOfRangeError(
absl::StrFormat("cbOutput size=%u not large enough to fit "
"property value of size %u",
cbOutput, property_value.size()),
SOURCE_LOCATION);
}
property_value.copy(reinterpret_cast<char*>(pbOutput), property_value.size());
return absl::OkStatus();
}