Newer
Older
AMI-Aptio-BIOS-Reversed / IpSecDxe / IpSecDxe.h
@Ajax Dong Ajax Dong 2 days ago 21 KB Init
/**
 * IpSecDxe.h - IP Security (IPspec) Protocol DXE Driver Header
 *
 * Module: IpSecDxe, Index: 0138
 * Source: AMI NetworkPkg / UefiNetworkStack / Common / IpSecDxe
 * HR650X BIOS Decompilation Project
 *
 * This driver implements IPsec (RFC 4301) and IKEv2 (RFC 7296) protocols
 * for the UEFI network stack. It provides:
 *   - IPsec protocol interface for securing network traffic
 *   - IKEv2 key exchange for SA establishment
 *   - SPD (Security Policy Database) management
 *   - SAD (Security Association Database) management
 *   - Crypto operations for IPsec (AES-CBC, HMAC-SHA1, etc.)
 *
 * Source files (from debug strings):
 *   IpSecDriver.c, IpSecConfigImpl.c, IpSecMain.c
 *   IpSecImpl.c, IpSecCryptIo.c, IpSecDebug.c
 *   IkeService.c, IkeCommon.c, IkePacket.c
 *   Ikev2/Exchange.c, Ikev2/Payload.c, Ikev2/Utility.c
 *   Ikev2/Sa.c, Ikev2/Info.c
 *
 * Architecture: IKEv2-focused IPsec implementation using UDp (ports 500/4500)
 * for IKE exchanges, with linked list SA management and DPC for async dispatch.
 * Binary stats: 2724 functions (14 named), .text = 0xe7300 (946 KB),
 * 3126 strings, installed protocols: IPsec, IPsecConfig, DriverBinding
 */

#ifndef __IPSEC_DXE_H__
#define __IPSEC_DXE_H__

#include "../uefi_headers/Uefi.h"

/* ========================================================================
 * GUID Definitions
 * ======================================================================== */

/* EFI_IPSEC_PROTOCOL_GUID
 * A3979E64-ACE8-4DDC-BC07-4D66B8FD0977
 * Main IPsec protocol installed on network handles */
#define EFI_IPSEC_PROTOCOL_GUID \
  { 0xA3979E64, 0xACE8, 0x4DDC, { 0xBC, 0x07, 0x4D, 0x66, 0xB8, 0xFD, 0x09, 0x77 } }

/* EFI_IPSEC_CONFIG_PROTOCOL_GUID
 * CE5E5929-C7A3-4602-AD9E-C9DAF94EBFCF
 * IPsec configuration protocol for SPD/SAD management */
#define EFI_IPSEC_CONFIG_PROTOCOL_GUID \
  { 0xCE5E5929, 0xC7A3, 0x4602, { 0xAD, 0x9E, 0xC9, 0xDA, 0xF9, 0x4E, 0xBF, 0xCF } }

/* EFI_IPSEC_V4_BINDING_GUID (private marker)
 * 83F01464-99BD-45E5-B383-AF6305D8E9E6 */
#define EFI_IPSEC_V4_BINDING_GUID \
  { 0x83F01464, 0x99BD, 0x45E5, { 0xB3, 0x83, 0xAF, 0x63, 0x05, 0xD8, 0xE9, 0xE6 } }

/* EFI_IPSEC_V6_BINDING_GUID (IKE auth marker)
 * 66ED4721-3C98-4D3E-81E3-D03DD39A7254 */
#define EFI_IPSEC_V6_BINDING_GUID \
  { 0x66ED4721, 0x3C98, 0x4D3E, { 0x81, 0xE3, 0xD0, 0x3D, 0xD3, 0x9A, 0x72, 0x54 } }

/* gEfiUdp4ProtocolGuid = {3ad9df29-4501-478d-b1f8-7f7fe70e50f3} */
#define EFI_UDP4_PROTOCOL_GUID \
  { 0x3AD9DF29, 0x4501, 0x478D, { 0xB1, 0xF8, 0x7F, 0x7F, 0xE7, 0x0E, 0x50, 0xF3 } }

