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

  Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution. The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

  @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