]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/Application/IpsecConfig/IpSecConfig.c
NetworkPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / NetworkPkg / Application / IpsecConfig / IpSecConfig.c
CommitLineData
a3bcde70
HT
1/** @file\r
2 The main process for IpSecConfig application.\r
3\r
96c1d788 4 Copyright (c) 2009 - 2016, 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#include <Library/UefiRuntimeServicesTableLib.h>\r
11#include <Library/HiiLib.h>\r
12\r
13#include <Protocol/IpSec.h>\r
14\r
15#include "IpSecConfig.h"\r
16#include "Dump.h"\r
17#include "Indexer.h"\r
18#include "PolicyEntryOperation.h"\r
19#include "Delete.h"\r
20#include "Helper.h"\r
21\r
96c1d788
JW
22//\r
23// String token ID of IpSecConfig command help message text.\r
24//\r
25GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mStringIpSecHelpTokenId = STRING_TOKEN (STR_IPSEC_CONFIG_HELP);\r
26\r
a3bcde70
HT
27//\r
28// Used for ShellCommandLineParseEx only\r
29// and to ensure user inputs are in valid format\r
30//\r
31SHELL_PARAM_ITEM mIpSecConfigParamList[] = {\r
32 { L"-p", TypeValue },\r
33 { L"-a", TypeValue },\r
34 { L"-i", TypeValue },\r
35 { L"-e", TypeValue },\r
36 { L"-d", TypeValue },\r
37 { L"-f", TypeFlag },\r
38 { L"-l", TypeFlag },\r
39 { L"-enable", TypeFlag },\r
40 { L"-disable", TypeFlag },\r
41 { L"-status", TypeFlag },\r
a3bcde70
HT
42\r
43 //\r
44 // SPD Selector\r
45 //\r
46 { L"--local", TypeValue },\r
47 { L"--remote", TypeValue },\r
48 { L"--proto", TypeValue },\r
49 { L"--local-port", TypeValue },\r
50 { L"--remote-port", TypeValue },\r
51 { L"--icmp-type", TypeValue },\r
52 { L"--icmp-code", TypeValue },\r
53\r
54 //\r
55 // SPD Data\r
56 //\r
57 { L"--name", TypeValue },\r
58 { L"--packet-flag", TypeValue },\r
59 { L"--action", TypeValue },\r
60 { L"--lifebyte", TypeValue },\r
61 { L"--lifetime-soft", TypeValue },\r
62 { L"--lifetime", TypeValue },\r
63 { L"--mode", TypeValue },\r
64 { L"--tunnel-local", TypeValue },\r
65 { L"--tunnel-remote", TypeValue },\r
66 { L"--dont-fragment", TypeValue },\r
67 { L"--ipsec-proto", TypeValue },\r
68 { L"--auth-algo", TypeValue },\r
69 { L"--encrypt-algo", TypeValue },\r
70\r
71 { L"--ext-sequence", TypeFlag },\r
72 { L"--sequence-overflow", TypeFlag },\r
73 { L"--fragment-check", TypeFlag },\r
74 { L"--ext-sequence-", TypeFlag },\r
75 { L"--sequence-overflow-", TypeFlag },\r
76 { L"--fragment-check-", TypeFlag },\r
77\r
78 //\r
79 // SA ID\r
80 // --ipsec-proto\r
81 //\r
82 { L"--spi", TypeValue },\r
64b2d0e5 83 { L"--tunnel-dest", TypeValue },\r
84 { L"--tunnel-source", TypeValue },\r
a3bcde70
HT
85 { L"--lookup-spi", TypeValue },\r
86 { L"--lookup-ipsec-proto", TypeValue },\r
87 { L"--lookup-dest", TypeValue },\r
88\r
89 //\r
90 // SA DATA\r
91 // --mode\r
92 // --auth-algo\r
93 // --encrypt-algo\r
94 //\r
95 { L"--sequence-number", TypeValue },\r
96 { L"--antireplay-window", TypeValue },\r
97 { L"--auth-key", TypeValue },\r
98 { L"--encrypt-key", TypeValue },\r
99 { L"--path-mtu", TypeValue },\r
100\r
101 //\r
102 // PAD ID\r
103 //\r
104 { L"--peer-id", TypeValue },\r
105 { L"--peer-address", TypeValue },\r
106 { L"--auth-proto", TypeValue },\r
107 { L"--auth-method", TypeValue },\r
108 { L"--ike-id", TypeValue },\r
109 { L"--ike-id-", TypeValue },\r
110 { L"--auth-data", TypeValue },\r
111 { L"--revocation-data", TypeValue },\r
112 { L"--lookup-peer-id", TypeValue },\r
113 { L"--lookup-peer-address", TypeValue },\r
114\r
115 { NULL, TypeMax },\r
116};\r
117\r
118//\r
119// -P\r
120//\r
121STR2INT mMapPolicy[] = {\r
122 { L"SPD", IPsecConfigDataTypeSpd },\r
123 { L"SAD", IPsecConfigDataTypeSad },\r
124 { L"PAD", IPsecConfigDataTypePad },\r
125 { NULL, 0 },\r
126};\r
127\r
128//\r
129// --proto\r
130//\r
131STR2INT mMapIpProtocol[] = {\r
132 { L"TCP", EFI_IP4_PROTO_TCP },\r
133 { L"UDP", EFI_IP4_PROTO_UDP },\r
134 { L"ICMP", EFI_IP4_PROTO_ICMP },\r
135 { NULL, 0 },\r
136};\r
137\r
138//\r
139// --action\r
140//\r
141STR2INT mMapIpSecAction[] = {\r
142 { L"Bypass", EfiIPsecActionBypass },\r
143 { L"Discard", EfiIPsecActionDiscard },\r
144 { L"Protect", EfiIPsecActionProtect },\r
145 { NULL, 0 },\r
146};\r
147\r
148//\r
149// --mode\r
150//\r
151STR2INT mMapIpSecMode[] = {\r
152 { L"Transport", EfiIPsecTransport },\r
153 { L"Tunnel", EfiIPsecTunnel },\r
154 { NULL, 0 },\r
155};\r
156\r
157//\r
158// --dont-fragment\r
159//\r
160STR2INT mMapDfOption[] = {\r
161 { L"clear", EfiIPsecTunnelClearDf },\r
162 { L"set", EfiIPsecTunnelSetDf },\r
163 { L"copy", EfiIPsecTunnelCopyDf },\r
164 { NULL, 0 },\r
165};\r
166\r
167//\r
168// --ipsec-proto\r
169//\r
170STR2INT mMapIpSecProtocol[] = {\r
171 { L"AH", EfiIPsecAH },\r
172 { L"ESP", EfiIPsecESP },\r
173 { NULL, 0 },\r
174};\r
175\r
176//\r
177// --auth-algo\r
178//\r
179STR2INT mMapAuthAlgo[] = {\r
780847d1 180 { L"NONE", IPSEC_AALG_NONE },\r
181 { L"MD5HMAC", IPSEC_AALG_MD5HMAC },\r
182 { L"SHA1HMAC", IPSEC_AALG_SHA1HMAC },\r
183 { L"SHA2-256HMAC", IPSEC_AALG_SHA2_256HMAC },\r
184 { L"SHA2-384HMAC", IPSEC_AALG_SHA2_384HMAC },\r
185 { L"SHA2-512HMAC", IPSEC_AALG_SHA2_512HMAC },\r
186 { L"AES-XCBC-MAC", IPSEC_AALG_AES_XCBC_MAC },\r
187 { L"NULL", IPSEC_AALG_NULL },\r
a3bcde70
HT
188 { NULL, 0 },\r
189};\r
190\r
191//\r
192// --encrypt-algo\r
193//\r
194STR2INT mMapEncAlgo[] = {\r
780847d1 195 { L"NONE", IPSEC_EALG_NONE },\r
196 { L"DESCBC", IPSEC_EALG_DESCBC },\r
197 { L"3DESCBC", IPSEC_EALG_3DESCBC },\r
198 { L"CASTCBC", IPSEC_EALG_CASTCBC },\r
199 { L"BLOWFISHCBC", IPSEC_EALG_BLOWFISHCBC },\r
200 { L"NULL", IPSEC_EALG_NULL },\r
201 { L"AESCBC", IPSEC_EALG_AESCBC },\r
202 { L"AESCTR", IPSEC_EALG_AESCTR },\r
203 { L"AES-CCM-ICV8", IPSEC_EALG_AES_CCM_ICV8 },\r
204 { L"AES-CCM-ICV12",IPSEC_EALG_AES_CCM_ICV12 },\r
205 { L"AES-CCM-ICV16",IPSEC_EALG_AES_CCM_ICV16 },\r
206 { L"AES-GCM-ICV8", IPSEC_EALG_AES_GCM_ICV8 },\r
207 { L"AES-GCM-ICV12",IPSEC_EALG_AES_GCM_ICV12 },\r
208 { L"AES-GCM-ICV16",IPSEC_EALG_AES_GCM_ICV16 },\r
a3bcde70
HT
209 { NULL, 0 },\r
210};\r
211\r
212//\r
213// --auth-proto\r
214//\r
215STR2INT mMapAuthProto[] = {\r
216 { L"IKEv1", EfiIPsecAuthProtocolIKEv1 },\r
217 { L"IKEv2", EfiIPsecAuthProtocolIKEv2 },\r
218 { NULL, 0 },\r
219};\r
220\r
221//\r
222// --auth-method\r
223//\r
224STR2INT mMapAuthMethod[] = {\r
225 { L"PreSharedSecret", EfiIPsecAuthMethodPreSharedSecret },\r
226 { L"Certificates", EfiIPsecAuthMethodCertificates },\r
227 { NULL, 0 },\r
228};\r
229\r
780847d1 230EFI_IPSEC2_PROTOCOL *mIpSec;\r
a3bcde70
HT
231EFI_IPSEC_CONFIG_PROTOCOL *mIpSecConfig;\r
232EFI_HII_HANDLE mHiiHandle;\r
a3bcde70
HT
233CHAR16 mAppName[] = L"IpSecConfig";\r
234\r
235//\r
236// Used for IpSecConfigRetriveCheckListByName only to check the validation of user input\r
237//\r
238VAR_CHECK_ITEM mIpSecConfigVarCheckList[] = {\r
239 { L"-enable", BIT(1)|BIT(0), BIT(1), BIT(2)|BIT(1)|BIT(0), 0 },\r
240 { L"-disable", BIT(1)|BIT(0), BIT(1), BIT(2)|BIT(1)|BIT(0), 0 },\r
241 { L"-status", BIT(1)|BIT(0), BIT(1), BIT(2)|BIT(1)|BIT(0), 0 },\r
242 { L"-p", BIT(1), 0, BIT(2)|BIT(1)|BIT(0), 0 },\r
243\r
244 { L"-a", BIT(0), 0, BIT(2)|BIT(1)|BIT(0), 0 },\r
245 { L"-i", BIT(0), 0, BIT(2)|BIT(1)|BIT(0), 0 },\r
246 { L"-d", BIT(0), 0, BIT(2)|BIT(1)|BIT(0), 0 },\r
247 { L"-e", BIT(0), 0, BIT(2)|BIT(1)|BIT(0), 0 },\r
248 { L"-l", BIT(0), 0, BIT(2)|BIT(1)|BIT(0), 0 },\r
249 { L"-f", BIT(0), 0, BIT(2)|BIT(1)|BIT(0), 0 },\r
250\r
251 { L"-?", BIT(0), BIT(0), BIT(2)|BIT(1)|BIT(0), 0 },\r
252\r
253 //\r
254 // SPD Selector\r
255 //\r
256 { L"--local", 0, 0, BIT(2)|BIT(1), 0 },\r
257 { L"--remote", 0, 0, BIT(2)|BIT(1), 0 },\r
258 { L"--proto", 0, 0, BIT(2)|BIT(1), 0 },\r
259 { L"--local-port", 0, 0, BIT(2)|BIT(1), BIT(0) },\r
260 { L"--remote-port", 0, 0, BIT(2)|BIT(1), BIT(0) },\r
261 { L"--icmp-type", 0, 0, BIT(2)|BIT(1), BIT(1) },\r
262 { L"--icmp-code", 0, 0, BIT(2)|BIT(1), BIT(1) },\r
263\r
264 //\r
265 // SPD Data\r
266 //\r
267 { L"--name", 0, 0, BIT(2), 0 },\r
268 { L"--packet-flag", 0, 0, BIT(2), 0 },\r
269 { L"--action", 0, 0, BIT(2)|BIT(1), 0 },\r
270 { L"--lifebyte", 0, 0, BIT(2)|BIT(1), 0 },\r
271 { L"--lifetime-soft", 0, 0, BIT(2)|BIT(1), 0 },\r
272 { L"--lifetime", 0, 0, BIT(2)|BIT(1), 0 },\r
273 { L"--mode", 0, 0, BIT(2)|BIT(1), 0 },\r
274 { L"--tunnel-local", 0, 0, BIT(2), 0 },\r
275 { L"--tunnel-remote", 0, 0, BIT(2), 0 },\r
276 { L"--dont-fragment", 0, 0, BIT(2), 0 },\r
277 { L"--ipsec-proto", 0, 0, BIT(2)|BIT(1), 0 },\r
278 { L"--auth-algo", 0, 0, BIT(2)|BIT(1), 0 },\r
279 { L"--encrypt-algo", 0, 0, BIT(2)|BIT(1), 0 },\r
280\r
281 { L"--ext-sequence", 0, 0, BIT(2), BIT(2) },\r
282 { L"--sequence-overflow", 0, 0, BIT(2), BIT(2) },\r
283 { L"--fragment-check", 0, 0, BIT(2), BIT(2) },\r
284 { L"--ext-sequence-", 0, 0, BIT(2), BIT(3) },\r
285 { L"--sequence-overflow-", 0, 0, BIT(2), BIT(3) },\r
286 { L"--fragment-check-", 0, 0, BIT(2), BIT(3) },\r
287\r
288 //\r
289 // SA ID\r
290 // --ipsec-proto\r
291 //\r
292 { L"--spi", 0, 0, BIT(1), 0 },\r
64b2d0e5 293 { L"--tunnel-dest", 0, 0, BIT(1), 0 },\r
294 { L"--tunnel-source", 0, 0, BIT(1), 0 },\r
a3bcde70
HT
295 { L"--lookup-spi", 0, 0, BIT(1), 0 },\r
296 { L"--lookup-ipsec-proto", 0, 0, BIT(1), 0 },\r
297 { L"--lookup-dest", 0, 0, BIT(1), 0 },\r
298\r
299 //\r
300 // SA DATA\r
301 // --mode\r
302 // --auth-algo\r
303 // --encrypt-algo\r
304 //\r
305 { L"--sequence-number", 0, 0, BIT(1), 0 },\r
306 { L"--antireplay-window", 0, 0, BIT(1), 0 },\r
307 { L"--auth-key", 0, 0, BIT(1), 0 },\r
308 { L"--encrypt-key", 0, 0, BIT(1), 0 },\r
309 { L"--path-mtu", 0, 0, BIT(1), 0 },\r
310\r
311 //\r
312 // The example to add a PAD:\r
313 // "-A --peer-id Mike [--peer-address 10.23.2.2] --auth-proto IKE1/IKE2\r
314 // --auth-method PreSharedSeceret/Certificate --ike-id\r
315 // --auth-data 343343 --revocation-data 2342432"\r
316 // The example to delete a PAD:\r
317 // "-D * --lookup-peer-id Mike [--lookup-peer-address 10.23.2.2]"\r
318 // "-D 1"\r
319 // The example to edit a PAD:\r
320 // "-E * --lookup-peer-id Mike --auth-method Certificate"\r
321\r
322 //\r
323 // PAD ID\r
324 //\r
325 { L"--peer-id", 0, 0, BIT(0), BIT(4) },\r
326 { L"--peer-address", 0, 0, BIT(0), BIT(5) },\r
327 { L"--auth-proto", 0, 0, BIT(0), 0 },\r
328 { L"--auth-method", 0, 0, BIT(0), 0 },\r
329 { L"--IKE-ID", 0, 0, BIT(0), BIT(6) },\r
330 { L"--IKE-ID-", 0, 0, BIT(0), BIT(7) },\r
331 { L"--auth-data", 0, 0, BIT(0), 0 },\r
332 { L"--revocation-data", 0, 0, BIT(0), 0 },\r
333 { L"--lookup-peer-id", 0, 0, BIT(0), BIT(4) },\r
334 { L"--lookup-peer-address",0, 0, BIT(0), BIT(5) },\r
335\r
336 { NULL, 0, 0, 0, 0 },\r
337};\r
338\r
339/**\r
340 The function to allocate the proper sized buffer for various\r
341 EFI interfaces.\r
342\r
343 @param[in, out] Status Current status.\r
344 @param[in, out] Buffer Current allocated buffer, or NULL.\r
345 @param[in] BufferSize Current buffer size needed\r
346\r
347 @retval TRUE If the buffer was reallocated and the caller should try the API again.\r
348 @retval FALSE If the buffer was not reallocated successfully.\r
349**/\r
350BOOLEAN\r
351GrowBuffer (\r
352 IN OUT EFI_STATUS *Status,\r
353 IN OUT VOID **Buffer,\r
354 IN UINTN BufferSize\r
355 )\r
356{\r
357 BOOLEAN TryAgain;\r
358\r
359 ASSERT (Status != NULL);\r
360 ASSERT (Buffer != NULL);\r
361\r
362 //\r
363 // If this is an initial request, buffer will be null with a new buffer size.\r
364 //\r
365 if ((NULL == *Buffer) && (BufferSize != 0)) {\r
366 *Status = EFI_BUFFER_TOO_SMALL;\r
367 }\r
368\r
369 //\r
370 // If the status code is "buffer too small", resize the buffer.\r
371 //\r
372 TryAgain = FALSE;\r
373 if (*Status == EFI_BUFFER_TOO_SMALL) {\r
374\r
375 if (*Buffer != NULL) {\r
376 FreePool (*Buffer);\r
377 }\r
378\r
379 *Buffer = AllocateZeroPool (BufferSize);\r
380\r
381 if (*Buffer != NULL) {\r
382 TryAgain = TRUE;\r
383 } else {\r
384 *Status = EFI_OUT_OF_RESOURCES;\r
385 }\r
386 }\r
387\r
388 //\r
389 // If there's an error, free the buffer.\r
390 //\r
391 if (!TryAgain && EFI_ERROR (*Status) && (*Buffer != NULL)) {\r
392 FreePool (*Buffer);\r
393 *Buffer = NULL;\r
394 }\r
395\r
396 return TryAgain;\r
397}\r
398\r
399/**\r
400 Function returns an array of handles that support the requested protocol\r
401 in a buffer allocated from a pool.\r
402\r
403 @param[in] SearchType Specifies which handle(s) are to be returned.\r
404 @param[in] Protocol Provides the protocol to search by.\r
405 This parameter is only valid for SearchType ByProtocol.\r
406\r
407 @param[in] SearchKey Supplies the search key depending on the SearchType.\r
408 @param[in, out] NoHandles The number of handles returned in Buffer.\r
409 @param[out] Buffer A pointer to the buffer to return the requested array of\r
410 handles that support Protocol.\r
411\r
412 @retval EFI_SUCCESS The resulting array of handles was returned.\r
413 @retval Others Other mistake case.\r
414**/\r
415EFI_STATUS\r
416LocateHandle (\r
417 IN EFI_LOCATE_SEARCH_TYPE SearchType,\r
418 IN EFI_GUID *Protocol OPTIONAL,\r
419 IN VOID *SearchKey OPTIONAL,\r
420 IN OUT UINTN *NoHandles,\r
421 OUT EFI_HANDLE **Buffer\r
422 )\r
423{\r
424 EFI_STATUS Status;\r
425 UINTN BufferSize;\r
426\r
427 ASSERT (NoHandles != NULL);\r
428 ASSERT (Buffer != NULL);\r
429\r
430 //\r
431 // Initialize for GrowBuffer loop.\r
432 //\r
433 Status = EFI_SUCCESS;\r
434 *Buffer = NULL;\r
435 BufferSize = 50 * sizeof (EFI_HANDLE);\r
436\r
437 //\r
438 // Call the real function.\r
439 //\r
440 while (GrowBuffer (&Status, (VOID **) Buffer, BufferSize)) {\r
441 Status = gBS->LocateHandle (\r
442 SearchType,\r
443 Protocol,\r
444 SearchKey,\r
445 &BufferSize,\r
446 *Buffer\r
447 );\r
448 }\r
449\r
450 *NoHandles = BufferSize / sizeof (EFI_HANDLE);\r
451 if (EFI_ERROR (Status)) {\r
452 *NoHandles = 0;\r
453 }\r
454\r
455 return Status;\r
456}\r
457\r
458/**\r
459 Find the first instance of this protocol in the system and return its interface.\r
460\r
461 @param[in] ProtocolGuid The guid of the protocol.\r
462 @param[out] Interface The pointer to the first instance of the protocol.\r
463\r
464 @retval EFI_SUCCESS A protocol instance matching ProtocolGuid was found.\r
465 @retval Others A protocol instance matching ProtocolGuid was not found.\r
466**/\r
467EFI_STATUS\r
468LocateProtocol (\r
469 IN EFI_GUID *ProtocolGuid,\r
470 OUT VOID **Interface\r
471 )\r
472\r
473{\r
474 EFI_STATUS Status;\r
475 UINTN NumberHandles;\r
476 UINTN Index;\r
477 EFI_HANDLE *Handles;\r
478\r
479 *Interface = NULL;\r
480 Handles = NULL;\r
481 NumberHandles = 0;\r
482\r
483 Status = LocateHandle (ByProtocol, ProtocolGuid, NULL, &NumberHandles, &Handles);\r
484 if (EFI_ERROR (Status)) {\r
485 DEBUG ((EFI_D_INFO, "LibLocateProtocol: Handle not found\n"));\r
486 return Status;\r
487 }\r
488\r
489 for (Index = 0; Index < NumberHandles; Index++) {\r
490 ASSERT (Handles != NULL);\r
491 Status = gBS->HandleProtocol (\r
492 Handles[Index],\r
493 ProtocolGuid,\r
494 Interface\r
495 );\r
496\r
497 if (!EFI_ERROR (Status)) {\r
498 break;\r
499 }\r
500 }\r
501\r
502 if (Handles != NULL) {\r
503 FreePool (Handles);\r
504 }\r
505\r
506 return Status;\r
507}\r
508\r
509/**\r
510 Helper function called to check the conflicted flags.\r
511\r
512 @param[in] CheckList The pointer to the VAR_CHECK_ITEM table.\r
513 @param[in] ParamPackage The pointer to the ParamPackage list.\r
514\r
515 @retval EFI_SUCCESS No conflicted flags.\r
516 @retval EFI_INVALID_PARAMETER The input parameter is erroroneous or there are some conflicted flags.\r
517**/\r
518EFI_STATUS\r
519IpSecConfigRetriveCheckListByName (\r
520 IN VAR_CHECK_ITEM *CheckList,\r
521 IN LIST_ENTRY *ParamPackage\r
522)\r
523{\r
524\r
525 LIST_ENTRY *Node;\r
526 VAR_CHECK_ITEM *Item;\r
527 UINT32 Attribute1;\r
528 UINT32 Attribute2;\r
529 UINT32 Attribute3;\r
530 UINT32 Attribute4;\r
531 UINT32 Index;\r
532\r
533 Attribute1 = 0;\r
534 Attribute2 = 0;\r
535 Attribute3 = 0;\r
536 Attribute4 = 0;\r
537 Index = 0;\r
538 Item = mIpSecConfigVarCheckList;\r
539\r
540 if ((ParamPackage == NULL) || (CheckList == NULL)) {\r
541 return EFI_INVALID_PARAMETER;\r
542 }\r
543\r
544 //\r
545 // Enumerate through the list of parameters that are input by user.\r
546 //\r
547 for (Node = GetFirstNode (ParamPackage); !IsNull (ParamPackage, Node); Node = GetNextNode (ParamPackage, Node)) {\r
548 if (((SHELL_PARAM_PACKAGE *) Node)->Name != NULL) {\r
549 //\r
64b2d0e5 550 // Enumerate the check list that defines the conflicted attributes of each flag.\r
a3bcde70
HT
551 //\r
552 for (; Item->VarName != NULL; Item++) {\r
553 if (StrCmp (((SHELL_PARAM_PACKAGE *) Node)->Name, Item->VarName) == 0) {\r
554 Index++;\r
555 if (Index == 1) {\r
556 Attribute1 = Item->Attribute1;\r
557 Attribute2 = Item->Attribute2;\r
558 Attribute3 = Item->Attribute3;\r
559 Attribute4 = Item->Attribute4;\r
560 } else {\r
561 Attribute1 &= Item->Attribute1;\r
562 Attribute2 |= Item->Attribute2;\r
563 Attribute3 &= Item->Attribute3;\r
564 Attribute4 |= Item->Attribute4;\r
565 if (Attribute1 != 0) {\r
566 return EFI_INVALID_PARAMETER;\r
567 }\r
568\r
569 if (Attribute2 != 0) {\r
570 if ((Index == 2) && (StrCmp (Item->VarName, L"-p") == 0)) {\r
571 continue;\r
572 }\r
573\r
574 return EFI_INVALID_PARAMETER;\r
575 }\r
576\r
577 if (Attribute3 == 0) {\r
578 return EFI_INVALID_PARAMETER;\r
579 }\r
580 if (((Attribute4 & 0xFF) == 0x03) || ((Attribute4 & 0xFF) == 0x0C) ||\r
581 ((Attribute4 & 0xFF) == 0x30) || ((Attribute4 & 0xFF) == 0xC0)) {\r
582 return EFI_INVALID_PARAMETER;\r
583 }\r
584 }\r
585 break;\r
586 }\r
587 }\r
588\r
589 Item = mIpSecConfigVarCheckList;\r
590 }\r
591 }\r
592\r
593 return EFI_SUCCESS;\r
594}\r
595\r
596/**\r
597 This is the declaration of an EFI image entry point. This entry point is\r
598 the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers, including\r
599 both device drivers and bus drivers.\r
600\r
601 The entry point for IpSecConfig application that parse the command line input and call an IpSecConfig process.\r
602\r
603 @param[in] ImageHandle The image handle of this application.\r
604 @param[in] SystemTable The pointer to the EFI System Table.\r
605\r
606 @retval EFI_SUCCESS The operation completed successfully.\r
607\r
608**/\r
609EFI_STATUS\r
610EFIAPI\r
611InitializeIpSecConfig (\r
612 IN EFI_HANDLE ImageHandle,\r
613 IN EFI_SYSTEM_TABLE *SystemTable\r
614 )\r
615{\r
616 EFI_STATUS Status;\r
617 EFI_IPSEC_CONFIG_DATA_TYPE DataType;\r
618 UINT8 Value;\r
619 LIST_ENTRY *ParamPackage;\r
620 CONST CHAR16 *ValueStr;\r
621 CHAR16 *ProblemParam;\r
622 UINTN NonOptionCount;\r
be6cd654 623 EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
a3bcde70
HT
624\r
625 //\r
be6cd654 626 // Retrieve HII package list from ImageHandle\r
a3bcde70 627 //\r
be6cd654
ZL
628 Status = gBS->OpenProtocol (\r
629 ImageHandle,\r
630 &gEfiHiiPackageListProtocolGuid,\r
631 (VOID **) &PackageList,\r
632 ImageHandle,\r
633 NULL,\r
634 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
635 );\r
636 if (EFI_ERROR (Status)) {\r
637 return Status;\r
638 }\r
639\r
640 //\r
641 // Publish HII package list to HII Database.\r
642 //\r
643 Status = gHiiDatabase->NewPackageList (\r
644 gHiiDatabase,\r
645 PackageList,\r
646 NULL,\r
647 &mHiiHandle\r
648 );\r
649 if (EFI_ERROR (Status)) {\r
650 return Status;\r
651 }\r
652\r
a3bcde70
HT
653 ASSERT (mHiiHandle != NULL);\r
654\r
655 Status = ShellCommandLineParseEx (mIpSecConfigParamList, &ParamPackage, &ProblemParam, TRUE, FALSE);\r
656 if (EFI_ERROR (Status)) {\r
657 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_UNKNOWN_OPERATION), mHiiHandle, ProblemParam);\r
658 goto Done;\r
659 }\r
660\r
661 Status = IpSecConfigRetriveCheckListByName (mIpSecConfigVarCheckList, ParamPackage);\r
662 if (EFI_ERROR (Status)) {\r
663 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_MISTAKEN_OPTIONS), mHiiHandle);\r
664 goto Done;\r
665 }\r
666\r
667 Status = LocateProtocol (&gEfiIpSecConfigProtocolGuid, (VOID **) &mIpSecConfig);\r
668 if (EFI_ERROR (Status) || mIpSecConfig == NULL) {\r
669 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_PROTOCOL_INEXISTENT), mHiiHandle, mAppName);\r
670 goto Done;\r
671 }\r
672\r
0a7294f7 673 Status = LocateProtocol (&gEfiIpSec2ProtocolGuid, (VOID **) &mIpSec);\r
a3bcde70
HT
674 if (EFI_ERROR (Status) || mIpSec == NULL) {\r
675 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_PROTOCOL_INEXISTENT), mHiiHandle, mAppName);\r
676 goto Done;\r
677 }\r
678\r
679 //\r
680 // Enable IPsec.\r
681 //\r
682 if (ShellCommandLineGetFlag (ParamPackage, L"-enable")) {\r
683 if (!(mIpSec->DisabledFlag)) {\r
684 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_ALREADY_ENABLE), mHiiHandle, mAppName);\r
685 } else {\r
686 //\r
687 // Set enable flag.\r
688 //\r
689 Value = IPSEC_STATUS_ENABLED;\r
690 Status = gRT->SetVariable (\r
691 IPSECCONFIG_STATUS_NAME,\r
692 &gEfiIpSecConfigProtocolGuid,\r
693 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
694 sizeof (Value),\r
695 &Value\r
696 );\r
697 if (!EFI_ERROR (Status)) {\r
698 mIpSec->DisabledFlag = FALSE;\r
699 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_ENABLE_SUCCESS), mHiiHandle, mAppName);\r
700 } else {\r
701 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_ENABLE_FAILED), mHiiHandle, mAppName);\r
702 }\r
703 }\r
704\r
705 goto Done;\r
706 }\r
707\r
708 //\r
709 // Disable IPsec.\r
710 //\r
711 if (ShellCommandLineGetFlag (ParamPackage, L"-disable")) {\r
712 if (mIpSec->DisabledFlag) {\r
713 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_ALREADY_DISABLE), mHiiHandle, mAppName);\r
714 } else {\r
715 //\r
716 // Set disable flag; however, leave it to be disabled in the callback function of DisabledEvent.\r
717 //\r
718 gBS->SignalEvent (mIpSec->DisabledEvent);\r
719 if (mIpSec->DisabledFlag) {\r
720 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_DISABLE_SUCCESS), mHiiHandle, mAppName);\r
721 } else {\r
722 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_DISABLE_FAILED), mHiiHandle, mAppName);\r
723 }\r
724 }\r
725\r
726 goto Done;\r
727 }\r
728\r
729 //\r
730 //IPsec Status.\r
731 //\r
732 if (ShellCommandLineGetFlag (ParamPackage, L"-status")) {\r
733 if (mIpSec->DisabledFlag) {\r
734 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_STATUS_DISABLE), mHiiHandle, mAppName);\r
735 } else {\r
736 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_STATUS_ENABLE), mHiiHandle, mAppName);\r
737 }\r
a3bcde70
HT
738 goto Done;\r
739 }\r
740\r
741 //\r
742 // Try to get policy database type.\r
743 //\r
14fc747b 744 DataType = (EFI_IPSEC_CONFIG_DATA_TYPE) - 1;\r
a3bcde70
HT
745 ValueStr = ShellCommandLineGetValue (ParamPackage, L"-p");\r
746 if (ValueStr != NULL) {\r
747 DataType = (EFI_IPSEC_CONFIG_DATA_TYPE) MapStringToInteger (ValueStr, mMapPolicy);\r
748 if (DataType == -1) {\r
749 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_INCORRECT_DB), mHiiHandle, mAppName, ValueStr);\r
750 goto Done;\r
751 }\r
752 }\r
753\r
780847d1 754 NonOptionCount = ShellCommandLineGetCount (ParamPackage);\r
a3bcde70
HT
755 if ((NonOptionCount - 1) > 0) {\r
756 ValueStr = ShellCommandLineGetRawValue (ParamPackage, (UINT32) (NonOptionCount - 1));\r
757 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_REDUNDANCY_MANY), mHiiHandle, mAppName, ValueStr);\r
758 goto Done;\r
759 }\r
760\r
761 if (DataType == -1) {\r
762 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_MISSING_DB), mHiiHandle, mAppName);\r
763 goto Done;\r
764 }\r
765\r
766 if (ShellCommandLineGetFlag (ParamPackage, L"-a")) {\r
767 Status = AddOrInsertPolicyEntry (DataType, ParamPackage);\r
768 if (EFI_ERROR (Status)) {\r
769 goto Done;\r
770 }\r
771 } else if (ShellCommandLineGetFlag (ParamPackage, L"-i")) {\r
772 Status = AddOrInsertPolicyEntry (DataType, ParamPackage);\r
773 if (EFI_ERROR (Status)) {\r
774 goto Done;\r
775 }\r
776 } else if (ShellCommandLineGetFlag (ParamPackage, L"-e")) {\r
777 Status = EditPolicyEntry (DataType, ParamPackage);\r
778 if (EFI_ERROR (Status)) {\r
779 goto Done;\r
780 }\r
781 } else if (ShellCommandLineGetFlag (ParamPackage, L"-d")) {\r
782 Status = FlushOrDeletePolicyEntry (DataType, ParamPackage);\r
783 if (EFI_ERROR (Status)) {\r
784 goto Done;\r
785 }\r
786 } else if (ShellCommandLineGetFlag (ParamPackage, L"-f")) {\r
787 Status = FlushOrDeletePolicyEntry (DataType, ParamPackage);\r
788 if (EFI_ERROR (Status)) {\r
789 goto Done;\r
790 }\r
791 } else if (ShellCommandLineGetFlag (ParamPackage, L"-l")) {\r
792 Status = ListPolicyEntry (DataType, ParamPackage);\r
793 if (EFI_ERROR (Status)) {\r
794 goto Done;\r
795 }\r
796 } else {\r
797 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_IPSEC_CONFIG_UNKNOWN_OPERATION), mHiiHandle, mAppName);\r
798 goto Done;\r
799 }\r
800\r
801Done:\r
802 ShellCommandLineFreeVarList (ParamPackage);\r
803 HiiRemovePackages (mHiiHandle);\r
804\r
805 return EFI_SUCCESS;\r
806}\r