Signed-off-by: qianouyang Reviewed-by: ydong10 git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13856 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			335 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			335 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   The Interfaces of IPsec debug information printing.
 | |
| 
 | |
|   Copyright (c) 2009 - 2010, 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 "IpSecImpl.h"
 | |
| #include "IpSecDebug.h"
 | |
| 
 | |
| //
 | |
| // The print title for IKEv1 variety phase.
 | |
| //
 | |
| CHAR8 *mIkev1StateStr[IKE_STATE_NUM] = {
 | |
|   "IKEv1_MAIN_1",
 | |
|   "IKEv1_MAIN_2",
 | |
|   "IKEv1_MAIN_3",
 | |
|   "IKEv1_MAIN_ESTABLISHED",
 | |
|   "IKEv1_QUICK_1",
 | |
|   "IKEv1_QUICK_2",
 | |
|   "IKEv1_QUICK_ESTABLISHED"
 | |
| };
 | |
| 
 | |
| //
 | |
| // The print title for IKEv2 variety phase.
 | |
| //
 | |
| CHAR8 *mIkev2StateStr[IKE_STATE_NUM] = {
 | |
|   "IKEv2_STATE_INIT",
 | |
|   "IKEv2_STATE_AUTH",
 | |
|   "IKEv2_STATE_SA_ESTABLISH",
 | |
|   "IKEv2_STATE_CREATE_CHILD",
 | |
|   "IKEv2_STATE_SA_REKEYING",
 | |
|   "IKEv2_STATE_CHILD_SA_ESTABLISHED",
 | |
|   "IKEv2_STATE_SA_DELETING"
 | |
| };
 | |
| 
 | |
| //
 | |
| // The print title for IKEv1 variety Exchagne.
 | |
| //
 | |
| CHAR8 *mExchangeStr[] = {
 | |
|   "IKEv1 Main Exchange",
 | |
|   "IKEv1 Info Exchange",
 | |
|   "IKEv1 Quick Exchange",
 | |
|   "IKEv2 Initial Exchange",
 | |
|   "IKEv2 Auth Exchange",
 | |
|   "IKEv2 Create Child Exchange",
 | |
|   "IKEv2 Info Exchange",
 | |
|   "IKE   Unknow Exchange"
 | |
| };
 | |
| 
 | |
| //
 | |
| // The print title for IKEv1 variety Payload.
 | |
| //
 | |
| CHAR8 *mIkev1PayloadStr[] = {
 | |
|   "IKEv1 None Payload",
 | |
|   "IKEv1 SA Payload",
 | |
|   "IKEv1 Proposal Payload",
 | |
|   "IKEv1 Transform Payload",
 | |
|   "IKEv1 KE Payload",
 | |
|   "IKEv1 ID Payload",
 | |
|   "IKEv1 Certificate Payload",
 | |
|   "IKEv1 Certificate Request Payload",
 | |
|   "IKEv1 Hash Payload",
 | |
|   "IKEv1 Signature Payload",
 | |
|   "IKEv1 Nonce Payload",
 | |
|   "IKEv1 Notify Payload",
 | |
|   "IKEv1 Delete Payload",
 | |
|   "IKEv1 Vendor Payload"
 | |
| };
 | |
| 
 | |
| //
 | |
| // The print title for IKEv2 variety Payload.
 | |
| //
 | |
| CHAR8* mIkev2PayloadStr[] = {
 | |
|   "IKEv2 SA Payload",
 | |
|   "IKEv2 Key Payload",
 | |
|   "IKEv2 Identity Initial Payload",
 | |
|   "IKEv2 Identity Respond Payload",
 | |
|   "IKEv2 Certificate Payload",
 | |
|   "IKEv2 Certificate Request Payload",
 | |
|   "IKEv2 Auth Payload",
 | |
|   "IKEv2 Nonce Payload",
 | |
|   "IKEv2 Notify Payload",
 | |
|   "IKEv2 Delet Payload",
 | |
|   "IKEv2 Vendor Payload",
 | |
|   "IKEv2 Traffic Selector Initiator Payload",
 | |
|   "IKEv2 Traffic Selector Respond Payload",
 | |
|   "IKEv2 Encrypt Payload",
 | |
|   "IKEv2 Configuration Payload",
 | |
|   "IKEv2 Extensible Authentication Payload"
 | |
| };
 | |
| 
 | |
