// Copyright 2021 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.
@available(added=7)
library fuchsia.wlan.common.security;

// This package defines types used to describe WLAN security protocols and
// authenticate.

/// WEP credentials.
type WepCredentials = struct {
    /// Unencoded WEP key.
    ///
    /// This field is always a binary key; ASCII hexadecimal encoding should not
    /// be used here.
    key bytes;
};

/// WPA credentials.
type WpaCredentials = flexible union {
    /// Unencoded pre-shared key (PSK).
    ///
    /// This field is always a binary PSK; ASCII hexadecimal encoding should not
    /// be used here.
    1: psk array<byte, 32>;
    /// UTF-8 encoded passphrase.
    ///
    /// This field is expected to use UTF-8 or compatible encoding. This is more
    /// permissive than the passphrase to PSK mapping specified in IEEE Std
    /// 802.11-2016 Appendix J.4, but UTF-8 is typically used in practice.
    2: passphrase bytes:63;
};

/// Credentials used to authenticate with a WLAN.
///
/// The variants of this union describe the credentials supported by a protocol
/// or protocol suite (i.e., WEP and WPA).
type Credentials = flexible union {
    1: wep WepCredentials;
    2: wpa WpaCredentials;
};

/// WLAN security protocols.
///
/// WPA protocols are additionally enumerated by their authentication suite
/// (i.e., Personal vs. Enterprise).
type Protocol = flexible enum {
    /// Open network security.
    ///
    /// This indicates that no security protocol or suite is used by a WLAN; it
    /// is not to be confused with "open authentication".
    OPEN = 1;
    WEP = 2;
    WPA1 = 3;
    WPA2_PERSONAL = 4;
    WPA2_ENTERPRISE = 5;
    WPA3_PERSONAL = 6;
    WPA3_ENTERPRISE = 7;
};

/// Pairs credentials with a particular security protocol. This type requires
/// validation, as `Protocol` and `Credentials` may disagree. FIDL APIs that use
/// this type generally restrict authentication to `protocol`.
type Authentication = struct {
    protocol Protocol;
    credentials Credentials:optional;
};