/* gEfiUdp6ProtocolGuid = {4f948815-b4b9-43cb-8a33-90e060b34955} */
#define EFI_UDP6_PROTOCOL_GUID \
  { 0x4F948815, 0xB4B9, 0x43CB, { 0x8A, 0x33, 0x90, 0xE0, 0x60, 0xB3, 0x49, 0x55 } }

/* gEfiDpcProtocolGuid = {480f8ae9-0c46-4aa9-bc89-db9fba619806} */
#define EFI_DPC_PROTOCOL_GUID \
  { 0x480F8AE9, 0x0C46, 0x4AA9, { 0xBC, 0x89, 0xDB, 0x9F, 0xBA, 0x61, 0x98, 0x06 } }

/* gEfiDriverBindingProtocolGuid = {18a031ab-b443-4d1a-a5c0-0c09261e9f71} */
#define EFI_DRIVER_BINDING_PROTOCOL_GUID \
  { 0x18A031AB, 0xB443, 0x4D1A, { 0xA5, 0xC0, 0x0C, 0x09, 0x26, 0x1E, 0x9F, 0x71 } }

/* gEfiComponentName2ProtocolGuid = {107a772c-d5e1-11d4-9a46-0090273fc14d} */
#define EFI_COMPONENT_NAME2_PROTOCOL_GUID \
  { 0x107A772C, 0xD5E1, 0x11D4, { 0x9A, 0x46, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0x4D } }

/* ========================================================================
 * Signatures
 * ======================================================================== */

#define IPSEC_PRIVATE_SIGNATURE   0x45493049  /* "IPSI" */
#define IKEV2_SA_SIGNATURE        0x43414E49  /* "INAC" = 1128614729 */
#define IKEV1_SA_SIGNATURE        0x43415043  /* "CPAC" = 1229278025 */

/* ========================================================================
 * Constants
 * ======================================================================== */

#define IPSecConfigDataTypeSpd       0   /* Security Policy Database */
#define IPSecConfigDataTypeSad       1   /* Security Association Database */
#define IPSecConfigDataTypePcd       2   /* Platform Config Database */
#define IPSecConfigDataTypeMaximum   3

#define IKEV2_STATE_INIT              0
#define IKEV2_STATE_AUTH              1
#define IKEV2_STATE_SA_ESTABLISH      2
#define IKEV2_STATE_CREATE_CHILD      3
#define IKEV2_STATE_SA_REKEYING       4
#define IKEV2_STATE_CHILD_SA_ESTABLISHED 5
#define IKEV2_STATE_SA_DELETING       6

#define IKE_EXCHANGE_UNKNOWN         0
#define IKEV1_MAIN_EXCHANGE          1
#define IKEV1_INFO_EXCHANGE          2
#define IKEV1_QUICK_EXCHANGE         3
#define IKEV2_INITIAL_EXCHANGE       4
#define IKEV2_AUTH_EXCHANGE          5
#define IKEV2_CREATE_CHILD_EXCHANGE  6
#define IKEV2_INFO_EXCHANGE          7

#define IPSEC_PROTOCOL_ESP           50
#define IPSEC_PROTOCOL_AH            51

#define IKE_UDP_PORT                 500
#define IKE_UDP_PORT_NAT_T           4500

#define DEBUG_RING_MAX_ENTRIES       16
#define DEBUG_RING_BUFFER_SIZE       512  /* 16 entries x 32 bytes */

#define IPSEC_CONFIG_VAR_NAME        L"IpSecConfig"
#define IPSEC_STATUS_VAR_NAME        L"IpSecStatus"

/* ========================================================================
 * Forward declarations
 * ======================================================================== */

typedef struct _IPSEC_PRIVATE_DATA IPSEC_PRIVATE_DATA;
typedef struct _IKEV2_SA_SESSION     IKEV2_SA_SESSION;
typedef struct _CHILD_SA_SESSION     CHILD_SA_SESSION;

/* ========================================================================
 * Protocol Structure Definitions
 * ======================================================================== */

/** EFI_IPSEC_CONFIG_PROTOCOL (24 bytes, 3 function pointers)
 * Installed at +0x18 in IPSEC_PRIVATE_DATA. */
