https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			459 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			459 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  This file defines the EFI Supplicant Protocol.
 | 
						|
 | 
						|
  Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
  @par Revision Reference:
 | 
						|
  This Protocol is introduced in UEFI Specification 2.6
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef __EFI_SUPPLICANT_PROTOCOL_H__
 | 
						|
#define __EFI_SUPPLICANT_PROTOCOL_H__
 | 
						|
 | 
						|
#include <Protocol/WiFi2.h>
 | 
						|
 | 
						|
///
 | 
						|
/// The EFI Supplicant Service Binding Protocol is used to locate EFI
 | 
						|
/// Supplicant Protocol drivers to create and destroy child of the driver to
 | 
						|
/// communicate with other host using Supplicant protocol.
 | 
						|
///
 | 
						|
#define EFI_SUPPLICANT_SERVICE_BINDING_PROTOCOL_GUID \
 | 
						|
  { \
 | 
						|
    0x45bcd98e, 0x59ad, 0x4174, { 0x95, 0x46, 0x34, 0x4a, 0x7, 0x48, 0x58, 0x98 } \
 | 
						|
  }
 | 
						|
 | 
						|
///
 | 
						|
/// The EFI Supplicant protocol provides services to process authentication and
 | 
						|
/// data encryption/decryption for security management.
 | 
						|
///
 | 
						|
#define EFI_SUPPLICANT_PROTOCOL_GUID \
 | 
						|
  { \
 | 
						|
    0x54fcc43e, 0xaa89, 0x4333, { 0x9a, 0x85, 0xcd, 0xea, 0x24, 0x5, 0x1e, 0x9e } \
 | 
						|
  }
 | 
						|
 | 
						|
typedef struct _EFI_SUPPLICANT_PROTOCOL EFI_SUPPLICANT_PROTOCOL;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_CRYPT_MODE
 | 
						|
///
 | 
						|
typedef enum {
 | 
						|
  //
 | 
						|
  // Encrypt data provided in the fragment buffers.
 | 
						|
  //
 | 
						|
  EfiSupplicantEncrypt,
 | 
						|
  //
 | 
						|
  // Decrypt data provided in the fragment buffers.
 | 
						|
  //
 | 
						|
  EfiSupplicantDecrypt,
 | 
						|
} EFI_SUPPLICANT_CRYPT_MODE;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_DATA_TYPE
 | 
						|
///
 | 
						|
