-/** @file\r
- The implementation of match policy entry function in IpSecConfig application.\r
-\r
- Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
-\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include "IpSecConfig.h"\r
-#include "Indexer.h"\r
-#include "Match.h"\r
-\r
-/**\r
- Private function to validate a buffer that should be filled with zero.\r
-\r
- @param[in] Memory The pointer to the buffer.\r
- @param[in] Size The size of the buffer.\r
-\r
- @retval TRUE The memory is filled with zero.\r
- @retval FALSE The memory isn't filled with zero.\r
-**/\r
-BOOLEAN\r
-IsMemoryZero (\r
- IN VOID *Memory,\r
- IN UINTN Size\r
- )\r
-{\r
- UINTN Index;\r
-\r
- for (Index = 0; Index < Size; Index++) {\r
- if (*((UINT8 *) Memory + Index) != 0) {\r
- return FALSE;\r
- }\r
- }\r
-\r
- return TRUE;\r
-}\r
-\r
-/**\r
- Find the matching SPD with Indexer.\r
-\r
- @param[in] Selector The pointer to the EFI_IPSEC_SPD_SELECTOR structure.\r
- @param[in] Data The pointer to the EFI_IPSEC_SPD_DATA structure.\r
- @param[in] Indexer The pointer to the SPD_ENTRY_INDEXER structure.\r
-\r
- @retval TRUE The matched SPD is found.\r
- @retval FALSE The matched SPD is not found.\r
-**/\r
-BOOLEAN\r
-MatchSpdEntry (\r
- IN EFI_IPSEC_SPD_SELECTOR *Selector,\r
- IN EFI_IPSEC_SPD_DATA *Data,\r
- IN SPD_ENTRY_INDEXER *Indexer\r
- )\r
-{\r
- BOOLEAN Match;\r
-\r
- Match = FALSE;\r
- if (!IsMemoryZero (Indexer->Name, MAX_PEERID_LEN)) {\r
- if ((Data->Name != NULL) && (AsciiStrCmp ((CHAR8 *) Indexer->Name, (CHAR8 *) Data->Name) == 0)) {\r
- Match = TRUE;\r
- }\r
- } else {\r
- if (Indexer->Index == 0) {\r
- Match = TRUE;\r
- }\r
-\r
- Indexer->Index--;\r
- }\r
-\r
- return Match;\r
-}\r
-\r
-/**\r
- Find the matching SAD with Indexer.\r
-\r
- @param[in] SaId The pointer to the EFI_IPSEC_SA_ID structure.\r
- @param[in] Data The pointer to the EFI_IPSEC_SA_DATA2 structure.\r
- @param[in] Indexer The pointer to the SPD_ENTRY_INDEXER structure.\r
-\r
- @retval TRUE The matched SAD is found.\r
- @retval FALSE The matched SAD is not found.\r
-**/\r
-BOOLEAN\r
-MatchSadEntry (\r
- IN EFI_IPSEC_SA_ID *SaId,\r
- IN EFI_IPSEC_SA_DATA2 *Data,\r
- IN SAD_ENTRY_INDEXER *Indexer\r
- )\r
-{\r
- BOOLEAN Match;\r
-\r
- Match = FALSE;\r
- if (!IsMemoryZero (&Indexer->SaId, sizeof (EFI_IPSEC_SA_ID))) {\r
- Match = (BOOLEAN) (CompareMem (&Indexer->SaId, SaId, sizeof (EFI_IPSEC_SA_ID)) == 0);\r
- } else {\r
- if (Indexer->Index == 0) {\r
- Match = TRUE;\r
- }\r
- Indexer->Index--;\r
- }\r
-\r
- return Match;\r
-}\r
-\r
-/**\r
- Find the matching PAD with Indexer.\r
-\r
- @param[in] PadId The pointer to the EFI_IPSEC_PAD_ID structure.\r
- @param[in] Data The pointer to the EFI_IPSEC_PAD_DATA structure.\r
- @param[in] Indexer The pointer to the SPD_ENTRY_INDEXER structure.\r
-\r
- @retval TRUE The matched PAD is found.\r
- @retval FALSE The matched PAD is not found.\r
-**/\r
-BOOLEAN\r
-MatchPadEntry (\r
- IN EFI_IPSEC_PAD_ID *PadId,\r
- IN EFI_IPSEC_PAD_DATA *Data,\r
- IN PAD_ENTRY_INDEXER *Indexer\r
- )\r
-{\r
- BOOLEAN Match;\r
-\r
- Match = FALSE;\r
- if (!IsMemoryZero (&Indexer->PadId, sizeof (EFI_IPSEC_PAD_ID))) {\r
- Match = (BOOLEAN) ((Indexer->PadId.PeerIdValid == PadId->PeerIdValid) &&\r
- ((PadId->PeerIdValid &&\r
- (StrCmp (\r
- (CONST CHAR16 *) Indexer->PadId.Id.PeerId,\r
- (CONST CHAR16 *) PadId->Id.PeerId\r
- ) == 0)) ||\r
- ((!PadId->PeerIdValid) &&\r
- (Indexer->PadId.Id.IpAddress.PrefixLength == PadId->Id.IpAddress.PrefixLength) &&\r
- (CompareMem (\r
- &Indexer->PadId.Id.IpAddress.Address,\r
- &PadId->Id.IpAddress.Address,\r
- sizeof (EFI_IP_ADDRESS)\r
- ) == 0))));\r
- } else {\r
- if (Indexer->Index == 0) {\r
- Match = TRUE;\r
- }\r
-\r
- Indexer->Index--;\r
- }\r
-\r
- return Match;\r
-}\r
-\r
-MATCH_POLICY_ENTRY mMatchPolicyEntry[] = {\r
- (MATCH_POLICY_ENTRY) MatchSpdEntry,\r
- (MATCH_POLICY_ENTRY) MatchSadEntry,\r
- (MATCH_POLICY_ENTRY) MatchPadEntry\r
-};\r
-\r