typedef struct _EFI_IPSEC_CONFIG_PROTOCOL {
  EFI_STATUS (EFIAPI *SetData)(
    VOID    *This,
    UINTN    DataType,
    VOID    *Data,
    UINTN    DataSize
    );
  EFI_STATUS (EFIAPI *GetData)(
    VOID    *This,
    UINTN    DataType,
    VOID    *Data,
    UINTN   *DataSize
    );
  EFI_STATUS (EFIAPI *RegisterNotify)(
    VOID    *This,
    UINTN    DataType,
    EFI_EVENT Event
    );
} EFI_IPSEC_CONFIG_PROTOCOL;

/** EFI_DRIVER_BINDING_PROTOCOL (24 bytes)
 * Two instances: IPv4 (sub_620) and IPv6 (sub_620 selects based on n4 param). */
typedef struct _EFI_DRIVER_BINDING_PROTOCOL {
  EFI_STATUS (EFIAPI *Supported)(
    VOID        *This,
    EFI_HANDLE   ControllerHandle,
    EFI_HANDLE  *RemainingDevicePath
    );
  EFI_STATUS (EFIAPI *Start)(
    VOID        *This,
    EFI_HANDLE   ControllerHandle,
    EFI_HANDLE  *RemainingDevicePath
    );
  EFI_STATUS (EFIAPI *Stop)(
    VOID        *This,
    EFI_HANDLE   ControllerHandle,
    UINTN        NumberOfChildren,
    EFI_HANDLE  *ChildHandleBuffer
    );
} EFI_DRIVER_BINDING_PROTOCOL;

/** EFI_COMPONENT_NAME_PROTOCOL */
typedef struct _EFI_COMPONENT_NAME_PROTOCOL {
  EFI_STATUS (EFIAPI *GetDriverName)(
    VOID     *This,
    CHAR8    *Language,
    CHAR16  **DriverName
    );
  EFI_STATUS (EFIAPI *GetControllerName)(
    VOID        *This,
    EFI_HANDLE   ControllerHandle,
    EFI_HANDLE   ChildHandle,
    CHAR8       *Language,
    CHAR16     **ControllerName
    );
} EFI_COMPONENT_NAME_PROTOCOL;

/** EFI_COMPONENT_NAME2_PROTOCOL */
typedef struct _EFI_COMPONENT_NAME2_PROTOCOL {
  EFI_STATUS (EFIAPI *GetDriverName)(
    VOID     *This,
    CHAR8    *Language,
    CHAR16  **DriverName
    );
  EFI_STATUS (EFIAPI *GetControllerName)(
    VOID        *This,
    EFI_HANDLE   ControllerHandle,
    EFI_HANDLE   ChildHandle,
    CHAR8       *Language,
    CHAR16     **ControllerName
    );
} EFI_COMPONENT_NAME2_PROTOCOL;

/** EFI_DPC_PROTOCOL - Deferred Procedure Call
 * Used for async IKE packet dispatch. Queued via sub_31F8 during init. */
typedef struct _EFI_DPC_PROTOCOL {
  EFI_STATUS (EFIAPI *QueueDpc)(
    UINTN     DpcTpl,
    VOID     *DpcFunction,
    VOID     *DpcContext
    );
  EFI_STATUS (EFIAPI *DispatchDpc)(
    VOID
    );
} EFI_DPC_PROTOCOL;

/* ========================================================================
 * IPsec Internal Data Structures
 * ======================================================================== */

/**
 * IPSEC_CONFIG_DATA_ENTRY
 * Packed header for NV variable storage entries.
 * Config variables contain sequences of these entries.
 */
#pragma pack(1)
typedef struct {
  UINT8   Type;            /* Data type (bit 7 set = valid) */
  UINT16  Length;           /* Total entry length */
  UINT8   Data[1];          /* Variable-length data */
} IPSEC_CONFIG_DATA_ENTRY;
#pragma pack()

/**
 * DEBUG_RECORD (32 bytes per entry)
 * 16-entry ring buffer at 0x12C520. Head at +0x200, tail at +0x204.
 * Indexing: head = (head +1) % 16, wraparound at tail.
 */
