absl::Status OpenKey()

in kmscng/main/bridge.cc [163:202]


absl::Status OpenKey(__inout NCRYPT_PROV_HANDLE hProvider,
                     __out NCRYPT_KEY_HANDLE* phKey, __in LPCWSTR pszKeyName,
                     __in_opt DWORD dwLegacyKeySpec, __in DWORD dwFlags) {
  LOG_IF(INFO, std::getenv(kVerboseLoggingEnvVariable))
      << "OpenKey invoked\n"
      << "Provider: " << hProvider << "\n"
      << "Key name: " << WideToString(std::wstring(pszKeyName)) << "\n"
      << "LegacyKeySpec: " << dwLegacyKeySpec << "\n"
      << "Flags: " << dwFlags << "\n\n";
  if (hProvider == 0) {
    return NewInvalidArgumentError("The provider handle cannot be null",
                                   NTE_INVALID_HANDLE, SOURCE_LOCATION);
  }
  if (phKey == nullptr) {
    return NewInvalidArgumentError("the key handle cannot be null",
                                   NTE_INVALID_PARAMETER, SOURCE_LOCATION);
  }
  if (!pszKeyName) {
    return NewInvalidArgumentError("the key name cannot be null",
                                   NTE_INVALID_PARAMETER, SOURCE_LOCATION);
  }
  if (dwLegacyKeySpec != AT_KEYEXCHANGE && dwLegacyKeySpec != AT_SIGNATURE) {
    return NewInvalidArgumentError(
        absl::StrFormat("unsupported legacy key spec specified: %u",
                        dwLegacyKeySpec),
        NTE_INVALID_PARAMETER, SOURCE_LOCATION);
  }
  dwFlags = dwFlags & ~NCRYPT_SILENT_FLAG;
  dwFlags = dwFlags & ~NCRYPT_MACHINE_KEY_FLAG;
  if (dwFlags != 0) {
    return NewInvalidArgumentError(
        absl::StrFormat("unsupported flag specified: %u", dwFlags),
        NTE_BAD_FLAGS, SOURCE_LOCATION);
  }

  ASSIGN_OR_RETURN(Object * object,
                   Object::New(hProvider, WideToString(pszKeyName)));
  *phKey = reinterpret_cast<NCRYPT_KEY_HANDLE>(object);
  return absl::OkStatus();
}