| /** @file | |
| EFI IPsec Configuration Protocol Definition | |
| The EFI_IPSEC_CONFIG_PROTOCOL provides the mechanism to set and retrieve security and | |
| policy related information for the EFI IPsec protocol driver. | |
| Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| @par Revision Reference: | |
| This Protocol is introduced in UEFI Specification 2.2 | |
| **/ | |
| #ifndef __EFI_IPSE_CCONFIG_PROTOCOL_H__ | |
| #define __EFI_IPSE_CCONFIG_PROTOCOL_H__ | |
| #define EFI_IPSEC_CONFIG_PROTOCOL_GUID \ | |
| { \ | |
| 0xce5e5929, 0xc7a3, 0x4602, {0xad, 0x9e, 0xc9, 0xda, 0xf9, 0x4e, 0xbf, 0xcf } \ | |
| } | |
| typedef struct _EFI_IPSEC_CONFIG_PROTOCOL EFI_IPSEC_CONFIG_PROTOCOL; | |
| /// | |
| /// EFI_IPSEC_CONFIG_DATA_TYPE | |
| /// | |
| typedef enum { | |
| /// | |
| /// The IPsec Security Policy Database (aka SPD) setting. In IPsec, | |
| /// an essential element of Security Association (SA) processing is | |
| /// underlying SPD that specifies what services are to be offered to | |
| /// IP datagram and in what fashion. The SPD must be consulted | |
| /// during the processing of all traffic (inbound and outbound), | |
| /// including traffic not protected by IPsec, that traverses the IPsec | |
| /// boundary. With this DataType, SetData() function is to set | |
| /// the SPD entry information, which may add one new entry, delete | |
| /// one existed entry or flush the whole database according to the | |
| /// parameter values. The corresponding Data is of type | |
| /// EFI_IPSEC_SPD_DATA | |
| /// | |
| IPsecConfigDataTypeSpd, | |
| /// | |
| /// The IPsec Security Association Database (aka SAD) setting. A | |
| /// SA is a simplex connection that affords security services to the | |
| /// traffic carried by it. Security services are afforded to an SA by the | |
| /// use of AH, or ESP, but not both. The corresponding Data is of | |
| /// type EFI_IPSEC_SAD_DATA. | |
| /// | |
| IPsecConfigDataTypeSad, | |
| /// | |
| /// The IPsec Peer Authorization Database (aka PAD) setting, which | |
| /// provides the link between the SPD and a security association | |
| /// management protocol. The PAD entry specifies the | |
| /// authentication protocol (e.g. IKEv1, IKEv2) method used and the | |
| /// authentication data. The corresponding Data is of type | |
| /// EFI_IPSEC_PAD_DATA. | |
| /// | |
| IPsecConfigDataTypePad, | |
| IPsecConfigDataTypeMaximum | |
| } EFI_IPSEC_CONFIG_DATA_TYPE; | |
| /// | |
| /// EFI_IP_ADDRESS_INFO | |
| /// | |
| typedef struct _EFI_IP_ADDRESS_INFO { | |
| EFI_IP_ADDRESS Address; ///< The IPv4 or IPv6 address | |
| UINT8 PrefixLength; ///< The length of the prefix associated with the Address. | |
| } EFI_IP_ADDRESS_INFO; | |
| /// | |
| /// EFI_IPSEC_SPD_SELECTOR | |
| /// | |
| typedef struct _EFI_IPSEC_SPD_SELECTOR { | |
| /// | |
| /// Specifies the actual number of entries in LocalAddress. | |
| /// | |
| UINT32 LocalAddressCount; | |
| /// | |
| /// A list of ranges of IPv4 or IPv6 addresses, which refers to the | |
| /// addresses being protected by IPsec policy. | |
| /// | |
| EFI_IP_ADDRESS_INFO *LocalAddress; | |
| /// | |
| /// Specifies the actual number of entries in RemoteAddress. | |
| /// | |
| UINT32 RemoteAddressCount; | |
| /// | |
| /// A list of ranges of IPv4 or IPv6 addresses, which are peer entities | |
| /// to LocalAddress. | |
| /// | |
| EFI_IP_ADDRESS_INFO *RemoteAddress; | |
| /// | |
| /// Next layer protocol. Obtained from the IPv4 Protocol or the IPv6 | |
| /// Next Header fields. The next layer protocol is whatever comes | |
| /// after any IP extension headers that are present. A zero value is a | |
| /// wildcard that matches any value in NextLayerProtocol field. | |
| /// | |
| UINT16 NextLayerProtocol; | |
| /// | |
| /// Local Port if the Next Layer Protocol uses two ports (as do TCP, | |
| /// UDP, and others). A zero value is a wildcard that matches any | |
| /// value in LocalPort field. | |
| /// | |
| UINT16 LocalPort; | |
| /// | |
| /// A designed port range size. The start port is LocalPort, and | |
| /// the total number of ports is described by LocalPortRange. | |
| /// This field is ignored if NextLayerProtocol does not use | |
| /// ports. | |
| /// | |
| UINT16 LocalPortRange; | |
| /// | |
| /// Remote Port if the Next Layer Protocol uses two ports. A zero | |
| /// value is a wildcard that matches any value in RemotePort field. | |
| /// | |
| UINT16 RemotePort; | |
| /// | |
| /// A designed port range size. The start port is RemotePort, and | |
| /// the total number of ports is described by RemotePortRange. | |
| /// This field is ignored if NextLayerProtocol does not use ports. | |
| /// | |
| UINT16 RemotePortRange; | |
| } EFI_IPSEC_SPD_SELECTOR; | |
| /// | |
| /// EFI_IPSEC_TRAFFIC_DIR | |
| /// represents the directionality in an SPD entry. | |
| /// | |
| typedef enum { | |
| /// | |
| /// The EfiIPsecInBound refers to traffic entering an IPsec implementation via | |
| /// the unprotected interface or emitted by the implementation on the unprotected | |
| /// side of the boundary and directed towards the protected interface. | |
| /// | |
| EfiIPsecInBound, | |
| /// | |
| /// The EfiIPsecOutBound refers to traffic entering the implementation via | |
| /// the protected interface, or emitted by the implementation on the protected side | |
| /// of the boundary and directed toward the unprotected interface. | |
| /// | |
| EfiIPsecOutBound | |
| } EFI_IPSEC_TRAFFIC_DIR; | |
| /// | |
| /// EFI_IPSEC_ACTION | |
| /// represents three possible processing choices. | |
| /// | |
| typedef enum { | |
| /// | |
| /// Refers to traffic that is not allowed to traverse the IPsec boundary. | |
| /// | |
| EfiIPsecActionDiscard, | |
| /// | |
| /// Refers to traffic that is allowed to cross the IPsec boundary | |
| /// without protection. | |
| /// | |
| EfiIPsecActionBypass, | |
| /// | |
| /// Refers to traffic that is afforded IPsec protection, and for such | |
| /// traffic the SPD must specify the security protocols to be | |
| /// employed, their mode, security service options, and the | |
| /// cryptographic algorithms to be used. | |
| /// | |
| EfiIPsecActionProtect | |
| } EFI_IPSEC_ACTION; | |
| /// | |
| /// EFI_IPSEC_SA_LIFETIME | |
| /// defines the lifetime of an SA, which represents when a SA must be | |
| /// replaced or terminated. A value of all 0 for each field removes | |
| /// the limitation of a SA lifetime. | |
| /// | |
| typedef struct _EFI_IPSEC_SA_LIFETIME { | |
| /// | |
| /// The number of bytes to which the IPsec cryptographic algorithm | |
| /// can be applied. For ESP, this is the encryption algorithm and for | |
| /// AH, this is the authentication algorithm. The ByteCount | |
| /// includes pad bytes for cryptographic operations. | |
| /// | |
| UINT64 ByteCount; | |
| /// | |
| /// A time interval in second that warns the implementation to | |
| /// initiate action such as setting up a replacement SA. | |
| /// | |
| UINT64 SoftLifetime; | |
| /// | |
| /// A time interval in second when the current SA ends and is | |
| /// destroyed. | |
| /// | |
| UINT64 HardLifetime; | |
| } EFI_IPSEC_SA_LIFETIME; | |
| /// | |
| /// EFI_IPSEC_MODE | |
| /// There are two modes of IPsec operation: transport mode and tunnel mode. In | |
| /// EfiIPsecTransport mode, AH and ESP provide protection primarily for next layer protocols; | |
| /// In EfiIPsecTunnel mode, AH and ESP are applied to tunneled IP packets. | |
| /// | |
| typedef enum { | |
| EfiIPsecTransport, | |
| EfiIPsecTunnel | |
| } EFI_IPSEC_MODE; | |
| /// | |
| /// EFI_IPSEC_TUNNEL_DF_OPTION | |
| /// The option of copying the DF bit from an outbound package to | |
| /// the tunnel mode header that it emits, when traffic is carried | |
| /// via a tunnel mode SA. This applies to SAs where both inner and | |
| /// outer headers are IPv4. | |
| /// | |
| typedef enum { | |
| EfiIPsecTunnelClearDf, ///< Clear DF bit from inner header. | |
| EfiIPsecTunnelSetDf, ///< Set DF bit from inner header. | |
| EfiIPsecTunnelCopyDf ///< Copy DF bit from inner header. | |
| } EFI_IPSEC_TUNNEL_DF_OPTION; | |
| /// | |
| /// EFI_IPSEC_TUNNEL_OPTION | |
| /// | |
| typedef struct _EFI_IPSEC_TUNNEL_OPTION { | |
| /// | |
| /// Local tunnel address when IPsec mode is EfiIPsecTunnel. | |
| /// | |
| EFI_IP_ADDRESS LocalTunnelAddress; | |
| /// | |
| /// Remote tunnel address when IPsec mode is EfiIPsecTunnel. | |
| /// | |
| EFI_IP_ADDRESS RemoteTunnelAddress; | |
| /// | |
| /// The option of copying the DF bit from an outbound package | |
| /// to the tunnel mode header that it emits, when traffic is | |
| /// carried via a tunnel mode SA. | |
| /// | |
| EFI_IPSEC_TUNNEL_DF_OPTION DF; | |
| } EFI_IPSEC_TUNNEL_OPTION; | |
| /// | |
| /// EFI_IPSEC_PROTOCOL_TYPE | |
| /// | |
| typedef enum { | |
| EfiIPsecAH, ///< IP Authentication Header protocol which is specified in RFC 4302. | |
| EfiIPsecESP ///< IP Encapsulating Security Payload which is specified in RFC 4303. | |
| } EFI_IPSEC_PROTOCOL_TYPE; | |
| /// | |
| /// EFI_IPSEC_PROCESS_POLICY | |
| /// describes a policy list for traffic processing. | |
| /// | |
| typedef struct _EFI_IPSEC_PROCESS_POLICY { | |
| /// | |
| /// Extended Sequence Number. Is this SA using extended sequence | |
| /// numbers. 64 bit counter is used if TRUE. | |
| /// | |
| BOOLEAN ExtSeqNum; | |
| /// | |
| /// A flag indicating whether overflow of the sequence number | |
| /// counter should generate an auditable event and prevent | |
| /// transmission of additional packets on the SA, or whether rollover | |
| /// is permitted. | |
| /// | |
| BOOLEAN SeqOverflow; | |
| /// | |
| /// Is this SA using stateful fragment checking. TRUE represents | |
| /// stateful fragment checking. | |
| /// | |
| BOOLEAN FragCheck; | |
| /// | |
| /// A time interval after which a SA must be replaced with a new SA | |
| /// (and new SPI) or terminated. | |
| /// | |
| EFI_IPSEC_SA_LIFETIME SaLifetime; | |
| /// | |
| /// IPsec mode: tunnel or transport. | |
| /// | |
| EFI_IPSEC_MODE Mode; | |
| /// | |
| /// Tunnel Option. TunnelOption is ignored if Mode is EfiIPsecTransport. | |
| /// | |
| EFI_IPSEC_TUNNEL_OPTION *TunnelOption; | |
| /// | |
| /// IPsec protocol: AH or ESP | |
| /// | |
| EFI_IPSEC_PROTOCOL_TYPE Proto; | |
| /// | |
| /// Cryptographic algorithm type used for authentication. | |
| /// | |
| UINT8 AuthAlgoId; | |
| /// | |
| /// Cryptographic algorithm type used for encryption. EncAlgo is | |
| /// NULL when IPsec protocol is AH. For ESP protocol, EncAlgo | |
| /// can also be used to describe the algorithm if a combined mode | |
| /// algorithm is used. | |
| /// | |
| UINT8 EncAlgoId; | |
| } EFI_IPSEC_PROCESS_POLICY; | |
| /// | |
| /// EFI_IPSEC_SA_ID | |
| /// A triplet to identify an SA, consisting of the following members. | |
| /// | |
| typedef struct _EFI_IPSEC_SA_ID { | |
| /// | |
| /// Security Parameter Index (aka SPI). An arbitrary 32-bit value | |
| /// that is used by a receiver to identity the SA to which an incoming | |
| /// package should be bound. | |
| /// | |
| UINT32 Spi; | |
| /// | |
| /// IPsec protocol: AH or ESP | |
| /// | |
| EFI_IPSEC_PROTOCOL_TYPE Proto; | |
| /// | |
| /// Destination IP address. | |
| /// | |
| EFI_IP_ADDRESS DestAddress; | |
| } EFI_IPSEC_SA_ID; | |
| #define MAX_PEERID_LEN 128 | |
| /// | |
| /// EFI_IPSEC_SPD_DATA | |
| /// | |
| typedef struct _EFI_IPSEC_SPD_DATA { | |
| /// | |
| /// A null-terminated ASCII name string which is used as a symbolic | |
| /// identifier for an IPsec Local or Remote address. | |
| /// | |
| UINT8 Name[MAX_PEERID_LEN]; | |
| /// | |
| /// Bit-mapped list describing Populate from Packet flags. When | |
| /// creating a SA, if PackageFlag bit is set to TRUE, instantiate | |
| /// the selector from the corresponding field in the package that | |
| /// triggered the creation of the SA, else from the value(s) in the | |
| /// corresponding SPD entry. The PackageFlag bit setting for | |
| /// corresponding selector field of EFI_IPSEC_SPD_SELECTOR: | |
| /// Bit 0: EFI_IPSEC_SPD_SELECTOR.LocalAddress | |
| /// Bit 1: EFI_IPSEC_SPD_SELECTOR.RemoteAddress | |
| /// Bit 2: | |
| /// EFI_IPSEC_SPD_SELECTOR.NextLayerProtocol | |
| /// Bit 3: EFI_IPSEC_SPD_SELECTOR.LocalPort | |
| /// Bit 4: EFI_IPSEC_SPD_SELECTOR.RemotePort | |
| /// Others: Reserved. | |
| /// | |
| UINT32 PackageFlag; | |
| /// | |
| /// The traffic direction of data gram. | |
| /// | |
| EFI_IPSEC_TRAFFIC_DIR TrafficDirection; | |
| /// | |
| /// Processing choices to indicate which action is required by this | |
| /// policy. | |
| /// | |
| EFI_IPSEC_ACTION Action; | |
| /// | |
| /// The policy and rule information for a SPD entry. | |
| /// | |
| EFI_IPSEC_PROCESS_POLICY *ProcessingPolicy; | |
| /// | |
| /// Specifies the actual number of entries in SaId list. | |
| /// | |
| UINTN SaIdCount; | |
| /// | |
| /// The SAD entry used for the traffic processing. The | |
| /// existed SAD entry links indicate this is the manual key case. | |
| /// | |
| EFI_IPSEC_SA_ID SaId[1]; | |
| } EFI_IPSEC_SPD_DATA; | |
| /// | |
| /// EFI_IPSEC_AH_ALGO_INFO | |
| /// The security algorithm selection for IPsec AH authentication. | |
| /// The required authentication algorithm is specified in RFC 4305. | |
| /// | |
| typedef struct _EFI_IPSEC_AH_ALGO_INFO { | |
| UINT8 AuthAlgoId; | |
| UINTN AuthKeyLength; | |
| VOID *AuthKey; | |
| } EFI_IPSEC_AH_ALGO_INFO; | |
| /// | |
| /// EFI_IPSEC_ESP_ALGO_INFO | |
| /// The security algorithm selection for IPsec ESP encryption and authentication. | |
| /// The required authentication algorithm is specified in RFC 4305. | |
| /// EncAlgoId fields can also specify an ESP combined mode algorithm | |
| /// (e.g. AES with CCM mode, specified in RFC 4309), which provides both | |
| /// confidentiality and authentication services. | |
| /// | |
| typedef struct _EFI_IPSEC_ESP_ALGO_INFO { | |
| UINT8 EncAlgoId; | |
| UINTN EncKeyLength; | |
| VOID *EncKey; | |
| UINT8 AuthAlgoId; | |
| UINTN AuthKeyLength; | |
| VOID *AuthKey; | |
| } EFI_IPSEC_ESP_ALGO_INFO; | |
| /// | |
| /// EFI_IPSEC_ALGO_INFO | |
| /// | |
| typedef union { | |
| EFI_IPSEC_AH_ALGO_INFO AhAlgoInfo; | |
| EFI_IPSEC_ESP_ALGO_INFO EspAlgoInfo; | |
| } EFI_IPSEC_ALGO_INFO; | |
| /// | |
| /// EFI_IPSEC_SA_DATA | |
| /// | |
| typedef struct _EFI_IPSEC_SA_DATA { | |
| /// | |
| /// IPsec mode: tunnel or transport. | |
| /// | |
| EFI_IPSEC_MODE Mode; | |
| /// | |
| /// Sequence Number Counter. A 64-bit counter used to generate the | |
| /// sequence number field in AH or ESP headers. | |
| /// | |
| UINT64 SNCount; | |
| /// | |
| /// Anti-Replay Window. A 64-bit counter and a bit-map used to | |
| /// determine whether an inbound AH or ESP packet is a replay. | |
| /// | |
| UINT8 AntiReplayWindows; | |
| /// | |
| /// AH/ESP cryptographic algorithm, key and parameters. | |
| /// | |
| EFI_IPSEC_ALGO_INFO AlgoInfo; | |
| /// | |
| /// Lifetime of this SA. | |
| /// | |
| EFI_IPSEC_SA_LIFETIME SaLifetime; | |
| /// | |
| /// Any observed path MTU and aging variables. The Path MTU | |
| /// processing is defined in section 8 of RFC 4301. | |
| /// | |
| UINT32 PathMTU; | |
| /// | |
| /// Link to one SPD entry. | |
| /// | |
| EFI_IPSEC_SPD_SELECTOR *SpdSelector; | |
| /// | |
| /// Indication of whether it's manually set or negotiated automatically. | |
| /// If ManualSet is FALSE, the corresponding SA entry is inserted through | |
| /// IKE protocol negotiation. | |
| /// | |
| BOOLEAN ManualSet; | |
| } EFI_IPSEC_SA_DATA; | |
| /// | |
| /// EFI_IPSEC_SA_DATA2 | |
| /// | |
| typedef struct _EFI_IPSEC_SA_DATA2 { | |
| /// | |
| /// IPsec mode: tunnel or transport | |
| /// | |
| EFI_IPSEC_MODE Mode; | |
| /// | |
| /// Sequence Number Counter. A 64-bit counter used to generate the sequence | |
| /// number field in AH or ESP headers. | |
| /// | |
| UINT64 SNCount; | |
| /// | |
| /// Anti-Replay Window. A 64-bit counter and a bit-map used to determine | |
| /// whether an inbound AH or ESP packet is a replay. | |
| /// | |
| UINT8 AntiReplayWindows; | |
| /// | |
| /// AH/ESP cryptographic algorithm, key and parameters. | |
| /// | |
| EFI_IPSEC_ALGO_INFO AlgoInfo; | |
| /// | |
| /// Lifetime of this SA. | |
| /// | |
| EFI_IPSEC_SA_LIFETIME SaLifetime; | |
| /// | |
| /// Any observed path MTU and aging variables. The Path MTU processing is | |
| /// defined in section 8 of RFC 4301. | |
| /// | |
| UINT32 PathMTU; | |
| /// | |
| /// Link to one SPD entry | |
| /// | |
| EFI_IPSEC_SPD_SELECTOR *SpdSelector; | |
| /// | |
| /// Indication of whether it's manually set or negotiated automatically. | |
| /// If ManualSet is FALSE, the corresponding SA entry is inserted through IKE | |
| /// protocol negotiation | |
| /// | |
| BOOLEAN ManualSet; | |
| /// | |
| /// The tunnel header IP source address. | |
| /// | |
| EFI_IP_ADDRESS TunnelSourceAddress; | |
| /// | |
| /// The tunnel header IP destination address. | |
| /// | |
| EFI_IP_ADDRESS TunnelDestinationAddress; | |
| } EFI_IPSEC_SA_DATA2; | |
| /// | |
| /// EFI_IPSEC_PAD_ID | |
| /// specifies the identifier for PAD entry, which is also used for SPD lookup. | |
| /// IpAddress Pointer to the IPv4 or IPv6 address range. | |
| /// | |
| typedef struct _EFI_IPSEC_PAD_ID { | |
| /// | |
| /// Flag to identify which type of PAD Id is used. | |
| /// | |
| BOOLEAN PeerIdValid; | |
| union { | |
| /// | |
| /// Pointer to the IPv4 or IPv6 address range. | |
| /// | |
| EFI_IP_ADDRESS_INFO IpAddress; | |
| /// | |
| /// Pointer to a null terminated ASCII string | |
| /// representing the symbolic names. A PeerId can be a DNS | |
| /// name, Distinguished Name, RFC 822 email address or Key ID | |
| /// (specified in section 4.4.3.1 of RFC 4301) | |
| /// | |
| UINT8 PeerId[MAX_PEERID_LEN]; | |
| } Id; | |
| } EFI_IPSEC_PAD_ID; | |
| /// | |
| /// EFI_IPSEC_CONFIG_SELECTOR | |
| /// describes the expected IPsec configuration data selector | |
| /// of type EFI_IPSEC_CONFIG_DATA_TYPE. | |
| /// | |
| typedef union { | |
| EFI_IPSEC_SPD_SELECTOR SpdSelector; | |
| EFI_IPSEC_SA_ID SaId; | |
| EFI_IPSEC_PAD_ID PadId; | |
| } EFI_IPSEC_CONFIG_SELECTOR; | |
| /// | |
| /// EFI_IPSEC_AUTH_PROTOCOL_TYPE | |
| /// defines the possible authentication protocol for IPsec | |
| /// security association management. | |
| /// | |
| typedef enum { | |
| EfiIPsecAuthProtocolIKEv1, | |
| EfiIPsecAuthProtocolIKEv2, | |
| EfiIPsecAuthProtocolMaximum | |
| } EFI_IPSEC_AUTH_PROTOCOL_TYPE; | |
| /// | |
| /// EFI_IPSEC_AUTH_METHOD | |
| /// | |
| typedef enum { | |
| /// | |
| /// Using Pre-shared Keys for manual security associations. | |
| /// | |
| EfiIPsecAuthMethodPreSharedSecret, | |
| /// | |
| /// IKE employs X.509 certificates for SA establishment. | |
| /// | |
| EfiIPsecAuthMethodCertificates, | |
| EfiIPsecAuthMethodMaximum | |
| } EFI_IPSEC_AUTH_METHOD; | |
| /// | |
| /// EFI_IPSEC_PAD_DATA | |
| /// | |
| typedef struct _EFI_IPSEC_PAD_DATA { | |
| /// | |
| /// Authentication Protocol for IPsec security association management. | |
| /// | |
| EFI_IPSEC_AUTH_PROTOCOL_TYPE AuthProtocol; | |
| /// | |
| /// Authentication method used. | |
| /// | |
| EFI_IPSEC_AUTH_METHOD AuthMethod; | |
| /// | |
| /// The IKE ID payload will be used as a symbolic name for SPD | |
| /// lookup if IkeIdFlag is TRUE. Otherwise, the remote IP | |
| /// address provided in traffic selector playloads will be used. | |
| /// | |
| BOOLEAN IkeIdFlag; | |
| /// | |
| /// The size of Authentication data buffer, in bytes. | |
| /// | |
| UINTN AuthDataSize; | |
| /// | |
| /// Buffer for Authentication data, (e.g., the pre-shared secret or the | |
| /// trust anchor relative to which the peer's certificate will be | |
| /// validated). | |
| /// | |
| VOID *AuthData; | |
| /// | |
| /// The size of RevocationData, in bytes | |
| /// | |
| UINTN RevocationDataSize; | |
| /// | |
| /// Pointer to CRL or OCSP data, if certificates are used for | |
| /// authentication method. | |
| /// | |
| VOID *RevocationData; | |
| } EFI_IPSEC_PAD_DATA; | |
| /** | |
| Set the security association, security policy and peer authorization configuration | |
| information for the EFI IPsec driver. | |
| This function is used to set the IPsec configuration information of type DataType for | |
| the EFI IPsec driver. | |
| The IPsec configuration data has a unique selector/identifier separately to identify | |
| a data entry. The selector structure depends on DataType's definition. | |
| Using SetData() with a Data of NULL causes the IPsec configuration data entry identified | |
| by DataType and Selector to be deleted. | |
| @param[in] This Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance. | |
| @param[in] DataType The type of data to be set. | |
| @param[in] Selector Pointer to an entry selector on operated configuration data | |
| specified by DataType. A NULL Selector causes the entire | |
| specified-type configuration information to be flushed. | |
| @param[in] Data The data buffer to be set. The structure of the data buffer is | |
| associated with the DataType. | |
| @param[in] InsertBefore Pointer to one entry selector which describes the expected | |
| position the new data entry will be added. If InsertBefore is NULL, | |
| the new entry will be appended the end of database. | |
| @retval EFI_SUCCESS The specified configuration entry data is set successfully. | |
| @retval EFI_INVALID_PARAMETER One or more of the following are TRUE: | |
| - This is NULL. | |
| @retval EFI_UNSUPPORTED The specified DataType is not supported. | |
| @retval EFI_OUT_OF_RESOURCED The required system resource could not be allocated. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_IPSEC_CONFIG_SET_DATA)( | |
| IN EFI_IPSEC_CONFIG_PROTOCOL *This, | |
| IN EFI_IPSEC_CONFIG_DATA_TYPE DataType, | |
| IN EFI_IPSEC_CONFIG_SELECTOR *Selector, | |
| IN VOID *Data, | |
| IN EFI_IPSEC_CONFIG_SELECTOR *InsertBefore OPTIONAL | |
| ); | |
| /** | |
| Return the configuration value for the EFI IPsec driver. | |
| This function lookup the data entry from IPsec database or IKEv2 configuration | |
| information. The expected data type and unique identification are described in | |
| DataType and Selector parameters. | |
| @param[in] This Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance. | |
| @param[in] DataType The type of data to retrieve. | |
| @param[in] Selector Pointer to an entry selector which is an identifier of the IPsec | |
| configuration data entry. | |
| @param[in, out] DataSize On output the size of data returned in Data. | |
| @param[out] Data The buffer to return the contents of the IPsec configuration data. | |
| The type of the data buffer is associated with the DataType. | |
| @retval EFI_SUCCESS The specified configuration data is got successfully. | |
| @retval EFI_INVALID_PARAMETER One or more of the followings are TRUE: | |
| - This is NULL. | |
| - Selector is NULL. | |
| - DataSize is NULL. | |
| - Data is NULL and *DataSize is not zero | |
| @retval EFI_NOT_FOUND The configuration data specified by Selector is not found. | |
| @retval EFI_UNSUPPORTED The specified DataType is not supported. | |
| @retval EFI_BUFFER_TOO_SMALL The DataSize is too small for the result. DataSize has been | |
| updated with the size needed to complete the request. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_IPSEC_CONFIG_GET_DATA)( | |
| IN EFI_IPSEC_CONFIG_PROTOCOL *This, | |
| IN EFI_IPSEC_CONFIG_DATA_TYPE DataType, | |
| IN EFI_IPSEC_CONFIG_SELECTOR *Selector, | |
| IN OUT UINTN *DataSize, | |
| OUT VOID *Data | |
| ); | |
| /** | |
| Enumerates the current selector for IPsec configuration data entry. | |
| This function is called multiple times to retrieve the entry Selector in IPsec | |
| configuration database. On each call to GetNextSelector(), the next entry | |
| Selector are retrieved into the output interface. | |
| If the entire IPsec configuration database has been iterated, the error | |
| EFI_NOT_FOUND is returned. | |
| If the Selector buffer is too small for the next Selector copy, an | |
| EFI_BUFFER_TOO_SMALL error is returned, and SelectorSize is updated to reflect | |
| the size of buffer needed. | |
| On the initial call to GetNextSelector() to start the IPsec configuration database | |
| search, a pointer to the buffer with all zero value is passed in Selector. Calls | |
| to SetData() between calls to GetNextSelector may produce unpredictable results. | |
| @param[in] This Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance. | |
| @param[in] DataType The type of IPsec configuration data to retrieve. | |
| @param[in, out] SelectorSize The size of the Selector buffer. | |
| @param[in, out] Selector On input, supplies the pointer to last Selector that was | |
| returned by GetNextSelector(). | |
| On output, returns one copy of the current entry Selector | |
| of a given DataType. | |
| @retval EFI_SUCCESS The specified configuration data is got successfully. | |
| @retval EFI_INVALID_PARAMETER One or more of the followings are TRUE: | |
| - This is NULL. | |
| - SelectorSize is NULL. | |
| - Selector is NULL. | |
| @retval EFI_NOT_FOUND The next configuration data entry was not found. | |
| @retval EFI_UNSUPPORTED The specified DataType is not supported. | |
| @retval EFI_BUFFER_TOO_SMALL The SelectorSize is too small for the result. This parameter | |
| has been updated with the size needed to complete the search | |
| request. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_IPSEC_CONFIG_GET_NEXT_SELECTOR)( | |
| IN EFI_IPSEC_CONFIG_PROTOCOL *This, | |
| IN EFI_IPSEC_CONFIG_DATA_TYPE DataType, | |
| IN OUT UINTN *SelectorSize, | |
| IN OUT EFI_IPSEC_CONFIG_SELECTOR *Selector | |
| ); | |
| /** | |
| Register an event that is to be signaled whenever a configuration process on the | |
| specified IPsec configuration information is done. | |
| This function registers an event that is to be signaled whenever a configuration | |
| process on the specified IPsec configuration data is done (e.g. IPsec security | |
| policy database configuration is ready). An event can be registered for different | |
| DataType simultaneously and the caller is responsible for determining which type | |
| of configuration data causes the signaling of the event in such case. | |
| @param[in] This Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance. | |
| @param[in] DataType The type of data to be registered the event for. | |
| @param[in] Event The event to be registered. | |
| @retval EFI_SUCCESS The event is registered successfully. | |
| @retval EFI_INVALID_PARAMETER This is NULL or Event is NULL. | |
| @retval EFI_ACCESS_DENIED The Event is already registered for the DataType. | |
| @retval EFI_UNSUPPORTED The notify registration unsupported or the specified | |
| DataType is not supported. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_IPSEC_CONFIG_REGISTER_NOTIFY)( | |
| IN EFI_IPSEC_CONFIG_PROTOCOL *This, | |
| IN EFI_IPSEC_CONFIG_DATA_TYPE DataType, | |
| IN EFI_EVENT Event | |
| ); | |
| /** | |
| Remove the specified event that is previously registered on the specified IPsec | |
| configuration data. | |
| This function removes a previously registered event for the specified configuration data. | |
| @param[in] This Pointer to the EFI_IPSEC_CONFIG_PROTOCOL instance. | |
| @param[in] DataType The configuration data type to remove the registered event for. | |
| @param[in] Event The event to be unregistered. | |
| @retval EFI_SUCCESS The event is removed successfully. | |
| @retval EFI_NOT_FOUND The Event specified by DataType could not be found in the | |
| database. | |
| @retval EFI_INVALID_PARAMETER This is NULL or Event is NULL. | |
| @retval EFI_UNSUPPORTED The notify registration unsupported or the specified | |
| DataType is not supported. | |
| **/ | |
| typedef | |
| EFI_STATUS | |
| (EFIAPI *EFI_IPSEC_CONFIG_UNREGISTER_NOTIFY)( | |
| IN EFI_IPSEC_CONFIG_PROTOCOL *This, | |
| IN EFI_IPSEC_CONFIG_DATA_TYPE DataType, | |
| IN EFI_EVENT Event | |
| ); | |
| /// | |
| /// EFI_IPSEC_CONFIG_PROTOCOL | |
| /// provides the ability to set and lookup the IPsec SAD (Security Association Database), | |
| /// SPD (Security Policy Database) data entry and configure the security association | |
| /// management protocol such as IKEv2. This protocol is used as the central | |
| /// repository of any policy-specific configuration for EFI IPsec driver. | |
| /// EFI_IPSEC_CONFIG_PROTOCOL can be bound to both IPv4 and IPv6 stack. User can use this | |
| /// protocol for IPsec configuration in both IPv4 and IPv6 environment. | |
| /// | |
| struct _EFI_IPSEC_CONFIG_PROTOCOL { | |
| EFI_IPSEC_CONFIG_SET_DATA SetData; | |
| EFI_IPSEC_CONFIG_GET_DATA GetData; | |
| EFI_IPSEC_CONFIG_GET_NEXT_SELECTOR GetNextSelector; | |
| EFI_IPSEC_CONFIG_REGISTER_NOTIFY RegisterDataNotify; | |
| EFI_IPSEC_CONFIG_UNREGISTER_NOTIFY UnregisterDataNotify; | |
| }; | |
| extern EFI_GUID gEfiIpSecConfigProtocolGuid; | |
| #endif |