| /**
 | |
|   Print the IP address.
 | |
| 
 | |
|   @param[in]  Level     Debug print error level. Pass to DEBUG().
 | |
|   @param[in]  Ip        Point to a specified IP address.
 | |
|   @param[in]  IpVersion The IP Version.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| IpSecDumpAddress (
 | |
|   IN UINTN               Level,
 | |
|   IN EFI_IP_ADDRESS      *Ip,
 | |
|   IN UINT8               IpVersion
 | |
|   )
 | |
| {
 | |
|   if (IpVersion == IP_VERSION_6) {
 | |
|     DEBUG (
 | |
|       (Level,
 | |
|       "%x%x:%x%x:%x%x:%x%x",
 | |
|       Ip->v6.Addr[0],
 | |
|       Ip->v6.Addr[1],
 | |
|       Ip->v6.Addr[2],
 | |
|       Ip->v6.Addr[3],
 | |
|       Ip->v6.Addr[4],
 | |
|       Ip->v6.Addr[5],
 | |
|       Ip->v6.Addr[6],
 | |
|       Ip->v6.Addr[7])
 | |
|       );
 | |
|     DEBUG (
 | |
|       (Level,
 | |
|       ":%x%x:%x%x:%x%x:%x%x\n",
 | |
|       Ip->v6.Addr[8],
 | |
|       Ip->v6.Addr[9],
 | |
|       Ip->v6.Addr[10],
 | |
|       Ip->v6.Addr[11],
 | |
|       Ip->v6.Addr[12],
 | |
|       Ip->v6.Addr[13],
 | |
|       Ip->v6.Addr[14],
 | |
|       Ip->v6.Addr[15])
 | |
|       );
 | |
|   } else {
 | |
|     DEBUG (
 | |
|       (Level,
 | |
|       "%d.%d.%d.%d\n",
 | |
|       Ip->v4.Addr[0],
 | |
|       Ip->v4.Addr[1],
 | |
|       Ip->v4.Addr[2],
 | |
|       Ip->v4.Addr[3])
 | |
|       );
 | |
|   }
 | |
| 
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Print IKE Current states.
 | |
| 
 | |
|   @param[in]  Previous    The Previous state of IKE.
 | |
|   @param[in]  Current     The current state of IKE.
 | |
|   @param[in]  IkeVersion  The version of IKE.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| IkeDumpState (
 | |
|   IN UINT32              Previous,
 | |
|   IN UINT32              Current,
 | |
|   IN UINT8               IkeVersion
 | |
|   )
 | |
| {
 | |
|   if (Previous >= IKE_STATE_NUM || Current >= IKE_STATE_NUM) {
 | |
|     return; 
 | |
|   }
 | |
|   
 | |
|   if (Previous == Current) {
 | |
|     if (IkeVersion == 1) {
 | |
|       DEBUG ((DEBUG_INFO, "\n****Current state is %a\n", mIkev1StateStr[Previous]));
 | |
|     } else if (IkeVersion == 2) {
 | |
|       DEBUG ((DEBUG_INFO, "\n****Current state is %a\n", mIkev2StateStr[Previous]));
 | |
|     }    
 | |
|   } else {
 | |
|     if (IkeVersion == 1) {
 | |
|       DEBUG ((DEBUG_INFO, "\n****Change state from %a to %a\n", mIkev1StateStr[Previous], mIkev1StateStr[Current]));
 | |
|     } else {
 | |
|       DEBUG ((DEBUG_INFO, "\n****Change state from %a to %a\n", mIkev2StateStr[Previous], mIkev2StateStr[Current]));
 | |
|     }    
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Print the IKE Packet.
 | |
| 
 | |
|   @param[in]  Packet      Point to IKE packet to be printed.
 | |
|   @param[in]  Direction   Point to the IKE packet is inbound or outbound.
 | |
|   @param[in]  IpVersion   Specified IP Version.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| IpSecDumpPacket (
 | |
|   IN IKE_PACKET            *Packet,
 | |
|   IN EFI_IPSEC_TRAFFIC_DIR Direction,
 | |
|   IN UINT8                 IpVersion
 | |
|   )
 | |
| {
 | |
|   CHAR8                     *TypeStr;
 | |
|   UINTN                     PacketSize;
 | |
|   UINT64                    InitCookie;
 | |
|   UINT64                    RespCookie;
 | |
| 
 | |
|   ASSERT (Packet != NULL);
 | |
| 
 | |
|   PacketSize = Packet->PayloadTotalSize + sizeof (IKE_HEADER);
 | |
|   InitCookie = (Direction == EfiIPsecOutBound) ? HTONLL (Packet->Header->InitiatorCookie) : Packet->Header->InitiatorCookie;
 | |
|   RespCookie = (Direction == EfiIPsecOutBound) ? HTONLL (Packet->Header->ResponderCookie) : Packet->Header->ResponderCookie;
 | |
| 
 | |
|   switch (Packet->Header->ExchangeType) {
 | |
|   case IKE_XCG_TYPE_IDENTITY_PROTECT:
 | |
|     TypeStr = mExchangeStr[0];
 | |
|     break;
 | |
| 
 | |
|   case IKE_XCG_TYPE_INFO:
 | |
|     TypeStr = mExchangeStr[1];
 | |
|     break;
 | |
| 
 | |
|   case IKE_XCG_TYPE_QM:
 | |
|     TypeStr = mExchangeStr[2];
 | |
|     break;
 | |
|     
 | |
|   case IKE_XCG_TYPE_SA_INIT:
 | |
|     TypeStr = mExchangeStr[3];
 | |
|     break;
 | |
| 
 | |
|   case IKE_XCG_TYPE_AUTH:
 | |
|     TypeStr = mExchangeStr[4];
 | |
|     break;
 | |
| 
 | |
|   case IKE_XCG_TYPE_CREATE_CHILD_SA:
 | |
|     TypeStr = mExchangeStr[5];
 | |
|     break;
 | |
| 
 | |
|   case IKE_XCG_TYPE_INFO2:
 | |
|     TypeStr = mExchangeStr[6];
 | |
|     break;
 | |
|     
 | |
|   default:
 | |
|     TypeStr = mExchangeStr[7];
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   if (Direction == EfiIPsecOutBound) {
 | |
|     DEBUG ((DEBUG_INFO, "\n>>>Sending %d bytes %a to ", PacketSize, TypeStr));
 | |
|   } else {
 | |
|     DEBUG ((DEBUG_INFO, "\n>>>Receiving %d bytes %a from ", PacketSize, TypeStr));
 | |
|   }
 | |
| 
 | |
|   IpSecDumpAddress (DEBUG_INFO, &Packet->RemotePeerIp, IpVersion);
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO, "   InitiatorCookie:0x%lx ResponderCookie:0x%lx\n", InitCookie, RespCookie));
 | |
|   DEBUG (
 | |
|     (DEBUG_INFO,
 | |
|     "   Version: 0x%x Flags:0x%x ExchangeType:0x%x\n",
 | |
|     Packet->Header->Version,
 | |
|     Packet->Header->Flags,
 | |
|     Packet->Header->ExchangeType)
 | |
|     );
 | |
|   DEBUG (
 | |
|     (DEBUG_INFO,
 | |
|     "   MessageId:0x%x NextPayload:0x%x\n",
 | |
|     Packet->Header->MessageId,
 | |
|     Packet->Header->NextPayload)
 | |
|     );
 | |
| 
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Print the IKE Paylolad.
 | |
| 
 | |
|   @param[in]  IkePayload  Point to payload to be printed.
 | |
|   @param[in]  IkeVersion  The specified version of IKE.
 | |
|  
 | |
| **/
 | |