typedef enum {
 | 
						|
  //
 | 
						|
  // Session Configuration
 | 
						|
  //
 | 
						|
 | 
						|
  //
 | 
						|
  // Current authentication type in use. The corresponding Data is of type
 | 
						|
  // EFI_80211_AKM_SUITE_SELECTOR.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211AKMSuite,
 | 
						|
  //
 | 
						|
  // Group data encryption type in use. The corresponding Data is of type
 | 
						|
  // EFI_SUPPLICANT_CIPHER_SUITE_SELECTOR.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211GroupDataCipherSuite,
 | 
						|
  //
 | 
						|
  // Pairwise encryption type in use. The corresponding Data is of type
 | 
						|
  // EFI_80211_CIPHER_SUITE_SELECTOR.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211PairwiseCipherSuite,
 | 
						|
  //
 | 
						|
  // PSK password. The corresponding Data is a NULL-terminated ASCII string.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211PskPassword,
 | 
						|
  //
 | 
						|
  // Target SSID name. The corresponding Data is of type EFI_80211_SSID.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211TargetSSIDName,
 | 
						|
  //
 | 
						|
  // Station MAC address. The corresponding Data is of type
 | 
						|
  // EFI_80211_MAC_ADDRESS.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211StationMac,
 | 
						|
  //
 | 
						|
  // Target SSID MAC address. The corresponding Data is 6 bytes MAC address.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211TargetSSIDMac,
 | 
						|
 | 
						|
  //
 | 
						|
  // Session Information
 | 
						|
  //
 | 
						|
 | 
						|
  //
 | 
						|
  // 802.11 PTK. The corresponding Data is of type EFI_SUPPLICANT_KEY.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211PTK,
 | 
						|
  //
 | 
						|
  // 802.11 GTK. The corresponding Data is of type EFI_SUPPLICANT_GTK_LIST.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211GTK,
 | 
						|
  //
 | 
						|
  // Supplicant state. The corresponding Data is
 | 
						|
  // EFI_EAPOL_SUPPLICANT_PAE_STATE.
 | 
						|
  //
 | 
						|
  EfiSupplicantState,
 | 
						|
  //
 | 
						|
  // 802.11 link state. The corresponding Data is EFI_80211_LINK_STATE.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211LinkState,
 | 
						|
  //
 | 
						|
  // Flag indicates key is refreshed. The corresponding Data is
 | 
						|
  // EFI_SUPPLICANT_KEY_REFRESH.
 | 
						|
  //
 | 
						|
  EfiSupplicantKeyRefresh,
 | 
						|
 | 
						|
  //
 | 
						|
  // Session Configuration
 | 
						|
  //
 | 
						|
 | 
						|
  //
 | 
						|
  // Supported authentication types. The corresponding Data is of type
 | 
						|
  // EFI_80211_AKM_SUITE_SELECTOR.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211SupportedAKMSuites,
 | 
						|
  //
 | 
						|
  // Supported software encryption types provided by supplicant driver. The
 | 
						|
  // corresponding Data is of type EFI_80211_CIPHER_SUITE_SELECTOR.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211SupportedSoftwareCipherSuites,
 | 
						|
  //
 | 
						|
  // Supported hardware encryption types provided by wireless UNDI driver. The
 | 
						|
  // corresponding Data is of type EFI_80211_CIPHER_SUITE_SELECTOR.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211SupportedHardwareCipherSuites,
 | 
						|
 | 
						|
  //
 | 
						|
  // Session Information
 | 
						|
  //
 | 
						|
 | 
						|
  //
 | 
						|
  // 802.11 Integrity GTK. The corresponding Data is of type
 | 
						|
  // EFI_SUPPLICANT_GTK_LIST.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211IGTK,
 | 
						|
  //
 | 
						|
  // 802.11 PMK. The corresponding Data is 32 bytes pairwise master key.
 | 
						|
  //
 | 
						|
  EfiSupplicant80211PMK,
 | 
						|
  EfiSupplicantDataTypeMaximum
 | 
						|
} EFI_SUPPLICANT_DATA_TYPE;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_80211_LINK_STATE
 | 
						|
///
 | 
						|
typedef enum {
 | 
						|
  //
 | 
						|
  // Indicates initial start state, unauthenticated, unassociated.
 | 
						|
  //
 | 
						|
  Ieee80211UnauthenticatedUnassociated,
 | 
						|
  //
 | 
						|
  // Indicates authenticated, unassociated.
 | 
						|
  //
 | 
						|
  Ieee80211AuthenticatedUnassociated,
 | 
						|
  //
 | 
						|
  // Indicates authenticated and associated, but pending RSN authentication.
 | 
						|
  //
 | 
						|
  Ieee80211PendingRSNAuthentication,
 | 
						|
  //
 | 
						|
  // Indicates authenticated and associated.
 | 
						|
  //
 | 
						|
  Ieee80211AuthenticatedAssociated
 | 
						|
} EFI_80211_LINK_STATE;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_KEY_TYPE (IEEE Std 802.11 Section 6.3.19.1.2)
 | 
						|
///
 | 
						|
typedef enum {
 | 
						|
  Group,
 | 
						|
  Pairwise,
 | 
						|
  PeerKey,
 | 
						|
  IGTK
 | 
						|
} EFI_SUPPLICANT_KEY_TYPE;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_KEY_DIRECTION (IEEE Std 802.11 Section 6.3.19.1.2)
 | 
						|
///
 | 
						|
