# Copyright 2017 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# Contributing to Chrome DevTools Protocol: https://goo.gle/devtools-contribution-guide-cdp

# This domain allows configuring virtual authenticators to test the WebAuthn
# API.
experimental domain WebAuthn
  type AuthenticatorId extends string

  type AuthenticatorProtocol extends string
    enum
      # Universal 2nd Factor.
      u2f
      # Client To Authenticator Protocol 2.
      ctap2

  type Ctap2Version extends string
    enum
      ctap2_0
      ctap2_1

  type AuthenticatorTransport extends string
    enum
      # Cross-Platform authenticator attachments:
      usb
      nfc
      ble
      cable
      # Platform authenticator attachment:
      internal

  type VirtualAuthenticatorOptions extends object
    properties
      AuthenticatorProtocol protocol
      # Defaults to ctap2_0. Ignored if |protocol| == u2f.
      optional Ctap2Version ctap2Version
      AuthenticatorTransport transport
      # Defaults to false.
      optional boolean hasResidentKey
      # Defaults to false.
      optional boolean hasUserVerification
      # If set to true, the authenticator will support the largeBlob extension.
      # https://w3c.github.io/webauthn#largeBlob
      # Defaults to false.
      optional boolean hasLargeBlob
      # If set to true, the authenticator will support the credBlob extension.
      # https://fidoalliance.org/specs/fido-v2.1-rd-20201208/fido-client-to-authenticator-protocol-v2.1-rd-20201208.html#sctn-credBlob-extension
      # Defaults to false.
      optional boolean hasCredBlob
      # If set to true, the authenticator will support the minPinLength extension.
      # https://fidoalliance.org/specs/fido-v2.1-ps-20210615/fido-client-to-authenticator-protocol-v2.1-ps-20210615.html#sctn-minpinlength-extension
      # Defaults to false.
      optional boolean hasMinPinLength
      # If set to true, the authenticator will support the prf extension.
      # https://w3c.github.io/webauthn/#prf-extension
      # Defaults to false.
      optional boolean hasPrf
      # If set to true, tests of user presence will succeed immediately.
      # Otherwise, they will not be resolved. Defaults to true.
      optional boolean automaticPresenceSimulation
      # Sets whether User Verification succeeds or fails for an authenticator.
      # Defaults to false.
      optional boolean isUserVerified
      # Credentials created by this authenticator will have the backup
      # eligibility (BE) flag set to this value. Defaults to false.
      # https://w3c.github.io/webauthn/#sctn-credential-backup
      optional boolean defaultBackupEligibility
      # Credentials created by this authenticator will have the backup state
      # (BS) flag set to this value. Defaults to false.
      # https://w3c.github.io/webauthn/#sctn-credential-backup
      optional boolean defaultBackupState

  type Credential extends object
    properties
      binary credentialId
      boolean isResidentCredential
      # Relying Party ID the credential is scoped to. Must be set when adding a
      # credential.
      optional string rpId
      # The ECDSA P-256 private key in PKCS#8 format.
      binary privateKey
      # An opaque byte sequence with a maximum size of 64 bytes mapping the
      # credential to a specific user.
      optional binary userHandle
      # Signature counter. This is incremented by one for each successful
      # assertion.
      # See https://w3c.github.io/webauthn/#signature-counter
      integer signCount
      # The large blob associated with the credential.
      # See https://w3c.github.io/webauthn/#sctn-large-blob-extension
      optional binary largeBlob
      # Assertions returned by this credential will have the backup eligibility
      # (BE) flag set to this value. Defaults to the authenticator's
      # defaultBackupEligibility value.
      optional boolean backupEligibility
      # Assertions returned by this credential will have the backup state (BS)
      # flag set to this value. Defaults to the authenticator's
      # defaultBackupState value.
      optional boolean backupState
      # The credential's user.name property. Equivalent to empty if not set.
      # https://w3c.github.io/webauthn/#dom-publickeycredentialentity-name
      optional string userName
      # The credential's user.displayName property. Equivalent to empty if
      # not set.
      # https://w3c.github.io/webauthn/#dom-publickeycredentialuserentity-displayname
      optional string userDisplayName

  # Enable the WebAuthn domain and start intercepting credential storage and
  # retrieval with a virtual authenticator.
  command enable
    parameters
      # Whether to enable the WebAuthn user interface. Enabling the UI is
      # recommended for debugging and demo purposes, as it is closer to the real
      # experience. Disabling the UI is recommended for automated testing.
      # Supported at the embedder's discretion if UI is available.
      # Defaults to false.
      optional boolean enableUI

  # Disable the WebAuthn domain.
  command disable

  # Creates and adds a virtual authenticator.
  command addVirtualAuthenticator
    parameters
      VirtualAuthenticatorOptions options
    returns
      AuthenticatorId authenticatorId

  # Resets parameters isBogusSignature, isBadUV, isBadUP to false if they are not present.
  command setResponseOverrideBits
    parameters
      AuthenticatorId authenticatorId
      # If isBogusSignature is set, overrides the signature in the authenticator response to be zero.
      # Defaults to false.
      optional boolean isBogusSignature
      # If isBadUV is set, overrides the UV bit in the flags in the authenticator response to
      # be zero. Defaults to false.
      optional boolean isBadUV
      # If isBadUP is set, overrides the UP bit in the flags in the authenticator response to
      # be zero. Defaults to false.
      optional boolean isBadUP

  # Removes the given authenticator.
  command removeVirtualAuthenticator
    parameters
      AuthenticatorId authenticatorId

  # Adds the credential to the specified authenticator.
  command addCredential
    parameters
      AuthenticatorId authenticatorId
      Credential credential

  # Returns a single credential stored in the given virtual authenticator that
  # matches the credential ID.
  command getCredential
    parameters
      AuthenticatorId authenticatorId
      binary credentialId
    returns
      Credential credential

  # Returns all the credentials stored in the given virtual authenticator.
  command getCredentials
    parameters
      AuthenticatorId authenticatorId
    returns
      array of Credential credentials

  # Removes a credential from the authenticator.
  command removeCredential
    parameters
      AuthenticatorId authenticatorId
      binary credentialId

  # Clears all the credentials from the specified device.
  command clearCredentials
    parameters
      AuthenticatorId authenticatorId

  # Sets whether User Verification succeeds or fails for an authenticator.
  # The default is true.
  command setUserVerified
    parameters
      AuthenticatorId authenticatorId
      boolean isUserVerified

  # Sets whether tests of user presence will succeed immediately (if true) or fail to resolve (if false) for an authenticator.
  # The default is true.
  command setAutomaticPresenceSimulation
    parameters
      AuthenticatorId authenticatorId
      boolean enabled

  # Allows setting credential properties.
  # https://w3c.github.io/webauthn/#sctn-automation-set-credential-properties
  command setCredentialProperties
    parameters
      AuthenticatorId authenticatorId
      binary credentialId
      optional boolean backupEligibility
      optional boolean backupState

  # Triggered when a credential is added to an authenticator.
  event credentialAdded
    parameters
      AuthenticatorId authenticatorId
      Credential credential

  # Triggered when a credential is deleted, e.g. through
  # PublicKeyCredential.signalUnknownCredential().
  event credentialDeleted
    parameters
      AuthenticatorId authenticatorId
      binary credentialId

  # Triggered when a credential is updated, e.g. through
  # PublicKeyCredential.signalCurrentUserDetails().
  event credentialUpdated
    parameters
      AuthenticatorId authenticatorId
      Credential credential

  # Triggered when a credential is used in a webauthn assertion.
  event credentialAsserted
    parameters
      AuthenticatorId authenticatorId
      Credential credential
