1 // SoftEther VPN Source Code - Stable Edition Repository
2 // Cedar Communication Module
3 //
4 // SoftEther VPN Server, Client and Bridge are free software under the Apache License, Version 2.0.
5 //
6 // Copyright (c) Daiyuu Nobori.
7 // Copyright (c) SoftEther VPN Project, University of Tsukuba, Japan.
8 // Copyright (c) SoftEther Corporation.
9 // Copyright (c) all contributors on SoftEther VPN project in GitHub.
10 //
11 // All Rights Reserved.
12 //
13 // http://www.softether.org/
14 //
15 // This stable branch is officially managed by Daiyuu Nobori, the owner of SoftEther VPN Project.
16 // Pull requests should be sent to the Developer Edition Master Repository on https://github.com/SoftEtherVPN/SoftEtherVPN
17 //
18 // License: The Apache License, Version 2.0
19 // https://www.apache.org/licenses/LICENSE-2.0
20 //
21 // DISCLAIMER
22 // ==========
23 //
24 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
25 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
26 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
27 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
28 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
29 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 // SOFTWARE.
31 //
32 // THIS SOFTWARE IS DEVELOPED IN JAPAN, AND DISTRIBUTED FROM JAPAN, UNDER
33 // JAPANESE LAWS. YOU MUST AGREE IN ADVANCE TO USE, COPY, MODIFY, MERGE, PUBLISH,
34 // DISTRIBUTE, SUBLICENSE, AND/OR SELL COPIES OF THIS SOFTWARE, THAT ANY
35 // JURIDICAL DISPUTES WHICH ARE CONCERNED TO THIS SOFTWARE OR ITS CONTENTS,
36 // AGAINST US (SOFTETHER PROJECT, SOFTETHER CORPORATION, DAIYUU NOBORI OR OTHER
37 // SUPPLIERS), OR ANY JURIDICAL DISPUTES AGAINST US WHICH ARE CAUSED BY ANY KIND
38 // OF USING, COPYING, MODIFYING, MERGING, PUBLISHING, DISTRIBUTING, SUBLICENSING,
39 // AND/OR SELLING COPIES OF THIS SOFTWARE SHALL BE REGARDED AS BE CONSTRUED AND
40 // CONTROLLED BY JAPANESE LAWS, AND YOU MUST FURTHER CONSENT TO EXCLUSIVE
41 // JURISDICTION AND VENUE IN THE COURTS SITTING IN TOKYO, JAPAN. YOU MUST WAIVE
42 // ALL DEFENSES OF LACK OF PERSONAL JURISDICTION AND FORUM NON CONVENIENS.
43 // PROCESS MAY BE SERVED ON EITHER PARTY IN THE MANNER AUTHORIZED BY APPLICABLE
44 // LAW OR COURT RULE.
45 //
46 // USE ONLY IN JAPAN. DO NOT USE THIS SOFTWARE IN ANOTHER COUNTRY UNLESS YOU HAVE
47 // A CONFIRMATION THAT THIS SOFTWARE DOES NOT VIOLATE ANY CRIMINAL LAWS OR CIVIL
48 // RIGHTS IN THAT PARTICULAR COUNTRY. USING THIS SOFTWARE IN OTHER COUNTRIES IS
49 // COMPLETELY AT YOUR OWN RISK. THE SOFTETHER VPN PROJECT HAS DEVELOPED AND
50 // DISTRIBUTED THIS SOFTWARE TO COMPLY ONLY WITH THE JAPANESE LAWS AND EXISTING
51 // CIVIL RIGHTS INCLUDING PATENTS WHICH ARE SUBJECTS APPLY IN JAPAN. OTHER
52 // COUNTRIES' LAWS OR CIVIL RIGHTS ARE NONE OF OUR CONCERNS NOR RESPONSIBILITIES.
53 // WE HAVE NEVER INVESTIGATED ANY CRIMINAL REGULATIONS, CIVIL LAWS OR
54 // INTELLECTUAL PROPERTY RIGHTS INCLUDING PATENTS IN ANY OF OTHER 200+ COUNTRIES
55 // AND TERRITORIES. BY NATURE, THERE ARE 200+ REGIONS IN THE WORLD, WITH
56 // DIFFERENT LAWS. IT IS IMPOSSIBLE TO VERIFY EVERY COUNTRIES' LAWS, REGULATIONS
57 // AND CIVIL RIGHTS TO MAKE THE SOFTWARE COMPLY WITH ALL COUNTRIES' LAWS BY THE
58 // PROJECT. EVEN IF YOU WILL BE SUED BY A PRIVATE ENTITY OR BE DAMAGED BY A
59 // PUBLIC SERVANT IN YOUR COUNTRY, THE DEVELOPERS OF THIS SOFTWARE WILL NEVER BE
60 // LIABLE TO RECOVER OR COMPENSATE SUCH DAMAGES, CRIMINAL OR CIVIL
61 // RESPONSIBILITIES. NOTE THAT THIS LINE IS NOT LICENSE RESTRICTION BUT JUST A
62 // STATEMENT FOR WARNING AND DISCLAIMER.
63 //
64 // READ AND UNDERSTAND THE 'WARNING.TXT' FILE BEFORE USING THIS SOFTWARE.
65 // SOME SOFTWARE PROGRAMS FROM THIRD PARTIES ARE INCLUDED ON THIS SOFTWARE WITH
66 // LICENSE CONDITIONS WHICH ARE DESCRIBED ON THE 'THIRD_PARTY.TXT' FILE.
67 //
68 //
69 // SOURCE CODE CONTRIBUTION
70 // ------------------------
71 //
72 // Your contribution to SoftEther VPN Project is much appreciated.
73 // Please send patches to us through GitHub.
74 // Read the SoftEther VPN Patch Acceptance Policy in advance:
75 // http://www.softether.org/5-download/src/9.patch
76 //
77 //
78 // DEAR SECURITY EXPERTS
79 // ---------------------
80 //
81 // If you find a bug or a security vulnerability please kindly inform us
82 // about the problem immediately so that we can fix the security problem
83 // to protect a lot of users around the world as soon as possible.
84 //
85 // Our e-mail address for security reports is:
86 // softether-vpn-security [at] softether.org
87 //
88 // Please note that the above e-mail address is not a technical support
89 // inquiry address. If you need technical assistance, please visit
90 // http://www.softether.org/ and ask your question on the users forum.
91 //
92 // Thank you for your cooperation.
93 //
94 //
95 // NO MEMORY OR RESOURCE LEAKS
96 // ---------------------------
97 //
98 // The memory-leaks and resource-leaks verification under the stress
99 // test has been passed before release this source code.
100 
101 
102 // IPsec_IkePacket.h
103 // Header of IPsec_IkePacket.c
104 
105 #ifndef	IPSEC_PACKET_H
106 #define	IPSEC_PACKET_H
107 
108 // Constants
109 #ifdef	OS_WIN32
110 #pragma pack(push, 1)
111 #endif	// OS_WIN32
112 
113 // Maximum hash size
114 #define	IKE_MAX_HASH_SIZE				64		// Size of SHA-2-512 is the maximum for now
115 
116 // Maximum block size
117 #define	IKE_MAX_BLOCK_SIZE				16		// Size of AES is maximum at the moment
118 
119 // Maximum key size
120 #define	IKE_MAX_KEY_SIZE				32		// Size of AES-256 is the maximum for now
121 
122 // IKE version
123 #define IKE_VERSION						0x10	// 1.0
124 
125 // IKE payload type
126 #define	IKE_PAYLOAD_NONE				0		// No payload
127 #define IKE_PAYLOAD_SA					1		// SA payload
128 #define IKE_PAYLOAD_PROPOSAL			2		// Proposal payload
129 #define IKE_PAYLOAD_TRANSFORM			3		// Transform payload
130 #define IKE_PAYLOAD_KEY_EXCHANGE		4		// Key exchange payload
131 #define IKE_PAYLOAD_ID					5		// ID payload
132 #define IKE_PAYLOAD_CERT				6		// Certificate payload
133 #define IKE_PAYLOAD_CERT_REQUEST		7		// Certificate request payload
134 #define IKE_PAYLOAD_HASH				8		// Hash payload
135 #define IKE_PAYLOAD_SIGN				9		// Signature payload
136 #define IKE_PAYLOAD_RAND				10		// Random number payload
137 #define IKE_PAYLOAD_NOTICE				11		// Notification Payload
138 #define IKE_PAYLOAD_DELETE				12		// Deletion payload
139 #define IKE_PAYLOAD_VENDOR_ID			13		// Vendor ID payload
140 #define	IKE_PAYLOAD_NAT_D				20		// NAT-D payload
141 #define	IKE_PAYLOAD_NAT_OA				21		// NAT-OA payload
142 #define	IKE_PAYLOAD_NAT_D_DRAFT			130		// NAT-D payload draft
143 #define	IKE_PAYLOAD_NAT_OA_DRAFT		16		// NAT-OA payload draft
144 #define	IKE_PAYLOAD_NAT_OA_DRAFT_2		131		// NAT-OA payload draft 2
145 
146 // Macro to check whether the payload type is supported
147 #define IKE_IS_SUPPORTED_PAYLOAD_TYPE(i) ((((i) >= IKE_PAYLOAD_SA) && ((i) <= IKE_PAYLOAD_VENDOR_ID)) || ((i) == IKE_PAYLOAD_NAT_D) || ((i) == IKE_PAYLOAD_NAT_OA) || ((i) == IKE_PAYLOAD_NAT_OA_DRAFT) || ((i) == IKE_PAYLOAD_NAT_OA_DRAFT_2) || ((i) == IKE_PAYLOAD_NAT_D_DRAFT))
148 
149 // IKE header flag
150 #define IKE_HEADER_FLAG_ENCRYPTED			1	// Encryption
151 #define IKE_HEADER_FLAG_COMMIT				2	// Commit
152 #define IKE_HEADER_FLAG_AUTH_ONLY			4	// Only authentication
153 
154 // IKE payload common header
155 struct IKE_COMMON_HEADER
156 {
157 	UCHAR NextPayload;
158 	UCHAR Reserved;
159 	USHORT PayloadSize;
160 } GCC_PACKED;
161 
162 // IKE SA payload header
163 struct IKE_SA_HEADER
164 {
165 	UINT DoI;									// DOI value
166 	UINT Situation;								// Situation value
167 } GCC_PACKED;
168 
169 // DOI value in the IKE SA payload
170 #define IKE_SA_DOI_IPSEC				1		// IPsec
171 
172 // Situation value in the IKE SA payload
173 #define IKE_SA_SITUATION_IDENTITY		1		// Only authentication
174 
175 // IKE proposal payload header
176 struct IKE_PROPOSAL_HEADER
177 {
178 	UCHAR Number;								// Number
179 	UCHAR ProtocolId;							// Protocol ID
180 	UCHAR SpiSize;								// Length of SPI
181 	UCHAR NumTransforms;						// Transform number
182 } GCC_PACKED;
183 
184 // Protocol ID in the IKE proposal payload header
185 #define IKE_PROTOCOL_ID_IKE				1		// IKE
186 #define IKE_PROTOCOL_ID_IPSEC_AH		2		// AH
187 #define IKE_PROTOCOL_ID_IPSEC_ESP		3		// ESP
188 #define	IKE_PROTOCOL_ID_IPV4			4		// IP
189 #define	IKE_PROTOCOL_ID_IPV6			41		// IPv6
190 
191 // IKE transform payload header
192 struct IKE_TRANSFORM_HEADER
193 {
194 	UCHAR Number;								// Number
195 	UCHAR TransformId;							// Transform ID
196 	USHORT Reserved;							// Reserved
197 } GCC_PACKED;
198 
199 // Transform ID (Phase 1) in IKE transform payload header
200 #define IKE_TRANSFORM_ID_P1_KEY_IKE				1	// IKE
201 
202 // Transform ID (Phase 2) in IKE transform payload header
203 #define IKE_TRANSFORM_ID_P2_ESP_DES				2	// DES-CBC
204 #define IKE_TRANSFORM_ID_P2_ESP_3DES			3	// 3DES-CBC
205 #define IKE_TRANSFORM_ID_P2_ESP_CAST			6	// CAST
206 #define IKE_TRANSFORM_ID_P2_ESP_BLOWFISH		7	// BLOWFISH
207 #define IKE_TRANSFORM_ID_P2_ESP_AES				12	// AES
208 
209 // IKE transform value (fixed length)
210 struct IKE_TRANSFORM_VALUE
211 {
212 	UCHAR AfBit;								// AF bit (0: Fixed length, 1: Variable length)
213 	UCHAR Type;									// Type
214 	USHORT Value;								// Value data (16bit)
215 } GCC_PACKED;
216 
217 // The Type value in IKE transform value (Phase 1)
218 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
219 #define IKE_TRANSFORM_VALUE_P1_CRYPTO			1	// Encryption algorithm
220 #define IKE_TRANSFORM_VALUE_P1_HASH				2	// Hash algorithm
221 #define IKE_TRANSFORM_VALUE_P1_AUTH_METHOD		3	// Authentication method
222 #define IKE_TRANSFORM_VALUE_P1_DH_GROUP			4	// DH group number
223 #define IKE_TRANSFORM_VALUE_P1_LIFE_TYPE		11	// Expiration date type
224 #define IKE_TRANSFORM_VALUE_P1_LIFE_VALUE		12	// Expiration date
225 #define IKE_TRANSFORM_VALUE_P1_KET_SIZE			14	// Key size
226 
227 // The Type value in IKE transform values (Phase 2)
228 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
229 #define IKE_TRANSFORM_VALUE_P2_LIFE_TYPE	1	// Expiration date type
230 #define IKE_TRANSFORM_VALUE_P2_LIFE_VALUE	2	// Expiration date
231 #define IKE_TRANSFORM_VALUE_P2_DH_GROUP		3	// DH group number
232 #define IKE_TRANSFORM_VALUE_P2_CAPSULE		4	// Encapsulation mode
233 #define IKE_TRANSFORM_VALUE_P2_HMAC			5	// HMAC algorithm
234 #define IKE_TRANSFORM_VALUE_P2_KEY_SIZE		6	// Key size
235 
236 // Phase 1: The encryption algorithm in the IKE transform value
237 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
238 #define IKE_P1_CRYPTO_DES_CBC				1
239 #define IKE_P1_CRYPTO_BLOWFISH				3
240 #define IKE_P1_CRYPTO_3DES_CBC				5
241 #define IKE_P1_CRYPTO_CAST_CBC				6
242 #define IKE_P1_CRYPTO_AES_CBC				7
243 
244 // Phase 1: The hash algorithm in IKE transform value
245 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
246 #define	IKE_P1_HASH_MD5						1
247 #define IKE_P1_HASH_SHA1					2
248 #define IKE_P1_HASH_SHA2_256				4
249 #define IKE_P1_HASH_SHA2_384				5
250 #define IKE_P1_HASH_SHA2_512				6
251 
252 // Phase 1: The authentication method in the IKE transform value
253 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
254 #define IKE_P1_AUTH_METHOD_PRESHAREDKEY		1
255 #define IKE_P1_AUTH_METHOD_RSA_SIGN			3
256 
257 // Phase 1: The DH group number in the IKE transform value
258 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
259 #define IKE_P1_DH_GROUP_768_MODP			1
260 #define IKE_P1_DH_GROUP_1024_MODP			2
261 #define IKE_P1_DH_GROUP_1536_MODP			5
262 #define IKE_P1_DH_GROUP_2048_MODP			14
263 #define IKE_P1_DH_GROUP_3072_MODP			15
264 #define IKE_P1_DH_GROUP_4096_MODP			16
265 
266 // Phase 1: The expiration date type in IKE transform value
267 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
268 #define IKE_P1_LIFE_TYPE_SECONDS			1
269 #define IKE_P1_LIFE_TYPE_KILOBYTES			2
270 
271 // Phase 2: The HMAC algorithm in IPsec transform value
272 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
273 #define IKE_P2_HMAC_MD5_96					1
274 #define IKE_P2_HMAC_SHA1_96					2
275 
276 // Phase 2: The DH group number in the IPsec transform value
277 // MUST BE LESS THAN "MAX_IKE_ENGINE_ELEMENTS" !!!
278 #define IKE_P2_DH_GROUP_768_MODP			1
279 #define IKE_P2_DH_GROUP_1024_MODP			2
280 #define IKE_P2_DH_GROUP_1536_MODP			5
281 #define IKE_P2_DH_GROUP_2048_MODP			14
282 #define IKE_P2_DH_GROUP_3072_MODP			15
283 #define IKE_P2_DH_GROUP_4096_MODP			16
284 
285 // Phase 2: The encapsulation mode in IPsec transform value
286 #define IKE_P2_CAPSULE_TUNNEL				1
287 #define IKE_P2_CAPSULE_TRANSPORT			2
288 #define IKE_P2_CAPSULE_NAT_TUNNEL_1			3
289 #define IKE_P2_CAPSULE_NAT_TUNNEL_2			61443
290 #define IKE_P2_CAPSULE_NAT_TRANSPORT_1		4
291 #define IKE_P2_CAPSULE_NAT_TRANSPORT_2		61444
292 
293 // Phase 2: The expiration date type in IPsec transform value
294 #define IKE_P2_LIFE_TYPE_SECONDS			1
295 #define IKE_P2_LIFE_TYPE_KILOBYTES			2
296 
297 
298 // IKE ID payload header
299 struct IKE_ID_HEADER
300 {
301 	UCHAR IdType;								// Type of ID
302 	UCHAR ProtocolId;							// Protocol ID
303 	USHORT Port;								// Port
304 } GCC_PACKED;
305 
306 // Type of ID in the IKE ID payload header
307 #define IKE_ID_IPV4_ADDR				1		// IPv4 address (32 bit)
308 #define IKE_ID_FQDN						2		// FQDN
309 #define IKE_ID_USER_FQDN				3		// User FQDN
310 #define IKE_ID_IPV4_ADDR_SUBNET			4		// IPv4 + subnet (64 bit)
311 #define IKE_ID_IPV6_ADDR				5		// IPv6 address (128 bit)
312 #define IKE_ID_IPV6_ADDR_SUBNET			6		// IPv6 + subnet (256 bit)
313 #define IKE_ID_DER_ASN1_DN				9		// X.500 Distinguished Name
314 #define IKE_ID_DER_ASN1_GN				10		// X.500 General Name
315 #define IKE_ID_KEY_ID					11		// Key
316 
317 // The protocol ID in the IKE ID payload
318 #define IKE_ID_PROTOCOL_UDP			IP_PROTO_UDP	// UDP
319 
320 // IKE certificate payload header
321 struct IKE_CERT_HEADER
322 {
323 	UCHAR CertType;								// Certificate Type
324 } GCC_PACKED;
325 
326 // The certificate type in IKE certificate payload header
327 #define IKE_CERT_TYPE_X509				4		// X.509 certificate (for digital signature)
328 
329 // IKE certificate payload header
330 struct IKE_CERT_REQUEST_HEADER
331 {
332 	UCHAR CertType;								// Certificate Type
333 } GCC_PACKED;
334 
335 // IKE notification payload header
336 struct IKE_NOTICE_HEADER
337 {
338 	UINT DoI;									// DOI value
339 	UCHAR ProtocolId;							// Protocol ID
340 	// Same to the protocol ID in the IKE proposal payload header
341 	UCHAR SpiSize;								// SPI size
342 	USHORT MessageType;							// Message type
343 } GCC_PACKED;
344 
345 // IKE Deletion payload header
346 struct IKE_DELETE_HEADER
347 {
348 	UINT DoI;									// DOI value
349 	UCHAR ProtocolId;							// Protocol ID
350 	// Same to the protocol ID in the IKE proposal payload header
351 	UCHAR SpiSize;								// SPI size
352 	USHORT NumSpis;								// SPI number
353 } GCC_PACKED;
354 
355 // IKE NAT-OA payload header
356 struct IKE_NAT_OA_HEADER
357 {
358 	UCHAR IdType;								// Type of ID
359 	UCHAR Reserved1;
360 	USHORT Reserved2;
361 } GCC_PACKED;
362 
363 
364 #ifdef	OS_WIN32
365 #pragma pack(pop)
366 #endif	// OS_WIN32
367 
368 
369 
370 //
371 // IKE internal data structure
372 //
373 
374 // IKE packet SA payload
375 struct IKE_PACKET_SA_PAYLOAD
376 {
377 	LIST *PayloadList;						// Proposal payload list
378 };
379 
380 // IKE proposal packet payload
381 struct IKE_PACKET_PROPOSAL_PAYLOAD
382 {
383 	UCHAR Number;							// Number
384 	UCHAR ProtocolId;						// Protocol ID
385 	BUF *Spi;								// SPI data
386 
387 	LIST *PayloadList;						// Payload list
388 };
389 
390 // IKE packet transform payload
391 struct IKE_PACKET_TRANSFORM_PAYLOAD
392 {
393 	UCHAR Number;								// Number
394 	UCHAR TransformId;							// Transform ID
395 
396 	LIST *ValueList;							// Value list
397 };
398 
399 // IKE packet transform value
400 struct IKE_PACKET_TRANSFORM_VALUE
401 {
402 	UCHAR Type;									// Type
403 	UINT Value;									// Value
404 };
405 
406 // IKE generic data payload
407 struct IKE_PACKET_DATA_PAYLOAD
408 {
409 	BUF *Data;									// Generic data
410 };
411 
412 // IKE packet ID payload
413 struct IKE_PACKET_ID_PAYLOAD
414 {
415 	UCHAR Type;									// Type
416 	UCHAR ProtocolId;							// Protocol ID
417 	USHORT Port;								// Port number
418 	BUF *IdData;								// ID data
419 	char StrData[128];							// Data of the result of converting to a string
420 };
421 
422 // IKE packet certificate payload
423 struct IKE_PACKET_CERT_PAYLOAD
424 {
425 	UCHAR CertType;								// Certificate type
426 	BUF *CertData;								// Certificate data
427 };
428 
429 // IKE packet certificate request payload
430 struct IKE_PACKET_CERT_REQUEST_PAYLOAD
431 {
432 	UCHAR CertType;								// Certificate type
433 	BUF *Data;									// Request data
434 };
435 
436 // IKE packet notification payload
437 struct IKE_PACKET_NOTICE_PAYLOAD
438 {
439 	UCHAR ProtocolId;							// Protocol ID
440 	USHORT MessageType;							// Message type
441 	BUF *Spi;									// SPI data
442 	BUF *MessageData;							// Message data
443 };
444 
445 // IKE notification message type
446 // Error
447 #define	IKE_NOTICE_ERROR_INVALID_COOKIE			4	// Invalid cookie
448 #define	IKE_NOTICE_ERROR_INVALID_EXCHANGE_TYPE	7	// Invalid exchange type
449 #define	IKE_NOTICE_ERROR_INVALID_SPI			11	// Invalid SPI
450 #define	IKE_NOTICE_ERROR_NO_PROPOSAL_CHOSEN		14	// There is nothing worth mentioning in the presented proposal
451 
452 // DPD
453 #define	IKE_NOTICE_DPD_REQUEST					36136	// R-U-THERE
454 #define	IKE_NOTICE_DPD_RESPONSE					36137	// R-U-THERE-ACK
455 
456 
457 // IKE packet deletion payload
458 struct IKE_PACKET_DELETE_PAYLOAD
459 {
460 	UCHAR ProtocolId;							// Protocol ID
461 	LIST *SpiList;								// SPI list
462 };
463 
464 // IKE NAT-OA payload
465 struct IKE_PACKET_NAT_OA_PAYLOAD
466 {
467 	IP IpAddress;								// IP address
468 };
469 
470 // IKE packet payload
471 struct IKE_PACKET_PAYLOAD
472 {
473 	UCHAR PayloadType;							// Payload type
474 	UCHAR Padding[3];
475 	BUF *BitArray;								// Bit array
476 
477 	union
478 	{
479 		IKE_PACKET_SA_PAYLOAD Sa;				// SA payload
480 		IKE_PACKET_PROPOSAL_PAYLOAD Proposal;	// Proposal payload
481 		IKE_PACKET_TRANSFORM_PAYLOAD Transform;	// Transform payload
482 		IKE_PACKET_DATA_PAYLOAD KeyExchange;	// Key exchange payload
483 		IKE_PACKET_ID_PAYLOAD Id;				// ID payload
484 		IKE_PACKET_CERT_PAYLOAD Cert;			// Certificate payload
485 		IKE_PACKET_CERT_REQUEST_PAYLOAD CertRequest;	// Certificate request payload
486 		IKE_PACKET_DATA_PAYLOAD Hash;			// Hash payload
487 		IKE_PACKET_DATA_PAYLOAD Sign;			// Signature payload
488 		IKE_PACKET_DATA_PAYLOAD Rand;			// Random number payload
489 		IKE_PACKET_NOTICE_PAYLOAD Notice;		// Notification Payload
490 		IKE_PACKET_DELETE_PAYLOAD Delete;		// Deletion payload
491 		IKE_PACKET_DATA_PAYLOAD VendorId;		// Vendor ID payload
492 		IKE_PACKET_NAT_OA_PAYLOAD NatOa;		// NAT-OA payload
493 		IKE_PACKET_DATA_PAYLOAD GeneralData;	// Generic data payload
494 	} Payload;
495 };
496 
497 struct IKE_PACKET
498 {
499 	UINT64 InitiatorCookie;						// Initiator cookie
500 	UINT64 ResponderCookie;						// Responder cookie
501 	UCHAR ExchangeType;							// Exchange type
502 	bool FlagEncrypted;							// Encryption flag
503 	bool FlagCommit;							// Commit flag
504 	bool FlagAuthOnly;							// Flag only authentication
505 	UINT MessageId;								// Message ID
506 	LIST *PayloadList;							// Payload list
507 	BUF *DecryptedPayload;						// Decrypted payload
508 	UINT MessageSize;							// Original size
509 };
510 
511 // IKE P1 key set
512 struct IKE_P1_KEYSET
513 {
514 	BUF *SKEYID_d;									// IPsec SA key
515 	BUF *SKEYID_a;									// IKE SA authentication key
516 	BUF *SKEYID_e;									// IKE SA encryption key
517 };
518 
519 // Number and name of the encryption algorithm for IKE
520 #define	IKE_CRYPTO_DES_ID						0
521 #define	IKE_CRYPTO_DES_STRING					"DES-CBC"
522 
523 #define	IKE_CRYPTO_3DES_ID						1
524 #define	IKE_CRYPTO_3DES_STRING					"3DES-CBC"
525 
526 #define	IKE_CRYPTO_AES_ID						2
527 #define	IKE_CRYPTO_AES_STRING					"AES-CBC"
528 
529 #define	IKE_CRYPTO_BLOWFISH_ID					3
530 #define	IKE_CRYPTO_BLOWFISH_STRING				"Blowfish-CBC"
531 
532 #define	IKE_CRYPTO_CAST_ID						4
533 #define	IKE_CRYPTO_CAST_STRING					"CAST-128-CBC"
534 
535 // Number and name of the IKE hash algorithm
536 #define	IKE_HASH_MD5_ID							0
537 #define	IKE_HASH_MD5_STRING						"MD5"
538 
539 #define	IKE_HASH_SHA1_ID						1
540 #define	IKE_HASH_SHA1_STRING					"SHA-1"
541 
542 #define	IKE_HASH_SHA2_256_ID					2
543 #define	IKE_HASH_SHA2_256_STRING				"SHA-2-256"
544 
545 #define	IKE_HASH_SHA2_384_ID					3
546 #define	IKE_HASH_SHA2_384_STRING				"SHA-2-384"
547 
548 #define	IKE_HASH_SHA2_512_ID					4
549 #define	IKE_HASH_SHA2_512_STRING				"SHA-2-512"
550 
551 // Number and name of DH algorithm for IKE
552 #define	IKE_DH_1_ID								0
553 #define	IKE_DH_1_STRING							"MODP 768 (Group 1)"
554 
555 #define	IKE_DH_2_ID								1
556 #define	IKE_DH_2_STRING							"MODP 1024 (Group 2)"
557 
558 #define	IKE_DH_5_ID								2
559 #define	IKE_DH_5_STRING							"MODP 1536 (Group 5)"
560 
561 #define IKE_DH_2048_ID							14
562 #define IKE_DH_2048_STRING						"MODP 2048 (Group 14)"
563 
564 #define IKE_DH_3072_ID							15
565 #define IKE_DH_3072_STRING						"MODP 3072 (Group 15)"
566 
567 #define IKE_DH_4096_ID							16
568 #define IKE_DH_4096_STRING						"MODP 4096 (Group 16)"
569 
570 
571 // Encryption algorithm for IKE
572 struct IKE_CRYPTO
573 {
574 	UINT CryptoId;								// ID
575 	char *Name;									// Name
576 	UINT KeySizes[16];							// Key size candidate
577 	UINT BlockSize;								// Block size
578 	bool VariableKeySize;						// Whether the key size is variable
579 };
580 
581 // IKE encryption key
582 struct IKE_CRYPTO_KEY
583 {
584 	IKE_CRYPTO *Crypto;
585 	void *Data;									// Key data
586 	UINT Size;									// Key size
587 
588 	DES_KEY_VALUE *DesKey1, *DesKey2, *DesKey3;	// DES key
589 	AES_KEY_VALUE *AesKey;						// AES key
590 };
591 
592 // IKE hash algorithm
593 struct IKE_HASH
594 {
595 	UINT HashId;								// ID
596 	char *Name;									// Name
597 	UINT HashSize;								// Output size
598 };
599 
600 // DH algorithm for IKE
601 struct IKE_DH
602 {
603 	UINT DhId;									// ID
604 	char *Name;									// Name
605 	UINT KeySize;								// Key size
606 };
607 
608 #define	MAX_IKE_ENGINE_ELEMENTS					64
609 
610 // Encryption engine for IKE
611 struct IKE_ENGINE
612 {
613 	IKE_CRYPTO *IkeCryptos[MAX_IKE_ENGINE_ELEMENTS];	// Encryption algorithm list that is used in the IKE
614 	IKE_HASH *IkeHashes[MAX_IKE_ENGINE_ELEMENTS];		// Hash algorithm list that is used in the IKE
615 	IKE_DH *IkeDhs[MAX_IKE_ENGINE_ELEMENTS];			// DH algorithm list that is used in the IKE
616 
617 	IKE_CRYPTO *EspCryptos[MAX_IKE_ENGINE_ELEMENTS];	// Encryption algorithm list that is used by ESP
618 	IKE_HASH *EspHashes[MAX_IKE_ENGINE_ELEMENTS];		// Hash algorithm list that is used by ESP
619 	IKE_DH *EspDhs[MAX_IKE_ENGINE_ELEMENTS];			// DH algorithm list that is used by ESP
620 
621 	LIST *CryptosList;
622 	LIST *HashesList;
623 	LIST *DhsList;
624 };
625 
626 // IKE encryption parameters
627 struct IKE_CRYPTO_PARAM
628 {
629 	IKE_CRYPTO_KEY *Key;						// Key
630 	UCHAR Iv[IKE_MAX_BLOCK_SIZE];				// IV
631 	UCHAR NextIv[IKE_MAX_BLOCK_SIZE];			// IV to be used next
632 };
633 
634 
635 // Function prototype
636 IKE_PACKET *IkeParseHeader(void *data, UINT size, IKE_CRYPTO_PARAM *cparam);
637 IKE_PACKET *IkeParse(void *data, UINT size, IKE_CRYPTO_PARAM *cparam);
638 IKE_PACKET *IkeParseEx(void *data, UINT size, IKE_CRYPTO_PARAM *cparam, bool header_only);
639 void IkeFree(IKE_PACKET *p);
640 IKE_PACKET *IkeNew(UINT64 init_cookie, UINT64 resp_cookie, UCHAR exchange_type,
641 				   bool encrypted, bool commit, bool auth_only, UINT msg_id,
642 				   LIST *payload_list);
643 
644 void IkeDebugPrintPayloads(LIST *o, UINT depth);
645 void IkeDebugUdpSendRawPacket(IKE_PACKET *p);
646 
647 BUF *IkeEncrypt(void *data, UINT size, IKE_CRYPTO_PARAM *cparam);
648 BUF *IkeEncryptWithPadding(void *data, UINT size, IKE_CRYPTO_PARAM *cparam);
649 BUF *IkeDecrypt(void *data, UINT size, IKE_CRYPTO_PARAM *cparam);
650 
651 LIST *IkeParsePayloadList(void *data, UINT size, UCHAR first_payload);
652 LIST *IkeParsePayloadListEx(void *data, UINT size, UCHAR first_payload, UINT *total_read_size);
653 void IkeFreePayloadList(LIST *o);
654 UINT IkeGetPayloadNum(LIST *o, UINT payload_type);
655 IKE_PACKET_PAYLOAD *IkeGetPayload(LIST *o, UINT payload_type, UINT index);
656 
657 IKE_PACKET_PAYLOAD *IkeParsePayload(UINT payload_type, BUF *b);
658 void IkeFreePayload(IKE_PACKET_PAYLOAD *p);
659 bool IkeParseDataPayload(IKE_PACKET_DATA_PAYLOAD *t, BUF *b);
660 void IkeFreeDataPayload(IKE_PACKET_DATA_PAYLOAD *t);
661 bool IkeParseSaPayload(IKE_PACKET_SA_PAYLOAD *t, BUF *b);
662 void IkeFreeSaPayload(IKE_PACKET_SA_PAYLOAD *t);
663 bool IkeParseProposalPayload(IKE_PACKET_PROPOSAL_PAYLOAD *t, BUF *b);
664 void IkeFreeProposalPayload(IKE_PACKET_PROPOSAL_PAYLOAD *t);
665 bool IkeParseTransformPayload(IKE_PACKET_TRANSFORM_PAYLOAD *t, BUF *b);
666 void IkeFreeTransformPayload(IKE_PACKET_TRANSFORM_PAYLOAD *t);
667 LIST *IkeParseTransformValueList(BUF *b);
668 void IkeFreeTransformValueList(LIST *o);
669 bool IkeParseIdPayload(IKE_PACKET_ID_PAYLOAD *t, BUF *b);
670 void IkeFreeIdPayload(IKE_PACKET_ID_PAYLOAD *t);
671 bool IkeParseCertPayload(IKE_PACKET_CERT_PAYLOAD *t, BUF *b);
672 void IkeFreeCertPayload(IKE_PACKET_CERT_PAYLOAD *t);
673 bool IkeParseCertRequestPayload(IKE_PACKET_CERT_REQUEST_PAYLOAD *t, BUF *b);
674 void IkeFreeCertRequestPayload(IKE_PACKET_CERT_REQUEST_PAYLOAD *t);
675 bool IkeParseNoticePayload(IKE_PACKET_NOTICE_PAYLOAD *t, BUF *b);
676 void IkeFreeNoticePayload(IKE_PACKET_NOTICE_PAYLOAD *t);
677 bool IkeParseDeletePayload(IKE_PACKET_DELETE_PAYLOAD *t, BUF *b);
678 void IkeFreeDeletePayload(IKE_PACKET_DELETE_PAYLOAD *t);
679 bool IkeParseNatOaPayload(IKE_PACKET_NAT_OA_PAYLOAD *t, BUF *b);
680 
681 
682 bool IkeCompareHash(IKE_PACKET_PAYLOAD *hash_payload, void *hash_data, UINT hash_size);
683 
684 IKE_PACKET_PAYLOAD *IkeNewPayload(UINT payload_type);
685 IKE_PACKET_PAYLOAD *IkeNewDataPayload(UCHAR payload_type, void *data, UINT size);
686 IKE_PACKET_PAYLOAD *IkeNewNatOaPayload(UCHAR payload_type, IP *ip);
687 IKE_PACKET_PAYLOAD *IkeNewSaPayload(LIST *payload_list);
688 IKE_PACKET_PAYLOAD *IkeNewProposalPayload(UCHAR number, UCHAR protocol_id, void *spi, UINT spi_size, LIST *payload_list);
689 IKE_PACKET_PAYLOAD *IkeNewTransformPayload(UCHAR number, UCHAR transform_id, LIST *value_list);
690 IKE_PACKET_TRANSFORM_VALUE *IkeNewTransformValue(UCHAR type, UINT value);
691 IKE_PACKET_PAYLOAD *IkeNewIdPayload(UCHAR id_type, UCHAR protocol_id, USHORT port, void *id_data, UINT id_size);
692 IKE_PACKET_PAYLOAD *IkeNewCertPayload(UCHAR cert_type, void *cert_data, UINT cert_size);
693 IKE_PACKET_PAYLOAD *IkeNewCertRequestPayload(UCHAR cert_type, void *data, UINT size);
694 IKE_PACKET_PAYLOAD *IkeNewNoticePayload(UCHAR protocol_id, USHORT message_type,
695 										void *spi, UINT spi_size,
696 										void *message, UINT message_size);
697 IKE_PACKET_PAYLOAD *IkeNewDeletePayload(UCHAR protocol_id, LIST *spi_list);
698 
699 IKE_PACKET_PAYLOAD *IkeNewNoticeErrorInvalidCookiePayload(UINT64 init_cookie, UINT64 resp_cookie);
700 IKE_PACKET_PAYLOAD *IkeNewNoticeErrorInvalidExchangeTypePayload(UINT64 init_cookie, UINT64 resp_cookie, UCHAR exchange_type);
701 IKE_PACKET_PAYLOAD *IkeNewNoticeErrorInvalidSpiPayload(UINT spi);
702 IKE_PACKET_PAYLOAD *IkeNewNoticeErrorNoProposalChosenPayload(bool quick_mode, UINT64 init_cookie, UINT64 resp_cookie);
703 IKE_PACKET_PAYLOAD *IkeNewNoticeDpdPayload(bool ack, UINT64 init_cookie, UINT64 resp_cookie, UINT seq_no);
704 
705 UCHAR IkeGetFirstPayloadType(LIST *o);
706 BUF *IkeBuild(IKE_PACKET *p, IKE_CRYPTO_PARAM *cparam);
707 BUF *IkeBuildEx(IKE_PACKET *p, IKE_CRYPTO_PARAM *cparam, bool use_original_decrypted);
708 BUF *IkeBuildPayloadList(LIST *o);
709 BUF *IkeBuildPayload(IKE_PACKET_PAYLOAD *p);
710 BUF *IkeBuildDataPayload(IKE_PACKET_DATA_PAYLOAD *t);
711 BUF *IkeBuildSaPayload(IKE_PACKET_SA_PAYLOAD *t);
712 BUF *IkeBuildProposalPayload(IKE_PACKET_PROPOSAL_PAYLOAD *t);
713 BUF *IkeBuildTransformPayload(IKE_PACKET_TRANSFORM_PAYLOAD *t);
714 BUF *IkeBuildTransformValue(IKE_PACKET_TRANSFORM_VALUE *v);
715 BUF *IkeBuildTransformValueList(LIST *o);
716 BUF *IkeBuildIdPayload(IKE_PACKET_ID_PAYLOAD *t);
717 BUF *IkeBuildCertPayload(IKE_PACKET_CERT_PAYLOAD *t);
718 BUF *IkeBuildCertRequestPayload(IKE_PACKET_CERT_REQUEST_PAYLOAD *t);
719 BUF *IkeBuildNoticePayload(IKE_PACKET_NOTICE_PAYLOAD *t);
720 BUF *IkeBuildDeletePayload(IKE_PACKET_DELETE_PAYLOAD *t);
721 
722 BUF *IkeBuildTransformPayload(IKE_PACKET_TRANSFORM_PAYLOAD *t);
723 UINT IkeGetTransformValue(IKE_PACKET_TRANSFORM_PAYLOAD *t, UINT type, UINT index);
724 UINT IkeGetTransformValueNum(IKE_PACKET_TRANSFORM_PAYLOAD *t, UINT type);
725 
726 UCHAR IkeStrToPhase1CryptId(char *name);
727 UCHAR IkeStrToPhase1HashId(char *name);
728 UCHAR IkeStrToPhase2CryptId(char *name);
729 UCHAR IkeStrToPhase2HashId(char *name);
730 BUF *IkeStrToPassword(char *str);
731 UINT IkePhase1CryptIdToKeySize(UCHAR id);
732 UINT IkePhase2CryptIdToKeySize(UCHAR id);
733 
734 UINT IkeNewSpi();
735 
736 IKE_ENGINE *NewIkeEngine();
737 IKE_CRYPTO *NewIkeCrypto(IKE_ENGINE *e, UINT crypto_id, char *name, UINT *key_sizes, UINT num_key_sizes, UINT block_size);
738 IKE_HASH *NewIkeHash(IKE_ENGINE *e, UINT hash_id, char *name, UINT size);
739 IKE_DH *NewIkeDh(IKE_ENGINE *e, UINT dh_id, char *name, UINT key_size);
740 void FreeIkeEngine(IKE_ENGINE *e);
741 void FreeIkeCrypto(IKE_CRYPTO *c);
742 void FreeIkeHash(IKE_HASH *h);
743 void FreeIkeDh(IKE_DH *d);
744 IKE_CRYPTO *GetIkeCrypto(IKE_ENGINE *e, bool for_esp, UINT i);
745 IKE_HASH *GetIkeHash(IKE_ENGINE *e, bool for_esp, UINT i);
746 IKE_DH *GetIkeDh(IKE_ENGINE *e, bool for_esp, UINT i);
747 
748 void IkeHash(IKE_HASH *h, void *dst, void *src, UINT size);
749 void IkeHMac(IKE_HASH *h, void *dst, void *key, UINT key_size, void *data, UINT data_size);
750 void IkeHMacBuf(IKE_HASH *h, void *dst, BUF *key, BUF *data);
751 
752 IKE_CRYPTO_KEY *IkeNewKey(IKE_CRYPTO *c, void *data, UINT size);
753 bool IkeCheckKeySize(IKE_CRYPTO *c, UINT size);
754 void IkeFreeKey(IKE_CRYPTO_KEY *k);
755 void IkeCryptoEncrypt(IKE_CRYPTO_KEY *k, void *dst, void *src, UINT size, void *ivec);
756 void IkeCryptoDecrypt(IKE_CRYPTO_KEY *k, void *dst, void *src, UINT size, void *ivec);
757 
758 DH_CTX *IkeDhNewCtx(IKE_DH *d);
759 void IkeDhFreeCtx(DH_CTX *dh);
760 
761 
762 #endif	// IPSEC_PACKET_H
763 
764 
765