mirror of https://github.com/acidanthera/audk.git
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;
|
|
}
|
|
|
|
}
|