| VOID
 | |
| IpSecDumpPayload (
 | |
|   IN IKE_PAYLOAD           *IkePayload,
 | |
|   IN UINT8                 IkeVersion
 | |
|   )
 | |
| {
 | |
|   if (IkeVersion == 1) {
 | |
|     DEBUG ((DEBUG_INFO, "+%a\n", mIkev1PayloadStr[IkePayload->PayloadType]));
 | |
|   }  else {
 | |
|     //
 | |
|     // For IKEV2 the first Payload type is started from 33.
 | |
|     //
 | |
|     DEBUG ((DEBUG_INFO, "+%a\n", mIkev2PayloadStr[IkePayload->PayloadType - 33]));
 | |
|   }
 | |
|   IpSecDumpBuf ("Payload data", IkePayload->PayloadBuf, IkePayload->PayloadSize);
 | |
| }
 | |
| 
 | |
| /**
 | |
|   Print the buffer in form of Hex.
 | |
| 
 | |
|   @param[in]  Title       The strings to be printed before the data of the buffer.
 | |
|   @param[in]  Data        Points to buffer to be printed.
 | |
|   @param[in]  DataSize    The size of the buffer to be printed.
 | |
| 
 | |
| **/
 | |
| VOID
 | |
| IpSecDumpBuf (
 | |
|   IN CHAR8                 *Title,
 | |
|   IN UINT8                 *Data,
 | |
|   IN UINTN                 DataSize
 | |
|   )
 | |
| {
 | |
|   UINTN Index;
 | |
|   UINTN DataIndex;
 | |
|   UINTN BytesRemaining;
 | |
|   UINTN BytesToPrint;
 | |
| 
 | |
|   DataIndex       = 0;
 | |
|   BytesRemaining  = DataSize;
 | |
| 
 | |
|   DEBUG ((DEBUG_INFO, "==%a %d bytes==\n", Title, DataSize));
 | |
| 
 | |
|   while (BytesRemaining > 0) {
 | |
| 
 | |
|     BytesToPrint = (BytesRemaining > IPSEC_DEBUG_BYTE_PER_LINE) ? IPSEC_DEBUG_BYTE_PER_LINE : BytesRemaining;
 | |
| 
 | |
|     for (Index = 0; Index < BytesToPrint; Index++) {
 | |
|       DEBUG ((DEBUG_INFO, " 0x%02x,", Data[DataIndex++]));
 | |
|     }
 | |
| 
 | |
|     DEBUG ((DEBUG_INFO, "\n"));
 | |
|     BytesRemaining -= BytesToPrint;
 | |
|   }
 | |
| 
 | |
| }
 |