typedef struct {
  UINT32    TypeField;        /* +0x00: event type */
  UINT32    TypeData;          /* +0x04: packed [a1[31:24]|a2[23:12]|a3[11:0]] */
  UINT64    DataPtr;           /* +0x08: data pointer */
  UINT32    Extra;             /* +0x10: extra data (a5) */
  UINT32    Flags;             /* +0x14: flags (bit 0 = string present) */
  UINT64    DebugString;       /* +0x18: debug string pointer */
} DEBUG_RECORD;

/* (uses DEBUG_RING_MAX_ENTRIES = 16) */

typedef struct {
  DEBUG_RECORD Records[16];      /* +0x000: 16 x 32 = 512 bytes */
  UINT32       HeadIndex;        /* +0x200: next write index */
  UINT32       TailIndex;        /* +0x204: oldest index */
} DEBUG_RING_BUFFER;

/**
 * IPSEC_PRIVATE_DATA (216 = 0xD8 bytes)
 * Main driver instance. Accessd via CONTAINER_RECORD pattern from
 * protocol handle. Signature checked at 0x12A610.
 * Allocated with AllocatePool(216) at 0xBE8+0x80.
 *
 * Field layout:
 *  +0x00: Signature = "IPSI" (0x45493049)
 *  +0x08: ProtocolHandle (installed protocol handle)
 *  +0x10: ImageHandle (driver image handle)
 *  +0x18: EFI_IPSEC_CONFIG_PROTOCOL (24 bytes)
 *  +0x30: Config function table (5 x 8 = 40 bytes)
 *          +0x30: SetDataFunc
 *          +0x38: GetDataFunc
 *          +0x40: RegisterNotifyFunc
 *          +0x48: InternalFunc1
 *          +0x50: InternalFunc2
 *  +0x58: LIST_ENTRY SpdCacheList
 *  +0x68: LIST_ENTRY SadCacheList
 *  +0x78: LIST_ENTRY SaBySpiList
 *  +0x88: LIST_ENTRY IkeSaSessionList
 *  +0x98: LIST_ENTRY ChildSaList
 *  +0xA8: LIST_ENTRY EstablishList
 *  +0xB8: LIST_ENTRY PendingList
 *  +0xC8: LIST_ENTRY EventList
 *  +0xD0: UINT8 ConfigChanged
 *  +0xD1-D7: padding
 */
typedef struct _IPSEC_PRIVATE_DATA {
  UINT32    Signature;            /* +0x00: "IPSI" */
  UINT32    Reserved1;           /* +0x04: padding */
  EFI_HANDLE ProtocolHandle;      /* +0x08 */
  EFI_HANDLE ImageHandle;         /* +0x10 */

  /* +0x18: EFI_IPSEC_CONFIG_PROTOCOL (24 bytes) */
  EFI_IPSEC_CONFIG_PROTOCOL ConfigProtocol;

  /* +0x30: Config function pointers (40 bytes) */
  VOID    *SetDataFunc;           /* +0x30 */
  VOID    *GetDataFunc;           /* +0x38 */
  VOID    *RegisterNotifyFunc;    /* +0x40 */
  VOID    *InternalFunc1;          /* +0x48 */
  VOID    *InternalFunc2;          /* +0x50 */

  /* +0x58: Linked list heads */
  LIST_ENTRY    SpdCacheList;     /* +0x58 */
  LIST_ENTRY    SadCacheList;     /* +0x68 */
  LIST_ENTRY    SaBySpiList;      /* +0x78 */
  LIST_ENTRY    IkeSaSessionList; /* +0x88 */
  LIST_ENTRY    ChildSaList;      /* +0x98 */
  LIST_ENTRY    EstablishList;    /* +0xA8 */
  LIST_ENTRY    PendingList;      /* +0xB8 */
  LIST_ENTRY    EventList;         /* +0xC8 */

  UINT8     ConfigChanged;        /* +0xD0 */
  UINT8     Reserved2[7];         /* +0xD1-D7 */
} IPSEC_PRIVATE_DATA;

