259 lines
8.6 KiB
C
259 lines
8.6 KiB
C
/** @file
|
|
IKEv2 related definitions.
|
|
|
|
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_V2_H_
|
|
#define _IKE_V2_H_
|
|
|
|
#include "Ike.h"
|
|
#include "Payload.h"
|
|
|
|
#define IKEV2_TS_ANY_PORT 0xffff
|
|
#define IKEV2_TS_ANY_PROTOCOL 0
|
|
|
|
#define IKEV2_DELET_CHILDSA_LIST 0
|
|
#define IKEV2_ESTABLISHING_CHILDSA_LIST 1
|
|
#define IKEV2_ESTABLISHED_CHILDSA_LIST 2
|
|
|
|
#define IKEV2_SA_SESSION_SIGNATURE SIGNATURE_32 ('I', 'K', 'E', 'I')
|
|
#define IKEV2_SA_SESSION_FROM_COMMON(a) CR (a, IKEV2_SA_SESSION, SessionCommon, IKEV2_SA_SESSION_SIGNATURE)
|
|
#define IKEV2_SA_SESSION_BY_SESSION(a) CR (a, IKEV2_SA_SESSION, BySessionTable, IKEV2_SA_SESSION_SIGNATURE)
|
|
#define IKEV2_SA_SESSION_BY_ESTABLISHED(a) CR (a, IKEV2_SA_SESSION, ByEstablishedTable, IKEV2_SA_SESSION_SIGNATURE)
|
|
|
|
#define IKEV2_CHILD_SA_SESSION_SIGNATURE SIGNATURE_32 ('I', 'K', 'E', 'C')
|
|
#define IKEV2_CHILD_SA_SESSION_FROM_COMMON(a) CR (a, IKEV2_CHILD_SA_SESSION, SessionCommon, IKEV2_CHILD_SA_SESSION_SIGNATURE)
|
|
#define IKEV2_CHILD_SA_SESSION_BY_IKE_SA(a) CR (a, IKEV2_CHILD_SA_SESSION, ByIkeSa, IKEV2_CHILD_SA_SESSION_SIGNATURE)
|
|
#define IKEV2_CHILD_SA_SESSION_BY_DEL_SA(a) CR (a, IKEV2_CHILD_SA_SESSION, ByDelete, IKEV2_CHILD_SA_SESSION_SIGNATURE)
|
|
|
|
#define IS_IKEV2_SA_SESSION(s) ((s)->Common.IkeSessionType == IkeSessionTypeIkeSa)
|
|
#define IKEV2_SA_FIRST_PROPOSAL(Sa) (IKEV2_PROPOSAL *)((IKEV2_SA *)(Sa)+1)
|
|
#define IKEV2_NEXT_TRANSFORM_WITH_SIZE(Transform,TransformSize) \
|
|
(IKEV2_TRANSFORM *) ((UINT8 *)(Transform) + (TransformSize))
|
|
|
|
#define IKEV2_NEXT_PROPOSAL_WITH_SIZE(Proposal, ProposalSize) \
|
|
(IKEV2_PROPOSAL *) ((UINT8 *)(Proposal) + (ProposalSize))
|
|
|
|
#define IKEV2_PROPOSAL_FIRST_TRANSFORM(Proposal) \
|
|
(IKEV2_TRANSFORM *)((UINT8 *)((IKEV2_PROPOSAL *)(Proposal)+1) + \
|
|
(((IKEV2_PROPOSAL *)(Proposal))->SpiSize))
|
|
#define IKEV2_PROPOSAL_FIRST_TRANSFORM(Proposal) \
|
|
(IKEV2_TRANSFORM *)((UINT8 *)((IKEV2_PROPOSAL *)(Proposal)+1) + \
|
|
(((IKEV2_PROPOSAL *)(Proposal))->SpiSize))
|
|
|
|
typedef enum {
|
|
IkeStateInit,
|
|
IkeStateAuth,
|
|
IkeStateIkeSaEstablished,
|
|
IkeStateCreateChild,
|
|
IkeStateSaRekeying,
|
|
IkeStateChildSaEstablished,
|
|
IkeStateSaDeleting,
|
|
IkeStateMaximum
|
|
} IKEV2_SESSION_STATE;
|
|
|
|
typedef enum {
|
|
IkeRequestTypeCreateChildSa,
|
|
IkeRequestTypeRekeyChildSa,
|
|
IkeRequestTypeRekeyIkeSa,
|
|
IkeRequestTypeMaximum
|
|
} IKEV2_CREATE_CHILD_REQUEST_TYPE;
|
|
|
|
typedef struct {
|
|
UINT8 *GxBuffer;
|
|
UINTN GxSize;
|
|
UINT8 *GyBuffer;
|
|
UINTN GySize;
|
|
UINT8 *GxyBuffer;
|
|
UINTN GxySize;
|
|
UINT8 *DhContext;
|
|
} IKEV2_DH_BUFFER;
|
|
|
|
typedef struct {
|
|
IKEV2_DH_BUFFER *DhBuffer;
|
|
UINT8 *SkdKey;
|
|
UINTN SkdKeySize;
|
|
UINT8 *SkAiKey;
|
|
UINTN SkAiKeySize;
|
|
UINT8 *SkArKey;
|
|
UINTN SkArKeySize;
|
|
UINT8 *SkEiKey;
|
|
UINTN SkEiKeySize;
|
|
UINT8 *SkErKey;
|
|
UINTN SkErKeySize;
|
|
UINT8 *SkPiKey;
|
|
UINTN SkPiKeySize;
|
|
UINT8 *SkPrKey;
|
|
UINTN SkPrKeySize;
|
|
} IKEV2_SESSION_KEYS;
|
|
|
|
typedef struct {
|
|
UINT16 LifeType;
|
|
UINT64 LifeDuration;
|
|
UINT16 EncAlgId;
|
|
UINTN EnckeyLen;
|
|
UINT16 Prf;
|
|
UINT16 IntegAlgId;
|
|
UINTN IntegKeyLen;
|
|
UINT16 DhGroup;
|
|
UINT8 ExtSeq;
|
|
} IKEV2_SA_PARAMS;
|
|
|
|
//
|
|
// Internal Payload
|
|
//
|
|
typedef struct {
|
|
IKEV2_SA SaHeader;
|
|
UINTN NumProposals;
|
|
//
|
|
// IKE_PROPOSAL_DATA Proposals[1];
|
|
//
|
|
} IKEV2_SA_DATA;
|
|
|
|
typedef struct {
|
|
UINT8 ProposalIndex;
|
|
UINT8 ProtocolId;
|
|
UINT8 *Spi;
|
|
UINT8 NumTransforms;
|
|
//
|
|
// IKE_TRANSFORM_DATA Transforms[1];
|
|
//
|
|
} IKEV2_PROPOSAL_DATA;
|
|
|
|
typedef struct {
|
|
UINT8 TransformIndex;
|
|
UINT8 TransformType;
|
|
UINT16 TransformId;
|
|
IKE_SA_ATTRIBUTE Attribute;
|
|
} IKEV2_TRANSFORM_DATA;
|
|
|
|
typedef struct {
|
|
UINT8 IkeVer;
|
|
IKE_SESSION_TYPE IkeSessionType;
|
|
BOOLEAN IsInitiator;
|
|
BOOLEAN IsOnDeleting; // Flag to indicate whether the SA is on deleting.
|
|
IKEV2_SESSION_STATE State;
|
|
EFI_EVENT TimeoutEvent;
|
|
UINT64 TimeoutInterval;
|
|
UINTN RetryCount;
|
|
IKE_PACKET *LastSentPacket;
|
|
IKEV2_SA_PARAMS *SaParams;
|
|
UINT16 PreferDhGroup;
|
|
EFI_IP_ADDRESS RemotePeerIp;
|
|
EFI_IP_ADDRESS LocalPeerIp;
|
|
IKE_ON_PAYLOAD_FROM_NET BeforeDecodePayload;
|
|
IKE_ON_PAYLOAD_FROM_NET AfterEncodePayload;
|
|
IKE_UDP_SERVICE *UdpService;
|
|
IPSEC_PRIVATE_DATA *Private;
|
|
} IKEV2_SESSION_COMMON;
|
|
|
|
typedef struct {
|
|
UINT32 Signature;
|
|
IKEV2_SESSION_COMMON SessionCommon;
|
|
UINT64 InitiatorCookie;
|
|
UINT64 ResponderCookie;
|
|
//
|
|
// Initiator: SA proposals to be sent
|
|
// Responder: SA proposals to be matched
|
|
//
|
|
IKEV2_SA_DATA *SaData; // SA Private struct used for SA payload generation
|
|
IKEV2_SESSION_KEYS *IkeKeys;
|
|
UINT8 *NiBlock;
|
|
UINTN NiBlkSize;
|
|
UINT8 *NrBlock;
|
|
UINTN NrBlkSize;
|
|
UINT8 *NCookie; // Buffer Contains the Notify Cookie
|
|
UINTN NCookieSize; // Size of NCookie
|
|
IPSEC_PAD_ENTRY *Pad;
|
|
IPSEC_SPD_ENTRY *Spd; // SPD that requested the negotiation, TODO: better use SPD selector
|
|
LIST_ENTRY ChildSaSessionList;
|
|
LIST_ENTRY ChildSaEstablishSessionList; // For Establish Child SA.
|
|
LIST_ENTRY InfoMIDList; // For Information MID
|
|
LIST_ENTRY DeleteSaList; // For deteling Child SA.
|
|
UINT8 *InitPacket;
|
|
UINTN InitPacketSize;
|
|
UINT8 *RespPacket;
|
|
UINTN RespPacketSize;
|
|
UINT32 MessageId;
|
|
LIST_ENTRY BySessionTable; // Use for all IkeSaSession Links
|
|
} IKEV2_SA_SESSION;
|
|
|
|
typedef struct {
|
|
UINT32 Signature;
|
|
IKEV2_SESSION_COMMON SessionCommon;
|
|
IKEV2_SA_SESSION *IkeSaSession;
|
|
UINT32 MessageId;
|
|
IKEV2_SA_DATA *SaData;
|
|
UINT8 IpsecProtocol;
|
|
UINT32 LocalPeerSpi;
|
|
UINT32 RemotePeerSpi;
|
|
UINT8 *NiBlock;
|
|
UINTN NiBlkSize;
|
|
UINT8 *NrBlock;
|
|
UINTN NrBlkSize;
|
|
SA_KEYMATS ChildKeymats;
|
|
IKEV2_DH_BUFFER *DhBuffer; //New DH exchnaged by CREATE_CHILD_SA
|
|
IPSEC_SPD_ENTRY *Spd;
|
|
EFI_IPSEC_SPD_SELECTOR *SpdSelector;
|
|
UINT16 ProtoId;
|
|
UINT16 RemotePort;
|
|
UINT16 LocalPort;
|
|
LIST_ENTRY ByIkeSa;
|
|
LIST_ENTRY ByDelete;
|
|
} IKEV2_CHILD_SA_SESSION;
|
|
|
|
typedef enum {
|
|
Ikev2InfoNotify,
|
|
Ikev2InfoDelete,
|
|
Ikev2InfoLiveCheck
|
|
} IKEV2_INFO_TYPE;
|
|
|
|
//
|
|
// This struct is used to pass the detail infromation to the InfoGenerator() for
|
|
// the response Information Exchange Message creatation.
|
|
//
|
|
typedef struct {
|
|
UINT32 MessageId;
|
|
IKEV2_INFO_TYPE InfoType;
|
|
} IKEV2_INFO_EXCHANGE_CONTEXT;
|
|
|
|
typedef struct {
|
|
UINTN DataSize;
|
|
UINT8 *Data;
|
|
} PRF_DATA_FRAGMENT;
|
|
|
|
typedef
|
|
IKE_PACKET *
|
|
(*IKEV2_PACKET_GENERATOR) (
|
|
IN UINT8 *SaSession,
|
|
IN VOID *Context
|
|
);
|
|
|
|
typedef
|
|
EFI_STATUS
|
|
(*IKEV2_PACKET_PARSER) (
|
|
IN UINT8 *SaSession,
|
|
IN IKE_PACKET *IkePacket
|
|
);
|
|
|
|
typedef struct {
|
|
IKEV2_PACKET_PARSER Parser;
|
|
IKEV2_PACKET_GENERATOR Generator;
|
|
} IKEV2_PACKET_HANDLER;
|
|
|
|
extern IKEV2_PACKET_HANDLER mIkev2Initial[][2];
|
|
extern IKEV2_PACKET_HANDLER mIkev2CreateChild;
|
|
extern IKEV2_PACKET_HANDLER mIkev2Info;
|
|
|
|
#endif
|
|
|