/** @file | |
The common definition of IPsec Key Exchange (IKE). | |
Copyright (c) 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. | |
**/ | |
#ifndef _IKE_H_ | |
#define _IKE_H_ | |
#include <Library/UdpIoLib.h> | |
#include <Library/BaseCryptLib.h> | |
#include "IpSecImpl.h" | |
#define IKE_VERSION_MAJOR_MASK 0xf0 | |
#define IKE_VERSION_MINOR_MASK 0x0f | |
#define IKE_MAJOR_VERSION(v) (((v) & IKE_VERSION_MAJOR_MASK) >> 4) | |
#define IKE_MINOR_VERSION(v) ((v) & IKE_VERSION_MINOR_MASK) | |
// | |
// Protocol Value Use in IKEv1 and IKEv2 | |
// | |
#define IPSEC_PROTO_ISAKMP 1 | |
#define IPSEC_PROTO_IPSEC_AH 2 | |
#define IPSEC_PROTO_IPSEC_ESP 3 | |
#define IPSEC_PROTO_IPCOMP 4 // For IKEv1 this value is reserved | |
// | |
// For Algorithm search in support list.Last two types are for IKEv2 only. | |
// | |
#define IKE_ENCRYPT_TYPE 0 | |
#define IKE_AUTH_TYPE 1 | |
#define IKE_PRF_TYPE 2 | |
#define IKE_DH_TYPE 3 | |
// | |
// Encryption Algorithm present in IKEv1 phasrs2 and IKEv2 transform payload (Transform Type 1) | |
// | |
#define IPSEC_ESP_DES_IV64 1 | |
#define IPSEC_ESP_DES 2 | |
#define IPSEC_ESP_3DES 3 | |
#define IPSEC_ESP_RC5 4 | |
#define IPSEC_ESP_IDEA 5 | |
#define IPSEC_ESP_CAST 6 | |
#define IPSEC_ESP_BLOWFISH 7 | |
#define IPSEC_ESP_3IDEA 8 | |
#define IPSEC_ESP_DES_IV32 9 | |
#define IPSEC_ESP_RC4 10 // It's reserved in IKEv2 | |
#define IPSEC_ESP_NULL 11 | |
#define IPSEC_ESP_AES 12 | |
#define IKE_XCG_TYPE_NONE 0 | |
#define IKE_XCG_TYPE_BASE 1 | |
#define IKE_XCG_TYPE_IDENTITY_PROTECT 2 | |
#define IKE_XCG_TYPE_AUTH_ONLY 3 | |
#define IKE_XCG_TYPE_AGGR 4 | |
#define IKE_XCG_TYPE_INFO 5 | |
#define IKE_XCG_TYPE_QM 32 | |
#define IKE_XCG_TYPE_NGM 33 | |
#define IKE_XCG_TYPE_SA_INIT 34 | |
#define IKE_XCG_TYPE_AUTH 35 | |
#define IKE_XCG_TYPE_CREATE_CHILD_SA 36 | |
#define IKE_XCG_TYPE_INFO2 37 | |
#define IKE_LIFE_TYPE_SECONDS 1 | |
#define IKE_LIFE_TYPE_KILOBYTES 2 | |
// | |
// Deafult IKE SA lifetime and CHILD SA lifetime | |
// | |
#define IKE_SA_DEFAULT_LIFETIME 1200 | |
#define CHILD_SA_DEFAULT_LIFETIME 3600 | |
// | |
// Next payload type presented within Proposal payload | |
// | |
#define IKE_PROPOSAL_NEXT_PAYLOAD_MORE 2 | |
#define IKE_PROPOSAL_NEXT_PAYLOAD_NONE 0 | |
// | |
// Next payload type presented within Transform payload | |
// | |
#define IKE_TRANSFORM_NEXT_PAYLOAD_MORE 3 | |
#define IKE_TRANSFORM_NEXT_PAYLOAD_NONE 0 | |
// | |
// Max size of the SA attribute | |
// | |
#define MAX_SA_ATTRS_SIZE 48 | |
#define SA_ATTR_FORMAT_BIT 0x8000 | |
// | |
// The definition for Information Message ID. | |
// | |
#define INFO_MID_SIGNATURE SIGNATURE_32 ('I', 'N', 'F', 'M') | |
// | |
// Type for the IKE SESSION COMMON | |
// | |
typedef enum { | |
IkeSessionTypeIkeSa, | |
IkeSessionTypeChildSa, | |
IkeSessionTypeInfo, | |
IkeSessionTypeMax | |
} IKE_SESSION_TYPE; | |
// | |
// The DH Group ID defined RFC3526 and RFC 2409 | |
// | |
typedef enum { | |
OakleyGroupModp768 = 1, | |
OakleyGroupModp1024 = 2, | |
OakleyGroupGp155 = 3, // Unsupported Now. | |
OakleyGroupGp185 = 4, // Unsupported Now. | |
OakleyGroupModp1536 = 5, | |
OakleyGroupModp2048 = 14, | |
OakleyGroupModp3072 = 15, | |
OakleyGroupModp4096 = 16, | |
OakleyGroupModp6144 = 17, | |
OakleyGroupModp8192 = 18, | |
OakleyGroupMax | |
} OAKLEY_GROUP_ID; | |
// | |
// IKE Header | |
// | |
#pragma pack(1) | |
typedef struct { | |
UINT64 InitiatorCookie; | |
UINT64 ResponderCookie; | |
UINT8 NextPayload; | |
UINT8 Version; | |
UINT8 ExchangeType; | |
UINT8 Flags; | |
UINT32 MessageId; | |
UINT32 Length; | |
} IKE_HEADER; | |
#pragma pack() | |
typedef union { | |
UINT16 AttrLength; | |
UINT16 AttrValue; | |
} IKE_SA_ATTR_UNION; | |
// | |
// SA Attribute present in Transform Payload | |
// | |
#pragma pack(1) | |
typedef struct { | |
UINT16 AttrType; | |
IKE_SA_ATTR_UNION Attr; | |
} IKE_SA_ATTRIBUTE; | |
#pragma pack() | |
// | |
// Contains the IKE packet information. | |
// | |
typedef struct { | |
UINTN RefCount; | |
BOOLEAN IsHdrExt; | |
IKE_HEADER *Header; | |
BOOLEAN IsPayloadsBufExt; | |
UINT8 *PayloadsBuf; // The whole IkePakcet trimed the IKE header. | |
UINTN PayloadTotalSize; | |
LIST_ENTRY PayloadList; | |
EFI_IP_ADDRESS RemotePeerIp; | |
BOOLEAN IsEncoded; // whether HTON is done when sending the packet | |
UINT32 Spi; // For the Delete Information Exchange | |
BOOLEAN IsDeleteInfo; // For the Delete Information Exchange | |
IPSEC_PRIVATE_DATA *Private; // For the Delete Information Exchange | |
} IKE_PACKET; | |
// | |
// The generic structure to all kinds of IKE payloads. | |
// | |
typedef struct { | |
UINT32 Signature; | |
BOOLEAN IsPayloadBufExt; | |
UINT8 PayloadType; | |
UINT8 *PayloadBuf; | |
UINTN PayloadSize; | |
LIST_ENTRY ByPacket; | |
} IKE_PAYLOAD; | |
// | |
// Udp Service | |
// | |
typedef struct { | |
UINT32 Signature; | |
UINT8 IpVersion; | |
LIST_ENTRY List; | |
LIST_ENTRY *ListHead; | |
EFI_HANDLE NicHandle; | |
EFI_HANDLE ImageHandle; | |
UDP_IO *Input; | |
UDP_IO *Output; | |
EFI_IP_ADDRESS DefaultAddress; | |
BOOLEAN IsConfigured; | |
} IKE_UDP_SERVICE; | |
// | |
// Each IKE session has its own Key sets for local peer and remote peer. | |
// | |
typedef struct { | |
EFI_IPSEC_ALGO_INFO LocalPeerInfo; | |
EFI_IPSEC_ALGO_INFO RemotePeerInfo; | |
} SA_KEYMATS; | |
// | |
// Each algorithm has its own Id, Guid, BlockSize and KeyLength. | |
// This struct contains these information for each algorithm. It is generic structure | |
// for both encryption and authentication algorithm. | |
// For authentication algorithm, the AlgSize means IcvSize. For encryption algorithm, | |
// it means IvSize. | |
// | |
#pragma pack(1) | |
typedef struct { | |
UINT8 AlgorithmId; // Encryption or Authentication Id used by ESP/AH | |
EFI_GUID *AlgGuid; | |
UINT8 AlgSize; // IcvSize or IvSize | |
UINT8 BlockSize; | |
UINTN KeyMateLen; | |
} IKE_ALG_GUID_INFO; // For IPsec Authentication and Encryption Algorithm. | |
#pragma pack() | |
// | |
// Structure used to store the DH group | |
// | |
typedef struct { | |
UINT8 GroupId; | |
UINTN Size; | |
UINT8 *Modulus; | |
UINTN GroupGenerator; | |
} MODP_GROUP; | |
/** | |
This is prototype definition of general interface to phase the payloads | |
after/before the decode/encode. | |
@param[in] SessionCommon Point to the SessionCommon | |
@param[in] PayloadBuf Point to the buffer of Payload. | |
@param[in] PayloadSize The size of the PayloadBuf in bytes. | |
@param[in] PayloadType The type of Payload. | |
**/ | |
typedef | |
VOID | |
(*IKE_ON_PAYLOAD_FROM_NET) ( | |
IN UINT8 *SessionCommon, | |
IN UINT8 *PayloadBuf, | |
IN UINTN PayloadSize, | |
IN UINT8 PayloadType | |
); | |
#endif | |