/**
 * IKEV2_SA_SESSION (IKE SA session)
 * Stored in IkeSaSessionList (+0x88) of IPSEC_PRIVATE_DATA.
 * Signature = "INAC" (0x43414E49 = IKE SA).
 * CONTAINER_RECORD at -42 entries (--336 bytes) from list entry.
 * Total ~744+ bytes (1288 byte allocation).
 *
 * Fields (from sub_439C (IkeSaFree) and sub_4928):
 *  +0x00: Signature ("INAC")
 *  +0x04: State (IKEV2_STATE_*)
 *  +0x08: IsInitiator (BOOLEAN)
 *  +0x10: InitiatorCookie (UINT64)
 *  +0x18: ResponderCookie (UINT64)
 *  +0x20: InitiatorSpi (UINT64)
 *  +0x28: ResponderSpi (UINT64)
 *  +0x30: EncryptKey (SK_ei)
 *  +0x38: IntegrityKey (SK_ai)
 *  +0x40: DecryptKey (SK_er)
 *  +0x48: VerifKey (SK_ar)
 *  +0x50: LIST_ENTRY SessionList
 *  +0x60: LIST_ENTRY ChildSaList
 *  +0x70: LifetimeBytes (UINT64)
 *  +0x78: LifetimeSeconds (UINT32)
 *  +0x7C: SoftLifetimeSeconds (UINT32)
 *  +0x80: ExchangeContext
 *  +0x88+: DHSession, Propossal, etc.)
 */
typedef struct _IKEV2_SA_SESSION {
  UINT32    Signature;            /* +0x00: "INAC" */
  UINT32    State;               /* +0x04: IKEV2_STATE_* */
  UINT8     IsInitiator;          /* +0x08 */
  UINT8     Reserved1[7];
  UINT64    InitiatorCookie;      /* +0x10 */
  UINT64    ResponderCookie;      /* +0x18 */
  UINT64    InitiatorSpi;         /* +0x20 */
  UINT64    ResponderSpi;        /* +0x28 */
  VOID     *EncryptKey;           /* +0x30: SK_ei */
  VOID     *IntegrityKey;         /* +0x38: SK_ai */
  VOID     *DecryptKey;           /* +0x40: SK_er */
  VOID     *VerifKey;             /* +0x48: SK_ar */
  LIST_ENTRY SessionList;         /* +0x50 */
  LIST_ENTRY ChildSaList;         /* +0x60 */
  UINT64    LifetimeBytes;        /* +0x70 */
  UINT32    LifetimeSeconds;      /* +0x78 */
  UINT32    SoftLifetimeSeconds;  /* +0x7C */
  VOID     *ExchangeContext;      /* +0x80 */
  /* +0x88+: more fields */
} IKEV2_SA_SESSION;

/**
 * CHILD_SA_SESSION (Child SA)
 * Stored in ChildSaList (+0x98 of private or +0x60 of IKE SA).
 * Signature = "CPAC" (0x43415043).
 * Access from list: CONTAINER_RECORD subtracts -42 QWORD = -336 bytes.
 *
 * Fields (from sub_4928):
 *  +0x00: Signature ("CPAC")
 *  +0x04: State
 *  +0x08: Protocol (ESP=50, AH=51)
 *  +0x0C: Spi (Security Parameter Index)
 *  +0x10: PeerSpi
 *  +0x14: SeqNumber
 *  +0x18: Reserved
 *  +0x20: EncryptAlgo pointer
 *  +0x28: IntegrityAlgo pointer
 *  +0x30: EncryptKeyLen
 *  +0x34: IntegrityKeyLen
 *  +0x38: LIST_ENTRY Link
 */
typedef struct _CHILD_SA_SESSION {
  UINT32    Signature;            /* +0x00: "CPAC" */
  UINT32    State;               /* +0x04 */
  UINT8     Protocol;            /* +0x08: ESP=50, AH=51 */
  UINT8     Reserved1[3];
  UINT32    Spi;                 /* +0x0C */
  UINT32    PeerSpi;             /* +0x10 */
  UINT32    SeqNumber;           /* +0x14 */
  UINT32    Reserved2;
  VOID     *EncryptAlgo;         /* +0x20 */
  VOID     *IntegrityAlgo;       /* +0x28 */
  UINT32    EncryptKeyLen;        /* +0x30 */
  UINT32    IntegrityKeyLen;     /* +0x34 */
  LIST_ENTRY Link;                /* +0x38 */
} CHILD_SA_SESSION;

