ike_debug.c
Go to the documentation of this file.
1 /**
2  * @file ike_debug.c
3  * @brief Data logging functions for debugging purpose (IKEv2)
4  *
5  * @section License
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  *
9  * Copyright (C) 2022-2026 Oryx Embedded SARL. All rights reserved.
10  *
11  * This file is part of CycloneIPSEC Open.
12  *
13  * This program is free software; you can redistribute it and/or
14  * modify it under the terms of the GNU General Public License
15  * as published by the Free Software Foundation; either version 2
16  * of the License, or (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program; if not, write to the Free Software Foundation,
25  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
26  *
27  * @author Oryx Embedded SARL (www.oryx-embedded.com)
28  * @version 2.6.6
29  **/
30 
31 //Switch to the appropriate trace level
32 #define TRACE_LEVEL IKE_TRACE_LEVEL
33 
34 //Dependencies
35 #include "ike/ike.h"
36 #include "ike/ike_debug.h"
37 #include "debug.h"
38 
39 //Check IKEv2 library configuration
40 #if (IKE_SUPPORT == ENABLED && IKE_TRACE_LEVEL >= TRACE_LEVEL_DEBUG)
41 
42 //Exchange types
43 static const IkeParamName ikeExchangeTypeList[] =
44 {
45  {IKE_EXCHANGE_TYPE_IKE_SA_INIT, "IKE_SA_INIT"},
46  {IKE_EXCHANGE_TYPE_IKE_AUTH, "IKE_AUTH"},
47  {IKE_EXCHANGE_TYPE_CREATE_CHILD_SA, "CREATE_CHILD_SA"},
48  {IKE_EXCHANGE_TYPE_INFORMATIONAL, "INFORMATIONAL"},
49  {IKE_EXCHANGE_TYPE_IKE_SESSION_RESUME, "IKE_SESSION_RESUME"},
50  {IKE_EXCHANGE_TYPE_GSA_AUTH, "GSA_AUTH"},
51  {IKE_EXCHANGE_TYPE_GSA_REGISTRATION, "GSA_REGISTRATION"},
52  {IKE_EXCHANGE_TYPE_GSA_REKEY, "GSA_REKEY"},
53  {IKE_EXCHANGE_TYPE_GSA_INBAND_REKEY, "GSA_INBAND_REKEY"},
54  {IKE_EXCHANGE_TYPE_IKE_INTERMEDIATE, "IKE_INTERMEDIATE"},
55  {IKE_EXCHANGE_TYPE_IKE_FOLLOWUP_KE, "IKE_FOLLOWUP_KE"}
56 };
57 
58 //Payload types
59 static const IkeParamName ikePayloadList[] =
60 {
61  {IKE_PAYLOAD_TYPE_LAST, "No Next Payload"},
62  {IKE_PAYLOAD_TYPE_SA, "Security Association"},
63  {IKE_PAYLOAD_TYPE_KE, "Key Exchange"},
64  {IKE_PAYLOAD_TYPE_IDI, "Identification - Initiator"},
65  {IKE_PAYLOAD_TYPE_IDR, "Identification - Responder"},
66  {IKE_PAYLOAD_TYPE_CERT, "Certificate"},
67  {IKE_PAYLOAD_TYPE_CERTREQ, "Certificate Request"},
68  {IKE_PAYLOAD_TYPE_AUTH, "Authentication"},
69  {IKE_PAYLOAD_TYPE_NONCE, "Nonce"},
70  {IKE_PAYLOAD_TYPE_N, "Notify"},
71  {IKE_PAYLOAD_TYPE_D, "Delete"},
72  {IKE_PAYLOAD_TYPE_V, "Vendor ID"},
73  {IKE_PAYLOAD_TYPE_TSI, "Traffic Selector - Initiator"},
74  {IKE_PAYLOAD_TYPE_TSR, "Traffic Selector - Responder"},
75  {IKE_PAYLOAD_TYPE_SK, "Encrypted and Authenticated"},
76  {IKE_PAYLOAD_TYPE_CP, "Configuration"},
77  {IKE_PAYLOAD_TYPE_EAP, "Extensible Authentication"},
78  {IKE_PAYLOAD_TYPE_GSPM, "Generic Secure Password Method"},
79  {IKE_PAYLOAD_TYPE_IDG, "Group Identification"},
80  {IKE_PAYLOAD_TYPE_GSA, "Group Security Association"},
81  {IKE_PAYLOAD_TYPE_KD, "Key Download"},
82  {IKE_PAYLOAD_TYPE_SKF, "Encrypted and Authenticated Fragment"},
83  {IKE_PAYLOAD_TYPE_PS, "Puzzle Solution"}
84 };
85 
86 //Last Substruc values
87 static const IkeParamName ikeLastSubstrucList[] =
88 {
89  {IKE_LAST_SUBSTRUC_LAST, "Last"},
90  {IKE_LAST_SUBSTRUC_MORE_PROPOSALS, "More Proposals"},
91  {IKE_LAST_SUBSTRUC_MORE_TRANSFORMS, "More Transforms"}
92 };
93 
94 //Protocol IDs
95 static const IkeParamName ikeProtocolIdList[] =
96 {
97  {IKE_PROTOCOL_ID_IKE, "IKE"},
98  {IKE_PROTOCOL_ID_AH, "AH"},
99  {IKE_PROTOCOL_ID_ESP, "ESP"},
100  {IKE_PROTOCOL_ID_FC_ESP_HEADER, "FC_ESP_HEADER"},
101  {IKE_PROTOCOL_ID_FC_CT_AUTHENTICATION, "FC_CT_AUTHENTICATION"},
102  {IKE_PROTOCOL_ID_GIKE_UPDATE, "GIKE_UPDATE"}
103 };
104 
105 //Transform types
106 static const IkeParamName ikeTransformTypeList[] =
107 {
108  {IKE_TRANSFORM_TYPE_ENCR, "Encryption Algorithm"},
109  {IKE_TRANSFORM_TYPE_PRF, "Pseudorandom Function"},
110  {IKE_TRANSFORM_TYPE_INTEG, "Integrity Algorithm"},
111  {IKE_TRANSFORM_TYPE_KE, "Key Exchange Method"},
112  {IKE_TRANSFORM_TYPE_ESN, "Extended Sequence Numbers"},
113  {IKE_TRANSFORM_TYPE_ADDKE1, "Additional Key Exchange 1"},
114  {IKE_TRANSFORM_TYPE_ADDKE2, "Additional Key Exchange 2"},
115  {IKE_TRANSFORM_TYPE_ADDKE3, "Additional Key Exchange 3"},
116  {IKE_TRANSFORM_TYPE_ADDKE4, "Additional Key Exchange 4"},
117  {IKE_TRANSFORM_TYPE_ADDKE5, "Additional Key Exchange 5"},
118  {IKE_TRANSFORM_TYPE_ADDKE6, "Additional Key Exchange 6"},
119  {IKE_TRANSFORM_TYPE_ADDKE7, "Additional Key Exchange 7"},
120  {IKE_TRANSFORM_TYPE_KWA, "Key Wrap Algorithm"},
121  {IKE_TRANSFORM_TYPE_GCAUTH, "Group Controller Authentication Method"}
122 };
123 
124 //Encryption algorithms
125 static const IkeParamName ikeEncrAlgoList[] =
126 {
127  {IKE_TRANSFORM_ID_ENCR_DES_IV64, "ENCR_DES_IV64"},
128  {IKE_TRANSFORM_ID_ENCR_DES, "ENCR_DES"},
129  {IKE_TRANSFORM_ID_ENCR_3DES, "ENCR_3DES"},
130  {IKE_TRANSFORM_ID_ENCR_RC5, "ENCR_RC5"},
131  {IKE_TRANSFORM_ID_ENCR_IDEA, "ENCR_IDEA"},
132  {IKE_TRANSFORM_ID_ENCR_CAST, "ENCR_CAST"},
133  {IKE_TRANSFORM_ID_ENCR_BLOWFISH, "ENCR_BLOWFISH"},
134  {IKE_TRANSFORM_ID_ENCR_3IDEA, "ENCR_3IDEA"},
135  {IKE_TRANSFORM_ID_ENCR_DES_IV32, "ENCR_DES_IV32"},
136  {IKE_TRANSFORM_ID_ENCR_NULL, "ENCR_NULL"},
137  {IKE_TRANSFORM_ID_ENCR_AES_CBC, "ENCR_AES_CBC"},
138  {IKE_TRANSFORM_ID_ENCR_AES_CTR, "ENCR_AES_CTR"},
139  {IKE_TRANSFORM_ID_ENCR_AES_CCM_8, "ENCR_AES_CCM_8"},
140  {IKE_TRANSFORM_ID_ENCR_AES_CCM_12, "ENCR_AES_CCM_12"},
141  {IKE_TRANSFORM_ID_ENCR_AES_CCM_16, "ENCR_AES_CCM_16"},
142  {IKE_TRANSFORM_ID_ENCR_AES_GCM_8, "ENCR_AES_GCM_8"},
143  {IKE_TRANSFORM_ID_ENCR_AES_GCM_12, "ENCR_AES_GCM_12"},
144  {IKE_TRANSFORM_ID_ENCR_AES_GCM_16, "ENCR_AES_GCM_16"},
145  {IKE_TRANSFORM_ID_ENCR_NULL_AUTH_AES_GMAC, "ENCR_NULL_AUTH_AES_GMAC"},
146  {IKE_TRANSFORM_ID_ENCR_CAMELLIA_CBC, "ENCR_CAMELLIA_CBC"},
147  {IKE_TRANSFORM_ID_ENCR_CAMELLIA_CTR, "ENCR_CAMELLIA_CTR"},
148  {IKE_TRANSFORM_ID_ENCR_CAMELLIA_CCM_8, "ENCR_CAMELLIA_CCM_8"},
149  {IKE_TRANSFORM_ID_ENCR_CAMELLIA_CCM_12, "ENCR_CAMELLIA_CCM_12"},
150  {IKE_TRANSFORM_ID_ENCR_CAMELLIA_CCM_16, "ENCR_CAMELLIA_CCM_16"},
151  {IKE_TRANSFORM_ID_ENCR_CHACHA20_POLY1305, "ENCR_CHACHA20_POLY1305"},
152  {IKE_TRANSFORM_ID_ENCR_AES_CCM_8_IIV, "ENCR_AES_CCM_8_IIV"},
153  {IKE_TRANSFORM_ID_ENCR_AES_GCM_16_IIV, "ENCR_AES_GCM_16_IIV"},
154  {IKE_TRANSFORM_ID_ENCR_CHACHA20_POLY1305_IIV, "ENCR_CHACHA20_POLY1305_IIV"},
155  {IKE_TRANSFORM_ID_ENCR_KUZNYECHIK_MGM_KTREE, "ENCR_KUZNYECHIK_MGM_KTREE"},
156  {IKE_TRANSFORM_ID_ENCR_MAGMA_MGM_KTREE, "ENCR_MAGMA_MGM_KTREE"},
157  {IKE_TRANSFORM_ID_ENCR_KUZNYECHIK_MGM_MAC_KTREE, "ENCR_KUZNYECHIK_MGM_MAC_KTREE"},
158  {IKE_TRANSFORM_ID_ENCR_MAGMA_MGM_MAC_KTREE, "ENCR_MAGMA_MGM_MAC_KTREE"},
159 };
160 
161 //Pseudorandom functions
162 static const IkeParamName ikePrfAlgoList[] =
163 {
164  {IKE_TRANSFORM_ID_PRF_HMAC_MD5, "PRF_HMAC_MD5"},
165  {IKE_TRANSFORM_ID_PRF_HMAC_SHA1, "PRF_HMAC_SHA1"},
166  {IKE_TRANSFORM_ID_PRF_HMAC_TIGER, "PRF_HMAC_TIGER"},
167  {IKE_TRANSFORM_ID_PRF_AES128_XCBC, "PRF_AES128_XCBC"},
168  {IKE_TRANSFORM_ID_PRF_HMAC_SHA2_256, "PRF_HMAC_SHA2_256"},
169  {IKE_TRANSFORM_ID_PRF_HMAC_SHA2_384, "PRF_HMAC_SHA2_384"},
170  {IKE_TRANSFORM_ID_PRF_HMAC_SHA2_512, "PRF_HMAC_SHA2_512"},
171  {IKE_TRANSFORM_ID_PRF_AES128_CMAC, "PRF_AES128_CMAC"},
172  {IKE_TRANSFORM_ID_PRF_HMAC_STREEBOG_512, "PRF_HMAC_STREEBOG_512"},
173 };
174 
175 //Integrity algorithms
176 static const IkeParamName ikeAuthAlgoList[] =
177 {
178  {IKE_TRANSFORM_ID_AUTH_NONE, "AUTH_NONE"},
179  {IKE_TRANSFORM_ID_AUTH_HMAC_MD5_96, "AUTH_HMAC_MD5_96"},
180  {IKE_TRANSFORM_ID_AUTH_HMAC_SHA1_96, "AUTH_HMAC_SHA1_96"},
181  {IKE_TRANSFORM_ID_AUTH_DES_MAC, "AUTH_DES_MAC"},
182  {IKE_TRANSFORM_ID_AUTH_KPDK_MD5, "AUTH_KPDK_MD5"},
183  {IKE_TRANSFORM_ID_AUTH_AES_XCBC_96, "AUTH_AES_XCBC_96"},
184  {IKE_TRANSFORM_ID_AUTH_HMAC_MD5_128, "AUTH_HMAC_MD5_128"},
185  {IKE_TRANSFORM_ID_AUTH_HMAC_SHA1_160, "AUTH_HMAC_SHA1_160"},
186  {IKE_TRANSFORM_ID_AUTH_AES_CMAC_96, "AUTH_AES_CMAC_96"},
187  {IKE_TRANSFORM_ID_AUTH_AES_128_GMAC, "AUTH_AES_128_GMAC"},
188  {IKE_TRANSFORM_ID_AUTH_AES_192_GMAC, "AUTH_AES_192_GMAC"},
189  {IKE_TRANSFORM_ID_AUTH_AES_256_GMAC, "AUTH_AES_256_GMAC"},
190  {IKE_TRANSFORM_ID_AUTH_HMAC_SHA2_256_128, "AUTH_HMAC_SHA2_256_128"},
191  {IKE_TRANSFORM_ID_AUTH_HMAC_SHA2_384_192, "AUTH_HMAC_SHA2_384_192"},
192  {IKE_TRANSFORM_ID_AUTH_HMAC_SHA2_512_256, "AUTH_HMAC_SHA2_512_256"},
193 };
194 
195 //Key exchange methods
196 static const IkeParamName ikeKeAlgoList[] =
197 {
198  {IKE_TRANSFORM_ID_KE_NONE, "None"},
199  {IKE_TRANSFORM_ID_KE_MODP_768, "768-bit MODP Group"},
200  {IKE_TRANSFORM_ID_KE_MODP_1024, "1024-bit MODP Group"},
201  {IKE_TRANSFORM_ID_KE_MODP_1536, "1536-bit MODP Group"},
202  {IKE_TRANSFORM_ID_KE_MODP_2048, "2048-bit MODP Group"},
203  {IKE_TRANSFORM_ID_KE_MODP_3072, "3072-bit MODP group"},
204  {IKE_TRANSFORM_ID_KE_MODP_4096, "4096-bit MODP Group"},
205  {IKE_TRANSFORM_ID_KE_MODP_6144, "6144-bit MODP Group"},
206  {IKE_TRANSFORM_ID_KE_MODP_8192, "8192-bit MODP Group"},
207  {IKE_TRANSFORM_ID_KE_ECP_256, "256-bit random ECP Group"},
208  {IKE_TRANSFORM_ID_KE_ECP_384, "384-bit random ECP Group"},
209  {IKE_TRANSFORM_ID_KE_ECP_521, "521-bit random ECP Group"},
210  {IKE_TRANSFORM_ID_KE_MODP_1024_160, "1024-bit MODP Group with 160-bit Prime Order Subgroup"},
211  {IKE_TRANSFORM_ID_KE_MODP_2048_224, "2048-bit MODP Group with 224-bit Prime Order Subgroup"},
212  {IKE_TRANSFORM_ID_KE_MODP_2048_256, "2048-bit MODP Group with 256-bit Prime Order Subgroup"},
213  {IKE_TRANSFORM_ID_KE_ECP_192, "192-bit Random ECP Group"},
214  {IKE_TRANSFORM_ID_KE_ECP_224, "224-bit Random ECP Group"},
215  {IKE_TRANSFORM_ID_KE_BRAINPOOLP224R1, "brainpoolP224r1"},
216  {IKE_TRANSFORM_ID_KE_BRAINPOOLP256R1, "brainpoolP256r1"},
217  {IKE_TRANSFORM_ID_KE_BRAINPOOLP384R1, "brainpoolP384r1"},
218  {IKE_TRANSFORM_ID_KE_BRAINPOOLP512R1, "brainpoolP512r1"},
219  {IKE_TRANSFORM_ID_KE_CURVE25519, "curve25519"},
220  {IKE_TRANSFORM_ID_KE_CURVE448, "curve448"},
221  {IKE_TRANSFORM_ID_KE_GOST3410_2012_256, "GOST3410_2012_256"},
222  {IKE_TRANSFORM_ID_KE_GOST3410_2012_512, "GOST3410_2012_512"},
223  {IKE_TRANSFORM_ID_KE_ML_KEM_512, "ML-KEM-512"},
224  {IKE_TRANSFORM_ID_KE_ML_KEM_768, "ML-KEM-768"},
225  {IKE_TRANSFORM_ID_KE_ML_KEM_1024, "ML-KEM-1024"},
226 };
227 
228 //Extended sequence numbers
229 static const IkeParamName ikeEsnList[] =
230 {
231  {IKE_TRANSFORM_ID_ESN_NO, "No ESNs"},
232  {IKE_TRANSFORM_ID_ESN_YES, "ESNs"}
233 };
234 
235 //Transform attribute formats
236 static const IkeParamName ikeAttrFormatList[] =
237 {
238  {IKE_ATTR_FORMAT_TLV, "TLV"},
239  {IKE_ATTR_FORMAT_TV, "TV"}
240 };
241 
242 //Transform attribute types
243 static const IkeParamName ikeAttrTypeList[] =
244 {
245  {IKE_TRANSFORM_ATTR_TYPE_KEY_LEN, "Key Length"},
246 };
247 
248 //ID types
249 static const IkeParamName ikeIdTypeList[] =
250 {
251  {IKE_ID_TYPE_IPV4_ADDR, "ID_IPV4_ADDR"},
252  {IKE_ID_TYPE_FQDN, "ID_FQDN"},
253  {IKE_ID_TYPE_RFC822_ADDR, "ID_RFC822_ADDR"},
254  {IKE_ID_TYPE_IPV6_ADDR, "ID_IPV6_ADDR"},
255  {IKE_ID_TYPE_DER_ASN1_DN, "ID_DER_ASN1_DN"},
256  {IKE_ID_TYPE_DER_ASN1_GN, "ID_DER_ASN1_GN"},
257  {IKE_ID_TYPE_KEY_ID, "ID_KEY_ID"},
258  {IKE_ID_TYPE_FC_NAME, "ID_FC_NAME"},
259  {IKE_ID_TYPE_NULL, "ID_NULL"}
260 };
261 
262 //Certificate encoding
263 static const IkeParamName ikeCertEncodingList[] =
264 {
265  {IKE_CERT_ENCODING_PKCS7_X509_CERT, "PKCS #7 wrapped X.509 certificate"},
266  {IKE_CERT_ENCODING_PGP_CERT, "PGP certificate"},
267  {IKE_CERT_ENCODING_DNS_SIGNED_KEY, "DNS signed key"},
268  {IKE_CERT_ENCODING_X509_CERT_SIGN, "X.509 certificate - signature"},
269  {IKE_CERT_ENCODING_KERBEROS_TOKEN, "Kerberos token"},
270  {IKE_CERT_ENCODING_CRL, "Certificate revocation list"},
271  {IKE_CERT_ENCODING_ARL, "Authority revocation list"},
272  {IKE_CERT_ENCODING_SPKI_CERT, "SPKI certificate"},
273  {IKE_CERT_ENCODING_X509_CERT_ATTR, "X.509 certificate - attribute"},
274  {IKE_CERT_ENCODING_RAW_RSA_KEY, "Raw RSA key"},
275  {IKE_CERT_ENCODING_HASH_URL_X509_CERT, "Hash and URL of X.509 certificate"},
276  {IKE_CERT_ENCODING_HASH_URL_X509_BUNDLE, "Hash and URL of X.509 bundle"},
277  {IKE_CERT_ENCODING_OCSP_CONTENT, "OCSP Content"},
278  {IKE_CERT_ENCODING_RAW_PUBLIC_KEY, "Raw Public Key"}
279 };
280 
281 //Authentication methods
282 static const IkeParamName ikeAuthMethodList[] =
283 {
284  {IKE_AUTH_METHOD_RSA, "RSA Digital Signature"},
285  {IKE_AUTH_METHOD_SHARED_KEY, "Shared Key Message Integrity Code"},
286  {IKE_AUTH_METHOD_DSS, "DSS Digital Signature"},
287  {IKE_AUTH_METHOD_ECDSA_P256_SHA256, "ECDSA with SHA-256 on the P-256 curve"},
288  {IKE_AUTH_METHOD_ECDSA_P384_SHA384, "ECDSA with SHA-384 on the P-384 curve"},
289  {IKE_AUTH_METHOD_ECDSA_P521_SHA512, "ECDSA with SHA-512 on the P-521 curve"},
290  {IKE_AUTH_METHOD_GSPAM, "Generic Secure Password Authentication Method"},
291  {IKE_AUTH_METHOD_NULL, "NULL Authentication"},
292  {IKE_AUTH_METHOD_DIGITAL_SIGN, "Digital Signature"}
293 };
294 
295 //Hash algorithms
296 static const IkeParamName ikeHashAlgoList[] =
297 {
298  {IKE_HASH_ALGO_SHA1, "SHA-1"},
299  {IKE_HASH_ALGO_SHA256, "SHA-256"},
300  {IKE_HASH_ALGO_SHA384, "SHA-384"},
301  {IKE_HASH_ALGO_SHA512, "SHA-512"},
302  {IKE_HASH_ALGO_IDENTITY, "Identity"},
303  {IKE_HASH_ALGO_STREEBOG_256, "STREEBOG_256"},
304  {IKE_HASH_ALGO_STREEBOG_512, "STREEBOG_512"}
305 };
306 
307 //Notify message types
308 static const IkeParamName ikeNotifyMsgTypeList[] =
309 {
310  {IKE_NOTIFY_MSG_TYPE_UNSUPPORTED_CRITICAL_PAYLOAD, "UNSUPPORTED_CRITICAL_PAYLOAD"},
311  {IKE_NOTIFY_MSG_TYPE_INVALID_IKE_SPI, "INVALID_IKE_SPI"},
312  {IKE_NOTIFY_MSG_TYPE_INVALID_MAJOR_VERSION, "INVALID_MAJOR_VERSION"},
313  {IKE_NOTIFY_MSG_TYPE_INVALID_SYNTAX, "INVALID_SYNTAX"},
314  {IKE_NOTIFY_MSG_TYPE_INVALID_MESSAGE_ID, "INVALID_MESSAGE_ID"},
315  {IKE_NOTIFY_MSG_TYPE_INVALID_SPI, "INVALID_SPI"},
316  {IKE_NOTIFY_MSG_TYPE_NO_PROPOSAL_CHOSEN, "NO_PROPOSAL_CHOSEN"},
317  {IKE_NOTIFY_MSG_TYPE_INVALID_KE_PAYLOAD, "INVALID_KE_PAYLOAD"},
318  {IKE_NOTIFY_MSG_TYPE_AUTH_FAILED, "AUTHENTICATION_FAILED"},
319  {IKE_NOTIFY_MSG_TYPE_SINGLE_PAIR_REQUIRED, "SINGLE_PAIR_REQUIRED"},
320  {IKE_NOTIFY_MSG_TYPE_NO_ADDITIONAL_SAS, "NO_ADDITIONAL_SAS"},
321  {IKE_NOTIFY_MSG_TYPE_INTERNAL_ADDRESS_FAILURE, "INTERNAL_ADDRESS_FAILURE"},
322  {IKE_NOTIFY_MSG_TYPE_FAILED_CP_REQUIRED, "FAILED_CP_REQUIRED"},
323  {IKE_NOTIFY_MSG_TYPE_TS_UNACCEPTABLE, "TS_UNACCEPTABLE"},
324  {IKE_NOTIFY_MSG_TYPE_INVALID_SELECTORS, "INVALID_SELECTORS"},
325  {IKE_NOTIFY_MSG_TYPE_UNACCEPTABLE_ADDRESSES, "UNACCEPTABLE_ADDRESSES"},
326  {IKE_NOTIFY_MSG_TYPE_UNEXPECTED_NAT_DETECTED, "UNEXPECTED_NAT_DETECTED"},
327  {IKE_NOTIFY_MSG_TYPE_USE_ASSIGNED_HOA, "USE_ASSIGNED_HOA"},
328  {IKE_NOTIFY_MSG_TYPE_TEMPORARY_FAILURE, "TEMPORARY_FAILURE"},
329  {IKE_NOTIFY_MSG_TYPE_CHILD_SA_NOT_FOUND, "CHILD_SA_NOT_FOUND"},
330  {IKE_NOTIFY_MSG_TYPE_INVALID_GROUP_ID, "INVALID_GROUP_ID"},
331  {IKE_NOTIFY_MSG_TYPE_AUTHORIZATION_FAILED, "AUTHORIZATION_FAILED"},
332  {IKE_NOTIFY_MSG_TYPE_STATE_NOT_FOUND, "STATE_NOT_FOUND"},
333  {IKE_NOTIFY_MSG_TYPE_TS_MAX_QUEUE, "TS_MAX_QUEUE"},
334  {IKE_NOTIFY_MSG_TYPE_REGISTRATION_FAILED, "REGISTRATION_FAILED"},
335  {IKE_NOTIFY_MSG_TYPE_INITIAL_CONTACT, "INITIAL_CONTACT"},
336  {IKE_NOTIFY_MSG_TYPE_SET_WINDOW_SIZE, "SET_WINDOW_SIZE"},
337  {IKE_NOTIFY_MSG_TYPE_ADDITIONAL_TS_POSSIBLE, "ADDITIONAL_TS_POSSIBLE"},
338  {IKE_NOTIFY_MSG_TYPE_IPCOMP_SUPPORTED, "IPCOMP_SUPPORTED"},
339  {IKE_NOTIFY_MSG_TYPE_NAT_DETECTION_SOURCE_IP, "NAT_DETECTION_SOURCE_IP"},
340  {IKE_NOTIFY_MSG_TYPE_NAT_DETECTION_DESTINATION_IP, "NAT_DETECTION_DESTINATION_IP"},
341  {IKE_NOTIFY_MSG_TYPE_COOKIE, "COOKIE"},
342  {IKE_NOTIFY_MSG_TYPE_USE_TRANSPORT_MODE, "USE_TRANSPORT_MODE"},
343  {IKE_NOTIFY_MSG_TYPE_HTTP_CERT_LOOKUP_SUPPORTED, "HTTP_CERT_LOOKUP_SUPPORTED"},
344  {IKE_NOTIFY_MSG_TYPE_REKEY_SA, "REKEY_SA"},
345  {IKE_NOTIFY_MSG_TYPE_ESP_TFC_PADDING_NOT_SUPPORTED, "ESP_TFC_PADDING_NOT_SUPPORTED"},
346  {IKE_NOTIFY_MSG_TYPE_NON_FIRST_FRAGMENTS_ALSO, "NON_FIRST_FRAGMENTS_ALSO"},
347  {IKE_NOTIFY_MSG_TYPE_MOBIKE_SUPPORTED, "MOBIKE_SUPPORTED"},
348  {IKE_NOTIFY_MSG_TYPE_ADDITIONAL_IP4_ADDRESS, "ADDITIONAL_IP4_ADDRESS"},
349  {IKE_NOTIFY_MSG_TYPE_ADDITIONAL_IP6_ADDRESS, "ADDITIONAL_IP6_ADDRESS"},
350  {IKE_NOTIFY_MSG_TYPE_NO_ADDITIONAL_ADDRESSES, "NO_ADDITIONAL_ADDRESSES"},
351  {IKE_NOTIFY_MSG_TYPE_UPDATE_SA_ADDRESSES, "UPDATE_SA_ADDRESSES"},
352  {IKE_NOTIFY_MSG_TYPE_COOKIE2, "COOKIE2"},
353  {IKE_NOTIFY_MSG_TYPE_NO_NATS_ALLOWED, "NO_NATS_ALLOWED"},
354  {IKE_NOTIFY_MSG_TYPE_AUTH_LIFETIME, "AUTH_LIFETIME"},
355  {IKE_NOTIFY_MSG_TYPE_MULTIPLE_AUTH_SUPPORTED, "MULTIPLE_AUTH_SUPPORTED"},
356  {IKE_NOTIFY_MSG_TYPE_ANOTHER_AUTH_FOLLOWS, "ANOTHER_AUTH_FOLLOWS"},
357  {IKE_NOTIFY_MSG_TYPE_REDIRECT_SUPPORTED, "REDIRECT_SUPPORTED"},
358  {IKE_NOTIFY_MSG_TYPE_REDIRECT, "REDIRECT"},
359  {IKE_NOTIFY_MSG_TYPE_REDIRECTED_FROM, "REDIRECTED_FROM"},
360  {IKE_NOTIFY_MSG_TYPE_TICKET_LT_OPAQUE, "TICKET_LT_OPAQUE"},
361  {IKE_NOTIFY_MSG_TYPE_TICKET_REQUEST, "TICKET_REQUEST"},
362  {IKE_NOTIFY_MSG_TYPE_TICKET_ACK, "TICKET_ACK"},
363  {IKE_NOTIFY_MSG_TYPE_TICKET_NACK, "TICKET_NACK"},
364  {IKE_NOTIFY_MSG_TYPE_TICKET_OPAQUE, "TICKET_OPAQUE"},
365  {IKE_NOTIFY_MSG_TYPE_LINK_ID, "LINK_ID"},
366  {IKE_NOTIFY_MSG_TYPE_USE_WESP_MODE, "USE_WESP_MODE"},
367  {IKE_NOTIFY_MSG_TYPE_ROHC_SUPPORTED, "ROHC_SUPPORTED"},
368  {IKE_NOTIFY_MSG_TYPE_EAP_ONLY_AUTHENTICATION, "EAP_ONLY_AUTHENTICATION"},
369  {IKE_NOTIFY_MSG_TYPE_CHILDLESS_IKEV2_SUPPORTED, "CHILDLESS_IKEV2_SUPPORTED"},
370  {IKE_NOTIFY_MSG_TYPE_QUICK_CRASH_DETECTION, "QUICK_CRASH_DETECTION"},
371  {IKE_NOTIFY_MSG_TYPE_IKEV2_MESSAGE_ID_SYNC_SUPPORTED, "IKEV2_MESSAGE_ID_SYNC_SUPPORTED"},
372  {IKE_NOTIFY_MSG_TYPE_IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED, "IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED"},
373  {IKE_NOTIFY_MSG_TYPE_IKEV2_MESSAGE_ID_SYNC, "IKEV2_MESSAGE_ID_SYNC"},
374  {IKE_NOTIFY_MSG_TYPE_IPSEC_REPLAY_COUNTER_SYNC, "IPSEC_REPLAY_COUNTER_SYNC"},
375  {IKE_NOTIFY_MSG_TYPE_SECURE_PASSWORD_METHODS, "SECURE_PASSWORD_METHODS"},
376  {IKE_NOTIFY_MSG_TYPE_PSK_PERSIST, "PSK_PERSIST"},
377  {IKE_NOTIFY_MSG_TYPE_PSK_CONFIRM, "PSK_CONFIRM"},
378  {IKE_NOTIFY_MSG_TYPE_ERX_SUPPORTED, "ERX_SUPPORTED"},
379  {IKE_NOTIFY_MSG_TYPE_IFOM_CAPABILITY, "IFOM_CAPABILITY"},
380  {IKE_NOTIFY_MSG_TYPE_GROUP_SENDER, "GROUP_SENDER"},
381  {IKE_NOTIFY_MSG_TYPE_IKEV2_FRAGMENTATION_SUPPORTED, "IKEV2_FRAGMENTATION_SUPPORTED"},
382  {IKE_NOTIFY_MSG_TYPE_SIGNATURE_HASH_ALGORITHMS, "SIGNATURE_HASH_ALGORITHMS"},
383  {IKE_NOTIFY_MSG_TYPE_CLONE_IKE_SA_SUPPORTED, "CLONE_IKE_SA_SUPPORTED"},
384  {IKE_NOTIFY_MSG_TYPE_CLONE_IKE_SA, "CLONE_IKE_SA"},
385  {IKE_NOTIFY_MSG_TYPE_PUZZLE, "PUZZLE"},
386  {IKE_NOTIFY_MSG_TYPE_USE_PPK, "USE_PPK"},
387  {IKE_NOTIFY_MSG_TYPE_PPK_IDENTITY, "PPK_IDENTITY"},
388  {IKE_NOTIFY_MSG_TYPE_NO_PPK_AUTH, "NO_PPK_AUTH"},
389  {IKE_NOTIFY_MSG_TYPE_INTERMEDIATE_EXCHANGE_SUPPORTED, "INTERMEDIATE_EXCHANGE_SUPPORTED"},
390  {IKE_NOTIFY_MSG_TYPE_IP4_ALLOWED, "IP4_ALLOWED"},
391  {IKE_NOTIFY_MSG_TYPE_IP6_ALLOWED, "IP6_ALLOWED"},
392  {IKE_NOTIFY_MSG_TYPE_ADDITIONAL_KEY_EXCHANGE, "ADDITIONAL_KEY_EXCHANGE"},
393  {IKE_NOTIFY_MSG_TYPE_USE_AGGFRAG, "USE_AGGFRAG"},
394  {IKE_NOTIFY_MSG_TYPE_SUPPORTED_AUTH_METHODS, "SUPPORTED_AUTH_METHODS"},
395  {IKE_NOTIFY_MSG_TYPE_SA_RESOURCE_INFO, "SA_RESOURCE_INFO"},
396  {IKE_NOTIFY_MSG_TYPE_USE_PPK_INT, "USE_PPK_INT"},
397  {IKE_NOTIFY_MSG_TYPE_PPK_IDENTITY_KEY, "PPK_IDENTITY_KEY"}
398 };
399 
400 //Traffic selector types
401 static const IkeParamName ikeTsTypeList[] =
402 {
403  {IKE_TS_TYPE_IPV4_ADDR_RANGE, "TS_IPV4_ADDR_RANGE"},
404  {IKE_TS_TYPE_IPV6_ADDR_RANGE, "TS_IPV6_ADDR_RANGE"},
405  {IKE_TS_TYPE_FC_ADDR_RANGE, "TS_FC_ADDR_RANGE"},
406  {IKE_TS_TYPE_SECLABEL, "TS_SECLABEL"}
407 };
408 
409 //IP protocol IDs
410 static const IkeParamName ikeIpProtocolIdList[] =
411 {
412  {IKE_IP_PROTOCOL_ID_ICMP, "ICMP"},
413  {IKE_IP_PROTOCOL_ID_TCP, "TCP"},
414  {IKE_IP_PROTOCOL_ID_UDP, "UDP"},
415  {IKE_IP_PROTOCOL_ID_ICMPV6, "ICMPv6"},
416 };
417 
418 
419 /**
420  * @brief Dump IKE message
421  * @param[in] message Pointer to the IKE message to dump
422  * @param[in] length Length of the IKE message, in bytes
423  **/
424 
425 void ikeDumpMessage(const uint8_t *message, size_t length)
426 {
427  const IkeHeader *header;
428 
429  //Check the length of the IKE message
430  if(length < sizeof(IkeHeader))
431  return;
432 
433  //Each message begins with the IKE header
434  header = (IkeHeader *) message;
435 
436  //Dump IKE header
437  ikeDumpHeader(header);
438 
439  //Determine the length of the IKE payloads
440  length -= sizeof(IkeHeader);
441 
442  //The Next Payload field indicates the type of payload that immediately
443  //follows the header
444  ikeDumpPayloads(message + sizeof(IkeHeader), length, header->nextPayload);
445 }
446 
447 
448 /**
449  * @brief Dump IKE header
450  * @param[in] header Pointer to the IKE header to dump
451  **/
452 
453 void ikeDumpHeader(const IkeHeader *header)
454 {
455  const char_t *nextPayloadName;
456  const char_t *exchangeTypeName;
457 
458  //Convert the Next Payload field to string representation
459  nextPayloadName = ikeGetParamName(header->nextPayload,
460  ikePayloadList, arraysize(ikePayloadList));
461 
462  //Convert the Exchange Type field to string representation
463  exchangeTypeName = ikeGetParamName(header->exchangeType,
464  ikeExchangeTypeList, arraysize(ikeExchangeTypeList));
465 
466  //Dump IKE header
467  TRACE_DEBUG_ARRAY(" Initiator SPI = ", header->initiatorSpi, IKE_SPI_SIZE);
468  TRACE_DEBUG_ARRAY(" Responder SPI = ", header->responderSpi, IKE_SPI_SIZE);
469  TRACE_DEBUG(" Next Payload = %" PRIu8 " (%s)\r\n", header->nextPayload, nextPayloadName);
470  TRACE_DEBUG(" Major Version = %" PRIu8 "\r\n", header->majorVersion);
471  TRACE_DEBUG(" Minor Version = %" PRIu8 "\r\n", header->minorVersion);
472  TRACE_DEBUG(" Exchange Type = %" PRIu8 " (%s)\r\n", header->exchangeType, exchangeTypeName);
473  ikeDumpFlags(header->flags);
474  TRACE_DEBUG(" Message ID = %" PRIu32 "\r\n", ntohl(header->messageId));
475  TRACE_DEBUG(" Length = %" PRIu32 "\r\n", ntohl(header->length));
476 }
477 
478 
479 /**
480  * @brief Dump flags
481  * @param[in] flags specific options that are set for the IKE message
482  **/
483 
484 void ikeDumpFlags(uint8_t flags)
485 {
486  uint8_t r;
487  uint8_t v;
488  uint8_t i;
489 
490  //The R bit indicates that this message is a response to a message containing
491  //the same Message ID
492  r = (flags & IKE_FLAGS_R) ? 1 : 0;
493 
494  //The V bit indicates that the transmitter is capable of speaking a higher
495  //major version number of the protocol than the one indicated in the major
496  //version number field
497  v = (flags & IKE_FLAGS_V) ? 1 : 0;
498 
499  //The I bit must be set in messages sent by the original initiator of the
500  //IKE SA and must be cleared in messages sent by the original responder
501  i = (flags & IKE_FLAGS_I) ? 1 : 0;
502 
503  //Check whether any flag is set
504  if(r != 0 || v != 0 || i != 0)
505  {
506  //Dump the value of the Flags field
507  TRACE_DEBUG(" Flags = 0x%02" PRIX8 " (", flags);
508 
509  //Dump flags
510  while(1)
511  {
512  if(r != 0)
513  {
514  TRACE_DEBUG("Response");
515  r = FALSE;
516  }
517  else if(v != 0)
518  {
519  TRACE_DEBUG("Version");
520  v = FALSE;
521  }
522  else if(i != 0)
523  {
524  TRACE_DEBUG("Initiator");
525  i = FALSE;
526  }
527  else
528  {
529  }
530 
531  if(r != 0 || v != 0 || i != 0)
532  {
533  TRACE_DEBUG(", ");
534  }
535  else
536  {
537  TRACE_DEBUG(")\r\n");
538  break;
539  }
540  }
541  }
542  else
543  {
544  //Dump the value of the Flags field
545  TRACE_DEBUG(" Flags = 0x%02" PRIX8 "\r\n", flags);
546  }
547 }
548 
549 
550 /**
551  * @brief Dump IKE payloads
552  * @param[in] payloads Pointer to the IKE payloads to dump
553  * @param[in] length Length of the IKE payloads, in bytes
554  * @param[in] nextPayload Next payload type
555  **/
556 
557 void ikeDumpPayloads(const uint8_t *payloads, size_t length,
558  uint8_t nextPayload)
559 {
560  size_t n;
561  const char_t *payloadName;
562  const IkePayloadHeader *payload;
563 
564  //Following the header are one or more IKE payloads each identified by
565  //a Next Payload field in the preceding payload
567  length >= sizeof(IkePayloadHeader))
568  {
569  //Retrieve the name of the current IKE payload
570  payloadName = ikeGetParamName(nextPayload, ikePayloadList,
571  arraysize(ikePayloadList));
572 
573  //Each IKE payload begins with a generic payload header
574  payload = (IkePayloadHeader *) payloads;
575 
576  //The Payload Length field indicates the length in octets of the current
577  //payload, including the generic payload header
578  n = ntohs(payload->payloadLength);
579 
580  //Display the name of the current IKE payload
581  TRACE_DEBUG(" %s Payload (%" PRIuSIZE " bytes)\r\n", payloadName, n);
582 
583  //Check the length of the IKE payload
584  if(n < sizeof(IkePayloadHeader) || n > length)
585  break;
586 
587  //Dump generic payload header
589 
590  //Check IKE payload type
592  {
593  //Dump Security Association payload
595  }
596  else if(nextPayload == IKE_PAYLOAD_TYPE_KE)
597  {
598  //Dump Key Exchange payload
600  }
601  else if(nextPayload == IKE_PAYLOAD_TYPE_IDI ||
603  {
604  //Dump Identification payload
606  }
608  {
609  //Dump Certificate
611  }
613  {
614  //Dump Certificate Request
616  }
618  {
619  //Dump Authentication payload
621  }
623  {
624  //Dump Nonce payload
626  }
627  else if(nextPayload == IKE_PAYLOAD_TYPE_N)
628  {
629  //Dump Notify payload
631  }
632  else if(nextPayload == IKE_PAYLOAD_TYPE_D)
633  {
634  //Dump Delete payload
636  }
637  else if(nextPayload == IKE_PAYLOAD_TYPE_TSI ||
639  {
640  //Dump Traffic Selector payload
642  }
643  else if(nextPayload == IKE_PAYLOAD_TYPE_SK)
644  {
645  //Dump Encrypted payload
647 
648  //The Encrypted payload, if present in a message, must be the last
649  //payload in the message (refer to RFC 7296, section 3.14)
650  break;
651  }
653  {
654  //Dump Encrypted Fragment payload
656 
657  //As is the case for the Encrypted payload, the Encrypted Fragment
658  //payload, if present in a message, MUST be the last payload in the
659  //message (refer to RFC 7383, section 2.5)
660  break;
661  }
662  else
663  {
664  //Unknown IKE payload type
665  }
666 
667  //The Next Payload field indicates the payload type of the next payload
668  //in the message
669  nextPayload = payload->nextPayload;
670 
671  //Jump to the next IKE payload
672  payloads += n;
673  length -= n;
674  }
675 }
676 
677 
678 /**
679  * @brief Dump generic payload header
680  * @param[in] header Pointer to the generic payload header to dump
681  **/
682 
684 {
685  const char_t *nextPayloadName;
686 
687  //Convert the Next Payload field to string representation
688  nextPayloadName = ikeGetParamName(header->nextPayload,
689  ikePayloadList, arraysize(ikePayloadList));
690 
691  //Dump generic payload header
692  TRACE_DEBUG(" Next Payload = %" PRIu8 " (%s)\r\n", header->nextPayload, nextPayloadName);
693  TRACE_DEBUG(" Critical = %" PRIu8 "\r\n", header->critical);
694  TRACE_DEBUG(" Payload Length = %" PRIu16 "\r\n", ntohs(header->payloadLength));
695 }
696 
697 
698 /**
699  * @brief Dump Security Association payload
700  * @param[in] payload Pointer to the payload to dump
701  * @param[in] length Length of the payload, in bytes
702  **/
703 
705 {
706  size_t n;
707  const uint8_t *p;
708  const IkeProposal *proposal;
709 
710  //Check the length of the payload
711  if(length < sizeof(IkeSaPayload))
712  return;
713 
714  //Point to the first byte of the Proposals field
715  p = payload->proposals;
716  //Determine the length of the Proposals field
717  length -= sizeof(IkeSaPayload);
718 
719  //The Security Association payload contains one or more Proposal
720  //substructures
721  while(length >= sizeof(IkeProposal))
722  {
723  //Point to the Proposal substructure
724  proposal = (IkeProposal *) p;
725 
726  //The Proposal Length field indicates the length of this proposal,
727  //including all transforms and attributes that follow
728  n = ntohs(proposal->proposalLength);
729 
730  //Debug message
731  TRACE_DEBUG(" Proposal (%" PRIuSIZE " bytes)\r\n", n);
732 
733  //Check the length of the proposal
734  if(n < sizeof(IkeProposal) || n > length)
735  break;
736 
737  //Dump Proposal substructure
738  ikeDumpProposal(proposal, n);
739 
740  //Jump to the next proposal
741  p += n;
742  length -= n;
743  }
744 }
745 
746 
747 /**
748  * @brief Dump Proposal substructure
749  * @param[in] proposal Pointer to the Proposal substructure to dump
750  * @param[in] length Length of the proposal, in bytes
751  **/
752 
753 void ikeDumpProposal(const IkeProposal *proposal, size_t length)
754 {
755  uint_t i;
756  size_t n;
757  const uint8_t *p;
758  const char_t *lastSubstrucName;
759  const char_t *protocolIdName;
760  const IkeTransform *transform;
761 
762  //Check the length of the Proposal substructure
763  if(length < sizeof(IkeProposal))
764  return;
765 
766  //The Last Substruc field specifies whether or not this is the last
767  //Proposal Substructure in the SA
768  lastSubstrucName = ikeGetParamName(proposal->lastSubstruc,
769  ikeLastSubstrucList, arraysize(ikeLastSubstrucList));
770 
771  //The Protocol ID specifies the IPsec protocol identifier for the
772  //current negotiation
773  protocolIdName = ikeGetParamName(proposal->protocolId,
774  ikeProtocolIdList, arraysize(ikeProtocolIdList));
775 
776  //Dump Proposal substructure
777  TRACE_DEBUG(" Last Substruc = %" PRIu8 " (%s)\r\n",
778  proposal->lastSubstruc, lastSubstrucName);
779 
780  TRACE_DEBUG(" Proposal Length = %" PRIu16 "\r\n",
781  ntohs(proposal->proposalLength));
782 
783  TRACE_DEBUG(" Proposal Num = %" PRIu8 "\r\n", proposal->proposalNum);
784 
785  TRACE_DEBUG(" Protocol ID = %" PRIu8 " (%s)\r\n",
786  proposal->protocolId, protocolIdName);
787 
788  TRACE_DEBUG(" SPI Size = %" PRIu8 "\r\n", proposal->spiSize);
789  TRACE_DEBUG(" Num Transforms = %" PRIu8 "\r\n", proposal->numTransforms);
790 
791  //Malformed substructure?
792  if(length < (sizeof(IkeProposal) + proposal->spiSize))
793  return;
794 
795  //Dump SPI
796  TRACE_DEBUG(" SPI (%" PRIu8 " bytes)\r\n", proposal->spiSize);
797  TRACE_DEBUG_ARRAY(" ", proposal->spi, proposal->spiSize);
798 
799  //Point to the first byte of the Transforms field
800  p = (uint8_t *) proposal + sizeof(IkeProposal) + proposal->spiSize;
801  //Determine the length of the Transforms field
802  length -= sizeof(IkeProposal) + proposal->spiSize;
803 
804  //The Transforms field contains one or more Transform substructures
805  for(i = 1; i <= proposal->numTransforms; i++)
806  {
807  //Malformed substructure?
808  if(length < sizeof(IkeTransform))
809  break;
810 
811  //Point to the Transform substructure
812  transform = (IkeTransform *) p;
813 
814  //The Transform Length field indicates the length of the Transform
815  //substructure including header and attributes
816  n = ntohs(transform->transformLength);
817 
818  //Debug message
819  TRACE_DEBUG(" Transform %u (%" PRIuSIZE " bytes)\r\n", i, n);
820 
821  //Check the length of the transform
822  if(n < sizeof(IkeTransform) || n > length)
823  break;
824 
825  //Dump Transform substructure
826  ikeDumpTransform(transform, n);
827 
828  //Jump to the next transform
829  p += n;
830  length -= n;
831  }
832 }
833 
834 
835 /**
836  * @brief Dump Transform substructure
837  * @param[in] transform Pointer to the Transform substructure to dump
838  * @param[in] length Length of the transform, in bytes
839  **/
840 
841 void ikeDumpTransform(const IkeTransform *transform, size_t length)
842 {
843  error_t error;
844  uint_t i;
845  size_t n;
846  uint16_t transformId;
847  const uint8_t *p;
848  const char_t *lastSubstrucName;
849  const char_t *transformName;
850  const char_t *algoName;
851  const IkeTransformAttr *attr;
852 
853  //Check the length of the Transform substructure
854  if(length < sizeof(IkeTransform))
855  return;
856 
857  //The Last Substruc field specifies whether or not this is the last
858  //Proposal Substructure in the SA
859  lastSubstrucName = ikeGetParamName(transform->lastSubstruc,
860  ikeLastSubstrucList, arraysize(ikeLastSubstrucList));
861 
862  //Retrieve the type of transform being specified in this transform
863  transformName = ikeGetParamName(transform->transformType,
864  ikeTransformTypeList, arraysize(ikeTransformTypeList));
865 
866  //Dump Transform substructure
867  TRACE_DEBUG(" Last Substruc = %" PRIu8 " (%s)\r\n",
868  transform->lastSubstruc, lastSubstrucName);
869 
870  TRACE_DEBUG(" Transform Length = %" PRIu16 "\r\n",
871  ntohs(transform->transformLength));
872 
873  TRACE_DEBUG(" Transform Type = %" PRIu8 " (%s)\r\n",
874  transform->transformType, transformName);
875 
876  //Convert the Transform ID field to host byte order
877  transformId = ntohs(transform->transformId);
878 
879  //Check transform type
880  if(transform->transformType == IKE_TRANSFORM_TYPE_ENCR)
881  {
882  //Transform type 1 (encryption algorithm)
883  algoName = ikeGetParamName(transformId, ikeEncrAlgoList,
884  arraysize(ikeEncrAlgoList));
885  }
886  else if(transform->transformType == IKE_TRANSFORM_TYPE_PRF)
887  {
888  //Transform type 2 (pseudorandom function)
889  algoName = ikeGetParamName(transformId, ikePrfAlgoList,
890  arraysize(ikePrfAlgoList));
891  }
892  else if(transform->transformType == IKE_TRANSFORM_TYPE_INTEG)
893  {
894  //Transform type 3 (integrity algorithm)
895  algoName = ikeGetParamName(transformId, ikeAuthAlgoList,
896  arraysize(ikeAuthAlgoList));
897  }
898  else if(transform->transformType == IKE_TRANSFORM_TYPE_KE)
899  {
900  //Transform type 4 (key exchange method)
901  algoName = ikeGetParamName(transformId, ikeKeAlgoList,
902  arraysize(ikeKeAlgoList));
903  }
904  else if(transform->transformType == IKE_TRANSFORM_TYPE_ESN)
905  {
906  //Transform type 5 (extended sequence numbers)
907  algoName = ikeGetParamName(transformId, ikeEsnList,
908  arraysize(ikeEsnList));
909  }
910  else if(transform->transformType == IKE_TRANSFORM_TYPE_ADDKE1 ||
911  transform->transformType == IKE_TRANSFORM_TYPE_ADDKE2 ||
912  transform->transformType == IKE_TRANSFORM_TYPE_ADDKE3 ||
913  transform->transformType == IKE_TRANSFORM_TYPE_ADDKE4 ||
914  transform->transformType == IKE_TRANSFORM_TYPE_ADDKE5 ||
915  transform->transformType == IKE_TRANSFORM_TYPE_ADDKE6 ||
916  transform->transformType == IKE_TRANSFORM_TYPE_ADDKE7)
917  {
918  //Transform type 6-12 (additional key exchange)
919  algoName = ikeGetParamName(transformId, ikeKeAlgoList,
920  arraysize(ikeKeAlgoList));
921  }
922  else
923  {
924  //Unknown transform
925  algoName = "Unknown";
926  }
927 
928  //Dump Transform ID field
929  TRACE_DEBUG(" Transform ID = %" PRIu16 " (%s)\r\n",
930  transformId, algoName);
931 
932  //Point to the first byte of the Transform Attributes field
933  p = transform->transformAttr;
934  //Get the length of the Transform Attributes field
935  length -= sizeof(IkeTransform);
936 
937  //The Transform Attributes field contains one or more attributes
938  for(i = 1; ; i++)
939  {
940  //Malformed attribute?
941  if(length < sizeof(IkeTransformAttr))
942  break;
943 
944  //Point to the transform attribute
945  attr = (IkeTransformAttr *) p;
946 
947  //Debug message
948  TRACE_DEBUG(" Transform Attribute %u\r\n", i);
949 
950  //Dump transform attribute
951  error = ikeDumpTransformAttr(attr, length, &n);
952  //Any error to report?
953  if(error)
954  break;
955 
956  //Jump to the next attribute
957  p += n;
958  length -= n;
959  }
960 }
961 
962 
963 /**
964  * @brief Dump transform attribute
965  * @param[in] attr Pointer to the transform attribute to dump
966  * @param[in] length Number of bytes available in the input stream
967  * @param[out] consumed Total number of characters that have been consumed
968  * @return Error code
969  **/
970 
972  size_t *consumed)
973 {
974  size_t n;
975  uint16_t attrFormat;
976  uint16_t attrType;
977  const char_t *attrFormatName;
978  const char_t *attrTypeName;
979 
980  //Malformed attribute?
981  if(length < sizeof(IkeTransformAttr))
982  return ERROR_INVALID_SYNTAX;
983 
984  //Retrieve the format of the attribute
985  attrFormat = (ntohs(attr->type) & 0x8000) >> 15;
986  //Retrieve the type of the attribute
987  attrType = ntohs(attr->type) & 0x7FFF;
988 
989  //The AF field indicates whether the data attribute follows the TLV
990  //format or a shortened TV format
991  attrFormatName = ikeGetParamName(ntohs(attr->type) & 0x8000,
992  ikeAttrFormatList, arraysize(ikeAttrFormatList));
993 
994  //The Attribute Type field is a unique identifier for each type of
995  //attribute
996  attrTypeName = ikeGetParamName(attrType, ikeAttrTypeList,
997  arraysize(ikeAttrTypeList));
998 
999  //Dump Transform Attribute
1000  TRACE_DEBUG(" Attribute Format = %" PRIu16 " (%s)\r\n",
1001  attrFormat, attrFormatName);
1002 
1003  TRACE_DEBUG(" Attribute Type = %" PRIu16 " (%s)\r\n",
1004  attrType, attrTypeName);
1005 
1006  //Check the format of the attribute
1007  if((ntohs(attr->type) & IKE_ATTR_FORMAT_TV) != 0)
1008  {
1009  //If the AF bit is set, then the attribute value has a fixed length
1010  n = 0;
1011 
1012  //Dump attribute value
1013  TRACE_DEBUG(" Attribute Value = %" PRIu16 "\r\n",
1014  ntohs(attr->length));
1015  }
1016  else
1017  {
1018  //If the AF bit is not set, then this attribute has a variable length
1019  //defined by the Attribute Length field
1020  n = ntohs(attr->length);
1021 
1022  //Dump attribute length
1023  TRACE_DEBUG(" Attribute Length = %" PRIu16 "\r\n", n);
1024 
1025  //Malformed attribute?
1026  if(length < (sizeof(IkeTransformAttr) + n))
1027  return ERROR_INVALID_SYNTAX;
1028 
1029  //Dump attribute value
1030  TRACE_DEBUG(" Attribute Value (%" PRIuSIZE " bytes)\r\n", n);
1031  TRACE_DEBUG_ARRAY(" ", attr->value, n);
1032  }
1033 
1034  //Total number of bytes that have been consumed
1035  *consumed = sizeof(IkeTransformAttr) + n;
1036 
1037  //Parsing was successful
1038  return NO_ERROR;
1039 }
1040 
1041 
1042 /**
1043  * @brief Dump Key Exchange payload
1044  * @param[in] payload Pointer to the payload to dump
1045  * @param[in] length Length of the payload, in bytes
1046  **/
1047 
1049 {
1050  size_t n;
1051  uint16_t groupNum;
1052  const char_t *groupName;
1053 
1054  //Check the length of the payload
1055  if(length < sizeof(IkeKePayload))
1056  return;
1057 
1058  //Determine the length of the Key Exchange Data field
1059  n = length - sizeof(IkeKePayload);
1060 
1061  //The Key Exchange Method identifies the Diffie-Hellman group in which the
1062  //Key Exchange Data was computed
1063  groupNum = ntohs(payload->keyExchangeMethod);
1064 
1065  //Convert the Key Exchange Method field to string representation
1066  groupName = ikeGetParamName(groupNum, ikeKeAlgoList,
1067  arraysize(ikeKeAlgoList));
1068 
1069  //Dump Key Exchange Method field
1070  TRACE_DEBUG(" Key Exchange Method = 0x%" PRIX16 " (%s)\r\n",
1071  groupNum, groupName);
1072 
1073  //Dump Key Exchange Data field
1074  TRACE_DEBUG(" Key Exchange Data (%" PRIuSIZE " bytes)\r\n", n);
1075  TRACE_DEBUG_ARRAY(" ", payload->keyExchangeData, n);
1076 }
1077 
1078 
1079 /**
1080  * @brief Dump Identification payload
1081  * @param[in] payload Pointer to the payload to dump
1082  * @param[in] length Length of the payload, in bytes
1083  **/
1084 
1086 {
1087  const char_t *idTypeName;
1088 
1089  //Check the length of the payload
1090  if(length < sizeof(IkeIdPayload))
1091  return;
1092 
1093  //The ID Type field specifies the type of Identification being used
1094  idTypeName = ikeGetParamName(payload->idType, ikeIdTypeList,
1095  arraysize(ikeIdTypeList));
1096 
1097  //Dump ID Type field
1098  TRACE_DEBUG(" ID Type = %" PRIu8 " (%s)\r\n", payload->idType,
1099  idTypeName);
1100 
1101  //The Identification Data field has a variable length
1102  length -= sizeof(IkeIdPayload);
1103 
1104  //Dump Identification Data field
1105  TRACE_DEBUG(" Identification Data (%" PRIuSIZE " bytes)\r\n", length);
1106 
1107 #if (IPV4_SUPPORT == ENABLED)
1108  //IPv4 address?
1109  if(payload->idType == IKE_ID_TYPE_IPV4_ADDR && length == sizeof(Ipv4Addr))
1110  {
1111  Ipv4Addr ipv4Addr;
1112 
1113  //Copy IPv4 address
1114  ipv4CopyAddr(&ipv4Addr, payload->idData);
1115  //Dump IPv4 address
1116  TRACE_DEBUG(" %s\r\n", ipv4AddrToString(ipv4Addr, NULL));
1117  }
1118  else
1119 #endif
1120 #if (IPV6_SUPPORT == ENABLED)
1121  //IPv4 address?
1122  if(payload->idType == IKE_ID_TYPE_IPV6_ADDR && length == sizeof(Ipv6Addr))
1123  {
1124  Ipv6Addr ipv6Addr;
1125 
1126  //Copy IPv6 address
1127  ipv6CopyAddr(&ipv6Addr, payload->idData);
1128  //Dump IPv6 address
1129  TRACE_DEBUG(" %s\r\n", ipv6AddrToString(&ipv6Addr, NULL));
1130  }
1131  else
1132 #endif
1133  {
1134  //Dump Identification Data field
1135  TRACE_DEBUG_ARRAY(" ", payload->idData, length);
1136  }
1137 }
1138 
1139 
1140 /**
1141  * @brief Dump Certificate payload
1142  * @param[in] payload Pointer to the payload to dump
1143  * @param[in] length Length of the payload, in bytes
1144  **/
1145 
1147 {
1148  const char_t *certEncodingName;
1149 
1150  //Check the length of the payload
1151  if(length < sizeof(IkeCertPayload))
1152  return;
1153 
1154  //The Certificate Encoding field indicates the type of certificate or
1155  //certificate-related information contained in the Certificate Data field
1156  certEncodingName = ikeGetParamName(payload->certEncoding,
1157  ikeCertEncodingList, arraysize(ikeCertEncodingList));
1158 
1159  //Dump Certificate Encoding field
1160  TRACE_DEBUG(" Certificate Encoding = %" PRIu8 " (%s)\r\n",
1161  payload->certEncoding, certEncodingName);
1162 
1163  //The Certificate Data field has a variable length
1164  length -= sizeof(IkeCertPayload);
1165 
1166  //Dump Certificate Data field
1167  TRACE_DEBUG(" Certificate Data (%" PRIuSIZE " bytes)\r\n", length);
1168  TRACE_DEBUG_ARRAY(" ", payload->certData, length);
1169 }
1170 
1171 
1172 /**
1173  * @brief Dump Certificate Request payload
1174  * @param[in] payload Pointer to the payload to dump
1175  * @param[in] length Length of the payload, in bytes
1176  **/
1177 
1179 {
1180  const char_t *certEncodingName;
1181 
1182  //Check the length of the payload
1183  if(length < sizeof(IkeCertReqPayload))
1184  return;
1185 
1186  //The Certificate Encoding field contains an encoding of the type or
1187  //format of certificate requested
1188  certEncodingName = ikeGetParamName(payload->certEncoding,
1189  ikeCertEncodingList, arraysize(ikeCertEncodingList));
1190 
1191  //Dump Certificate Encoding field
1192  TRACE_DEBUG(" Certificate Encoding = %" PRIu8 " (%s)\r\n",
1193  payload->certEncoding, certEncodingName);
1194 
1195  //The Certification Authority field has a variable length
1196  length -= sizeof(IkeCertReqPayload);
1197 
1198  //Dump Certification Authority field
1199  TRACE_DEBUG(" Certification Authority (%" PRIuSIZE " bytes)\r\n", length);
1200  TRACE_DEBUG_ARRAY(" ", payload->certAuthority, length);
1201 }
1202 
1203 
1204 /**
1205  * @brief Dump Authentication payload
1206  * @param[in] payload Pointer to the payload to dump
1207  * @param[in] length Length of the payload, in bytes
1208  **/
1209 
1211 {
1212  size_t n;
1213  const char_t *authMethodName;
1214 
1215  //Check the length of the payload
1216  if(length < sizeof(IkeAuthPayload))
1217  return;
1218 
1219  //The Auth Method field specifies the method of authentication used
1220  authMethodName = ikeGetParamName(payload->authMethod, ikeAuthMethodList,
1221  arraysize(ikeAuthMethodList));
1222 
1223  //Dump Auth Method field
1224  TRACE_DEBUG(" Auth Method = %" PRIu8 " (%s)\r\n",
1225  payload->authMethod, authMethodName);
1226 
1227  //The Authentication Data field has a variable length
1228  n = length - sizeof(IkeAuthPayload);
1229 
1230  //Dump Authentication Data field
1231  TRACE_DEBUG(" Auth Data (%" PRIuSIZE " bytes)\r\n", n);
1232  TRACE_DEBUG_ARRAY(" ", payload->authData, n);
1233 }
1234 
1235 
1236 /**
1237  * @brief Dump Nonce payload
1238  * @param[in] payload Pointer to the payload to dump
1239  * @param[in] length Length of the payload, in bytes
1240  **/
1241 
1243 {
1244  size_t n;
1245 
1246  //Check the length of the payload
1247  if(length < sizeof(IkeNoncePayload))
1248  return;
1249 
1250  //The size of the Nonce Data must be between 16 and 256 octets, inclusive
1251  n = length - sizeof(IkeNoncePayload);
1252 
1253  //Dump Nonce Data field
1254  TRACE_DEBUG(" Nonce (%" PRIuSIZE " bytes)\r\n", n);
1255  TRACE_DEBUG_ARRAY(" ", payload->nonceData, n);
1256 }
1257 
1258 
1259 /**
1260  * @brief Dump Notify payload
1261  * @param[in] payload Pointer to the payload to dump
1262  * @param[in] length Length of the payload, in bytes
1263  **/
1264 
1266 {
1267  size_t n;
1268  uint16_t notifyMsgType;
1269  const uint8_t *p;
1270  const char_t *protocolIdName;
1271  const char_t *notifyMsgName;
1272 
1273  //Check the length of the payload
1274  if(length < sizeof(IkeNotifyPayload))
1275  return;
1276 
1277  //Check the length of the SPI
1278  if(length < (sizeof(IkeNotifyPayload) + payload->spiSize))
1279  return;
1280 
1281  //Convert the Protocol ID to string representation
1282  protocolIdName = ikeGetParamName(payload->protocolId,
1283  ikeProtocolIdList, arraysize(ikeProtocolIdList));
1284 
1285  //The Notify Message Type field specifies the type of notification message
1286  notifyMsgType = ntohs(payload->notifyMsgType);
1287 
1288  //Convert the Notify Message Type to string representation
1289  notifyMsgName = ikeGetParamName(notifyMsgType, ikeNotifyMsgTypeList,
1290  arraysize(ikeNotifyMsgTypeList));
1291 
1292  //Dump Notify payload
1293  TRACE_DEBUG(" Protocol ID = %" PRIu8 " (%s)\r\n",
1294  payload->protocolId, protocolIdName);
1295 
1296  TRACE_DEBUG(" SPI Size = %" PRIu8 "\r\n", payload->spiSize);
1297 
1298  TRACE_DEBUG(" Notify Message Type = %" PRIu16 " (%s)\r\n",
1299  ntohs(payload->notifyMsgType), notifyMsgName);
1300 
1301  //Dump SPI field
1302  TRACE_DEBUG(" SPI (%" PRIu8 " bytes)\r\n", payload->spiSize);
1303 
1304  if(payload->spiSize > 0)
1305  {
1306  TRACE_DEBUG_ARRAY(" ", payload->spi, payload->spiSize);
1307  }
1308 
1309  //The Notification Data field has a variable length
1310  p = payload->spi + payload->spiSize;
1311  n = length - sizeof(IkeNotifyPayload) - payload->spiSize;
1312 
1313  //Debug message
1314  TRACE_DEBUG(" Notification Data (%" PRIuSIZE " bytes)\r\n", n);
1315 
1316  //Check notification message type
1318  {
1319  //The INVALID_KE_PAYLOAD notification indicates the selected group
1321  }
1323  {
1324  //The IKE_NOTIFY_MSG_TYPE_SIGNATURE_HASH_ALGORITHMS notification indicates
1325  //the list of hash functions supported by the sending peer
1327  }
1328  else
1329  {
1330  //Dump Notification Data field
1331  if(n > 0)
1332  {
1333  TRACE_DEBUG_ARRAY(" ", p, n);
1334  }
1335  }
1336 }
1337 
1338 
1339 /**
1340  * @brief Dump INVALID_KE_PAYLOAD notification data
1341  * @param[in] data Pointer to the notification data
1342  * @param[in] length Length of the notification data, in bytes
1343  **/
1344 
1346 {
1347  uint16_t groupNum;
1348  const char_t *groupName;
1349 
1350  //Malformed notification data?
1351  if(length < sizeof(uint16_t))
1352  return;
1353 
1354  //The INVALID_KE_PAYLOAD notification indicates the selected group
1355  groupNum = LOAD16BE(data);
1356 
1357  //Convert the group number to string representation
1358  groupName = ikeGetParamName(groupNum, ikeKeAlgoList,
1359  arraysize(ikeKeAlgoList));
1360 
1361  //Dump group number
1362  TRACE_DEBUG(" Selected Group = %" PRIu16 " (%s)\r\n", groupNum,
1363  groupName);
1364 }
1365 
1366 
1367 /**
1368  * @brief Dump IKE_NOTIFY_MSG_TYPE_SIGNATURE_HASH_ALGORITHMS notification data
1369  * @param[in] data Pointer to the notification data
1370  * @param[in] length Length of the notification data, in bytes
1371  **/
1372 
1373 void ikeDumpSignHashAlgosNotification(const uint8_t *data, size_t length)
1374 {
1375  uint_t i;
1376  uint16_t hashAlgoId;
1377  const char_t *hashAlgoName;
1378 
1379  //Malformed notification data?
1380  if((length % sizeof(uint16_t)) != 0)
1381  return;
1382 
1383  //The IKE_NOTIFY_MSG_TYPE_SIGNATURE_HASH_ALGORITHMS notification indicates
1384  //the list of hash functions supported by the sending peer
1385  for(i = 0; i < length; i += sizeof(uint16_t))
1386  {
1387  //Get the current 16-bit hash algorithm identifier
1388  hashAlgoId = LOAD16BE(data + i);
1389 
1390  //Convert the hash algorithm identifier to string representation
1391  hashAlgoName = ikeGetParamName(hashAlgoId, ikeHashAlgoList,
1392  arraysize(ikeHashAlgoList));
1393 
1394  //Dump hash algorithm identifier
1395  TRACE_DEBUG(" Hash Algorithm ID = %" PRIu16 " (%s)\r\n", hashAlgoId,
1396  hashAlgoName);
1397  }
1398 }
1399 
1400 
1401 /**
1402  * @brief Dump Delete payload
1403  * @param[in] payload Pointer to the payload to dump
1404  * @param[in] length Length of the payload, in bytes
1405  **/
1406 
1408 {
1409  size_t n;
1410  const char_t *protocolIdName;
1411 
1412  //Check the length of the payload
1413  if(length < sizeof(IkeDeletePayload))
1414  return;
1415 
1416  //Convert the Protocol ID to string representation
1417  protocolIdName = ikeGetParamName(payload->protocolId,
1418  ikeProtocolIdList, arraysize(ikeProtocolIdList));
1419 
1420  //Dump Delete payload
1421  TRACE_DEBUG(" Protocol ID = %" PRIu8 " (%s)\r\n",
1422  payload->protocolId, protocolIdName);
1423 
1424  TRACE_DEBUG(" SPI Size = %" PRIu8 "\r\n", payload->spiSize);
1425 
1426  TRACE_DEBUG(" Number Of SPIs = %" PRIu16 "\r\n", ntohs(payload->numSpi));
1427 
1428  //The SPIs field has a variable length
1429  n = length - sizeof(IkeDeletePayload);
1430 
1431  //Dump SPIs field
1432  TRACE_DEBUG(" SPIs (%" PRIuSIZE " bytes)\r\n", n);
1433 
1434  //The SPI size must be zero for IKE (SPI is in message header) or four
1435  //for AH and ESP
1436  if(n > 0)
1437  {
1438  TRACE_DEBUG_ARRAY(" ", payload->spi, n);
1439  }
1440 }
1441 
1442 
1443 /**
1444  * @brief Dump Traffic Selector payload
1445  * @param[in] payload Pointer to the payload to dump
1446  * @param[in] length Length of the payload, in bytes
1447  **/
1448 
1450 {
1451  uint_t i;
1452  size_t n;
1453  const uint8_t *p;
1454  const IkeTs *ts;
1455 
1456  //Check the length of the payload
1457  if(length < sizeof(IkeTsPayload))
1458  return;
1459 
1460  //Dump Number of TSs field
1461  TRACE_DEBUG(" Number of TSs = %" PRIu8 "\r\n", payload->numTs);
1462 
1463  //Point to the first byte of the Traffic Selectors field
1464  p = (uint8_t *) payload + sizeof(IkeProposal);
1465  //Determine the length of the Traffic Selectors field
1466  length -= sizeof(IkeTsPayload);
1467 
1468  //The Traffic Selectors field contains one or more Traffic Selector
1469  //substructures
1470  for(i = 1; i <= payload->numTs; i++)
1471  {
1472  //Malformed substructure?
1473  if(length < sizeof(IkeTs))
1474  break;
1475 
1476  //Point to the Traffic Selector substructure
1477  ts = (IkeTs *) p;
1478 
1479  //The Selector Length field indicates the length of the Traffic Selector
1480  //substructure including the header
1481  n = ntohs(ts->selectorLength);
1482 
1483  //Debug message
1484  TRACE_DEBUG(" Traffic Selector (%" PRIuSIZE " bytes)\r\n", n);
1485 
1486  //Check the length of the selector
1487  if(n < sizeof(IkeTs) || n > length)
1488  break;
1489 
1490  //Dump Traffic Selector substructure
1491  ikeDumpTs(ts, n);
1492 
1493  //Jump to the next selector
1494  p += n;
1495  length -= n;
1496  }
1497 }
1498 
1499 
1500 /**
1501  * @brief Dump Traffic Selector substructure
1502  * @param[in] ts Pointer to the Traffic Selector substructure to dump
1503  * @param[in] length Length of the selector, in bytes
1504  **/
1505 
1506 void ikeDumpTs(const IkeTs *ts, size_t length)
1507 {
1508  size_t n;
1509  const char_t *tsTypeName;
1510  const char_t *ipProtocolIdName;
1511 
1512  //Check the length of the Traffic Selector substructure
1513  if(length < sizeof(IkeTs))
1514  return;
1515 
1516  //Convert the TS Type to string representation
1517  tsTypeName = ikeGetParamName(ts->tsType, ikeTsTypeList,
1518  arraysize(ikeTsTypeList));
1519 
1520  //Convert the IP Protocol ID to string representation
1521  ipProtocolIdName = ikeGetParamName(ts->ipProtocolId, ikeIpProtocolIdList,
1522  arraysize(ikeIpProtocolIdList));
1523 
1524  //Dump Traffic Selector substructure
1525  TRACE_DEBUG(" TS Type = %" PRIu8 " (%s)\r\n", ts->tsType,
1526  tsTypeName);
1527 
1528  TRACE_DEBUG(" IP Protocol ID = %" PRIu8 " (%s)\r\n",
1529  ts->ipProtocolId, ipProtocolIdName);
1530 
1531  TRACE_DEBUG(" Selector Length = %" PRIu16 "\r\n",
1532  ntohs(ts->selectorLength));
1533 
1534  TRACE_DEBUG(" Start Port = %" PRIu16 "\r\n", ntohs(ts->startPort));
1535  TRACE_DEBUG(" End Port = %" PRIu16 "\r\n", ntohs(ts->endPort));
1536 
1537  //The length of the Starting Address and Ending Address fields are
1538  //determined by the Traffic Selector type
1539  n = length - sizeof(IkeTs);
1540 
1541 #if (IPV4_SUPPORT == ENABLED)
1542  //IPv4 address range?
1543  if(ts->tsType == IKE_TS_TYPE_IPV4_ADDR_RANGE &&
1544  n == (2 * sizeof(Ipv4Addr)))
1545  {
1546  Ipv4Addr ipv4StartAddr;
1547  Ipv4Addr ipv4EndAddr;
1548 
1549  //Copy IPv4 addresses
1550  ipv4CopyAddr(&ipv4StartAddr, ts->startAddr);
1551  ipv4CopyAddr(&ipv4EndAddr, ts->startAddr + sizeof(Ipv4Addr));
1552 
1553  //Dump IPv4 address range
1554  TRACE_DEBUG(" Starting Address = %s\r\n",
1555  ipv4AddrToString(ipv4StartAddr, NULL));
1556 
1557  TRACE_DEBUG(" Ending Address = %s\r\n",
1558  ipv4AddrToString(ipv4EndAddr, NULL));
1559  }
1560  else
1561 #endif
1562 #if (IPV6_SUPPORT == ENABLED)
1563  //IPv6 address range?
1564  if(ts->tsType == IKE_TS_TYPE_IPV6_ADDR_RANGE &&
1565  length == (2 * sizeof(Ipv6Addr)))
1566  {
1567  Ipv6Addr ipv6StartAddr;
1568  Ipv6Addr ipv6EndAddr;
1569 
1570  //Copy IPv6 addresses
1571  ipv6CopyAddr(&ipv6StartAddr, ts->startAddr);
1572  ipv6CopyAddr(&ipv6EndAddr, ts->startAddr + sizeof(Ipv6Addr));
1573 
1574  //Dump IPv6 address range
1575  TRACE_DEBUG(" Starting Address = %s\r\n",
1576  ipv6AddrToString(&ipv6StartAddr, NULL));
1577 
1578  TRACE_DEBUG(" Ending Address = %s\r\n",
1579  ipv6AddrToString(&ipv6EndAddr, NULL));
1580  }
1581  else
1582 #endif
1583  {
1584  //Just for sanity
1585  }
1586 }
1587 
1588 
1589 /**
1590  * @brief Dump Encrypted payload
1591  * @param[in] payload Pointer to the payload to dump
1592  * @param[in] length Length of the payload, in bytes
1593  **/
1594 
1596 {
1597  size_t n;
1598 
1599  //Check the length of the payload
1600  if(length < sizeof(IkeEncryptedPayload))
1601  return;
1602 
1603  //The Payload Length field indicates the length of the encrypted data
1604  n = length - sizeof(IkeEncryptedPayload);
1605 
1606  //Dump encrypted data
1607  TRACE_DEBUG(" Encrypted Data (%" PRIuSIZE " bytes)\r\n", n);
1608  TRACE_DEBUG_ARRAY(" ", payload->iv, n);
1609 
1610 }
1611 
1612 
1613 /**
1614  * @brief Dump Encrypted Fragment payload
1615  * @param[in] payload Pointer to the payload to dump
1616  * @param[in] length Length of the payload, in bytes
1617  **/
1618 
1620  size_t length)
1621 {
1622  size_t n;
1623 
1624  //Check the length of the payload
1625  if(length < sizeof(IkeEncryptedFragPayload))
1626  return;
1627 
1628  //The Payload Length field indicates the length of the encrypted data
1629  n = length - sizeof(IkeEncryptedFragPayload);
1630 
1631  //The Fragment Number field specifies the current Fragment message number
1632  TRACE_DEBUG(" Fragment Number = %" PRIu16 "\r\n",
1633  ntohs(payload->fragNum));
1634 
1635  //The Total Fragments field specifies the number of Fragment messages into
1636  //which the original message was divided
1637  TRACE_DEBUG(" Total Fragments = %" PRIu16 "\r\n",
1638  ntohs(payload->totalFrags));
1639 
1640  //Dump encrypted data
1641  TRACE_DEBUG(" Encrypted Data (%" PRIuSIZE " bytes)\r\n", n);
1642  TRACE_DEBUG_ARRAY(" ", payload->iv, n);
1643 }
1644 
1645 
1646 /**
1647  * @brief Convert a parameter to string representation
1648  * @param[in] value Parameter value
1649  * @param[in] paramList List of acceptable parameters
1650  * @param[in] paramListLen Number of entries in the list
1651  * @return NULL-terminated string describing the parameter
1652  **/
1653 
1655  size_t paramListLen)
1656 {
1657  uint_t i;
1658 
1659  //Default name for unknown values
1660  static const char_t defaultName[] = "Unknown";
1661 
1662  //Loop through the list of acceptable parameters
1663  for(i = 0; i < paramListLen; i++)
1664  {
1665  if(paramList[i].value == value)
1666  return paramList[i].name;
1667  }
1668 
1669  //Unknown value
1670  return defaultName;
1671 }
1672 
1673 #endif
void ikeDumpPayloads(const uint8_t *payloads, size_t length, uint8_t nextPayload)
Dump IKE payloads.
Definition: ike_debug.c:557
@ IKE_TRANSFORM_ID_ENCR_AES_GCM_8
Definition: ike.h:984
@ IKE_TRANSFORM_ID_AUTH_AES_CMAC_96
Definition: ike.h:1037
@ IKE_NOTIFY_MSG_TYPE_PSK_CONFIRM
Definition: ike.h:1250
@ IKE_ID_TYPE_FC_NAME
Definition: ike.h:1130
char_t * ipv6AddrToString(const Ipv6Addr *ipAddr, char_t *str)
Convert a binary IPv6 address to a string representation.
Definition: ipv6.c:2325
@ IKE_TRANSFORM_ID_KE_MODP_1024
1024-bit MODP Group
Definition: ike.h:1055
Parameter value/name binding.
Definition: ike_debug.h:49
error_t ikeDumpTransformAttr(const IkeTransformAttr *attr, size_t length, size_t *consumed)
Dump transform attribute.
Definition: ike_debug.c:971
@ IKE_TRANSFORM_ID_AUTH_HMAC_SHA2_384_192
Definition: ike.h:1042
@ IKE_NOTIFY_MSG_TYPE_CLONE_IKE_SA
Definition: ike.h:1257
@ IKE_NOTIFY_MSG_TYPE_PPK_IDENTITY_KEY
Definition: ike.h:1270
@ IKE_TRANSFORM_ID_AUTH_HMAC_SHA1_96
Definition: ike.h:1031
@ IKE_TS_TYPE_IPV4_ADDR_RANGE
TS_IPV4_ADDR_RANGE.
Definition: ike.h:1280
@ IKE_TRANSFORM_ID_PRF_AES128_CMAC
Definition: ike.h:1018
@ IKE_TRANSFORM_ID_ENCR_AES_CCM_16
Definition: ike.h:983
@ IKE_TRANSFORM_ID_KE_ML_KEM_1024
ML-KEM-1024.
Definition: ike.h:1080
@ IKE_NOTIFY_MSG_TYPE_IPCOMP_SUPPORTED
Definition: ike.h:1211
@ IKE_TRANSFORM_ID_ENCR_KUZNYECHIK_MGM_KTREE
Definition: ike.h:997
IkeCertReqPayload
Definition: ike.h:1583
@ IKE_NOTIFY_MSG_TYPE_INVALID_MESSAGE_ID
Definition: ike.h:1187
@ IKE_TRANSFORM_ID_ENCR_AES_CTR
Definition: ike.h:980
@ IKE_NOTIFY_MSG_TYPE_ERX_SUPPORTED
Definition: ike.h:1251
@ IKE_NOTIFY_MSG_TYPE_REGISTRATION_FAILED
Definition: ike.h:1207
@ IKE_NOTIFY_MSG_TYPE_IKEV2_FRAGMENTATION_SUPPORTED
Definition: ike.h:1254
@ IKE_HASH_ALGO_SHA256
Definition: ike.h:1400
void ikeDumpKePayload(const IkeKePayload *payload, size_t length)
Dump Key Exchange payload.
Definition: ike_debug.c:1048
@ IKE_NOTIFY_MSG_TYPE_INVALID_SPI
Definition: ike.h:1188
@ IKE_CERT_ENCODING_RAW_RSA_KEY
Raw RSA key (deprecated)
Definition: ike.h:1150
@ IKE_NOTIFY_MSG_TYPE_SET_WINDOW_SIZE
Definition: ike.h:1209
@ IKE_IP_PROTOCOL_ID_ICMP
Definition: ike.h:1293
@ IKE_IP_PROTOCOL_ID_TCP
Definition: ike.h:1294
@ IKE_ID_TYPE_NULL
Definition: ike.h:1131
@ IKE_NOTIFY_MSG_TYPE_REKEY_SA
Definition: ike.h:1217
@ IKE_NOTIFY_MSG_TYPE_CHILD_SA_NOT_FOUND
Definition: ike.h:1202
@ IKE_TRANSFORM_ID_AUTH_HMAC_SHA1_160
Definition: ike.h:1036
@ IKE_NOTIFY_MSG_TYPE_ADDITIONAL_TS_POSSIBLE
Definition: ike.h:1210
@ IKE_HASH_ALGO_SHA1
Definition: ike.h:1399
@ IKE_ID_TYPE_IPV4_ADDR
Definition: ike.h:1123
@ IKE_NOTIFY_MSG_TYPE_NO_PROPOSAL_CHOSEN
Definition: ike.h:1189
@ IKE_PAYLOAD_TYPE_CP
Configuration.
Definition: ike.h:901
@ IKE_NOTIFY_MSG_TYPE_ADDITIONAL_IP6_ADDRESS
Definition: ike.h:1222
IkeKePayload
Definition: ike.h:1546
@ IKE_TRANSFORM_ID_ENCR_CAMELLIA_CBC
Definition: ike.h:988
uint8_t p
Definition: ndp.h:300
@ IKE_ID_TYPE_DER_ASN1_DN
Definition: ike.h:1127
@ IKE_HASH_ALGO_STREEBOG_256
Definition: ike.h:1404
@ IKE_TRANSFORM_ID_ENCR_IDEA
Definition: ike.h:973
@ IKE_TRANSFORM_ID_AUTH_AES_128_GMAC
Definition: ike.h:1038
uint8_t message[]
Definition: chap.h:154
@ IKE_TRANSFORM_ID_AUTH_HMAC_MD5_96
Definition: ike.h:1030
@ IKE_CERT_ENCODING_DNS_SIGNED_KEY
DNS signed key.
Definition: ike.h:1143
@ IKE_LAST_SUBSTRUC_MORE_TRANSFORMS
More transform substructures.
Definition: ike.h:920
@ IKE_AUTH_METHOD_ECDSA_P521_SHA512
ECDSA with SHA-512 on the P-521 curve.
Definition: ike.h:1169
@ IKE_NOTIFY_MSG_TYPE_USE_PPK_INT
Definition: ike.h:1269
void ikeDumpSaPayload(const IkeSaPayload *payload, size_t length)
Dump Security Association payload.
Definition: ike_debug.c:704
uint8_t data[]
Definition: ethernet.h:224
void ikeDumpInvalidKePayloadNotification(const uint8_t *data, size_t length)
Dump INVALID_KE_PAYLOAD notification data.
Definition: ike_debug.c:1345
@ IKE_NOTIFY_MSG_TYPE_PUZZLE
Definition: ike.h:1258
IkeNotifyPayload
Definition: ike.h:1632
@ IKE_TRANSFORM_ID_KE_MODP_2048_224
2048-bit MODP Group with 224-bit Prime Order Subgroup
Definition: ike.h:1066
@ IKE_NOTIFY_MSG_TYPE_SA_RESOURCE_INFO
Definition: ike.h:1268
uint8_t numTransforms
Definition: ike.h:1503
@ IKE_TRANSFORM_ID_ESN_NO
No Extended Sequence Numbers.
Definition: ike.h:1090
@ IKE_TRANSFORM_TYPE_ADDKE2
Additional Key Exchange 2.
Definition: ike.h:951
@ IKE_AUTH_METHOD_GSPAM
Generic Secure Password Authentication Method.
Definition: ike.h:1170
@ IKE_NOTIFY_MSG_TYPE_UPDATE_SA_ADDRESSES
Definition: ike.h:1224
@ IKE_TRANSFORM_ID_ENCR_CAST
Definition: ike.h:974
@ IKE_TRANSFORM_ID_KE_ML_KEM_512
ML-KEM-512.
Definition: ike.h:1078
@ IKE_AUTH_METHOD_RSA
RSA Digital Signature.
Definition: ike.h:1164
@ IKE_TRANSFORM_ID_KE_BRAINPOOLP256R1
256-bit Brainpool ECP Group
Definition: ike.h:1071
@ IKE_TRANSFORM_ID_KE_ECP_192
192-bit Random ECP Group
Definition: ike.h:1068
@ IKE_PROTOCOL_ID_AH
AH.
Definition: ike.h:931
@ IKE_TRANSFORM_ID_ENCR_CAMELLIA_CCM_8
Definition: ike.h:990
Ipv6Addr
Definition: ipv6.h:282
@ IKE_EXCHANGE_TYPE_IKE_SESSION_RESUME
IKE_SESSION_RESUME.
Definition: ike.h:858
@ IKE_LAST_SUBSTRUC_LAST
Last proposal/transform substructure.
Definition: ike.h:918
@ IKE_EXCHANGE_TYPE_GSA_INBAND_REKEY
GSA_INBAND_REKEY.
Definition: ike.h:862
@ IKE_NOTIFY_MSG_TYPE_USE_WESP_MODE
Definition: ike.h:1239
@ IKE_TRANSFORM_ID_KE_MODP_768
768-bit MODP Group
Definition: ike.h:1054
void ikeDumpSignHashAlgosNotification(const uint8_t *data, size_t length)
Dump IKE_NOTIFY_MSG_TYPE_SIGNATURE_HASH_ALGORITHMS notification data.
Definition: ike_debug.c:1373
IkePayloadHeader
Definition: ike.h:1477
void ikeDumpEncryptedPayload(const IkeEncryptedPayload *payload, size_t length)
Dump Encrypted payload.
Definition: ike_debug.c:1595
@ IKE_PAYLOAD_TYPE_CERTREQ
Certificate Request.
Definition: ike.h:892
@ IKE_TRANSFORM_ID_ENCR_CAMELLIA_CCM_16
Definition: ike.h:992
@ IKE_TRANSFORM_ID_ENCR_MAGMA_MGM_MAC_KTREE
Definition: ike.h:1000
@ IKE_TRANSFORM_ID_AUTH_AES_192_GMAC
Definition: ike.h:1039
@ IKE_NOTIFY_MSG_TYPE_IFOM_CAPABILITY
Definition: ike.h:1252
@ IKE_TRANSFORM_TYPE_GCAUTH
Group Controller Authentication Method.
Definition: ike.h:958
@ IKE_NOTIFY_MSG_TYPE_ROHC_SUPPORTED
Definition: ike.h:1240
@ IKE_NOTIFY_MSG_TYPE_TICKET_NACK
Definition: ike.h:1236
@ IKE_TRANSFORM_ID_KE_MODP_2048_256
2048-bit MODP Group with 256-bit Prime Order Subgroup
Definition: ike.h:1067
@ IKE_TRANSFORM_ID_ENCR_CHACHA20_POLY1305_IIV
Definition: ike.h:996
@ IKE_IP_PROTOCOL_ID_UDP
Definition: ike.h:1295
@ IKE_TRANSFORM_ID_ENCR_DES_IV64
Definition: ike.h:969
@ IKE_TRANSFORM_ID_ENCR_AES_GCM_16_IIV
Definition: ike.h:995
@ IKE_CERT_ENCODING_HASH_URL_X509_BUNDLE
Hash and URL of X.509 bundle.
Definition: ike.h:1152
@ IKE_TRANSFORM_ID_KE_ECP_224
224-bit Random ECP Group
Definition: ike.h:1069
@ IKE_TRANSFORM_TYPE_KWA
Key Wrap Algorithm.
Definition: ike.h:957
@ IKE_AUTH_METHOD_NULL
NULL Authentication.
Definition: ike.h:1171
IkeTransform
Definition: ike.h:1521
@ IKE_TS_TYPE_SECLABEL
TS_SECLABEL.
Definition: ike.h:1283
uint32_t Ipv4Addr
IPv4 network address.
Definition: ipv4.h:324
@ IKE_NOTIFY_MSG_TYPE_SIGNATURE_HASH_ALGORITHMS
Definition: ike.h:1255
@ IKE_TRANSFORM_ID_ENCR_CHACHA20_POLY1305
Definition: ike.h:993
@ IKE_TRANSFORM_ID_KE_ECP_384
384-bit Random ECP Group
Definition: ike.h:1063
@ IKE_TRANSFORM_TYPE_ADDKE7
Additional Key Exchange 7.
Definition: ike.h:956
@ IKE_ATTR_FORMAT_TV
shortened Type/Value format
Definition: ike.h:1102
@ IKE_TRANSFORM_ID_AUTH_AES_XCBC_96
Definition: ike.h:1034
@ IKE_TRANSFORM_ID_PRF_HMAC_SHA2_384
Definition: ike.h:1016
@ IKE_NOTIFY_MSG_TYPE_USE_AGGFRAG
Definition: ike.h:1266
@ IKE_NOTIFY_MSG_TYPE_NAT_DETECTION_SOURCE_IP
Definition: ike.h:1212
@ IKE_TRANSFORM_ID_KE_MODP_3072
3072-bit MODP Group
Definition: ike.h:1058
uint8_t r
Definition: ndp.h:346
@ IKE_TRANSFORM_TYPE_ESN
Extended Sequence Numbers.
Definition: ike.h:949
void ikeDumpEncryptedFragPayload(const IkeEncryptedFragPayload *payload, size_t length)
Dump Encrypted Fragment payload.
Definition: ike_debug.c:1619
@ IKE_NOTIFY_MSG_TYPE_TS_UNACCEPTABLE
Definition: ike.h:1196
@ IKE_NOTIFY_MSG_TYPE_LINK_ID
Definition: ike.h:1238
@ IKE_NOTIFY_MSG_TYPE_NAT_DETECTION_DESTINATION_IP
Definition: ike.h:1213
@ IKE_TRANSFORM_ID_ENCR_AES_CBC
Definition: ike.h:979
@ IKE_PAYLOAD_TYPE_EAP
Extensible Authentication.
Definition: ike.h:902
@ IKE_ID_TYPE_DER_ASN1_GN
Definition: ike.h:1128
@ IKE_TRANSFORM_ATTR_TYPE_KEY_LEN
Key Length (in bits)
Definition: ike.h:1112
IkeAuthPayload
Definition: ike.h:1596
@ IKE_NOTIFY_MSG_TYPE_FAILED_CP_REQUIRED
Definition: ike.h:1195
@ IKE_NOTIFY_MSG_TYPE_IPSEC_REPLAY_COUNTER_SYNC
Definition: ike.h:1247
@ IKE_EXCHANGE_TYPE_IKE_AUTH
IKE_AUTH.
Definition: ike.h:855
void ikeDumpCertReqPayload(const IkeCertReqPayload *payload, size_t length)
Dump Certificate Request payload.
Definition: ike_debug.c:1178
@ IKE_ID_TYPE_IPV6_ADDR
Definition: ike.h:1126
@ IKE_NOTIFY_MSG_TYPE_CHILDLESS_IKEV2_SUPPORTED
Definition: ike.h:1242
#define FALSE
Definition: os_port.h:46
@ IKE_NOTIFY_MSG_TYPE_INVALID_SELECTORS
Definition: ike.h:1197
@ IKE_TRANSFORM_ID_KE_BRAINPOOLP224R1
224-bit Brainpool ECP Group
Definition: ike.h:1070
@ IKE_NOTIFY_MSG_TYPE_ANOTHER_AUTH_FOLLOWS
Definition: ike.h:1229
@ IKE_ATTR_FORMAT_TLV
Type/Length/Value format.
Definition: ike.h:1101
uint16_t notifyMsgType
Definition: ike.h:1630
@ IKE_TRANSFORM_ID_KE_MODP_6144
6144-bit MODP Group
Definition: ike.h:1060
@ IKE_NOTIFY_MSG_TYPE_IP4_ALLOWED
Definition: ike.h:1263
@ IKE_TRANSFORM_ID_KE_BRAINPOOLP384R1
384-bit Brainpool ECP Group
Definition: ike.h:1072
Data logging functions for debugging purpose (IKEv2)
@ IKE_TRANSFORM_TYPE_ADDKE3
Additional Key Exchange 3.
Definition: ike.h:952
@ IKE_FLAGS_I
Initiator flag.
Definition: ike.h:876
error_t
Error codes.
Definition: error.h:43
@ IKE_EXCHANGE_TYPE_IKE_FOLLOWUP_KE
IKE_FOLLOWUP_KE.
Definition: ike.h:864
@ IKE_PAYLOAD_TYPE_SK
Encrypted and Authenticated.
Definition: ike.h:900
IkeIdPayload
Definition: ike.h:1559
void ikeDumpTs(const IkeTs *ts, size_t length)
Dump Traffic Selector substructure.
Definition: ike_debug.c:1506
@ IKE_PAYLOAD_TYPE_AUTH
Authentication.
Definition: ike.h:893
@ IKE_TRANSFORM_ID_ENCR_NULL
Definition: ike.h:978
@ IKE_PAYLOAD_TYPE_CERT
Certificate.
Definition: ike.h:891
IkeTsPayload
Definition: ike.h:1670
@ IKE_AUTH_METHOD_DIGITAL_SIGN
Digital Signature.
Definition: ike.h:1172
@ IKE_TS_TYPE_FC_ADDR_RANGE
TS_FC_ADDR_RANGE.
Definition: ike.h:1282
@ IKE_TRANSFORM_ID_KE_MODP_1536
1536-bit MODP Group
Definition: ike.h:1056
@ IKE_EXCHANGE_TYPE_IKE_INTERMEDIATE
IKE_INTERMEDIATE.
Definition: ike.h:863
@ IKE_NOTIFY_MSG_TYPE_NO_NATS_ALLOWED
Definition: ike.h:1226
@ IKE_TRANSFORM_ID_KE_MODP_4096
4096-bit MODP Group
Definition: ike.h:1059
@ IKE_TRANSFORM_TYPE_ADDKE5
Additional Key Exchange 5.
Definition: ike.h:954
@ IKE_TRANSFORM_ID_ENCR_KUZNYECHIK_MGM_MAC_KTREE
Definition: ike.h:999
#define IKE_SPI_SIZE
Definition: ike.h:826
@ IKE_HASH_ALGO_SHA512
Definition: ike.h:1402
void ikeDumpPayloadHeader(const IkePayloadHeader *header)
Dump generic payload header.
Definition: ike_debug.c:683
@ IKE_PROTOCOL_ID_ESP
ESP.
Definition: ike.h:932
@ IKE_NOTIFY_MSG_TYPE_NO_PPK_AUTH
Definition: ike.h:1261
@ IKE_TRANSFORM_ID_PRF_HMAC_MD5
Definition: ike.h:1011
@ IKE_NOTIFY_MSG_TYPE_PPK_IDENTITY
Definition: ike.h:1260
@ IKE_NOTIFY_MSG_TYPE_QUICK_CRASH_DETECTION
Definition: ike.h:1243
@ IKE_TRANSFORM_ID_KE_ECP_256
256-bit Random ECP Group
Definition: ike.h:1062
@ IKE_CERT_ENCODING_PGP_CERT
PGP certificate.
Definition: ike.h:1142
@ IKE_IP_PROTOCOL_ID_ICMPV6
Definition: ike.h:1296
@ IKE_TRANSFORM_ID_PRF_HMAC_SHA1
Definition: ike.h:1012
@ IKE_CERT_ENCODING_X509_CERT_ATTR
X.509 certificate - attribute.
Definition: ike.h:1149
@ IKE_NOTIFY_MSG_TYPE_MOBIKE_SUPPORTED
Definition: ike.h:1220
@ IKE_TRANSFORM_ID_ENCR_AES_GCM_12
Definition: ike.h:985
IkeTransformAttr
Definition: ike.h:1533
@ IKE_CERT_ENCODING_OCSP_CONTENT
OCSP Content.
Definition: ike.h:1153
@ IKE_TRANSFORM_ID_ENCR_AES_CCM_8_IIV
Definition: ike.h:994
@ IKE_PAYLOAD_TYPE_V
Vendor ID.
Definition: ike.h:897
@ IKE_TRANSFORM_TYPE_ADDKE1
Additional Key Exchange 1.
Definition: ike.h:950
@ IKE_TRANSFORM_ID_ENCR_MAGMA_MGM_KTREE
Definition: ike.h:998
@ IKE_PAYLOAD_TYPE_IDI
Identification - Initiator.
Definition: ike.h:889
@ IKE_NOTIFY_MSG_TYPE_REDIRECTED_FROM
Definition: ike.h:1232
@ IKE_TRANSFORM_ID_ENCR_BLOWFISH
Definition: ike.h:975
@ IKE_TRANSFORM_TYPE_ENCR
Encryption Algorithm.
Definition: ike.h:945
@ IKE_TRANSFORM_ID_ENCR_DES_IV32
Definition: ike.h:977
uint8_t length
Definition: tcp.h:375
@ IKE_TRANSFORM_ID_KE_MODP_1024_160
1024-bit MODP Group with 160-bit Prime Order Subgroup
Definition: ike.h:1065
@ IKE_TRANSFORM_ID_PRF_AES128_XCBC
Definition: ike.h:1014
@ IKE_TRANSFORM_ID_AUTH_HMAC_MD5_128
Definition: ike.h:1035
@ IKE_CERT_ENCODING_HASH_URL_X509_CERT
Hash and URL of X.509 certificate.
Definition: ike.h:1151
IkeHeader
Definition: ike.h:1459
@ IKE_NOTIFY_MSG_TYPE_USE_PPK
Definition: ike.h:1259
@ IKE_NOTIFY_MSG_TYPE_IP6_ALLOWED
Definition: ike.h:1264
@ IKE_EXCHANGE_TYPE_CREATE_CHILD_SA
CREATE_CHILD_SA.
Definition: ike.h:856
@ IKE_NOTIFY_MSG_TYPE_TICKET_OPAQUE
Definition: ike.h:1237
@ IKE_NOTIFY_MSG_TYPE_UNEXPECTED_NAT_DETECTED
Definition: ike.h:1199
@ IKE_AUTH_METHOD_SHARED_KEY
Shared Key Message Integrity Code.
Definition: ike.h:1165
@ IKE_NOTIFY_MSG_TYPE_HTTP_CERT_LOOKUP_SUPPORTED
Definition: ike.h:1216
@ IKE_TRANSFORM_ID_PRF_HMAC_SHA2_256
Definition: ike.h:1015
@ IKE_NOTIFY_MSG_TYPE_ESP_TFC_PADDING_NOT_SUPPORTED
Definition: ike.h:1218
IkeEncryptedPayload
Definition: ike.h:1696
@ IKE_CERT_ENCODING_CRL
Certificate revocation list.
Definition: ike.h:1146
@ IKE_NOTIFY_MSG_TYPE_STATE_NOT_FOUND
Definition: ike.h:1205
@ IKE_NOTIFY_MSG_TYPE_GROUP_SENDER
Definition: ike.h:1253
@ IKE_NOTIFY_MSG_TYPE_NON_FIRST_FRAGMENTS_ALSO
Definition: ike.h:1219
@ IKE_EXCHANGE_TYPE_GSA_AUTH
GSA_AUTH.
Definition: ike.h:859
@ IKE_TRANSFORM_ID_AUTH_HMAC_SHA2_256_128
Definition: ike.h:1041
IkeDeletePayload
Definition: ike.h:1646
@ IKE_NOTIFY_MSG_TYPE_TS_MAX_QUEUE
Definition: ike.h:1206
void ikeDumpCertPayload(const IkeCertPayload *payload, size_t length)
Dump Certificate payload.
Definition: ike_debug.c:1146
@ IKE_TRANSFORM_ID_ENCR_DES
Definition: ike.h:970
IKEv2 (Internet Key Exchange Protocol)
@ IKE_NOTIFY_MSG_TYPE_AUTHORIZATION_FAILED
Definition: ike.h:1204
#define ntohs(value)
Definition: cpu_endian.h:421
@ IKE_TRANSFORM_ID_AUTH_KPDK_MD5
Definition: ike.h:1033
@ IKE_TRANSFORM_ID_KE_NONE
None.
Definition: ike.h:1053
@ IKE_TRANSFORM_ID_AUTH_AES_256_GMAC
Definition: ike.h:1040
IkeTs
Definition: ike.h:1685
@ IKE_TRANSFORM_ID_ENCR_NULL_AUTH_AES_GMAC
Definition: ike.h:987
void ikeDumpDeletePayload(const IkeDeletePayload *payload, size_t length)
Dump Delete payload.
Definition: ike_debug.c:1407
@ IKE_TRANSFORM_ID_KE_MODP_2048
2048-bit MODP Group
Definition: ike.h:1057
#define TRACE_DEBUG(...)
Definition: debug.h:119
@ IKE_TRANSFORM_ID_KE_ECP_521
521-bit Random ECP Group
Definition: ike.h:1064
IkeProposal
Definition: ike.h:1505
@ IKE_HASH_ALGO_STREEBOG_512
Definition: ike.h:1405
char char_t
Definition: compiler_port.h:55
@ IKE_CERT_ENCODING_PKCS7_X509_CERT
PKCS #7 wrapped X.509 certificate.
Definition: ike.h:1141
@ IKE_PAYLOAD_TYPE_PS
Puzzle Solution.
Definition: ike.h:908
@ IKE_TRANSFORM_TYPE_KE
Key Exchange Method.
Definition: ike.h:948
void ikeDumpAuthPayload(const IkeAuthPayload *payload, size_t length)
Dump Authentication payload.
Definition: ike_debug.c:1210
@ IKE_EXCHANGE_TYPE_IKE_SA_INIT
IKE_SA_INIT.
Definition: ike.h:854
@ IKE_PAYLOAD_TYPE_NONCE
Nonce.
Definition: ike.h:894
@ IKE_NOTIFY_MSG_TYPE_INVALID_KE_PAYLOAD
Definition: ike.h:1190
void ikeDumpHeader(const IkeHeader *header)
Dump IKE header.
Definition: ike_debug.c:453
void ikeDumpProposal(const IkeProposal *proposal, size_t length)
Dump Proposal substructure.
Definition: ike_debug.c:753
@ IKE_TRANSFORM_ID_PRF_HMAC_STREEBOG_512
Definition: ike.h:1019
#define ipv6CopyAddr(destIpAddr, srcIpAddr)
Definition: ipv6.h:132
void ikeDumpNoncePayload(const IkeNoncePayload *payload, size_t length)
Dump Nonce payload.
Definition: ike_debug.c:1242
#define TRACE_DEBUG_ARRAY(p, a, n)
Definition: debug.h:120
@ IKE_TRANSFORM_ID_ENCR_3DES
Definition: ike.h:971
@ IKE_TRANSFORM_ID_ENCR_AES_GCM_16
Definition: ike.h:986
@ IKE_NOTIFY_MSG_TYPE_INTERMEDIATE_EXCHANGE_SUPPORTED
Definition: ike.h:1262
@ IKE_NOTIFY_MSG_TYPE_NO_ADDITIONAL_SAS
Definition: ike.h:1193
@ IKE_NOTIFY_MSG_TYPE_UNSUPPORTED_CRITICAL_PAYLOAD
Definition: ike.h:1183
@ IKE_NOTIFY_MSG_TYPE_SUPPORTED_AUTH_METHODS
Definition: ike.h:1267
@ IKE_TRANSFORM_ID_KE_CURVE25519
curve25519
Definition: ike.h:1074
@ IKE_PAYLOAD_TYPE_IDG
Group Identification.
Definition: ike.h:904
uint8_t n
@ IKE_TRANSFORM_ID_PRF_HMAC_TIGER
Definition: ike.h:1013
@ IKE_PAYLOAD_TYPE_SKF
Encrypted and Authenticated Fragment.
Definition: ike.h:907
@ IKE_TRANSFORM_ID_KE_ML_KEM_768
ML-KEM-768.
Definition: ike.h:1079
IkeCertPayload
Definition: ike.h:1571
uint8_t payload[]
Definition: ipv6.h:308
@ IKE_TRANSFORM_ID_ENCR_AES_CCM_12
Definition: ike.h:982
@ IKE_TRANSFORM_TYPE_PRF
Pseudorandom Function.
Definition: ike.h:946
@ IKE_TRANSFORM_ID_ESN_YES
Extended Sequence Numbers.
Definition: ike.h:1091
@ IKE_PAYLOAD_TYPE_KD
Key Download.
Definition: ike.h:906
void ikeDumpTransform(const IkeTransform *transform, size_t length)
Dump Transform substructure.
Definition: ike_debug.c:841
@ IKE_NOTIFY_MSG_TYPE_TICKET_LT_OPAQUE
Definition: ike.h:1233
IkeEncryptedFragPayload
Definition: ike.h:1759
@ IKE_NOTIFY_MSG_TYPE_SECURE_PASSWORD_METHODS
Definition: ike.h:1248
@ IKE_TRANSFORM_ID_ENCR_CAMELLIA_CTR
Definition: ike.h:989
const char_t * name
Definition: ike_debug.h:51
@ IKE_TRANSFORM_ID_KE_GOST3410_2012_256
GOST3410_2012_256.
Definition: ike.h:1076
@ IKE_CERT_ENCODING_ARL
Authority revocation list.
Definition: ike.h:1147
@ IKE_NOTIFY_MSG_TYPE_USE_ASSIGNED_HOA
Definition: ike.h:1200
@ IKE_PROTOCOL_ID_FC_CT_AUTHENTICATION
FC_CT_AUTHENTICATION.
Definition: ike.h:934
@ IKE_ID_TYPE_RFC822_ADDR
Definition: ike.h:1125
uint16_t transformId
Definition: ike.h:1519
@ IKE_PROTOCOL_ID_IKE
IKE.
Definition: ike.h:930
uint8_t value[]
Definition: tcp.h:376
@ IKE_AUTH_METHOD_DSS
DSS Digital Signature.
Definition: ike.h:1166
@ IKE_NOTIFY_MSG_TYPE_AUTH_FAILED
Definition: ike.h:1191
@ IKE_NOTIFY_MSG_TYPE_TEMPORARY_FAILURE
Definition: ike.h:1201
@ IKE_TRANSFORM_ID_ENCR_3IDEA
Definition: ike.h:976
@ IKE_EXCHANGE_TYPE_INFORMATIONAL
INFORMATIONAL.
Definition: ike.h:857
@ IKE_PAYLOAD_TYPE_LAST
No Next Payload.
Definition: ike.h:886
@ IKE_LAST_SUBSTRUC_MORE_PROPOSALS
More proposal substructures.
Definition: ike.h:919
@ IKE_NOTIFY_MSG_TYPE_TICKET_REQUEST
Definition: ike.h:1234
const char_t * ikeGetParamName(uint_t value, const IkeParamName *paramList, size_t paramListLen)
Convert a parameter to string representation.
Definition: ike_debug.c:1654
@ IKE_CERT_ENCODING_SPKI_CERT
SPKI certificate.
Definition: ike.h:1148
@ IKE_NOTIFY_MSG_TYPE_INITIAL_CONTACT
Definition: ike.h:1208
@ IKE_NOTIFY_MSG_TYPE_INTERNAL_ADDRESS_FAILURE
Definition: ike.h:1194
@ IKE_PAYLOAD_TYPE_KE
Key Exchange.
Definition: ike.h:888
@ ERROR_INVALID_SYNTAX
Definition: error.h:68
@ IKE_NOTIFY_MSG_TYPE_IKEV2_MESSAGE_ID_SYNC_SUPPORTED
Definition: ike.h:1244
@ IKE_NOTIFY_MSG_TYPE_REDIRECT
Definition: ike.h:1231
@ IKE_NOTIFY_MSG_TYPE_AUTH_LIFETIME
Definition: ike.h:1227
uint8_t nextPayload
Definition: ike.h:1447
@ IKE_AUTH_METHOD_ECDSA_P256_SHA256
ECDSA with SHA-256 on the P-256 curve.
Definition: ike.h:1167
@ IKE_NOTIFY_MSG_TYPE_COOKIE
Definition: ike.h:1214
#define ipv4CopyAddr(destIpAddr, srcIpAddr)
Definition: ipv4.h:167
@ IKE_ID_TYPE_KEY_ID
Definition: ike.h:1129
@ IKE_NOTIFY_MSG_TYPE_IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED
Definition: ike.h:1245
@ IKE_FLAGS_R
Response flag.
Definition: ike.h:874
@ IKE_PAYLOAD_TYPE_TSI
Traffic Selector - Initiator.
Definition: ike.h:898
@ IKE_NOTIFY_MSG_TYPE_USE_TRANSPORT_MODE
Definition: ike.h:1215
@ IKE_PROTOCOL_ID_FC_ESP_HEADER
FC_ESP_HEADER.
Definition: ike.h:933
@ IKE_CERT_ENCODING_X509_CERT_SIGN
X.509 certificate - signature.
Definition: ike.h:1144
IkeNoncePayload
Definition: ike.h:1618
@ IKE_TRANSFORM_TYPE_ADDKE6
Additional Key Exchange 6.
Definition: ike.h:955
@ IKE_NOTIFY_MSG_TYPE_SINGLE_PAIR_REQUIRED
Definition: ike.h:1192
@ IKE_TRANSFORM_ID_AUTH_DES_MAC
Definition: ike.h:1032
@ IKE_TRANSFORM_ID_KE_MODP_8192
8192-bit MODP Group
Definition: ike.h:1061
@ IKE_NOTIFY_MSG_TYPE_TICKET_ACK
Definition: ike.h:1235
@ IKE_NOTIFY_MSG_TYPE_REDIRECT_SUPPORTED
Definition: ike.h:1230
@ IKE_EXCHANGE_TYPE_GSA_REKEY
GSA_REKEY.
Definition: ike.h:861
@ IKE_TRANSFORM_ID_KE_BRAINPOOLP512R1
512-bit Brainpool ECP Group
Definition: ike.h:1073
@ IKE_EXCHANGE_TYPE_GSA_REGISTRATION
GSA_REGISTRATION.
Definition: ike.h:860
uint8_t flags
Definition: tcp.h:358
@ IKE_NOTIFY_MSG_TYPE_MULTIPLE_AUTH_SUPPORTED
Definition: ike.h:1228
@ IKE_PAYLOAD_TYPE_IDR
Identification - Responder.
Definition: ike.h:890
@ IKE_PROTOCOL_ID_GIKE_UPDATE
GIKE_UPDATE.
Definition: ike.h:935
@ IKE_NOTIFY_MSG_TYPE_ADDITIONAL_KEY_EXCHANGE
Definition: ike.h:1265
#define PRIuSIZE
@ IKE_TRANSFORM_ID_AUTH_HMAC_SHA2_512_256
Definition: ike.h:1043
unsigned int uint_t
Definition: compiler_port.h:57
@ IKE_PAYLOAD_TYPE_D
Delete.
Definition: ike.h:896
void ikeDumpNotifyPayload(const IkeNotifyPayload *payload, size_t length)
Dump Notify payload.
Definition: ike_debug.c:1265
#define LOAD16BE(p)
Definition: cpu_endian.h:186
@ IKE_NOTIFY_MSG_TYPE_EAP_ONLY_AUTHENTICATION
Definition: ike.h:1241
@ IKE_NOTIFY_MSG_TYPE_COOKIE2
Definition: ike.h:1225
@ IKE_TRANSFORM_ID_KE_GOST3410_2012_512
GOST3410_2012_512.
Definition: ike.h:1077
@ IKE_PAYLOAD_TYPE_SA
Security Association.
Definition: ike.h:887
@ IKE_NOTIFY_MSG_TYPE_INVALID_GROUP_ID
Definition: ike.h:1203
@ IKE_TRANSFORM_TYPE_ADDKE4
Additional Key Exchange 4.
Definition: ike.h:953
@ IKE_TRANSFORM_ID_AUTH_NONE
Definition: ike.h:1029
char_t * ipv4AddrToString(Ipv4Addr ipAddr, char_t *str)
Convert a binary IPv4 address to dot-decimal notation.
Definition: ipv4.c:1516
@ IKE_FLAGS_V
Version flag.
Definition: ike.h:875
@ IKE_NOTIFY_MSG_TYPE_PSK_PERSIST
Definition: ike.h:1249
@ IKE_NOTIFY_MSG_TYPE_INVALID_MAJOR_VERSION
Definition: ike.h:1185
@ IKE_CERT_ENCODING_KERBEROS_TOKEN
Kerberos token.
Definition: ike.h:1145
@ IKE_NOTIFY_MSG_TYPE_IKEV2_MESSAGE_ID_SYNC
Definition: ike.h:1246
@ IKE_NOTIFY_MSG_TYPE_NO_ADDITIONAL_ADDRESSES
Definition: ike.h:1223
void ikeDumpMessage(const uint8_t *message, size_t length)
Dump IKE message.
Definition: ike_debug.c:425
void ikeDumpIdPayload(const IkeIdPayload *payload, size_t length)
Dump Identification payload.
Definition: ike_debug.c:1085
@ IKE_NOTIFY_MSG_TYPE_INVALID_IKE_SPI
Definition: ike.h:1184
@ IKE_NOTIFY_MSG_TYPE_UNACCEPTABLE_ADDRESSES
Definition: ike.h:1198
@ IKE_NOTIFY_MSG_TYPE_CLONE_IKE_SA_SUPPORTED
Definition: ike.h:1256
@ IKE_AUTH_METHOD_ECDSA_P384_SHA384
ECDSA with SHA-384 on the P-384 curve.
Definition: ike.h:1168
@ IKE_TRANSFORM_ID_ENCR_RC5
Definition: ike.h:972
@ IKE_HASH_ALGO_SHA384
Definition: ike.h:1401
@ IKE_NOTIFY_MSG_TYPE_ADDITIONAL_IP4_ADDRESS
Definition: ike.h:1221
@ IKE_HASH_ALGO_IDENTITY
Definition: ike.h:1403
@ IKE_PAYLOAD_TYPE_N
Notify.
Definition: ike.h:895
#define ntohl(value)
Definition: cpu_endian.h:422
@ IKE_TRANSFORM_ID_PRF_HMAC_SHA2_512
Definition: ike.h:1017
@ NO_ERROR
Success.
Definition: error.h:44
@ IKE_TS_TYPE_IPV6_ADDR_RANGE
TS_IPV6_ADDR_RANGE.
Definition: ike.h:1281
Debugging facilities.
@ IKE_ID_TYPE_FQDN
Definition: ike.h:1124
void ikeDumpFlags(uint8_t flags)
Dump flags.
Definition: ike_debug.c:484
IkeSaPayload
Definition: ike.h:1488
@ IKE_CERT_ENCODING_RAW_PUBLIC_KEY
Raw Public Key.
Definition: ike.h:1154
#define arraysize(a)
Definition: os_port.h:71
@ IKE_PAYLOAD_TYPE_GSA
Group Security Association.
Definition: ike.h:905
@ IKE_PAYLOAD_TYPE_GSPM
Generic Secure Password Method.
Definition: ike.h:903
@ IKE_TRANSFORM_ID_KE_CURVE448
curve448
Definition: ike.h:1075
@ IKE_PAYLOAD_TYPE_TSR
Traffic Selector - Responder.
Definition: ike.h:899
@ IKE_NOTIFY_MSG_TYPE_INVALID_SYNTAX
Definition: ike.h:1186
@ IKE_TRANSFORM_ID_ENCR_CAMELLIA_CCM_12
Definition: ike.h:991
@ IKE_TRANSFORM_ID_ENCR_AES_CCM_8
Definition: ike.h:981
void ikeDumpTsPayload(const IkeTsPayload *payload, size_t length)
Dump Traffic Selector payload.
Definition: ike_debug.c:1449
@ IKE_TRANSFORM_TYPE_INTEG
Integrity Algorithm.
Definition: ike.h:947