/** @file
  This file defines the EFI EAP Configuration protocol.

  Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.5

**/

#ifndef __EFI_EAP_CONFIGURATION_PROTOCOL_H__
#define __EFI_EAP_CONFIGURATION_PROTOCOL_H__

///
/// EFI EAP Configuration protocol provides a way to set and get EAP configuration.
///
#define EFI_EAP_CONFIGURATION_PROTOCOL_GUID \
  { \
    0xe5b58dbb, 0x7688, 0x44b4, {0x97, 0xbf, 0x5f, 0x1d, 0x4b, 0x7c, 0xc8, 0xdb } \
  }

typedef struct _EFI_EAP_CONFIGURATION_PROTOCOL EFI_EAP_CONFIGURATION_PROTOCOL;

///
/// Make sure it not conflict with any real EapTypeXXX
///
#define EFI_EAP_TYPE_ATTRIBUTE 0

typedef enum {
  ///
  /// EFI_EAP_TYPE_ATTRIBUTE
  ///
  EfiEapConfigEapAuthMethod,
  EfiEapConfigEapSupportedAuthMethod,
  ///
  /// EapTypeIdentity
  ///
  EfiEapConfigIdentityString,
  ///
  /// EapTypeEAPTLS/EapTypePEAP
  ///
  EfiEapConfigEapTlsCACert,
  EfiEapConfigEapTlsClientCert,
  EfiEapConfigEapTlsClientPrivateKeyFile,
  EfiEapConfigEapTlsClientPrivateKeyFilePassword, // ASCII format, Volatile
  EfiEapConfigEapTlsCipherSuite,
  EfiEapConfigEapTlsSupportedCipherSuite,
  ///
  /// EapTypeMSChapV2
  ///
  EfiEapConfigEapMSChapV2Password, // UNICODE format, Volatile
  ///
  /// EapTypePEAP
  ///
  EfiEapConfigEap2ndAuthMethod,
  ///
  /// More...
  ///
} EFI_EAP_CONFIG_DATA_TYPE;

///
/// EFI_EAP_TYPE
///
typedef UINT8 EFI_EAP_TYPE;
#define EFI_EAP_TYPE_ATTRIBUTE      0
#define EFI_EAP_TYPE_IDENTITY       1
#define EFI_EAP_TYPE_NOTIFICATION   2
#define EFI_EAP_TYPE_NAK            3
#define EFI_EAP_TYPE_MD5CHALLENGE   4
#define EFI_EAP_TYPE_OTP            5
#define EFI_EAP_TYPE_GTC            6
#define EFI_EAP_TYPE_EAPTLS         13
#define EFI_EAP_TYPE_EAPSIM         18
#define EFI_EAP_TYPE_TTLS           21
#define EFI_EAP_TYPE_PEAP           25
#define EFI_EAP_TYPE_MSCHAPV2       26
#define EFI_EAP_TYPE_EAP_EXTENSION  33

/**
  Set EAP configuration data.

  The SetData() function sets EAP configuration to non-volatile storage or volatile
  storage.

  @param[in]  This                Pointer to the EFI_EAP_CONFIGURATION_PROTOCOL instance.
  @param[in]  EapType             EAP type.
  @param[in]  DataType            Configuration data type.
  @param[in]  Data                Pointer to configuration data.
  @param[in]  DataSize            Total size of configuration data.

  @retval EFI_SUCCESS             The EAP configuration data is set successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  Data is NULL.
                                  DataSize is 0.
  @retval EFI_UNSUPPORTED         The EapType or DataType is unsupported.
  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_EAP_CONFIGURATION_SET_DATA) (
  IN EFI_EAP_CONFIGURATION_PROTOCOL       *This,
  IN EFI_EAP_TYPE                         EapType,
  IN EFI_EAP_CONFIG_DATA_TYPE             DataType,
  IN VOID                                 *Data,
  IN UINTN                                DataSize
  );

/**
  Get EAP configuration data.

  The GetData() function gets EAP configuration.

  @param[in]       This           Pointer to the EFI_EAP_CONFIGURATION_PROTOCOL instance.
  @param[in]       EapType        EAP type.
  @param[in]       DataType       Configuration data type.
  @param[in, out]  Data           Pointer to configuration data.
  @param[in, out]  DataSize       Total size of configuration data. On input, it means
                                  the size of Data buffer. On output, it means the size
                                  of copied Data buffer if EFI_SUCCESS, and means the
                                  size of desired Data buffer if EFI_BUFFER_TOO_SMALL.

  @retval EFI_SUCCESS             The EAP configuration data is got successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  Data is NULL.
                                  DataSize is NULL.
  @retval EFI_UNSUPPORTED         The EapType or DataType is unsupported.
  @retval EFI_NOT_FOUND           The EAP configuration data is not found.
  @retval EFI_BUFFER_TOO_SMALL    The buffer is too small to hold the buffer.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_EAP_CONFIGURATION_GET_DATA) (
  IN EFI_EAP_CONFIGURATION_PROTOCOL       *This,
  IN EFI_EAP_TYPE                         EapType,
  IN EFI_EAP_CONFIG_DATA_TYPE             DataType,
  IN OUT VOID                             *Data,
  IN OUT UINTN                            *DataSize
  );

///
/// The EFI_EAP_CONFIGURATION_PROTOCOL
/// is designed to provide a way to set and get EAP configuration, such as Certificate,
/// private key file.
///
struct _EFI_EAP_CONFIGURATION_PROTOCOL {
  EFI_EAP_CONFIGURATION_SET_DATA          SetData;
  EFI_EAP_CONFIGURATION_GET_DATA          GetData;
};

extern EFI_GUID gEfiEapConfigurationProtocolGuid;

#endif