typedef enum {
 | 
						|
  //
 | 
						|
  // Indicates that the keys are being installed for the receive direction.
 | 
						|
  //
 | 
						|
  Receive,
 | 
						|
  //
 | 
						|
  // Indicates that the keys are being installed for the transmit direction.
 | 
						|
  //
 | 
						|
  Transmit,
 | 
						|
  //
 | 
						|
  // Indicates that the keys are being installed for both the receive and
 | 
						|
  // transmit directions.
 | 
						|
  //
 | 
						|
  Both
 | 
						|
} EFI_SUPPLICANT_KEY_DIRECTION;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_KEY_REFRESH
 | 
						|
///
 | 
						|
typedef struct {
 | 
						|
  //
 | 
						|
  // If TRUE, indicates GTK is just refreshed after a successful call to
 | 
						|
  // EFI_SUPPLICANT_PROTOCOL.BuildResponsePacket().
 | 
						|
  //
 | 
						|
  BOOLEAN                                 GTKRefresh;
 | 
						|
} EFI_SUPPLICANT_KEY_REFRESH;
 | 
						|
 | 
						|
#define EFI_MAX_KEY_LEN 64
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_KEY
 | 
						|
///
 | 
						|
typedef struct {
 | 
						|
  //
 | 
						|
  // The key value.
 | 
						|
  //
 | 
						|
  UINT8                                   Key[EFI_MAX_KEY_LEN];
 | 
						|
  //
 | 
						|
  // Length in bytes of the Key. Should be up to EFI_MAX_KEY_LEN.
 | 
						|
  //
 | 
						|
  UINT8                                   KeyLen;
 | 
						|
  //
 | 
						|
  // The key identifier.
 | 
						|
  //
 | 
						|
  UINT8                                   KeyId;
 | 
						|
  //
 | 
						|
  // Defines whether this key is a group key, pairwise key, PeerKey, or
 | 
						|
  // Integrity Group.
 | 
						|
  //
 | 
						|
  EFI_SUPPLICANT_KEY_TYPE                 KeyType;
 | 
						|
  //
 | 
						|
  // The value is set according to the KeyType.
 | 
						|
  //
 | 
						|
  EFI_80211_MAC_ADDRESS                   Addr;
 | 
						|
  //
 | 
						|
  // The Receive Sequence Count value.
 | 
						|
  //
 | 
						|
  UINT8                                   Rsc[8];
 | 
						|
  //
 | 
						|
  // Length in bytes of the Rsc. Should be up to 8.
 | 
						|
  //
 | 
						|
  UINT8                                   RscLen;
 | 
						|
  //
 | 
						|
  // Indicates whether the key is configured by the Authenticator or
 | 
						|
  // Supplicant. The value true indicates Authenticator.
 | 
						|
  //
 | 
						|
  BOOLEAN                                 IsAuthenticator;
 | 
						|
  //
 | 
						|
  // The cipher suite required for this association.
 | 
						|
  //
 | 
						|
  EFI_80211_SUITE_SELECTOR                CipherSuite;
 | 
						|
  //
 | 
						|
  // Indicates the direction for which the keys are to be installed.
 | 
						|
  //
 | 
						|
  EFI_SUPPLICANT_KEY_DIRECTION            Direction;
 | 
						|
} EFI_SUPPLICANT_KEY;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_GTK_LIST
 | 
						|
///
 | 
						|
typedef struct {
 | 
						|
  //
 | 
						|
  // Indicates the number of GTKs that are contained in GTKList.
 | 
						|
  //
 | 
						|
  UINT8                                   GTKCount;
 | 
						|
  //
 | 
						|
  // A variable-length array of GTKs of type EFI_SUPPLICANT_KEY. The number of
 | 
						|
  // entries is specified by GTKCount.
 | 
						|
  //
 | 
						|
  EFI_SUPPLICANT_KEY                      GTKList[1];
 | 
						|
} EFI_SUPPLICANT_GTK_LIST;
 | 
						|
 | 
						|
///
 | 
						|
