/** @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, Intel Corporation                                                         
  All rights reserved. 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.             

  Module Name:  AuthenticationInfo.h

**/

#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;

typedef struct {
  EFI_GUID         Guid;
  UINT16           Length;
} AUTH_NODE_HEADER;

typedef struct {
  AUTH_NODE_HEADER Header;
  EFI_IPv6_ADDRESS RadiusIpAddr;             // IPv4 or IPv6 address
  UINT16           Reserved;
  EFI_IPv6_ADDRESS NasIpAddr;                // IPv4 or IPv6 address
  UINT16           NasSecretLength; 
  UINT8            *NasSecret;      
  UINT16           ChapSecretLength;
  UINT8            *ChapSecret;
  UINT16           ChapNameLength;
  UINT8            *ChapName;
} CHAP_RADIUS_AUTH_NODE;

typedef struct {
  AUTH_NODE_HEADER Header;
  UINT16           Reserved;
  UINT16           UserSecretLength;
  UINT8            *UserSecret;     
  UINT16           UserNameLength;
  UINT8            *UserName;
  UINT16           ChapSecretLength;
  UINT8            *ChapSecret;
  UINT16           ChapNameLength;
  UINT8            *ChapName;
} CHAP_LOCAL_AUTH_NODE;

/**
  Retrieves the Authentication information associated with a particular controller handle.

  @param  This                   Pointer to the EFI_AUTHENTICATION_INFO_PROTOCOL
  @param  ControllerHandle       Handle to the Controller
  @param  Buffer                 Pointer to the authentication information.

  @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_PROTOCOL_INFO_GET) (
  IN  EFI_AUTHENTICATION_INFO_PROTOCOL *This,
  IN  EFI_HANDLE                       *ControllerHandle,
  OUT VOID                             *Buffer
  )
;  

/**
  Set the Authentication information for a given controller handle.

  @param  This                  Pointer to the EFI_AUTHENTICATION_INFO_PROTOCOL
  @param  ControllerHandle      Handle to the Controller
  @param  Buffer                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_PROTOCOL_INFO_SET) (
  IN EFI_AUTHENTICATION_INFO_PROTOCOL  *This,
  IN EFI_HANDLE                        *ControllerHandle,
  IN VOID                              *Buffer
  )
;  

struct _EFI_AUTHENTICATION_INFO_PROTOCOL {
  EFI_AUTHENTICATION_PROTOCOL_INFO_GET Get;
  EFI_AUTHENTICATION_PROTOCOL_INFO_SET Set;
};

extern EFI_GUID gEfiAuthenticationInfoProtocolGuid;
extern EFI_GUID gEfiAuthenticationChapRadiusGuid;
extern EFI_GUID gEfiAuthenticationChapLocalGuid;

#endif
