/** @file
  EFI_AUTHENTICATION_INFO_PROTOCOL as defined in UEFI 2.0.
  This protocol is used on any device handle to obtain authentication information
  associated with the physical or logical device.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __AUTHENTICATION_INFO_H__
#define __AUTHENTICATION_INFO_H__

#define EFI_AUTHENTICATION_INFO_PROTOCOL_GUID \
  { \
    0x7671d9d0, 0x53db, 0x4173, {0xaa, 0x69, 0x23, 0x27, 0xf2, 0x1f, 0x0b, 0xc7 } \
  }

#define EFI_AUTHENTICATION_CHAP_RADIUS_GUID \
  { \
    0xd6062b50, 0x15ca, 0x11da, {0x92, 0x19, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d } \
  }

#define EFI_AUTHENTICATION_CHAP_LOCAL_GUID \
  { \
    0xc280c73e, 0x15ca, 0x11da, {0xb0, 0xca, 0x00, 0x10, 0x83, 0xff, 0xca, 0x4d } \
  }

typedef struct _EFI_AUTHENTICATION_INFO_PROTOCOL EFI_AUTHENTICATION_INFO_PROTOCOL;

#pragma pack(1)
typedef struct {
  ///
  /// Authentication Type GUID.
  ///
  EFI_GUID    Guid;

  ///
  /// Length of this structure in bytes.
  ///
  UINT16      Length;
} AUTH_NODE_HEADER;

typedef struct {
  AUTH_NODE_HEADER    Header;

  ///
  /// RADIUS Server IPv4 or IPv6 Address.
  ///
  UINT8               RadiusIpAddr[16];      ///< IPv4 or IPv6 address.

  ///
  /// Reserved for future use.
  ///
  UINT16              Reserved;

  ///
  /// Network Access Server IPv4 or IPv6 Address (OPTIONAL).
  ///
  UINT8               NasIpAddr[16];         ///< IPv4 or IPv6 address.

  ///
  /// Network Access Server Secret Length in bytes (OPTIONAL).
  ///
  UINT16              NasSecretLength;

  ///
  /// Network Access Server Secret (OPTIONAL).
  ///
  UINT8               NasSecret[1];

  ///
  /// CHAP Initiator Secret Length in bytes on offset NasSecret + NasSecretLength.
  ///
  /// UINT16           ChapSecretLength;
  ///
  /// CHAP Initiator Secret.
  ///
  /// UINT8            ChapSecret[];
  ///
  /// CHAP Initiator Name Length in bytes on offset ChapSecret + ChapSecretLength.
  ///
  /// UINT16           ChapNameLength;
  ///
  /// CHAP Initiator Name.
  ///
  /// UINT8            ChapName[];
  ///
  /// Reverse CHAP Name Length in bytes on offset ChapName + ChapNameLength.
  ///
  /// UINT16           ReverseChapNameLength;
  ///
  /// Reverse CHAP Name.
  ///
  /// UINT8            ReverseChapName[];
  ///
  /// Reverse CHAP Secret Length in bytes on offseet ReverseChapName + ReverseChapNameLength.
  ///
  /// UINT16           ReverseChapSecretLength;
  ///
  /// Reverse CHAP Secret.
  ///
  /// UINT8            ReverseChapSecret[];
  ///
} CHAP_RADIUS_AUTH_NODE;

typedef struct {
  AUTH_NODE_HEADER    Header;

  ///
  /// Reserved for future use.
  ///
  UINT16              Reserved;

  ///
  /// User Secret Length in bytes.
  ///
  UINT16              UserSecretLength;

  ///
  /// User Secret.
  ///
  UINT8               UserSecret[1];

  ///
  /// User Name Length in bytes on offset UserSecret + UserSecretLength.
  ///
  /// UINT16           UserNameLength;
  ///
  /// User Name.
  ///
  /// UINT8            UserName[];
  ///
  /// CHAP Initiator Secret Length in bytes on offset UserName + UserNameLength.
  ///
  /// UINT16           ChapSecretLength;
  ///
  /// CHAP Initiator Secret.
  ///
  /// UINT8            ChapSecret[];
  ///
  /// CHAP Initiator Name Length in bytes on offset ChapSecret + ChapSecretLength.
  ///
  /// UINT16           ChapNameLength;
  ///
  /// CHAP Initiator Name.
  ///
  /// UINT8            ChapName[];
  ///
  /// Reverse CHAP Name Length in bytes on offset ChapName + ChapNameLength.
  ///
  /// UINT16           ReverseChapNameLength;
  ///
  /// Reverse CHAP Name.
  ///
  /// UINT8            ReverseChapName[];
  ///
  /// Reverse CHAP Secret Length in bytes on offset ReverseChapName + ReverseChapNameLength.
  ///
  /// UINT16           ReverseChapSecretLength;
  ///
  /// Reverse CHAP Secret.
  ///
  /// UINT8            ReverseChapSecret[];
  ///
} CHAP_LOCAL_AUTH_NODE;
#pragma pack()

/**
  Retrieves the authentication information associated with a particular controller handle.

  @param[in]  This                  The pointer to the EFI_AUTHENTICATION_INFO_PROTOCOL.
  @param[in]  ControllerHandle      The handle to the Controller.
  @param[out] Buffer                The pointer to the authentication information. This function is
                                    responsible for allocating the buffer and it is the caller's
                                    responsibility to free buffer when the caller is finished with buffer.

  @retval EFI_SUCCESS           Successfully retrieved authentication information
                                for the given ControllerHandle.
  @retval EFI_INVALID_PARAMETER No matching authentication information found for
                                the given ControllerHandle.
  @retval EFI_DEVICE_ERROR      The authentication information could not be retrieved
                                due to a hardware error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_AUTHENTICATION_INFO_PROTOCOL_GET)(
  IN  EFI_AUTHENTICATION_INFO_PROTOCOL *This,
  IN  EFI_HANDLE                       ControllerHandle,
  OUT VOID                             **Buffer
  );

/**
  Set the authentication information for a given controller handle.

  @param[in]  This                 The pointer to the EFI_AUTHENTICATION_INFO_PROTOCOL.
  @param[in]  ControllerHandle     The handle to the Controller.
  @param[in]  Buffer               The pointer to the authentication information.

  @retval EFI_SUCCESS          Successfully set authentication information for the
                               given ControllerHandle.
  @retval EFI_UNSUPPORTED      If the platform policies do not allow setting of
                               the authentication information.
  @retval EFI_DEVICE_ERROR     The authentication information could not be configured
                               due to a hardware error.
  @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the data.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_AUTHENTICATION_INFO_PROTOCOL_SET)(
  IN EFI_AUTHENTICATION_INFO_PROTOCOL  *This,
  IN EFI_HANDLE                        ControllerHandle,
  IN VOID                              *Buffer
  );

///
/// This protocol is used on any device handle to obtain authentication
/// information associated with the physical or logical device.
///
struct _EFI_AUTHENTICATION_INFO_PROTOCOL {
  EFI_AUTHENTICATION_INFO_PROTOCOL_GET    Get;
  EFI_AUTHENTICATION_INFO_PROTOCOL_SET    Set;
};

extern EFI_GUID  gEfiAuthenticationInfoProtocolGuid;
extern EFI_GUID  gEfiAuthenticationChapRadiusGuid;
extern EFI_GUID  gEfiAuthenticationChapLocalGuid;

#endif
