]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/IpSecDxe/IpSecImpl.h
NetworkPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / NetworkPkg / IpSecDxe / IpSecImpl.h
CommitLineData
a3bcde70
HT
1/** @file\r
2 The definitions related to IPsec protocol implementation.\r
3\r
f75a7f56 4 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
a3bcde70 5\r
ecf98fbc 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
a3bcde70
HT
7\r
8**/\r
9\r
10#ifndef _IP_SEC_IMPL_H_\r
11#define _IP_SEC_IMPL_H_\r
12\r
13#include <Uefi.h>\r
14#include <Library/UefiLib.h>\r
15#include <Library/NetLib.h>\r
16#include <Library/BaseMemoryLib.h>\r
17#include <Library/UefiBootServicesTableLib.h>\r
18#include <Library/MemoryAllocationLib.h>\r
19#include <Protocol/IpSec.h>\r
20#include <Protocol/IpSecConfig.h>\r
21#include <Protocol/Dpc.h>\r
22#include <Protocol/ComponentName.h>\r
23#include <Protocol/ComponentName2.h>\r
24\r
25typedef struct _IPSEC_PRIVATE_DATA IPSEC_PRIVATE_DATA;\r
26typedef struct _IPSEC_SPD_ENTRY IPSEC_SPD_ENTRY;\r
27typedef struct _IPSEC_PAD_ENTRY IPSEC_PAD_ENTRY;\r
28typedef struct _IPSEC_SPD_DATA IPSEC_SPD_DATA;\r
29\r
30#define IPSEC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('I', 'P', 'S', 'E')\r
31\r
32#define IPSEC_PRIVATE_DATA_FROM_IPSEC(a) CR (a, IPSEC_PRIVATE_DATA, IpSec, IPSEC_PRIVATE_DATA_SIGNATURE)\r
33#define IPSEC_PRIVATE_DATA_FROM_UDP4LIST(a) CR (a, IPSEC_PRIVATE_DATA, Udp4List, IPSEC_PRIVATE_DATA_SIGNATURE)\r
34#define IPSEC_PRIVATE_DATA_FROM_UDP6LIST(a) CR (a, IPSEC_PRIVATE_DATA, Udp6List, IPSEC_PRIVATE_DATA_SIGNATURE)\r
35#define IPSEC_UDP_SERVICE_FROM_LIST(a) BASE_CR (a, IKE_UDP_SERVICE, List)\r
36#define IPSEC_SPD_ENTRY_FROM_LIST(a) BASE_CR (a, IPSEC_SPD_ENTRY, List)\r
37#define IPSEC_SAD_ENTRY_FROM_LIST(a) BASE_CR (a, IPSEC_SAD_ENTRY, List)\r
38#define IPSEC_PAD_ENTRY_FROM_LIST(a) BASE_CR (a, IPSEC_PAD_ENTRY, List)\r
39#define IPSEC_SAD_ENTRY_FROM_SPD(a) BASE_CR (a, IPSEC_SAD_ENTRY, BySpd)\r
40\r
41#define IPSEC_STATUS_DISABLED 0\r
42#define IPSEC_STATUS_ENABLED 1\r
43#define IPSEC_ESP_PROTOCOL 50\r
44#define IPSEC_AH_PROTOCOL 51\r
45#define IPSEC_DEFAULT_VARIABLE_SIZE 0x100\r
46\r
47//\r
48// Internal Structure Definition\r
49//\r
50#pragma pack(1)\r
51typedef struct _EFI_AH_HEADER {\r
52 UINT8 NextHeader;\r
53 UINT8 PayloadLen;\r
54 UINT16 Reserved;\r
55 UINT32 Spi;\r
56 UINT32 SequenceNumber;\r
57} EFI_AH_HEADER;\r
58\r
59typedef struct _EFI_ESP_HEADER {\r
60 UINT32 Spi;\r
61 UINT32 SequenceNumber;\r
62} EFI_ESP_HEADER;\r
63\r
64typedef struct _EFI_ESP_TAIL {\r
65 UINT8 PaddingLength;\r
66 UINT8 NextHeader;\r
67} EFI_ESP_TAIL;\r
68#pragma pack()\r
69\r
70struct _IPSEC_SPD_DATA {\r
71 CHAR16 Name[100];\r
72 UINT32 PackageFlag;\r
96702f88 73 EFI_IPSEC_TRAFFIC_DIR TrafficDirection;\r
a3bcde70
HT
74 EFI_IPSEC_ACTION Action;\r
75 EFI_IPSEC_PROCESS_POLICY *ProcessingPolicy;\r
76 LIST_ENTRY Sas;\r
77};\r
78\r
79struct _IPSEC_SPD_ENTRY {\r
80 EFI_IPSEC_SPD_SELECTOR *Selector;\r
81 IPSEC_SPD_DATA *Data;\r
82 LIST_ENTRY List;\r
83};\r
84\r
85typedef struct _IPSEC_SAD_DATA {\r
68d3f2fb 86 EFI_IPSEC_MODE Mode;\r
87 UINT64 SequenceNumber;\r
88 UINT8 AntiReplayWindowSize;\r
89 UINT64 AntiReplayBitmap[4]; // bitmap for received packet\r
90 EFI_IPSEC_ALGO_INFO AlgoInfo;\r
91 EFI_IPSEC_SA_LIFETIME SaLifetime;\r
92 UINT32 PathMTU;\r
93 IPSEC_SPD_ENTRY *SpdEntry;\r
94 EFI_IPSEC_SPD_SELECTOR *SpdSelector;\r
95 BOOLEAN ESNEnabled; // Extended (64-bit) SN enabled\r
96 BOOLEAN ManualSet;\r
97 EFI_IP_ADDRESS TunnelDestAddress;\r
98 EFI_IP_ADDRESS TunnelSourceAddress;\r
a3bcde70
HT
99} IPSEC_SAD_DATA;\r
100\r
101typedef struct _IPSEC_SAD_ENTRY {\r
102 EFI_IPSEC_SA_ID *Id;\r
103 IPSEC_SAD_DATA *Data;\r
104 LIST_ENTRY List;\r
105 LIST_ENTRY BySpd; // Linked on IPSEC_SPD_DATA.Sas\r
106} IPSEC_SAD_ENTRY;\r
107\r
108struct _IPSEC_PAD_ENTRY {\r
109 EFI_IPSEC_PAD_ID *Id;\r
110 EFI_IPSEC_PAD_DATA *Data;\r
111 LIST_ENTRY List;\r
112};\r
113\r
114typedef struct _IPSEC_RECYCLE_CONTEXT {\r
115 EFI_IPSEC_FRAGMENT_DATA *FragmentTable;\r
116 UINT8 *PayloadBuffer;\r
117} IPSEC_RECYCLE_CONTEXT;\r
118\r
9166f840 119//\r
120// Struct used to store the Hash and its data.\r
121//\r
44de1013
HT
122typedef struct {\r
123 UINTN DataSize;\r
124 UINT8 *Data;\r
9166f840 125} HASH_DATA_FRAGMENT;\r
126\r
a3bcde70
HT
127struct _IPSEC_PRIVATE_DATA {\r
128 UINT32 Signature;\r
129 EFI_HANDLE Handle; // Virtual handle to install private prtocol\r
130 EFI_HANDLE ImageHandle;\r
68d3f2fb 131 EFI_IPSEC2_PROTOCOL IpSec;\r
a3bcde70
HT
132 EFI_IPSEC_CONFIG_PROTOCOL IpSecConfig;\r
133 BOOLEAN SetBySelf;\r
134 LIST_ENTRY Udp4List;\r
135 UINTN Udp4Num;\r
136 LIST_ENTRY Udp6List;\r
137 UINTN Udp6Num;\r
138 LIST_ENTRY Ikev1SessionList;\r
139 LIST_ENTRY Ikev1EstablishedList;\r
140 LIST_ENTRY Ikev2SessionList;\r
141 LIST_ENTRY Ikev2EstablishedList;\r
142 BOOLEAN IsIPsecDisabling;\r
143};\r
144\r
145/**\r
146 This function processes the inbound traffic with IPsec.\r
147\r
f75a7f56 148 It checks the received packet security property, trims the ESP/AH header, and then\r
a3bcde70 149 returns without an IPsec protected IP Header and FragmentTable.\r
f75a7f56 150\r
a3bcde70 151 @param[in] IpVersion The version of IP.\r
f75a7f56 152 @param[in, out] IpHead Points to IP header containing the ESP/AH header\r
a3bcde70
HT
153 to be trimed on input, and without ESP/AH header\r
154 on return.\r
9166f840 155 @param[in, out] LastHead The Last Header in IP header on return.\r
47b27101 156 @param[in, out] OptionsBuffer Pointer to the options buffer.\r
157 @param[in, out] OptionsLength Length of the options buffer.\r
9166f840 158 @param[in, out] FragmentTable Pointer to a list of fragments in form of IPsec\r
a3bcde70
HT
159 protected on input, and without IPsec protected\r
160 on return.\r
9166f840 161 @param[in, out] FragmentCount The number of fragments.\r
a3bcde70 162 @param[out] SpdEntry Pointer to contain the address of SPD entry on return.\r
9166f840 163 @param[out] RecycleEvent The event for recycling of resources.\r
a3bcde70 164\r
9166f840 165 @retval EFI_SUCCESS The operation was successful.\r
166 @retval EFI_UNSUPPORTED The IPSEC protocol is not supported.\r
a3bcde70
HT
167\r
168**/\r
169EFI_STATUS\r
170IpSecProtectInboundPacket (\r
171 IN UINT8 IpVersion,\r
172 IN OUT VOID *IpHead,\r
9166f840 173 IN OUT UINT8 *LastHead,\r
47b27101 174 IN OUT VOID **OptionsBuffer,\r
175 IN OUT UINT32 *OptionsLength,\r
a3bcde70 176 IN OUT EFI_IPSEC_FRAGMENT_DATA **FragmentTable,\r
68d3f2fb 177 IN OUT UINT32 *FragmentCount,\r
9166f840 178 OUT EFI_IPSEC_SPD_SELECTOR **SpdEntry,\r
a3bcde70
HT
179 OUT EFI_EVENT *RecycleEvent\r
180 );\r
181\r
182\r
183/**\r
184 This fucntion processes the output traffic with IPsec.\r
185\r
186 It protected the sending packet by encrypting it payload and inserting ESP/AH header\r
187 in the orginal IP header, then return the IpHeader and IPsec protected Fragmentable.\r
188\r
189 @param[in] IpVersion The version of IP.\r
190 @param[in, out] IpHead Point to IP header containing the orginal IP header\r
191 to be processed on input, and inserted ESP/AH header\r
192 on return.\r
68d3f2fb 193 @param[in, out] LastHead The Last Header in IP header.\r
47b27101 194 @param[in, out] OptionsBuffer Pointer to the options buffer.\r
195 @param[in, out] OptionsLength Length of the options buffer.\r
a3bcde70
HT
196 @param[in, out] FragmentTable Pointer to a list of fragments to be protected by\r
197 IPsec on input, and with IPsec protected\r
198 on return.\r
68d3f2fb 199 @param[in, out] FragmentCount Number of fragments.\r
a3bcde70
HT
200 @param[in] SadEntry Related SAD entry.\r
201 @param[out] RecycleEvent Event for recycling of resources.\r
202\r
203 @retval EFI_SUCCESS The operation is successful.\r
204 @retval EFI_UNSUPPORTED If the IPSEC protocol is not supported.\r
205\r
206**/\r
207EFI_STATUS\r
208IpSecProtectOutboundPacket (\r
209 IN UINT8 IpVersion,\r
210 IN OUT VOID *IpHead,\r
68d3f2fb 211 IN OUT UINT8 *LastHead,\r
47b27101 212 IN OUT VOID **OptionsBuffer,\r
213 IN OUT UINT32 *OptionsLength,\r
a3bcde70 214 IN OUT EFI_IPSEC_FRAGMENT_DATA **FragmentTable,\r
68d3f2fb 215 IN OUT UINT32 *FragmentCount,\r
a3bcde70
HT
216 IN IPSEC_SAD_ENTRY *SadEntry,\r
217 OUT EFI_EVENT *RecycleEvent\r
218 );\r
219\r
220/**\r
221 Check if the IP Address in the address range of AddressInfos specified.\r
222\r
223 @param[in] IpVersion The IP version.\r
224 @param[in] IpAddr Points to EFI_IP_ADDRESS to be check.\r
225 @param[in] AddressInfo A list of EFI_IP_ADDRESS_INFO that is used to check\r
226 the IP Address is matched.\r
227 @param[in] AddressCount The total numbers of the AddressInfo.\r
228\r
229 @retval TRUE If the Specified IP Address is in the range of the AddressInfos specified.\r
230 @retval FALSE If the Specified IP Address is not in the range of the AddressInfos specified.\r
231\r
232**/\r
233BOOLEAN\r
234IpSecMatchIpAddress (\r
235 IN UINT8 IpVersion,\r
236 IN EFI_IP_ADDRESS *IpAddr,\r
237 IN EFI_IP_ADDRESS_INFO *AddressInfo,\r
238 IN UINT32 AddressCount\r
239 );\r
240\r
241/**\r
242 Find a PAD entry according to remote IP address.\r
243\r
244 @param[in] IpVersion The version of IP.\r
245 @param[in] IpAddr Point to remote IP address.\r
246\r
247 @return The pointer of related PAD entry.\r
248\r
249**/\r
250IPSEC_PAD_ENTRY *\r
251IpSecLookupPadEntry (\r
252 IN UINT8 IpVersion,\r
253 IN EFI_IP_ADDRESS *IpAddr\r
254 );\r
255\r
9166f840 256/**\r
257 Check if the specified IP packet can be serviced by this SPD entry.\r
258\r
259 @param[in] SpdEntry Point to SPD entry.\r
260 @param[in] IpVersion Version of IP.\r
261 @param[in] IpHead Point to IP header.\r
262 @param[in] IpPayload Point to IP payload.\r
263 @param[in] Protocol The Last protocol of IP packet.\r
264 @param[in] IsOutbound Traffic direction.\r
265 @param[out] Action The support action of SPD entry.\r
266\r
267 @retval EFI_SUCCESS Find the related SPD.\r
268 @retval EFI_NOT_FOUND Not find the related SPD entry;\r
269\r
270**/\r
271EFI_STATUS\r
272IpSecLookupSpdEntry (\r
273 IN IPSEC_SPD_ENTRY *SpdEntry,\r
274 IN UINT8 IpVersion,\r
275 IN VOID *IpHead,\r
276 IN UINT8 *IpPayload,\r
277 IN UINT8 Protocol,\r
f75a7f56 278 IN BOOLEAN IsOutbound,\r
9166f840 279 OUT EFI_IPSEC_ACTION *Action\r
280 );\r
281\r
282/**\r
283 Look up if there is existing SAD entry for specified IP packet sending.\r
284\r
285 This function is called by the IPsecProcess when there is some IP packet needed to\r
286 send out. This function checks if there is an existing SAD entry that can be serviced\r
287 to this IP packet sending. If no existing SAD entry could be used, this\r
288 function will invoke an IPsec Key Exchange Negotiation.\r
289\r
290 @param[in] Private Points to private data.\r
291 @param[in] NicHandle Points to a NIC handle.\r
292 @param[in] IpVersion The version of IP.\r
293 @param[in] IpHead The IP Header of packet to be sent out.\r
294 @param[in] IpPayload The IP Payload to be sent out.\r
295 @param[in] OldLastHead The Last protocol of the IP packet.\r
296 @param[in] SpdEntry Points to a related SPD entry.\r
297 @param[out] SadEntry Contains the Point of a related SAD entry.\r
298\r
299 @retval EFI_DEVICE_ERROR One of following conditions is TRUE:\r
300 - If don't find related UDP service.\r
301 - Sequence Number is used up.\r
302 - Extension Sequence Number is used up.\r
303 @retval EFI_NOT_READY No existing SAD entry could be used.\r
304 @retval EFI_SUCCESS Find the related SAD entry.\r
305\r
306**/\r
307EFI_STATUS\r
308IpSecLookupSadEntry (\r
309 IN IPSEC_PRIVATE_DATA *Private,\r
310 IN EFI_HANDLE NicHandle,\r
311 IN UINT8 IpVersion,\r
312 IN VOID *IpHead,\r
313 IN UINT8 *IpPayload,\r
314 IN UINT8 OldLastHead,\r
315 IN IPSEC_SPD_ENTRY *SpdEntry,\r
316 OUT IPSEC_SAD_ENTRY **SadEntry\r
317 );\r
318\r
a3bcde70
HT
319/**\r
320 Find the SAD through whole SAD list.\r
321\r
322 @param[in] Spi The SPI used to search the SAD entry.\r
323 @param[in] DestAddress The destination used to search the SAD entry.\r
9166f840 324 @param[in] IpVersion The IP version. Ip4 or Ip6.\r
a3bcde70
HT
325\r
326 @return The pointer to a certain SAD entry.\r
327\r
328**/\r
329IPSEC_SAD_ENTRY *\r
330IpSecLookupSadBySpi (\r
331 IN UINT32 Spi,\r
9166f840 332 IN EFI_IP_ADDRESS *DestAddress,\r
333 IN UINT8 IpVersion\r
a3bcde70
HT
334 )\r
335;\r
336\r
337/**\r
338 Handles IPsec packet processing for inbound and outbound IP packets.\r
339\r
340 The EFI_IPSEC_PROCESS process routine handles each inbound or outbound packet.\r
341 The behavior is that it can perform one of the following actions:\r
342 bypass the packet, discard the packet, or protect the packet.\r
343\r
0a7294f7 344 @param[in] This Pointer to the EFI_IPSEC2_PROTOCOL instance.\r
a3bcde70
HT
345 @param[in] NicHandle Instance of the network interface.\r
346 @param[in] IpVersion IPV4 or IPV6.\r
347 @param[in, out] IpHead Pointer to the IP Header.\r
68d3f2fb 348 @param[in, out] LastHead The protocol of the next layer to be processed by IPsec.\r
349 @param[in, out] OptionsBuffer Pointer to the options buffer.\r
350 @param[in, out] OptionsLength Length of the options buffer.\r
a3bcde70 351 @param[in, out] FragmentTable Pointer to a list of fragments.\r
68d3f2fb 352 @param[in, out] FragmentCount Number of fragments.\r
a3bcde70
HT
353 @param[in] TrafficDirection Traffic direction.\r
354 @param[out] RecycleSignal Event for recycling of resources.\r
355\r
356 @retval EFI_SUCCESS The packet was bypassed and all buffers remain the same.\r
357 @retval EFI_SUCCESS The packet was protected.\r
358 @retval EFI_ACCESS_DENIED The packet was discarded.\r
359\r
360**/\r
361EFI_STATUS\r
362EFIAPI\r
363IpSecProcess (\r
68d3f2fb 364 IN EFI_IPSEC2_PROTOCOL *This,\r
a3bcde70
HT
365 IN EFI_HANDLE NicHandle,\r
366 IN UINT8 IpVersion,\r
367 IN OUT VOID *IpHead,\r
68d3f2fb 368 IN OUT UINT8 *LastHead,\r
369 IN OUT VOID **OptionsBuffer,\r
370 IN OUT UINT32 *OptionsLength,\r
a3bcde70 371 IN OUT EFI_IPSEC_FRAGMENT_DATA **FragmentTable,\r
68d3f2fb 372 IN OUT UINT32 *FragmentCount,\r
a3bcde70
HT
373 IN EFI_IPSEC_TRAFFIC_DIR TrafficDirection,\r
374 OUT EFI_EVENT *RecycleSignal\r
375 );\r
376\r
377extern EFI_DPC_PROTOCOL *mDpc;\r
68d3f2fb 378extern EFI_IPSEC2_PROTOCOL mIpSecInstance;\r
a3bcde70
HT
379\r
380extern EFI_COMPONENT_NAME2_PROTOCOL gIpSecComponentName2;\r
381extern EFI_COMPONENT_NAME_PROTOCOL gIpSecComponentName;\r
382\r
383\r
384#endif\r