/**
 * SPD_ENTRY (Security Policy Database entry)
 * Compare function sub_11E8 checks CIDR matching.
 * Fields:
 *  +0x00: SourceAddr (UINT32)
 *  +0x04: DestAddr (UINT32) (a1[4])
 *  +0x08: SourceMask (prefix len, UINT16)
 *  +0x0A: DestMask (UINT16)
 *  +0x0C: SrcPort (UINT16)
 *  +0x0E: DstPort (UINT16)
 *  +0x10: Protocol (UINT8)
 *  +0x14: Action (UINT32)
 *  +0x18: SourceAddrPtr
 *  +0x20: DestAddrPtr
 */
typedef struct {
  UINT32    SourceAddr;           /* +0x00 */
  UINT32    DestAddr;             /* +0x04 */
  UINT16    SourceMask;           /* +0x08 */
  UINT16    DestMask;             /* +0x0A */
  UINT16    SrcPort;              /* +0x0C */
  UINT16    DstPort;              /* +0x0E */
  UINT8     Protocol;             /* +0x10 */
  UINT8     Reserved[3];
  UINT32    Action;               /* +0x14 */
  VOID     *SourceAddrPtr;        /* +0x18 */
  VOID     *DestAddrPtr;          /* +0x20 */
} SPD_ENTRY;

/* ========================================================================
 * Module Global Variables
 * ======================================================================== */

extern EFI_HANDLE            gImageHandle;       /* 0x12C4F8 */
extern EFI_SYSTEM_TABLE     *gSystemTable;       /* 0x12C4E8 */
extern EFI_BOOT_SERVICES    *gBootServices;      /* 0x12C4F0 */
extern EFI_RUNTIME_SERVICES *gRuntimeServices;   /* 0x12C500 */
extern VOID                 *gUdp4IpSec;          /* 0x12D080 */
extern VOID                 *gUdp6IpSec;          /* 0x12A6A0 */
extern VOID                 *gDpcProtocol;        /* 0x12C518 */
extern DEBUG_RING_BUFFER    *gDebugRing;          /* 0x12C520 */

/* ========================================================================
 * Function Prototypes
 * ======================================================================== */

/* -- Entry Point (0x460) -- */
EFI_STATUS
EFIAPI
IpSecDriverEntryPoint(
  IN EFI_HANDLE        ImageHandle,
  IN EFI_SYSTEM_TABLE *SystemTable
  );

/* -- Driver Init sub_47C (0x47C) -- */
EFI_STATUS
IpSecInitBootServices(
  VOID
  );

/* -- Main Init sub_BE8 (0xBE8) -- */
EFI_STATUS
IpSecModuleInit(
  IN EFI_HANDLE  ImageHandle
  );

/* -- Timer/DPC callback sub_31F8 (0x31F8) -- */
EFI_STATUS
IpSecTimerHandler(
  IN IPSEC_PRIVATE_DATA *Private
  );

