// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef DEVICE_FIDO_WIN_TYPE_CONVERSIONS_H_
#define DEVICE_FIDO_WIN_TYPE_CONVERSIONS_H_

#include <windows.h>

#include <optional>
#include <string>

#include "base/component_export.h"
#include "base/containers/flat_set.h"
#include "device/fido/authenticator_get_assertion_response.h"
#include "device/fido/authenticator_make_credential_response.h"
#include "device/fido/ctap_get_assertion_request.h"
#include "device/fido/fido_authenticator.h"
#include "device/fido/public/fido_constants.h"
#include "device/fido/public/fido_transport_protocol.h"
#include "device/fido/public/fido_types.h"
#include "third_party/blink/public/mojom/webauthn/authenticator.mojom-shared.h"
#include "third_party/microsoft_webauthn/src/webauthn.h"

namespace device {

class DiscoverableCredentialMetadata;
enum class GetAssertionStatus;
enum class MakeCredentialStatus;

COMPONENT_EXPORT(DEVICE_FIDO)
std::optional<AuthenticatorMakeCredentialResponse>
ToAuthenticatorMakeCredentialResponse(
    const WEBAUTHN_CREDENTIAL_ATTESTATION& credential_attestation);

COMPONENT_EXPORT(DEVICE_FIDO)
std::optional<AuthenticatorGetAssertionResponse>
ToAuthenticatorGetAssertionResponse(
    const WEBAUTHN_ASSERTION& credential_attestation,
    const CtapGetAssertionOptions& request_options);

COMPONENT_EXPORT(DEVICE_FIDO)
uint32_t ToWinUserVerificationRequirement(
    UserVerificationRequirement user_verification_requirement);

COMPONENT_EXPORT(DEVICE_FIDO)
uint32_t ToWinAuthenticatorAttachment(
    AuthenticatorAttachment authenticator_attachment);

COMPONENT_EXPORT(DEVICE_FIDO)
std::vector<WEBAUTHN_CREDENTIAL> ToWinCredentialVector(
    const std::vector<PublicKeyCredentialDescriptor>* credentials);

COMPONENT_EXPORT(DEVICE_FIDO)
std::vector<WEBAUTHN_CREDENTIAL_EX> ToWinCredentialExVector(
    const std::vector<PublicKeyCredentialDescriptor>* credentials);

COMPONENT_EXPORT(DEVICE_FIDO)
uint32_t ToWinLargeBlobSupport(LargeBlobSupport large_blob_support);

// WinErrorNameToMakeCredentialStatus maps a string returned by
// WebAuthNGetErrorName() to a MakeCredentialStatus.
COMPONENT_EXPORT(DEVICE_FIDO)
MakeCredentialStatus WinErrorNameToMakeCredentialStatus(
    std::u16string_view error_name);

// WinErrorNameToGetAssertionStatus maps a string returned by
// WebAuthNGetErrorName() to a GetAssertionStatus.
COMPONENT_EXPORT(DEVICE_FIDO)

GetAssertionStatus WinErrorNameToGetAssertionStatus(
    std::u16string_view error_name);

COMPONENT_EXPORT(DEVICE_FIDO)
uint32_t ToWinAttestationConveyancePreference(
    const AttestationConveyancePreference&,
    int api_version);

COMPONENT_EXPORT(DEVICE_FIDO)
std::vector<DiscoverableCredentialMetadata>
WinCredentialDetailsListToCredentialMetadata(
    const WEBAUTHN_CREDENTIAL_DETAILS_LIST& credentials);

COMPONENT_EXPORT(DEVICE_FIDO)
std::optional<FidoTransportProtocol> FromWinTransportsMask(
    const DWORD transport);

COMPONENT_EXPORT(DEVICE_FIDO)
base::flat_set<FidoTransportProtocol> FromWinTransportsBitmask(
    const DWORD transports);

COMPONENT_EXPORT(DEVICE_FIDO)
uint32_t ToWinTransportsMask(
    const base::flat_set<FidoTransportProtocol>& transports);

COMPONENT_EXPORT(DEVICE_FIDO)
std::vector<const wchar_t*> ToWinCredentialHints(
    base::span<const blink::mojom::Hint> hints);

// Utility functions for converting various structures to spans.
COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToAuthenticatorDataSpan(const WEBAUTHN_ASSERTION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToAuthenticatorDataSpan(
    const WEBAUTHN_CREDENTIAL_ATTESTATION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToUserIdSpan(const WEBAUTHN_ASSERTION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToCredentialIdSpan(
    const WEBAUTHN_CREDENTIAL_ATTESTATION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToAttestationSpan(
    const WEBAUTHN_CREDENTIAL_ATTESTATION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToAttestationObjectSpan(
    const WEBAUTHN_CREDENTIAL_ATTESTATION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToIdSpan(const WEBAUTHN_CREDENTIAL& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToIdSpan(const WEBAUTHN_CREDENTIAL_EX& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToIdSpan(const WEBAUTHN_USER_ENTITY_INFORMATION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToExtensionSpan(const WEBAUTHN_EXTENSION& in);

COMPONENT_EXPORT(DEVICE_FIDO)
base::span<const uint8_t> ToCredIdSpan(
    const WEBAUTHN_CRED_WITH_HMAC_SECRET_SALT& in);

}  // namespace device

#endif  // DEVICE_FIDO_WIN_TYPE_CONVERSIONS_H_
