If the SAD is set manually, print its keys in Ascci string format. If the SAD is created by IKE, print its keys in Hex format. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11226 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			164 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   The implementation of match policy entry function in IpSecConfig application.
 | |
| 
 | |
|   Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
 | |
| 
 | |
|   This program and the accompanying materials
 | |
|   are licensed and made available under the terms and conditions of the BSD License
 | |
|   which accompanies this distribution.  The full text of the license may be found at
 | |
|   http://opensource.org/licenses/bsd-license.php.
 | |
| 
 | |
|   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
|   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| 
 | |
| **/
 | |
| 
 | |
| #include "IpSecConfig.h"
 | |
| #include "Indexer.h"
 | |
| #include "Match.h"
 | |
| 
 | |
| /**
 | |
|   Private function to validate a buffer that should be filled with zero.
 | |
| 
 | |
|   @param[in] Memory    The pointer to the buffer.
 | |
|   @param[in] Size      The size of the buffer.
 | |
| 
 | |
|   @retval TRUE     The memory is filled with zero.
 | |
|   @retval FALSE    The memory isn't filled with zero.
 | |
| **/
 | |
| BOOLEAN
 | |
| IsMemoryZero (
 | |
|   IN VOID     *Memory,
 | |
|   IN UINTN    Size
 | |
|   )
 | |
| {
 | |
|   UINTN    Index;
 | |
| 
 | |
|   for (Index = 0; Index < Size; Index++) {
 | |
|     if (*((UINT8 *) Memory + Index) != 0) {
 | |
|       return FALSE;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return TRUE;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Find the matching SPD with Indexer.
 | |
| 
 | |
|   @param[in] Selector    The pointer to the EFI_IPSEC_SPD_SELECTOR structure.
 | |
|   @param[in] Data        The pointer to the EFI_IPSEC_SPD_DATA structure.
 | |
|   @param[in] Indexer     The pointer to the SPD_ENTRY_INDEXER structure.
 | |
| 
 | |
|   @retval TRUE     The matched SPD is found.
 | |
|   @retval FALSE    The matched SPD is not found.
 | |
| **/
 | |
| BOOLEAN
 | |
| MatchSpdEntry (
 | |
|   IN EFI_IPSEC_SPD_SELECTOR    *Selector,
 | |
|   IN EFI_IPSEC_SPD_DATA        *Data,
 | |
|   IN SPD_ENTRY_INDEXER         *Indexer
 | |
|   )
 | |
| {
 | |
|   BOOLEAN    Match;
 | |
| 
 | |
|   Match = FALSE;
 | |
|   if (Indexer->Name != NULL) {
 | |
|     if ((Data->Name != NULL) && (AsciiStrCmp ((CHAR8 *) Indexer->Name, (CHAR8 *) Data->Name) == 0)) {
 | |
|       Match = TRUE;
 | |
|     }
 | |
|   } else {
 | |
|     if (Indexer->Index == 0) {
 | |
|       Match = TRUE;
 | |
|     }
 | |
| 
 | |
|     Indexer->Index--;
 | |
|   }
 | |
| 
 | |
|   return Match;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Find the matching SAD with Indexer.
 | |
| 
 | |
|   @param[in] SaId       The pointer to the EFI_IPSEC_SA_ID structure.
 | |
|   @param[in] Data       The pointer to the EFI_IPSEC_SA_DATA2 structure.
 | |
|   @param[in] Indexer    The pointer to the SPD_ENTRY_INDEXER structure.
 | |
| 
 | |
|   @retval TRUE     The matched SAD is found.
 | |
|   @retval FALSE    The matched SAD is not found.
 | |
| **/
 | |
| BOOLEAN
 | |
| MatchSadEntry (
 | |
|   IN EFI_IPSEC_SA_ID      *SaId,
 | |
|   IN EFI_IPSEC_SA_DATA2   *Data,
 | |
|   IN SAD_ENTRY_INDEXER    *Indexer
 | |
|   )
 | |
| {
 | |
|   BOOLEAN    Match;
 | |
| 
 | |
|   Match = FALSE;
 | |
|   if (!IsMemoryZero (&Indexer->SaId, sizeof (EFI_IPSEC_SA_ID))) {
 | |
|     Match = (BOOLEAN) (CompareMem (&Indexer->SaId, SaId, sizeof (EFI_IPSEC_SA_ID)) == 0);
 | |
|   } else {
 | |
|     if (Indexer->Index == 0) {
 | |
|       Match = TRUE;
 | |
|     }
 | |
|     Indexer->Index--;
 | |
|   }
 | |
| 
 | |
|   return Match;
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Find the matching PAD with Indexer.
 | |
| 
 | |
|   @param[in] PadId      The pointer to the EFI_IPSEC_PAD_ID structure.
 | |
|   @param[in] Data       The pointer to the EFI_IPSEC_PAD_DATA structure.
 | |
|   @param[in] Indexer    The pointer to the SPD_ENTRY_INDEXER structure.
 | |
| 
 | |
|   @retval TRUE     The matched PAD is found.
 | |
|   @retval FALSE    The matched PAD is not found.
 | |
| **/
 | |
| BOOLEAN
 | |
| MatchPadEntry (
 | |
|   IN EFI_IPSEC_PAD_ID      *PadId,
 | |
|   IN EFI_IPSEC_PAD_DATA    *Data,
 | |
|   IN PAD_ENTRY_INDEXER     *Indexer
 | |
|   )
 | |
| {
 | |
|   BOOLEAN                       Match;
 | |
| 
 | |
|   Match = FALSE;
 | |
|   if (!IsMemoryZero (&Indexer->PadId, sizeof (EFI_IPSEC_PAD_ID))) {
 | |
|     Match = (BOOLEAN) ((Indexer->PadId.PeerIdValid == PadId->PeerIdValid) &&
 | |
|                        ((PadId->PeerIdValid &&
 | |
|                          (StrCmp (
 | |
|                             (CONST CHAR16 *) Indexer->PadId.Id.PeerId,
 | |
|                             (CONST CHAR16 *) PadId->Id.PeerId
 | |
|                             ) == 0)) ||
 | |
|                         ((!PadId->PeerIdValid) &&
 | |
|                          (Indexer->PadId.Id.IpAddress.PrefixLength == PadId->Id.IpAddress.PrefixLength) &&
 | |
|                          (CompareMem (
 | |
|                             &Indexer->PadId.Id.IpAddress.Address,
 | |
|                             &PadId->Id.IpAddress.Address,
 | |
|                             sizeof (EFI_IP_ADDRESS)
 | |
|                             ) == 0))));
 | |
|   } else {
 | |
|     if (Indexer->Index == 0) {
 | |
|       Match = TRUE;
 | |
|     }
 | |
| 
 | |
|     Indexer->Index--;
 | |
|   }
 | |
| 
 | |
|   return Match;
 | |
| }
 | |
| 
 | |
| MATCH_POLICY_ENTRY mMatchPolicyEntry[] = {
 | |
|   (MATCH_POLICY_ENTRY) MatchSpdEntry,
 | |
|   (MATCH_POLICY_ENTRY) MatchSadEntry,
 | |
|   (MATCH_POLICY_ENTRY) MatchPadEntry
 | |
| };
 | |
| 
 |