/// EFI_SUPPLICANT_FRAGMENT_DATA
 | 
						|
///
 | 
						|
typedef struct {
 | 
						|
  //
 | 
						|
  // Length of data buffer in the fragment.
 | 
						|
  //
 | 
						|
  UINT32                                  FragmentLength;
 | 
						|
  //
 | 
						|
  // Pointer to the data buffer in the fragment.
 | 
						|
  //
 | 
						|
  VOID                                    *FragmentBuffer;
 | 
						|
} EFI_SUPPLICANT_FRAGMENT_DATA;
 | 
						|
 | 
						|
/**
 | 
						|
  BuildResponsePacket() is called during STA and AP authentication is in
 | 
						|
  progress. Supplicant derives the PTK or session keys depend on type of
 | 
						|
  authentication is being employed.
 | 
						|
 | 
						|
  @param[in]       This           Pointer to the EFI_SUPPLICANT_PROTOCOL
 | 
						|
                                  instance.
 | 
						|
  @param[in]       RequestBuffer  Pointer to the most recently received EAPOL
 | 
						|
                                  packet. NULL means the supplicant need
 | 
						|
                                  initiate the EAP authentication session and
 | 
						|
                                  send EAPOL-Start message.
 | 
						|
  @param[in]       RequestBufferSize
 | 
						|
                                  Packet size in bytes for the most recently
 | 
						|
                                  received EAPOL packet. 0 is only valid when
 | 
						|
                                  RequestBuffer is NULL.
 | 
						|
  @param[out]      Buffer         Pointer to the buffer to hold the built
 | 
						|
                                  packet.
 | 
						|
  @param[in, out]  BufferSize     Pointer to the buffer size in bytes. On
 | 
						|
                                  input, it is the buffer size provided by the
 | 
						|
                                  caller. On output, it is the buffer size in
 | 
						|
                                  fact needed to contain the packet.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The required EAPOL packet is built
 | 
						|
                                  successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is
 | 
						|
                                  TRUE:
 | 
						|
                                  RequestBuffer is NULL, but RequestSize is
 | 
						|
                                  NOT 0.
 | 
						|
                                  RequestBufferSize is 0.
 | 
						|
                                  Buffer is NULL, but RequestBuffer is NOT 0.
 | 
						|
                                  BufferSize is NULL.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL    BufferSize is too small to hold the response
 | 
						|
                                  packet.
 | 
						|
  @retval EFI_NOT_READY           Current EAPOL session state is NOT ready to
 | 
						|
                                  build ResponsePacket.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SUPPLICANT_BUILD_RESPONSE_PACKET) (
 | 
						|
  IN     EFI_SUPPLICANT_PROTOCOL          *This,
 | 
						|
  IN     UINT8                            *RequestBuffer,     OPTIONAL
 | 
						|
  IN     UINTN                            RequestBufferSize,  OPTIONAL
 | 
						|
     OUT UINT8                            *Buffer,
 | 
						|
  IN OUT UINTN                            *BufferSize
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  ProcessPacket() is called to Supplicant driver to encrypt or decrypt the data
 | 
						|
  depending type of authentication type.
 | 
						|
 | 
						|
  @param[in]       This           Pointer to the EFI_SUPPLICANT_PROTOCOL
 | 
						|
                                  instance.
 | 
						|
  @param[in, out]  FragmentTable  Pointer to a list of fragment. The caller
 | 
						|
                                  will take responsible to handle the original
 | 
						|
                                  FragmentTable while it may be reallocated in
 | 
						|
                                  Supplicant driver.
 | 
						|
  @param[in]       FragmentCount  Number of fragment.
 | 
						|
  @param[in]       CryptMode      Crypt mode.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The operation completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   One or more of the following conditions is
 | 
						|
                                  TRUE:
 | 
						|
                                  FragmentTable is NULL.
 | 
						|
                                  FragmentCount is NULL.
 | 
						|
                                  CryptMode is invalid.
 | 
						|
  @retval EFI_NOT_READY           Current supplicant state is NOT Authenticated.
 | 
						|
  @retval EFI_ABORTED             Something wrong decryption the message.
 | 
						|
  @retval EFI_UNSUPPORTED         This API is not supported.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SUPPLICANT_PROCESS_PACKET) (
 | 
						|
  IN     EFI_SUPPLICANT_PROTOCOL          *This,
 | 
						|
  IN OUT EFI_SUPPLICANT_FRAGMENT_DATA     **FragmentTable,
 | 
						|
  IN     UINT32                           *FragmentCount,
 | 
						|
  IN     EFI_SUPPLICANT_CRYPT_MODE        CryptMode
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Set Supplicant configuration data.
 | 
						|
 | 
						|
  @param[in]  This                Pointer to the EFI_SUPPLICANT_PROTOCOL
 | 
						|
                                  instance.
 | 
						|
  @param[in]  DataType            The type of data.
 | 
						|
  @param[in]  Data                Pointer to the buffer to hold the data.
 | 
						|
  @param[in]  DataSize            Pointer to the buffer size in bytes.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The Supplicant 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 DataType is unsupported.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES    Required system resources could not be allocated.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SUPPLICANT_SET_DATA) (
 | 
						|
  IN EFI_SUPPLICANT_PROTOCOL              *This,
 | 
						|
  IN EFI_SUPPLICANT_DATA_TYPE             DataType,
 | 
						|
  IN VOID                                 *Data,
 | 
						|
  IN UINTN                                DataSize
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get Supplicant configuration data.
 | 
						|
 | 
						|
  @param[in]       This           Pointer to the EFI_SUPPLICANT_PROTOCOL
 | 
						|
                                  instance.
 | 
						|
  @param[in]       DataType       The type of data.
 | 
						|
  @param[out]      Data           Pointer to the buffer to hold the data.
 | 
						|
                                  Ignored if DataSize is 0.
 | 
						|
  @param[in, out]  DataSize       Pointer to the buffer size in bytes. On
 | 
						|
                                  input, it is the buffer size provided by the
 | 
						|
                                  caller. On output, it is the buffer size in
 | 
						|
                                  fact needed to contain the packet.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The Supplicant 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 Supplicant configuration data is not
 | 
						|
                                  found.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL    The size of Data is too small for the
 | 
						|
                                  specified configuration data and the required
 | 
						|
                                  size is returned in DataSize.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SUPPLICANT_GET_DATA) (
 | 
						|
  IN     EFI_SUPPLICANT_PROTOCOL          *This,
 | 
						|
  IN     EFI_SUPPLICANT_DATA_TYPE         DataType,
 | 
						|
     OUT UINT8                            *Data,     OPTIONAL
 | 
						|
  IN OUT UINTN                            *DataSize
 | 
						|
  );
 | 
						|
 | 
						|
///
 | 
						|
/// The EFI_SUPPLICANT_PROTOCOL is designed to provide unified place for WIFI
 | 
						|
/// and EAP security management. Both PSK authentication and 802.1X EAP
 | 
						|
/// authentication can be managed via this protocol and driver or application
 | 
						|
/// as a consumer can only focus on about packet transmitting or receiving.
 | 
						|
///
 | 
						|
struct _EFI_SUPPLICANT_PROTOCOL {
 | 
						|
  EFI_SUPPLICANT_BUILD_RESPONSE_PACKET    BuildResponsePacket;
 | 
						|
  EFI_SUPPLICANT_PROCESS_PACKET           ProcessPacket;
 | 
						|
  EFI_SUPPLICANT_SET_DATA                 SetData;
 | 
						|
  EFI_SUPPLICANT_GET_DATA                 GetData;
 | 
						|
};
 | 
						|
 | 
						|
extern EFI_GUID gEfiSupplicantServiceBindingProtocolGuid;
 | 
						|
extern EFI_GUID gEfiSupplicantProtocolGuid;
 | 
						|
 | 
						|
#endif
 |