]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/IpSecDxe/Ikev2/Ikev2.h
Merge branch 'master' of https://github.com/tianocore/edk2
[mirror_edk2.git] / NetworkPkg / IpSecDxe / Ikev2 / Ikev2.h
CommitLineData
9166f840 1/** @file\r
2 IKEv2 related definitions.\r
3\r
4 Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
5\r
6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php.\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15#ifndef _IKE_V2_H_\r
16#define _IKE_V2_H_\r
17\r
18#include "Ike.h"\r
19#include "Payload.h"\r
20\r
21#define IKEV2_TS_ANY_PORT 0xffff\r
22#define IKEV2_TS_ANY_PROTOCOL 0\r
23\r
24#define IKEV2_DELET_CHILDSA_LIST 0\r
25#define IKEV2_ESTABLISHING_CHILDSA_LIST 1\r
26#define IKEV2_ESTABLISHED_CHILDSA_LIST 2\r
27\r
28#define IKEV2_SA_SESSION_SIGNATURE SIGNATURE_32 ('I', 'K', 'E', 'I')\r
29#define IKEV2_SA_SESSION_FROM_COMMON(a) CR (a, IKEV2_SA_SESSION, SessionCommon, IKEV2_SA_SESSION_SIGNATURE)\r
30#define IKEV2_SA_SESSION_BY_SESSION(a) CR (a, IKEV2_SA_SESSION, BySessionTable, IKEV2_SA_SESSION_SIGNATURE)\r
31#define IKEV2_SA_SESSION_BY_ESTABLISHED(a) CR (a, IKEV2_SA_SESSION, ByEstablishedTable, IKEV2_SA_SESSION_SIGNATURE)\r
32\r
33#define IKEV2_CHILD_SA_SESSION_SIGNATURE SIGNATURE_32 ('I', 'K', 'E', 'C')\r
34#define IKEV2_CHILD_SA_SESSION_FROM_COMMON(a) CR (a, IKEV2_CHILD_SA_SESSION, SessionCommon, IKEV2_CHILD_SA_SESSION_SIGNATURE)\r
35#define IKEV2_CHILD_SA_SESSION_BY_IKE_SA(a) CR (a, IKEV2_CHILD_SA_SESSION, ByIkeSa, IKEV2_CHILD_SA_SESSION_SIGNATURE)\r
36#define IKEV2_CHILD_SA_SESSION_BY_DEL_SA(a) CR (a, IKEV2_CHILD_SA_SESSION, ByDelete, IKEV2_CHILD_SA_SESSION_SIGNATURE)\r
37\r
38#define IS_IKEV2_SA_SESSION(s) ((s)->Common.IkeSessionType == IkeSessionTypeIkeSa)\r
39#define IKEV2_SA_FIRST_PROPOSAL(Sa) (IKEV2_PROPOSAL *)((IKEV2_SA *)(Sa)+1)\r
40#define IKEV2_NEXT_TRANSFORM_WITH_SIZE(Transform,TransformSize) \\r
41 (IKEV2_TRANSFORM *) ((UINT8 *)(Transform) + (TransformSize))\r
42\r
43#define IKEV2_NEXT_PROPOSAL_WITH_SIZE(Proposal, ProposalSize) \\r
44 (IKEV2_PROPOSAL *) ((UINT8 *)(Proposal) + (ProposalSize))\r
45\r
46#define IKEV2_PROPOSAL_FIRST_TRANSFORM(Proposal) \\r
47 (IKEV2_TRANSFORM *)((UINT8 *)((IKEV2_PROPOSAL *)(Proposal)+1) + \\r
48 (((IKEV2_PROPOSAL *)(Proposal))->SpiSize))\r
49#define IKEV2_PROPOSAL_FIRST_TRANSFORM(Proposal) \\r
50 (IKEV2_TRANSFORM *)((UINT8 *)((IKEV2_PROPOSAL *)(Proposal)+1) + \\r
51 (((IKEV2_PROPOSAL *)(Proposal))->SpiSize))\r
52\r
53typedef enum {\r
54 IkeStateInit,\r
55 IkeStateAuth,\r
56 IkeStateIkeSaEstablished,\r
57 IkeStateCreateChild,\r
58 IkeStateSaRekeying,\r
59 IkeStateChildSaEstablished,\r
60 IkeStateSaDeleting,\r
61 IkeStateMaximum\r
62} IKEV2_SESSION_STATE;\r
63\r
64typedef enum {\r
65 IkeRequestTypeCreateChildSa,\r
66 IkeRequestTypeRekeyChildSa,\r
67 IkeRequestTypeRekeyIkeSa,\r
68 IkeRequestTypeMaximum\r
69} IKEV2_CREATE_CHILD_REQUEST_TYPE;\r
70\r
71typedef struct {\r
72 UINT8 *GxBuffer;\r
73 UINTN GxSize;\r
74 UINT8 *GyBuffer;\r
75 UINTN GySize;\r
76 UINT8 *GxyBuffer;\r
77 UINTN GxySize;\r
78 UINT8 *DhContext;\r
79} IKEV2_DH_BUFFER;\r
80\r
81typedef struct {\r
82 IKEV2_DH_BUFFER *DhBuffer;\r
83 UINT8 *SkdKey;\r
84 UINTN SkdKeySize;\r
85 UINT8 *SkAiKey;\r
86 UINTN SkAiKeySize;\r
87 UINT8 *SkArKey;\r
88 UINTN SkArKeySize;\r
89 UINT8 *SkEiKey;\r
90 UINTN SkEiKeySize;\r
91 UINT8 *SkErKey;\r
92 UINTN SkErKeySize;\r
93 UINT8 *SkPiKey;\r
94 UINTN SkPiKeySize;\r
95 UINT8 *SkPrKey;\r
96 UINTN SkPrKeySize;\r
97} IKEV2_SESSION_KEYS;\r
98\r
99typedef struct {\r
100 UINT16 LifeType;\r
101 UINT64 LifeDuration;\r
102 UINT16 EncAlgId;\r
103 UINTN EnckeyLen;\r
104 UINT16 Prf;\r
105 UINT16 IntegAlgId;\r
106 UINTN IntegKeyLen;\r
107 UINT16 DhGroup;\r
108 UINT8 ExtSeq;\r
109} IKEV2_SA_PARAMS;\r
110\r
111//\r
112// Internal Payload\r
113//\r
114typedef struct {\r
115 IKEV2_SA SaHeader;\r
116 UINTN NumProposals;\r
117 //\r
118 // IKE_PROPOSAL_DATA Proposals[1];\r
119 //\r
120} IKEV2_SA_DATA;\r
121\r
122typedef struct {\r
123 UINT8 ProposalIndex;\r
124 UINT8 ProtocolId;\r
125 UINT8 *Spi;\r
126 UINT8 NumTransforms;\r
127 //\r
128 // IKE_TRANSFORM_DATA Transforms[1];\r
129 //\r
130} IKEV2_PROPOSAL_DATA;\r
131\r
132typedef struct {\r
133 UINT8 TransformIndex;\r
134 UINT8 TransformType;\r
135 UINT16 TransformId;\r
136 IKE_SA_ATTRIBUTE Attribute;\r
137} IKEV2_TRANSFORM_DATA;\r
138\r
139typedef struct {\r
140 UINT8 IkeVer;\r
141 IKE_SESSION_TYPE IkeSessionType;\r
142 BOOLEAN IsInitiator;\r
143 BOOLEAN IsOnDeleting; // Flag to indicate whether the SA is on deleting.\r
144 IKEV2_SESSION_STATE State;\r
145 EFI_EVENT TimeoutEvent;\r
146 UINT64 TimeoutInterval;\r
147 UINTN RetryCount;\r
148 IKE_PACKET *LastSentPacket;\r
149 IKEV2_SA_PARAMS *SaParams;\r
150 UINT16 PreferDhGroup;\r
151 EFI_IP_ADDRESS RemotePeerIp;\r
152 EFI_IP_ADDRESS LocalPeerIp;\r
153 IKE_ON_PAYLOAD_FROM_NET BeforeDecodePayload;\r
154 IKE_ON_PAYLOAD_FROM_NET AfterEncodePayload;\r
155 IKE_UDP_SERVICE *UdpService;\r
156 IPSEC_PRIVATE_DATA *Private;\r
157} IKEV2_SESSION_COMMON;\r
158\r
159typedef struct {\r
160 UINT32 Signature;\r
161 IKEV2_SESSION_COMMON SessionCommon;\r
162 UINT64 InitiatorCookie;\r
163 UINT64 ResponderCookie;\r
164 //\r
165 // Initiator: SA proposals to be sent\r
166 // Responder: SA proposals to be matched\r
167 //\r
168 IKEV2_SA_DATA *SaData; // SA Private struct used for SA payload generation\r
169 IKEV2_SESSION_KEYS *IkeKeys;\r
170 UINT8 *NiBlock;\r
171 UINTN NiBlkSize;\r
172 UINT8 *NrBlock;\r
173 UINTN NrBlkSize;\r
174 UINT8 *NCookie; // Buffer Contains the Notify Cookie\r
175 UINTN NCookieSize; // Size of NCookie\r
176 IPSEC_PAD_ENTRY *Pad;\r
177 IPSEC_SPD_ENTRY *Spd; // SPD that requested the negotiation, TODO: better use SPD selector\r
178 LIST_ENTRY ChildSaSessionList;\r
179 LIST_ENTRY ChildSaEstablishSessionList; // For Establish Child SA.\r
180 LIST_ENTRY InfoMIDList; // For Information MID\r
181 LIST_ENTRY DeleteSaList; // For deteling Child SA.\r
182 UINT8 *InitPacket;\r
183 UINTN InitPacketSize;\r
184 UINT8 *RespPacket;\r
185 UINTN RespPacketSize;\r
186 UINT32 MessageId;\r
187 LIST_ENTRY BySessionTable; // Use for all IkeSaSession Links\r
188} IKEV2_SA_SESSION;\r
189\r
190typedef struct {\r
191 UINT32 Signature;\r
192 IKEV2_SESSION_COMMON SessionCommon;\r
193 IKEV2_SA_SESSION *IkeSaSession;\r
194 UINT32 MessageId;\r
195 IKEV2_SA_DATA *SaData;\r
196 UINT8 IpsecProtocol;\r
197 UINT32 LocalPeerSpi;\r
198 UINT32 RemotePeerSpi;\r
199 UINT8 *NiBlock;\r
200 UINTN NiBlkSize;\r
201 UINT8 *NrBlock;\r
202 UINTN NrBlkSize;\r
203 SA_KEYMATS ChildKeymats;\r
204 IKEV2_DH_BUFFER *DhBuffer; //New DH exchnaged by CREATE_CHILD_SA\r
205 IPSEC_SPD_ENTRY *Spd;\r
206 EFI_IPSEC_SPD_SELECTOR *SpdSelector;\r
207 UINT16 ProtoId;\r
208 UINT16 RemotePort;\r
209 UINT16 LocalPort;\r
210 LIST_ENTRY ByIkeSa;\r
211 LIST_ENTRY ByDelete;\r
212} IKEV2_CHILD_SA_SESSION;\r
213\r
214typedef enum {\r
215 Ikev2InfoNotify,\r
216 Ikev2InfoDelete,\r
217 Ikev2InfoLiveCheck\r
218} IKEV2_INFO_TYPE;\r
219\r
220//\r
221// This struct is used to pass the detail infromation to the InfoGenerator() for\r
222// the response Information Exchange Message creatation.\r
223//\r
224typedef struct {\r
225 UINT32 MessageId;\r
226 IKEV2_INFO_TYPE InfoType;\r
227} IKEV2_INFO_EXCHANGE_CONTEXT;\r
228\r
229typedef struct {\r
230 UINTN DataSize;\r
231 UINT8 *Data;\r
232} PRF_DATA_FRAGMENT;\r
233\r
234typedef \r
235IKE_PACKET *\r
236(*IKEV2_PACKET_GENERATOR) (\r
237 IN UINT8 *SaSession,\r
238 IN VOID *Context\r
239);\r
240\r
241typedef\r
242EFI_STATUS\r
243(*IKEV2_PACKET_PARSER) (\r
244 IN UINT8 *SaSession,\r
245 IN IKE_PACKET *IkePacket\r
246);\r
247\r
248typedef struct {\r
249 IKEV2_PACKET_PARSER Parser;\r
250 IKEV2_PACKET_GENERATOR Generator;\r
251} IKEV2_PACKET_HANDLER;\r
252\r
253extern IKEV2_PACKET_HANDLER mIkev2Initial[][2];\r
254extern IKEV2_PACKET_HANDLER mIkev2CreateChild;\r
255extern IKEV2_PACKET_HANDLER mIkev2Info;\r
256\r
257#endif\r
258\r