/** @file
  EFI TLS Configuration Protocol as defined in UEFI 2.5.
  The EFI TLS Configuration Protocol provides a way to set and get TLS configuration.

  Copyright (c) 2016, 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_TLS_CONFIGURATION_PROTOCOL_H__
#define __EFI_TLS_CONFIGURATION_PROTOCOL_H__

///
/// The EFI Configuration protocol provides a way to set and get TLS configuration.
///
#define EFI_TLS_CONFIGURATION_PROTOCOL_GUID  \
  { \
    0x1682fe44, 0xbd7a, 0x4407, { 0xb7, 0xc7, 0xdc, 0xa3, 0x7c, 0xa3, 0x92, 0x2d }  \
  }

typedef struct _EFI_TLS_CONFIGURATION_PROTOCOL EFI_TLS_CONFIGURATION_PROTOCOL;

///
/// EFI_TLS_CONFIG_DATA_TYPE
///
typedef enum {
  ///
  /// Local host configuration data: public certificate data.
  /// This data should be DER-encoded binary X.509 certificate 
  /// or PEM-encoded X.509 certificate.
  ///
  EfiTlsConfigDataTypeHostPublicCert,
  ///
  /// Local host configuration data: private key data.
  ///
  EfiTlsConfigDataTypeHostPrivateKey,
  ///
  /// CA certificate to verify peer. This data should be PEM-encoded 
  /// RSA or PKCS#8 private key.
  ///
  EfiTlsConfigDataTypeCACertificate,
  ///
  /// CA-supplied Certificate Revocation List data. This data should
  /// be DER-encoded CRL data.
  ///
  EfiTlsConfigDataTypeCertRevocationList,

  EfiTlsConfigDataTypeMaximum

} EFI_TLS_CONFIG_DATA_TYPE;

/**
  Set TLS configuration data.

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

  @param[in]  This                Pointer to the EFI_TLS_CONFIGURATION_PROTOCOL instance.
  @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 TLS configuration data is set successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  This is NULL.
                                  Data is NULL.
                                  DataSize is 0.
  @retval EFI_UNSUPPORTED         The DataType is unsupported.
  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TLS_CONFIGURATION_SET_DATA)(
  IN EFI_TLS_CONFIGURATION_PROTOCOL  *This,
  IN EFI_TLS_CONFIG_DATA_TYPE        DataType,
  IN VOID                            *Data,
  IN UINTN                           DataSize
  );

/**
  Get TLS configuration data.

  The GetData() function gets TLS configuration.

  @param[in]       This           Pointer to the EFI_TLS_CONFIGURATION_PROTOCOL instance.
  @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 TLS configuration data is got successfully.
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is TRUE:
                                  This is NULL.
                                  DataSize is NULL.
                                  Data is NULL if *DataSize is not zero.
  @retval EFI_UNSUPPORTED         The DataType is unsupported.
  @retval EFI_NOT_FOUND           The TLS configuration data is not found.
  @retval EFI_BUFFER_TOO_SMALL    The buffer is too small to hold the data.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TLS_CONFIGURATION_GET_DATA)(
  IN EFI_TLS_CONFIGURATION_PROTOCOL  *This,
  IN EFI_TLS_CONFIG_DATA_TYPE        DataType,
  IN OUT VOID                        *Data,  OPTIONAL
  IN OUT UINTN                       *DataSize
  );

///
/// The EFI_TLS_CONFIGURATION_PROTOCOL is designed to provide a way to set and get
/// TLS configuration, such as Certificate, private key data.
///
struct _EFI_TLS_CONFIGURATION_PROTOCOL {
  EFI_TLS_CONFIGURATION_SET_DATA     SetData;
  EFI_TLS_CONFIGURATION_GET_DATA     GetData;
};

extern EFI_GUID gEfiTlsConfigurationProtocolGuid;

#endif  //__EFI_TLS_CONFIGURATION_PROTOCOL_H__