/* -- Driver Binding sub_620 (0x620) -- */
EFI_STATUS
EFIAPI
IpSecV4DriverBindingSupported(
  IN EFI_DRIVER_BINDING_PROTOCOL *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_HANDLE                  *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
IpSecV4DriverBindingStart(
  IN EFI_DRIVER_BINDING_PROTOCOL *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_HANDLE                  *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
IpSecV4DriverBindingStop(
  IN EFI_DRIVER_BINDING_PROTOCOL *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN UINTN                        NumberOfChildren,
  IN EFI_HANDLE                  *ChildHandleBuffer
  );

/* -- IKEv2 Driver Binding sub_724 (0x724) -- */
EFI_STATUS
EFIAPI
IkeV2DriverBindingSupported(
  IN EFI_DRIVER_BINDING_PROTOCOL *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_HANDLE                  *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
IkeV2DriverBindingStart(
  IN EFI_DRIVER_BINDING_PROTOCOL *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN EFI_HANDLE                  *RemainingDevicePath
  );

EFI_STATUS
EFIAPI
IkeV2DriverBindingStop(
  IN EFI_DRIVER_BINDING_PROTOCOL *This,
  IN EFI_HANDLE                   ControllerHandle,
  IN UINTN                        NumberOfChildren,
  IN EFI_HANDLE                  *ChildHandleBuffer
  );

/* -- Create Child SAs -- */
/* sub_36F4 (0x36F4): Create IPv4 UDP child */
EFI_STATUS
IpSecUdp4CreateChild(
  IN IPSEC_PRIVATE_DATA *Private,
  IN EFI_HANDLE          ControllerHandle,
  IN VOID               *UdpConfig
  );

/* sub_37F8 (0x37F8): Create IPv6 UDP child */
EFI_STATUS
IpSecUdp6CreateChild(
  IN IPSEC_PRIVATE_DATA *Private,
  IN EFI_HANDLE          ControllerHandle,
  IN VOID               *UdpConfig
  );

/* -- Debug Log -- */
/* sub_38F90 (0x38F90): Log debug event */
VOID
IpSecDebugLogEvent(
  IN UINT8    Type,
  IN UINT16   ProtocolId,
  IN UINT16   Extra,
  IN UINT64   DataPtr,
  IN UINT32   Data
  );

/* sub_39A70 (0x39A70): Get debug ring */
DEBUG_RING_BUFFER *
IpSecGetDebugRing(
  VOID
  );

/* sub_210D0 (0x210D0): Copy string to debug entry */
VOID
IpSecDebugCopyString(
  IN UINT64    EntryPtr,
  IN CONST VOID *String,
  IN UINT32    FlagMask
  );

/* -- SPD Operations -- */
BOOLEAN
SpdEntriesExactMatch(
  IN SPD_ENTRY *Entry1,
  IN SPD_ENTRY *Entry2
  );                                    /* sub_FAC */

BOOLEAN
SpdEntriesSubnetMatch(
  IN SPD_ENTRY *Entry1,
  IN SPD_ENTRY *Entry2
  );                                    /* sub_11E8 */

BOOLEAN
SpdEntryIsEqual(
  IN SPD_ENTRY *Entry1,
  IN SPD_ENTRY *Entry2
  );                                    /* sub_1424 */

BOOLEAN
SpdEntryIsEmpty(
  IN SPD_ENTRY *Entry
  );                                    /* sub_152C */

/* -- Utility -- */
VOID *
AllocateZeroPool(
  IN UINTN  Size
  );                                    /* sub_10ABC */

VOID
FreePool(
  IN VOID  *Buffer
  );                                    /* sub_10BE0 */

VOID *
CopyMem(
  OUT VOID *Destination,
  IN  VOID *Source,
  IN  UINTN Length
  );                                    /* sub_EA94 */

VOID *
ZeroMem(
  OUT VOID  *Buffer,
  IN  UINTN  Length
  );                                     /* sub_EB30 */

INTN
CompareMem(
  IN VOID   *Buffer1,
  IN VOID   *Buffer2,
  IN UINTN   Length
  );                                     /* sub_EB94 */

VOID
InitializeListHead(
  IN LIST_ENTRY *ListHead
  );                                     /* sub_EDA4 */

BOOLEAN
IsListEmpty(
  IN LIST_ENTRY *ListEntry
  );                                     /* sub_EEB4 */

VOID
RemoveEntryList(
  IN LIST_ENTRY *Entry
  );                                     /* sub_EEEC */

VOID
InsertTailList(
  IN LIST_ENTRY *ListHead,
  IN LIST_ENTRY *Entry
  );                                     /* sub_EE2C */

UINTN
StrLen(
  IN CONST CHAR16 *String
  );                                      /* sub_EF34 */

/* -- Debug -- */
VOID
EFIAPI
DebugAssert(
  IN CHAR8   *FileName,
  IN UINTN    LineNumber,
  IN CHAR8   *Description
  );                                      /* sub_EA50 */

VOID
EFIAPI
DebugPrint(
  IN UINTN    ErrorLevel,
  IN CHAR8   *Format,
  ...
  );                                      /* sub_E9C8 */

/* -- PCD -- */
UINTN
PcdGetSize(
  IN UINTN    PcdToken
  );                                      /* sub_10F94 */

/* -- IKE Packet Processing -- */
/* sub_3A44 (0x3A44): Process incoming IKE packet */
EFI_STATUS
IkeProcessIncoming(
  IN IKEV2_SA_SESSION *Session,
  IN UINT8            *IkePacket,
  IN UINTN             IkePacketLen
  );

#endif /* __IPSEC_DXE_H__ */