// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.identity.authentication;

/// The modes in which an authentication UI protocol may operate.
type Mode = strict enum {
    /// Authenticate a user against existing authentication mechanism
    /// enrollment(s). For example, prove the user knows a password.
    AUTHENTICATE = 1;
    /// Create a new enrollment for an authentication mechanism. For example,
    /// set a password.
    ENROLL = 2;
};

/// A protocol for interactive enrollment of authentication mechanisms and
/// authentication using these mechanisms. The client of this protocol is
/// typically a user interface component and the server is the account system.
/// The server will close the channel when enrollment or authentication is
/// complete or when no further progress is possible.
///
/// Authentication and enrollment is performed using a set of more detailed
/// protocols specific to a particular authentication mechanism. The client of
/// these protocols is typically a user interface component and the server is
/// an authenticator component implementing that authentication mechanism. All
/// these protocols follow the same pattern where the authenticator follows the
/// following state machine:
///
///      +---------+  [wait conditions met]    +-----------+
///  O-->| WAITING |-------------------------->| VERIFYING |
///      +---------+                           +-----------+
///           ^                                      |
///           |             +-------+                |
///           +-------------| ERROR |<---------------+
///      [error reported]   +-------+    [verification failed]
///
/// On initialization, the authenticator is "WAITING" for some combination of
/// inputs from the UI (for example a password) and out of band events (for
/// example a touch on the fingerprint sensor). Once these conditions have all
/// been met the authenticator enters the "VERIFYING" state where it checks the
/// validity of the inputs. If verification succeeds the authenticator closes
/// the channel. If verification fails the authenticator enters the "ERROR"
/// state until the UI collects the description of the error, whereafter it
/// returns to the "WAITING" state. If the client closes the channel the
/// authentication or enrollment attempt is abandoned.
protocol Interaction {
    /// Begins interactive authentication or enrollment for a password. This
    /// method should only be called when a `WatchState` response indicated that
    /// password is available for the requested mode.
    ///
    /// The server will close the supplied `PasswordInteraction` channel if the
    /// requested mode or mechanism was invalid or when the authentication or
    /// enrollment is complete. Either event will cause a response to
    /// `WatchState`.
    StartPassword(resource struct {
        ui server_end:PasswordInteraction;
        mode Mode;
    });

    /// Returns the authentication mechanisms that are available to either
    /// authenticate or enroll. This method follows the "hanging get" interface
    /// pattern, returning immediately on the first call and hanging until a
    /// change in state on subsequent calls. Note that when a `Start*` method
    /// fails, `WatchState` will return, and may return the same set of
    /// mechanisms as the previous call.
    WatchState() -> (strict union {
        /// One or more mechanisms are available for authentication. Not all
        /// products allow multiple concurrent mechanisms, but when multiple
        /// mechanisms are allowed these are ordered from most preferred to
        /// least preferred as determined by the product.
        1: authenticate vector<Mechanism>:32;
        /// One or more mechanisms are available for enrollment. Not all
        /// products allow multiple concurrent mechanisms, but when multiple
        /// mechanisms are allowed these are ordered from most preferred to
        /// least preferred as determined by the product.
        2: enrollment vector<Mechanism>:32;
    });
};
