2 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the project nor the names of its contributors
14 * may be used to endorse or promote products derived from this software
15 * without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 /* \summary: Internet Security Association and Key Management Protocol (ISAKMP) printer */
33 /* specification: RFC 2407, RFC 2408, RFC 5996 */
39 /* The functions from print-esp.c used in this file are only defined when both
40 * OpenSSL and evp.h are detected. Employ the same preprocessor device here.
42 #ifndef HAVE_OPENSSL_EVP_H
46 #include "netdissect-stdinc.h"
50 #include "netdissect-ctype.h"
52 #include "netdissect.h"
53 #include "addrtoname.h"
58 #include "ipproto.h" /* for netdb_protoname() */
60 typedef nd_byte cookie_t
[8];
61 typedef nd_byte msgid_t
[4];
63 #define PORT_ISAKMP 500
65 /* 3.1 ISAKMP Header Format (IKEv1 and IKEv2)
66 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
67 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
73 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
75 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
82 cookie_t i_ck
; /* Initiator Cookie */
83 cookie_t r_ck
; /* Responder Cookie */
84 nd_uint8_t np
; /* Next Payload Type */
86 #define ISAKMP_VERS_MAJOR 0xf0
87 #define ISAKMP_VERS_MAJOR_SHIFT 4
88 #define ISAKMP_VERS_MINOR 0x0f
89 #define ISAKMP_VERS_MINOR_SHIFT 0
90 nd_uint8_t etype
; /* Exchange Type */
91 nd_uint8_t flags
; /* Flags */
93 nd_uint32_t len
; /* Length */
96 /* Next Payload Type */
97 #define ISAKMP_NPTYPE_NONE 0 /* NONE*/
98 #define ISAKMP_NPTYPE_SA 1 /* Security Association */
99 #define ISAKMP_NPTYPE_P 2 /* Proposal */
100 #define ISAKMP_NPTYPE_T 3 /* Transform */
101 #define ISAKMP_NPTYPE_KE 4 /* Key Exchange */
102 #define ISAKMP_NPTYPE_ID 5 /* Identification */
103 #define ISAKMP_NPTYPE_CERT 6 /* Certificate */
104 #define ISAKMP_NPTYPE_CR 7 /* Certificate Request */
105 #define ISAKMP_NPTYPE_HASH 8 /* Hash */
106 #define ISAKMP_NPTYPE_SIG 9 /* Signature */
107 #define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
108 #define ISAKMP_NPTYPE_N 11 /* Notification */
109 #define ISAKMP_NPTYPE_D 12 /* Delete */
110 #define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
111 #define ISAKMP_NPTYPE_v2E 46 /* v2 Encrypted payload */
113 #define IKEv1_MAJOR_VERSION 1
114 #define IKEv1_MINOR_VERSION 0
116 #define IKEv2_MAJOR_VERSION 2
117 #define IKEv2_MINOR_VERSION 0
120 #define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
121 #define ISAKMP_FLAG_C 0x02 /* Commit Bit */
122 #define ISAKMP_FLAG_extra 0x04
125 #define ISAKMP_FLAG_I (1 << 3) /* (I)nitiator */
126 #define ISAKMP_FLAG_V (1 << 4) /* (V)ersion */
127 #define ISAKMP_FLAG_R (1 << 5) /* (R)esponse */
130 /* 3.2 Payload Generic Header
131 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
132 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
133 ! Next Payload ! RESERVED ! Payload Length !
134 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
137 nd_uint8_t np
; /* Next Payload */
138 nd_uint8_t critical
; /* bit 7 - critical, rest is RESERVED */
139 nd_uint16_t len
; /* Payload Length */
142 /* 3.3 Data Attributes
143 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
144 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145 !A! Attribute Type ! AF=0 Attribute Length !
146 !F! ! AF=1 Attribute Value !
147 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
148 . AF=0 Attribute Value .
149 . AF=1 Not Transmitted .
150 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
153 nd_uint16_t type
; /* defined by DOI-spec, and Attribute Format */
154 nd_uint16_t lorv
; /* if f equal 1, Attribute Length */
155 /* if f equal 0, Attribute Value */
156 /* if f equal 1, Attribute Value */
159 /* 3.4 Security Association Payload */
160 /* MAY NOT be used, because of being defined in ipsec-doi. */
162 If the current payload is the last in the message,
163 then the value of the next payload field will be 0.
164 This field MUST NOT contain the
165 values for the Proposal or Transform payloads as they are considered
166 part of the security association negotiation. For example, this
167 field would contain the value "10" (Nonce payload) in the first
168 message of a Base Exchange (see Section 4.4) and the value "0" in the
169 first message of an Identity Protect Exchange (see Section 4.5).
173 nd_uint32_t doi
; /* Domain of Interpretation */
174 nd_uint32_t sit
; /* Situation */
177 /* 3.5 Proposal Payload */
179 The value of the next payload field MUST only contain the value "2"
180 or "0". If there are additional Proposal payloads in the message,
181 then this field will be 2. If the current Proposal payload is the
182 last within the security association proposal, then this field will
187 nd_uint8_t p_no
; /* Proposal # */
188 nd_uint8_t prot_id
; /* Protocol */
189 nd_uint8_t spi_size
; /* SPI Size */
190 nd_uint8_t num_t
; /* Number of Transforms */
194 /* 3.6 Transform Payload */
196 The value of the next payload field MUST only contain the value "3"
197 or "0". If there are additional Transform payloads in the proposal,
198 then this field will be 3. If the current Transform payload is the
199 last within the proposal, then this field will be 0.
203 nd_uint8_t t_no
; /* Transform # */
204 nd_uint8_t t_id
; /* Transform-Id */
205 nd_byte reserved
[2]; /* RESERVED2 */
209 /* 3.7 Key Exchange Payload */
212 /* Key Exchange Data */
215 /* 3.8 Identification Payload */
216 /* MUST NOT to be used, because of being defined in ipsec-doi. */
220 nd_uint8_t id_type
; /* ID Type */
221 nd_uint32_t doi_data
; /* DOI Specific ID Data */
223 /* Identification Data */
226 /* 3.9 Certificate Payload */
227 struct ikev1_pl_cert
{
229 nd_uint8_t encode
; /* Cert Encoding */
230 nd_uint8_t cert
; /* Certificate Data */
232 This field indicates the type of
233 certificate or certificate-related information contained in the
234 Certificate Data field.
238 /* 3.10 Certificate Request Payload */
241 nd_uint8_t num_cert
; /* # Cert. Types */
243 Certificate Types (variable length)
244 -- Contains a list of the types of certificates requested,
245 sorted in order of preference. Each individual certificate
246 type is 1 octet. This field is NOT requiredo
248 /* # Certificate Authorities (1 octet) */
249 /* Certificate Authorities (variable length) */
252 /* 3.11 Hash Payload */
253 /* may not be used, because of having only data. */
254 struct ikev1_pl_hash
{
259 /* 3.12 Signature Payload */
260 /* may not be used, because of having only data. */
261 struct ikev1_pl_sig
{
266 /* 3.13 Nonce Payload */
267 /* may not be used, because of having only data. */
268 struct ikev1_pl_nonce
{
273 /* 3.14 Notification Payload */
276 nd_uint32_t doi
; /* Domain of Interpretation */
277 nd_uint8_t prot_id
; /* Protocol-ID */
278 nd_uint8_t spi_size
; /* SPI Size */
279 nd_uint16_t type
; /* Notify Message Type */
281 /* Notification Data */
284 /* 3.14.1 Notify Message Types */
285 /* NOTIFY MESSAGES - ERROR TYPES */
286 #define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE 1
287 #define ISAKMP_NTYPE_DOI_NOT_SUPPORTED 2
288 #define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED 3
289 #define ISAKMP_NTYPE_INVALID_COOKIE 4
290 #define ISAKMP_NTYPE_INVALID_MAJOR_VERSION 5
291 #define ISAKMP_NTYPE_INVALID_MINOR_VERSION 6
292 #define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE 7
293 #define ISAKMP_NTYPE_INVALID_FLAGS 8
294 #define ISAKMP_NTYPE_INVALID_MESSAGE_ID 9
295 #define ISAKMP_NTYPE_INVALID_PROTOCOL_ID 10
296 #define ISAKMP_NTYPE_INVALID_SPI 11
297 #define ISAKMP_NTYPE_INVALID_TRANSFORM_ID 12
298 #define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED 13
299 #define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN 14
300 #define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX 15
301 #define ISAKMP_NTYPE_PAYLOAD_MALFORMED 16
302 #define ISAKMP_NTYPE_INVALID_KEY_INFORMATION 17
303 #define ISAKMP_NTYPE_INVALID_ID_INFORMATION 18
304 #define ISAKMP_NTYPE_INVALID_CERT_ENCODING 19
305 #define ISAKMP_NTYPE_INVALID_CERTIFICATE 20
306 #define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX 21
307 #define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY 22
308 #define ISAKMP_NTYPE_INVALID_HASH_INFORMATION 23
309 #define ISAKMP_NTYPE_AUTHENTICATION_FAILED 24
310 #define ISAKMP_NTYPE_INVALID_SIGNATURE 25
311 #define ISAKMP_NTYPE_ADDRESS_NOTIFICATION 26
313 /* 3.15 Delete Payload */
316 nd_uint32_t doi
; /* Domain of Interpretation */
317 nd_uint8_t prot_id
; /* Protocol-Id */
318 nd_uint8_t spi_size
; /* SPI Size */
319 nd_uint16_t num_spi
; /* # of SPIs */
323 /* IKEv2 (RFC4306) */
325 /* 3.3 Security Association Payload -- generic header */
326 /* 3.3.1. Proposal Substructure */
329 nd_uint8_t p_no
; /* Proposal # */
330 nd_uint8_t prot_id
; /* Protocol */
331 nd_uint8_t spi_size
; /* SPI Size */
332 nd_uint8_t num_t
; /* Number of Transforms */
335 /* 3.3.2. Transform Substructure */
338 nd_uint8_t t_type
; /* Transform Type (ENCR,PRF,INTEG,etc.*/
339 nd_byte res2
; /* reserved byte */
340 nd_uint16_t t_id
; /* Transform ID */
351 /* 3.4. Key Exchange Payload */
354 nd_uint16_t ke_group
;
360 /* 3.5. Identification Payloads */
372 nd_uint8_t type
; /* ID type */
376 /* Notification Data */
379 /* 3.10 Notification Payload */
382 nd_uint8_t prot_id
; /* Protocol-ID */
383 nd_uint8_t spi_size
; /* SPI Size */
384 nd_uint16_t type
; /* Notify Message Type */
388 IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
= 1, /* [RFC7296] */
389 IV2_NOTIFY_INVALID_IKE_SPI
= 4, /* [RFC7296] */
390 IV2_NOTIFY_INVALID_MAJOR_VERSION
= 5, /* [RFC7296] */
391 IV2_NOTIFY_INVALID_SYNTAX
= 7, /* [RFC7296] */
392 IV2_NOTIFY_INVALID_MESSAGE_ID
= 9, /* [RFC7296] */
393 IV2_NOTIFY_INVALID_SPI
=11, /* [RFC7296] */
394 IV2_NOTIFY_NO_PROPOSAL_CHOSEN
=14, /* [RFC7296] */
395 IV2_NOTIFY_INVALID_KE_PAYLOAD
=17, /* [RFC7296] */
396 IV2_NOTIFY_AUTHENTICATION_FAILED
=24, /* [RFC7296] */
397 IV2_NOTIFY_SINGLE_PAIR_REQUIRED
=34, /* [RFC7296] */
398 IV2_NOTIFY_NO_ADDITIONAL_SAS
=35, /* [RFC7296] */
399 IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
=36, /* [RFC7296] */
400 IV2_NOTIFY_FAILED_CP_REQUIRED
=37, /* [RFC7296] */
401 IV2_NOTIFY_TS_UNACCEPTABLE
=38, /* [RFC7296] */
402 IV2_NOTIFY_INVALID_SELECTORS
=39, /* [RFC7296] */
403 IV2_NOTIFY_UNACCEPTABLE_ADDRESSES
=40, /* [RFC4555] */
404 IV2_NOTIFY_UNEXPECTED_NAT_DETECTED
=41, /* [RFC4555] */
405 IV2_NOTIFY_USE_ASSIGNED_HOA
=42, /* [RFC5026] */
406 IV2_NOTIFY_TEMPORARY_FAILURE
=43, /* [RFC7296] */
407 IV2_NOTIFY_CHILD_SA_NOT_FOUND
=44, /* [RFC7296] */
408 IV2_NOTIFY_INVALID_GROUP_ID
=45, /* [draft-yeung-g-ikev2] */
409 IV2_NOTIFY_AUTHORIZATION_FAILED
=46, /* [draft-yeung-g-ikev2] */
410 IV2_NOTIFY_STATE_NOT_FOUND
=47, /* [RFC-ietf-ipsecme-ikev2-multiple-ke-12] */
411 IV2_NOTIFY_INITIAL_CONTACT
=16384, /* [RFC7296] */
412 IV2_NOTIFY_SET_WINDOW_SIZE
=16385, /* [RFC7296] */
413 IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
=16386, /* [RFC7296] */
414 IV2_NOTIFY_IPCOMP_SUPPORTED
=16387, /* [RFC7296] */
415 IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
=16388, /* [RFC7296] */
416 IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
=16389, /* [RFC7296] */
417 IV2_NOTIFY_COOKIE
=16390, /* [RFC7296] */
418 IV2_NOTIFY_USE_TRANSPORT_MODE
=16391, /* [RFC7296] */
419 IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
=16392, /* [RFC7296] */
420 IV2_NOTIFY_REKEY_SA
=16393, /* [RFC7296] */
421 IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
=16394, /* [RFC7296] */
422 IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
=16395, /* [RFC7296] */
423 IV2_NOTIFY_MOBIKE_SUPPORTED
=16396, /* [RFC4555] */
424 IV2_NOTIFY_ADDITIONAL_IP4_ADDRESS
=16397, /* [RFC4555] */
425 IV2_NOTIFY_ADDITIONAL_IP6_ADDRESS
=16398, /* [RFC4555] */
426 IV2_NOTIFY_NO_ADDITIONAL_ADDRESSES
=16399, /* [RFC4555] */
427 IV2_NOTIFY_UPDATE_SA_ADDRESSES
=16400, /* [RFC4555] */
428 IV2_NOTIFY_COOKIE2
=16401, /* [RFC4555] */
429 IV2_NOTIFY_NO_NATS_ALLOWED
=16402, /* [RFC4555] */
430 IV2_NOTIFY_AUTH_LIFETIME
=16403, /* [RFC4478] */
431 IV2_NOTIFY_MULTIPLE_AUTH_SUPPORTED
=16404, /* [RFC4739] */
432 IV2_NOTIFY_ANOTHER_AUTH_FOLLOWS
=16405, /* [RFC4739] */
433 IV2_NOTIFY_REDIRECT_SUPPORTED
=16406, /* [RFC5685] */
434 IV2_NOTIFY_REDIRECT
=16407, /* [RFC5685] */
435 IV2_NOTIFY_REDIRECTED_FROM
=16408, /* [RFC5685] */
436 IV2_NOTIFY_TICKET_LT_OPAQUE
=16409, /* [RFC5723] */
437 IV2_NOTIFY_TICKET_REQUEST
=16410, /* [RFC5723] */
438 IV2_NOTIFY_TICKET_ACK
=16411, /* [RFC5723] */
439 IV2_NOTIFY_TICKET_NACK
=16412, /* [RFC5723] */
440 IV2_NOTIFY_TICKET_OPAQUE
=16413, /* [RFC5723] */
441 IV2_NOTIFY_LINK_ID
=16414, /* [RFC5739] */
442 IV2_NOTIFY_USE_WESP_MODE
=16415, /* [RFC5840] */
443 IV2_NOTIFY_ROHC_SUPPORTED
=16416, /* [RFC5857] */
444 IV2_NOTIFY_EAP_ONLY_AUTHENTICATION
=16417, /* [RFC5998] */
445 IV2_NOTIFY_CHILDLESS_IKEV2_SUPPORTED
=16418, /* [RFC6023] */
446 IV2_NOTIFY_QUICK_CRASH_DETECTION
=16419, /* [RFC6290] */
447 IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC_SUPPORTED
=16420, /* [RFC6311] */
448 IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED
=16421, /* [RFC6311] */
449 IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC
=16422, /* [RFC6311] */
450 IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC
=16423, /* [RFC6311] */
451 IV2_NOTIFY_SECURE_PASSWORD_METHODS
=16424, /* [RFC6467] */
452 IV2_NOTIFY_PSK_PERSIST
=16425, /* [RFC6631] */
453 IV2_NOTIFY_PSK_CONFIRM
=16426, /* [RFC6631] */
454 IV2_NOTIFY_ERX_SUPPORTED
=16427, /* [RFC6867] */
455 IV2_NOTIFY_IFOM_CAPABILITY
=16428, /* [Frederic_Firmin][3GPP TS 24.303 v10.6.0 annex B.2] */
456 IV2_NOTIFY_SENDER_REQUEST_ID
=16429, /* [draft-yeung-g-ikev2] */
457 IV2_NOTIFY_IKEV2_FRAGMENTATION_SUPPORTED
=16430, /* [RFC7383] */
458 IV2_NOTIFY_SIGNATURE_HASH_ALGORITHMS
=16431, /* [RFC7427] */
459 IV2_NOTIFY_CLONE_IKE_SA_SUPPORTED
=16432, /* [RFC7791] */
460 IV2_NOTIFY_CLONE_IKE_SA
=16433, /* [RFC7791] */
461 IV2_NOTIFY_PUZZLE
=16434, /* [RFC8019] */
462 IV2_NOTIFY_USE_PPK
=16435, /* [RFC8784] */
463 IV2_NOTIFY_PPK_IDENTITY
=16436, /* [RFC8784] */
464 IV2_NOTIFY_NO_PPK_AUTH
=16437, /* [RFC8784] */
465 IV2_NOTIFY_INTERMEDIATE_EXCHANGE_SUPPORTED
=16438, /* [RFC9242] */
466 IV2_NOTIFY_IP4_ALLOWED
=16439, /* [RFC8983] */
467 IV2_NOTIFY_IP6_ALLOWED
=16440, /* [RFC8983] */
468 IV2_NOTIFY_ADDITIONAL_KEY_EXCHANGE
=16441, /* [RFC-ietf-ipsecme-ikev2-multiple-ke-12] */
469 IV2_NOTIFY_USE_AGGFRAG
=16442 /* [RFC9347] */
472 struct notify_messages
{
477 /* 3.8 Authentication Payload */
480 nd_uint8_t auth_method
; /* Protocol-ID */
482 /* authentication data */
485 enum ikev2_auth_type
{
491 /* refer to RFC 2409 */
494 /* isakmp sa structure */
496 uint8_t proto_id
; /* OAKLEY */
497 vchar_t
*spi
; /* spi */
498 uint8_t dhgrp
; /* DH; group */
499 uint8_t auth_t
; /* method of authentication */
500 uint8_t prf_t
; /* type of prf */
501 uint8_t hash_t
; /* type of hash */
502 uint8_t enc_t
; /* type of cipher */
503 uint8_t life_t
; /* type of duration of lifetime */
504 uint32_t ldur
; /* life duration */
508 /* refer to RFC 2407 */
512 /* 4.2 IPSEC Situation Definition */
513 #define IPSECDOI_SIT_IDENTITY_ONLY 0x00000001
514 #define IPSECDOI_SIT_SECRECY 0x00000002
515 #define IPSECDOI_SIT_INTEGRITY 0x00000004
517 /* 4.4.1 IPSEC Security Protocol Identifiers */
518 /* 4.4.2 IPSEC ISAKMP Transform Values */
519 #define IPSECDOI_PROTO_ISAKMP 1
520 #define IPSECDOI_KEY_IKE 1
522 /* 4.4.1 IPSEC Security Protocol Identifiers */
523 #define IPSECDOI_PROTO_IPSEC_AH 2
524 /* 4.4.3 IPSEC AH Transform Values */
525 #define IPSECDOI_AH_MD5 2
526 #define IPSECDOI_AH_SHA 3
527 #define IPSECDOI_AH_DES 4
528 #define IPSECDOI_AH_SHA2_256 5
529 #define IPSECDOI_AH_SHA2_384 6
530 #define IPSECDOI_AH_SHA2_512 7
532 /* 4.4.1 IPSEC Security Protocol Identifiers */
533 #define IPSECDOI_PROTO_IPSEC_ESP 3
534 /* 4.4.4 IPSEC ESP Transform Identifiers */
535 #define IPSECDOI_ESP_DES_IV64 1
536 #define IPSECDOI_ESP_DES 2
537 #define IPSECDOI_ESP_3DES 3
538 #define IPSECDOI_ESP_RC5 4
539 #define IPSECDOI_ESP_IDEA 5
540 #define IPSECDOI_ESP_CAST 6
541 #define IPSECDOI_ESP_BLOWFISH 7
542 #define IPSECDOI_ESP_3IDEA 8
543 #define IPSECDOI_ESP_DES_IV32 9
544 #define IPSECDOI_ESP_RC4 10
545 #define IPSECDOI_ESP_NULL 11
546 #define IPSECDOI_ESP_RIJNDAEL 12
547 #define IPSECDOI_ESP_AES 12
549 /* 4.4.1 IPSEC Security Protocol Identifiers */
550 #define IPSECDOI_PROTO_IPCOMP 4
551 /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
552 #define IPSECDOI_IPCOMP_OUI 1
553 #define IPSECDOI_IPCOMP_DEFLATE 2
554 #define IPSECDOI_IPCOMP_LZS 3
556 /* 4.5 IPSEC Security Association Attributes */
557 #define IPSECDOI_ATTR_SA_LTYPE 1 /* B */
558 #define IPSECDOI_ATTR_SA_LTYPE_DEFAULT 1
559 #define IPSECDOI_ATTR_SA_LTYPE_SEC 1
560 #define IPSECDOI_ATTR_SA_LTYPE_KB 2
561 #define IPSECDOI_ATTR_SA_LDUR 2 /* V */
562 #define IPSECDOI_ATTR_SA_LDUR_DEFAULT 28800 /* 8 hours */
563 #define IPSECDOI_ATTR_GRP_DESC 3 /* B */
564 #define IPSECDOI_ATTR_ENC_MODE 4 /* B */
565 /* default value: host dependent */
566 #define IPSECDOI_ATTR_ENC_MODE_TUNNEL 1
567 #define IPSECDOI_ATTR_ENC_MODE_TRNS 2
568 #define IPSECDOI_ATTR_AUTH 5 /* B */
569 /* 0 means not to use authentication. */
570 #define IPSECDOI_ATTR_AUTH_HMAC_MD5 1
571 #define IPSECDOI_ATTR_AUTH_HMAC_SHA1 2
572 #define IPSECDOI_ATTR_AUTH_DES_MAC 3
573 #define IPSECDOI_ATTR_AUTH_KPDK 4 /*RFC-1826(Key/Pad/Data/Key)*/
575 * When negotiating ESP without authentication, the Auth
576 * Algorithm attribute MUST NOT be included in the proposal.
577 * When negotiating ESP without confidentiality, the Auth
578 * Algorithm attribute MUST be included in the proposal and
579 * the ESP transform ID must be ESP_NULL.
581 #define IPSECDOI_ATTR_KEY_LENGTH 6 /* B */
582 #define IPSECDOI_ATTR_KEY_ROUNDS 7 /* B */
583 #define IPSECDOI_ATTR_COMP_DICT_SIZE 8 /* B */
584 #define IPSECDOI_ATTR_COMP_PRIVALG 9 /* V */
586 /* 4.6.1 Security Association Payload */
589 nd_uint32_t doi
; /* Domain of Interpretation */
590 nd_uint32_t sit
; /* Situation */
593 struct ipsecdoi_secrecy_h
{
595 nd_uint16_t reserved
;
598 /* 4.6.2.1 Identification Type Values */
601 nd_uint8_t type
; /* ID Type */
602 nd_uint8_t proto_id
; /* Protocol ID */
603 nd_uint16_t port
; /* Port */
604 /* Identification Data */
607 #define IPSECDOI_ID_IPV4_ADDR 1
608 #define IPSECDOI_ID_FQDN 2
609 #define IPSECDOI_ID_USER_FQDN 3
610 #define IPSECDOI_ID_IPV4_ADDR_SUBNET 4
611 #define IPSECDOI_ID_IPV6_ADDR 5
612 #define IPSECDOI_ID_IPV6_ADDR_SUBNET 6
613 #define IPSECDOI_ID_IPV4_ADDR_RANGE 7
614 #define IPSECDOI_ID_IPV6_ADDR_RANGE 8
615 #define IPSECDOI_ID_DER_ASN1_DN 9
616 #define IPSECDOI_ID_DER_ASN1_GN 10
617 #define IPSECDOI_ID_KEY_ID 11
619 /* 4.6.3 IPSEC DOI Notify Message Types */
620 /* Notify Messages - Status Types */
621 #define IPSECDOI_NTYPE_RESPONDER_LIFETIME 24576
622 #define IPSECDOI_NTYPE_REPLAY_STATUS 24577
623 #define IPSECDOI_NTYPE_INITIAL_CONTACT 24578
625 #define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
626 netdissect_options *ndo, u_char tpay, \
627 const struct isakmp_gen *ext, \
629 const u_char *end_pointer, \
632 uint32_t proto0, int depth)
634 DECLARE_PRINTER(v1_sa
);
635 DECLARE_PRINTER(v1_p
);
636 DECLARE_PRINTER(v1_t
);
637 DECLARE_PRINTER(v1_ke
);
638 DECLARE_PRINTER(v1_id
);
639 DECLARE_PRINTER(v1_cert
);
640 DECLARE_PRINTER(v1_cr
);
641 DECLARE_PRINTER(v1_sig
);
642 DECLARE_PRINTER(v1_hash
);
643 DECLARE_PRINTER(v1_nonce
);
644 DECLARE_PRINTER(v1_n
);
645 DECLARE_PRINTER(v1_d
);
646 DECLARE_PRINTER(v1_vid
);
648 DECLARE_PRINTER(v2_sa
);
649 DECLARE_PRINTER(v2_ke
);
650 DECLARE_PRINTER(v2_ID
);
651 DECLARE_PRINTER(v2_cert
);
652 DECLARE_PRINTER(v2_cr
);
653 DECLARE_PRINTER(v2_auth
);
654 DECLARE_PRINTER(v2_nonce
);
655 DECLARE_PRINTER(v2_n
);
656 DECLARE_PRINTER(v2_d
);
657 DECLARE_PRINTER(v2_vid
);
658 DECLARE_PRINTER(v2_TS
);
659 DECLARE_PRINTER(v2_cp
);
660 DECLARE_PRINTER(v2_eap
);
662 static const u_char
*ikev2_e_print(netdissect_options
*ndo
,
663 const struct isakmp
*base
,
665 const struct isakmp_gen
*ext
,
667 const u_char
*end_pointer
,
670 uint32_t proto0
, int depth
);
673 static const u_char
*ike_sub0_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
674 const u_char
*, uint32_t, uint32_t, uint32_t, int);
675 static const u_char
*ikev1_sub_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
676 const u_char
*, uint32_t, uint32_t, uint32_t, int);
678 static const u_char
*ikev2_sub_print(netdissect_options
*ndo
,
679 const struct isakmp
*base
,
680 u_char np
, const struct isakmp_gen
*ext
,
681 const u_char
*ep
, uint32_t phase
,
682 uint32_t doi
, uint32_t proto
,
686 static char *numstr(u_int
);
689 ikev1_print(netdissect_options
*ndo
,
690 const u_char
*bp
, u_int length
,
691 const u_char
*bp2
, const struct isakmp
*base
);
693 #define MAXINITIATORS 20
694 static int ninitiator
= 0;
702 union inaddr_u iaddr
;
703 union inaddr_u raddr
;
704 } cookiecache
[MAXINITIATORS
];
707 static const char *protoidstr
[] = {
708 NULL
, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
712 static const char *npstr
[] = {
713 "none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
714 "sig", "nonce", "n", "d", "vid", /* 9 - 13 */
715 "pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
716 "pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
717 "pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
718 "pay29", "pay30", "pay31", "pay32", /* 29- 32 */
719 "v2sa", "v2ke", "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
720 "v2cr", "v2auth","v2nonce", "v2n", "v2d", /* 38- 42 */
721 "v2vid", "v2TSi", "v2TSr", "v2e", "v2cp", /* 43- 47 */
727 static const u_char
*(*npfunc
[])(netdissect_options
*ndo
, u_char tpay
,
728 const struct isakmp_gen
*ext
,
730 const u_char
*end_pointer
,
733 uint32_t proto0
, int depth
) = {
747 ikev1_vid_print
, /* 13 */
748 NULL
, NULL
, NULL
, NULL
, NULL
, /* 14- 18 */
749 NULL
, NULL
, NULL
, NULL
, NULL
, /* 19- 23 */
750 NULL
, NULL
, NULL
, NULL
, NULL
, /* 24- 28 */
751 NULL
, NULL
, NULL
, NULL
, /* 29- 32 */
752 ikev2_sa_print
, /* 33 */
753 ikev2_ke_print
, /* 34 */
754 ikev2_ID_print
, /* 35 */
755 ikev2_ID_print
, /* 36 */
756 ikev2_cert_print
, /* 37 */
757 ikev2_cr_print
, /* 38 */
758 ikev2_auth_print
, /* 39 */
759 ikev2_nonce_print
, /* 40 */
760 ikev2_n_print
, /* 41 */
761 ikev2_d_print
, /* 42 */
762 ikev2_vid_print
, /* 43 */
763 ikev2_TS_print
, /* 44 */
764 ikev2_TS_print
, /* 45 */
765 NULL
, /* ikev2_e_print,*/ /* 46 - special */
766 ikev2_cp_print
, /* 47 */
767 ikev2_eap_print
, /* 48 */
771 static const char *etypestr
[] = {
772 /* IKEv1 exchange types */
773 "none", "base", "ident", "auth", "agg", "inf", NULL
, NULL
, /* 0-7 */
774 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 8-15 */
775 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 16-23 */
776 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 24-31 */
777 "oakley-quick", "oakley-newgroup", /* 32-33 */
778 /* IKEv2 exchange types */
779 "ikev2_init", "ikev2_auth", "child_sa", "inf2" /* 34-37 */
782 #define STR_OR_ID(x, tab) \
783 (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
784 #define PROTOIDSTR(x) STR_OR_ID(x, protoidstr)
785 #define NPSTR(x) STR_OR_ID(x, npstr)
786 #define ETYPESTR(x) STR_OR_ID(x, etypestr)
788 #define CHECKLEN(p, np) \
789 if (ep < (const u_char *)(p)) { \
790 ND_PRINT(" [|%s]", NPSTR(np)); \
796 (((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
797 ? npfunc[(x)] : NULL)
800 iszero(netdissect_options
*ndo
, const u_char
*p
, size_t l
)
811 /* find cookie from initiator cache */
813 cookie_find(const cookie_t
*in
)
817 for (i
= 0; i
< MAXINITIATORS
; i
++) {
818 if (memcmp(in
, &cookiecache
[i
].initiator
, sizeof(*in
)) == 0)
825 /* record initiator */
827 cookie_record(netdissect_options
*ndo
, const cookie_t
*in
, const u_char
*bp2
)
831 const struct ip6_hdr
*ip6
;
835 ninitiator
= (i
+ 1) % MAXINITIATORS
;
839 ip
= (const struct ip
*)bp2
;
842 cookiecache
[ninitiator
].version
= 4;
843 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in4
,
844 ip
->ip_src
, sizeof(nd_ipv4
));
845 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in4
,
846 ip
->ip_dst
, sizeof(nd_ipv4
));
849 ip6
= (const struct ip6_hdr
*)bp2
;
850 cookiecache
[ninitiator
].version
= 6;
851 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in6
,
852 ip6
->ip6_src
, sizeof(nd_ipv6
));
853 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in6
,
854 ip6
->ip6_dst
, sizeof(nd_ipv6
));
859 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].initiator
, in
, sizeof(*in
));
860 ninitiator
= (ninitiator
+ 1) % MAXINITIATORS
;
863 #define cookie_isinitiator(ndo, x, y) cookie_sidecheck(ndo, (x), (y), 1)
864 #define cookie_isresponder(ndo, x, y) cookie_sidecheck(ndo, (x), (y), 0)
866 cookie_sidecheck(netdissect_options
*ndo
, int i
, const u_char
*bp2
, int initiator
)
869 const struct ip6_hdr
*ip6
;
871 ip
= (const struct ip
*)bp2
;
874 if (cookiecache
[i
].version
!= 4)
877 if (UNALIGNED_MEMCMP(ip
->ip_src
, &cookiecache
[i
].iaddr
.in4
, sizeof(nd_ipv4
)) == 0)
880 if (UNALIGNED_MEMCMP(ip
->ip_src
, &cookiecache
[i
].raddr
.in4
, sizeof(nd_ipv4
)) == 0)
885 if (cookiecache
[i
].version
!= 6)
887 ip6
= (const struct ip6_hdr
*)bp2
;
889 if (UNALIGNED_MEMCMP(ip6
->ip6_src
, &cookiecache
[i
].iaddr
.in6
, sizeof(nd_ipv6
)) == 0)
892 if (UNALIGNED_MEMCMP(ip6
->ip6_src
, &cookiecache
[i
].raddr
.in6
, sizeof(nd_ipv6
)) == 0)
904 hexprint(netdissect_options
*ndo
, const uint8_t *loc
, size_t len
)
910 for (i
= 0; i
< len
; i
++)
911 ND_PRINT("%02x", p
[i
] & 0xff);
915 rawprint(netdissect_options
*ndo
, const uint8_t *loc
, size_t len
)
917 ND_TCHECK_LEN(loc
, len
);
919 hexprint(ndo
, loc
, len
);
927 * returns false if we run out of data buffer
929 static int ike_show_somedata(netdissect_options
*ndo
,
930 const u_char
*cp
, const u_char
*ep
)
932 /* there is too much data, just show some of it */
933 const u_char
*end
= ep
- 20;
935 size_t len
= ep
- cp
;
940 /* really shouldn't happen because of above */
947 if(!rawprint(ndo
, (const uint8_t *)(cp
), len
)) goto trunc
;
950 if(!rawprint(ndo
, (const uint8_t *)(end
), elen
)) goto trunc
;
962 const char *value
[30]; /*XXX*/
965 static const u_char
*
966 ikev1_attrmap_print(netdissect_options
*ndo
,
967 const u_char
*p
, const u_char
*ep2
,
968 const struct attrmap
*map
, size_t nmap
)
973 if (GET_U_1(p
) & 0x80)
976 totlen
= 4 + GET_BE_U_2(p
+ 2);
978 if (ep2
< p
+ totlen
) {
984 t
= GET_BE_U_2(p
) & 0x7fff;
985 if (map
&& t
< nmap
&& map
[t
].type
)
986 ND_PRINT("type=%s ", map
[t
].type
);
988 ND_PRINT("type=#%u ", t
);
989 if (GET_U_1(p
) & 0x80) {
991 v
= GET_BE_U_2(p
+ 2);
992 if (map
&& t
< nmap
&& v
< map
[t
].nvalue
&& map
[t
].value
[v
])
993 ND_PRINT("%s", map
[t
].value
[v
]);
995 if (!rawprint(ndo
, (const uint8_t *)(p
+ 2), 2)) {
1001 ND_PRINT("len=%u value=", totlen
- 4);
1002 if (!rawprint(ndo
, (const uint8_t *)(p
+ 4), totlen
- 4)) {
1014 static const u_char
*
1015 ikev1_attr_print(netdissect_options
*ndo
, const u_char
*p
, const u_char
*ep2
)
1020 if (GET_U_1(p
) & 0x80)
1023 totlen
= 4 + GET_BE_U_2(p
+ 2);
1025 if (ep2
< p
+ totlen
) {
1026 ND_PRINT("[|attr]");
1031 t
= GET_BE_U_2(p
) & 0x7fff;
1032 ND_PRINT("type=#%u ", t
);
1033 if (GET_U_1(p
) & 0x80) {
1036 if (!rawprint(ndo
, (const uint8_t *)(p
+ 2), 2)) {
1041 ND_PRINT("len=%u value=", totlen
- 4);
1042 if (!rawprint(ndo
, (const uint8_t *)(p
+ 4), totlen
- 4)) {
1054 static const u_char
*
1055 ikev1_sa_print(netdissect_options
*ndo
, u_char tpay _U_
,
1056 const struct isakmp_gen
*ext
,
1058 const u_char
*ep
, uint32_t phase
, uint32_t doi0 _U_
,
1059 uint32_t proto0
, int depth
)
1061 const struct ikev1_pl_sa
*p
;
1062 uint32_t doi
, sit
, ident
;
1063 const u_char
*cp
, *np
;
1066 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_SA
));
1068 p
= (const struct ikev1_pl_sa
*)ext
;
1070 doi
= GET_BE_U_4(p
->doi
);
1071 sit
= GET_BE_U_4(p
->sit
);
1073 ND_PRINT(" doi=%u", doi
);
1074 ND_PRINT(" situation=%u", sit
);
1075 return (const u_char
*)(p
+ 1);
1078 ND_PRINT(" doi=ipsec");
1079 ND_PRINT(" situation=");
1082 ND_PRINT("identity");
1086 ND_PRINT("%ssecrecy", t
? "+" : "");
1090 ND_PRINT("%sintegrity", t
? "+" : "");
1092 np
= (const u_char
*)ext
+ sizeof(struct ikev1_pl_sa
);
1094 ident
= GET_BE_U_4(ext
+ 1);
1095 ND_PRINT(" ident=%u", ident
);
1096 np
+= sizeof(ident
);
1099 ext
= (const struct isakmp_gen
*)np
;
1100 ND_TCHECK_SIZE(ext
);
1102 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_P
, ext
, ep
, phase
, doi
, proto0
,
1107 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_SA
));
1111 static const u_char
*
1112 ikev1_p_print(netdissect_options
*ndo
, u_char tpay _U_
,
1113 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1114 const u_char
*ep
, uint32_t phase
, uint32_t doi0
,
1115 uint32_t proto0 _U_
, int depth
)
1117 const struct ikev1_pl_p
*p
;
1121 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_P
));
1123 p
= (const struct ikev1_pl_p
*)ext
;
1125 ND_PRINT(" #%u protoid=%s transform=%u",
1126 GET_U_1(p
->p_no
), PROTOIDSTR(GET_U_1(p
->prot_id
)),
1128 spi_size
= GET_U_1(p
->spi_size
);
1131 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1135 ext
= (const struct isakmp_gen
*)((const u_char
*)(p
+ 1) + spi_size
);
1136 ND_TCHECK_SIZE(ext
);
1138 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_T
, ext
, ep
, phase
, doi0
,
1139 GET_U_1(p
->prot_id
), depth
);
1143 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
1147 static const char *ikev1_p_map
[] = {
1151 static const char *ikev2_t_type_map
[]={
1152 NULL
, "encr", "prf", "integ", "dh", "esn"
1155 static const char *ah_p_map
[] = {
1156 NULL
, "(reserved)", "md5", "sha", "1des",
1157 "sha2-256", "sha2-384", "sha2-512",
1160 static const char *prf_p_map
[] = {
1161 NULL
, "hmac-md5", "hmac-sha", "hmac-tiger",
1165 static const char *integ_p_map
[] = {
1166 NULL
, "hmac-md5", "hmac-sha", "dec-mac",
1167 "kpdk-md5", "aes-xcbc"
1170 static const char *esn_p_map
[] = {
1174 static const char *dh_p_map
[] = {
1176 "modp1024", /* group 2 */
1177 "EC2N 2^155", /* group 3 */
1178 "EC2N 2^185", /* group 4 */
1179 "modp1536", /* group 5 */
1180 "iana-grp06", "iana-grp07", /* reserved */
1181 "iana-grp08", "iana-grp09",
1182 "iana-grp10", "iana-grp11",
1183 "iana-grp12", "iana-grp13",
1184 "modp2048", /* group 14 */
1185 "modp3072", /* group 15 */
1186 "modp4096", /* group 16 */
1187 "modp6144", /* group 17 */
1188 "modp8192", /* group 18 */
1191 static const char *esp_p_map
[] = {
1192 NULL
, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
1193 "blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
1196 static const char *ipcomp_p_map
[] = {
1197 NULL
, "oui", "deflate", "lzs",
1200 static const struct attrmap ipsec_t_map
[] = {
1201 { NULL
, 0, { NULL
} },
1202 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1203 { "life", 0, { NULL
} },
1204 { "group desc", 18, { NULL
, "modp768",
1205 "modp1024", /* group 2 */
1206 "EC2N 2^155", /* group 3 */
1207 "EC2N 2^185", /* group 4 */
1208 "modp1536", /* group 5 */
1209 "iana-grp06", "iana-grp07", /* reserved */
1210 "iana-grp08", "iana-grp09",
1211 "iana-grp10", "iana-grp11",
1212 "iana-grp12", "iana-grp13",
1213 "modp2048", /* group 14 */
1214 "modp3072", /* group 15 */
1215 "modp4096", /* group 16 */
1216 "modp6144", /* group 17 */
1217 "modp8192", /* group 18 */
1219 { "enc mode", 3, { NULL
, "tunnel", "transport", }, },
1220 { "auth", 5, { NULL
, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
1221 { "keylen", 0, { NULL
} },
1222 { "rounds", 0, { NULL
} },
1223 { "dictsize", 0, { NULL
} },
1224 { "privalg", 0, { NULL
} },
1227 static const struct attrmap encr_t_map
[] = {
1228 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 0, 1 */
1229 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 2, 3 */
1230 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 4, 5 */
1231 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 6, 7 */
1232 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 8, 9 */
1233 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 10,11*/
1234 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 12,13*/
1235 { "keylen", 14, { NULL
}},
1238 static const struct attrmap oakley_t_map
[] = {
1239 { NULL
, 0, { NULL
} },
1240 { "enc", 8, { NULL
, "1des", "idea", "blowfish", "rc5",
1241 "3des", "cast", "aes", }, },
1242 { "hash", 7, { NULL
, "md5", "sha1", "tiger",
1243 "sha2-256", "sha2-384", "sha2-512", }, },
1244 { "auth", 6, { NULL
, "preshared", "dss", "rsa sig", "rsa enc",
1245 "rsa enc revised", }, },
1246 { "group desc", 18, { NULL
, "modp768",
1247 "modp1024", /* group 2 */
1248 "EC2N 2^155", /* group 3 */
1249 "EC2N 2^185", /* group 4 */
1250 "modp1536", /* group 5 */
1251 "iana-grp06", "iana-grp07", /* reserved */
1252 "iana-grp08", "iana-grp09",
1253 "iana-grp10", "iana-grp11",
1254 "iana-grp12", "iana-grp13",
1255 "modp2048", /* group 14 */
1256 "modp3072", /* group 15 */
1257 "modp4096", /* group 16 */
1258 "modp6144", /* group 17 */
1259 "modp8192", /* group 18 */
1261 { "group type", 4, { NULL
, "MODP", "ECP", "EC2N", }, },
1262 { "group prime", 0, { NULL
} },
1263 { "group gen1", 0, { NULL
} },
1264 { "group gen2", 0, { NULL
} },
1265 { "group curve A", 0, { NULL
} },
1266 { "group curve B", 0, { NULL
} },
1267 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1268 { "lifeduration", 0, { NULL
} },
1269 { "prf", 0, { NULL
} },
1270 { "keylen", 0, { NULL
} },
1271 { "field", 0, { NULL
} },
1272 { "order", 0, { NULL
} },
1275 static const u_char
*
1276 ikev1_t_print(netdissect_options
*ndo
, u_char tpay _U_
,
1277 const struct isakmp_gen
*ext
, u_int item_len
,
1278 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi _U_
,
1279 uint32_t proto
, int depth _U_
)
1281 const struct ikev1_pl_t
*p
;
1284 const struct attrmap
*map
;
1288 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_T
));
1290 p
= (const struct ikev1_pl_t
*)ext
;
1295 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ikev1_p_map
);
1297 nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1300 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ah_p_map
);
1302 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1305 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), esp_p_map
);
1307 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1310 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ipcomp_p_map
);
1312 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1322 ND_PRINT(" #%u id=%s ", GET_U_1(p
->t_no
), idstr
);
1324 ND_PRINT(" #%u id=%u ", GET_U_1(p
->t_no
), GET_U_1(p
->t_id
));
1325 cp
= (const u_char
*)(p
+ 1);
1326 ep2
= (const u_char
*)p
+ item_len
;
1327 while (cp
< ep
&& cp
< ep2
) {
1329 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
1331 cp
= ikev1_attr_print(ndo
, cp
, ep2
);
1339 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_T
));
1343 static const u_char
*
1344 ikev1_ke_print(netdissect_options
*ndo
, u_char tpay _U_
,
1345 const struct isakmp_gen
*ext
, u_int item_len
,
1346 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1347 uint32_t proto _U_
, int depth _U_
)
1349 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_KE
));
1351 ND_TCHECK_SIZE(ext
);
1353 * Our caller has ensured that the length is >= 4.
1355 ND_PRINT(" key len=%u", item_len
- 4);
1356 if (2 < ndo
->ndo_vflag
&& item_len
> 4) {
1357 /* Print the entire payload in hex */
1359 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1362 return (const u_char
*)ext
+ item_len
;
1364 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_KE
));
1368 static const u_char
*
1369 ikev1_id_print(netdissect_options
*ndo
, u_char tpay _U_
,
1370 const struct isakmp_gen
*ext
, u_int item_len
,
1371 const u_char
*ep _U_
, uint32_t phase
, uint32_t doi _U_
,
1372 uint32_t proto _U_
, int depth _U_
)
1374 #define USE_IPSECDOI_IN_PHASE1 1
1375 const struct ikev1_pl_id
*p
;
1376 static const char *idtypestr
[] = {
1377 "IPv4", "IPv4net", "IPv6", "IPv6net",
1379 static const char *ipsecidtypestr
[] = {
1380 NULL
, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
1381 "IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
1387 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_ID
));
1389 p
= (const struct ikev1_pl_id
*)ext
;
1391 if (sizeof(*p
) < item_len
) {
1392 data
= (const u_char
*)(p
+ 1);
1393 len
= item_len
- sizeof(*p
);
1400 ND_PRINT(" [phase=%u doi=%u proto=%u]", phase
, doi
, proto
);
1403 #ifndef USE_IPSECDOI_IN_PHASE1
1407 ND_PRINT(" idtype=%s",
1408 STR_OR_ID(GET_U_1(p
->d
.id_type
), idtypestr
));
1409 ND_PRINT(" doi_data=%u",
1410 GET_BE_U_4(p
->d
.doi_data
) & 0xffffff);
1413 #ifdef USE_IPSECDOI_IN_PHASE1
1418 const struct ipsecdoi_id
*doi_p
;
1420 uint8_t type
, proto_id
;
1422 doi_p
= (const struct ipsecdoi_id
*)ext
;
1423 ND_TCHECK_SIZE(doi_p
);
1424 type
= GET_U_1(doi_p
->type
);
1425 ND_PRINT(" idtype=%s", STR_OR_ID(type
, ipsecidtypestr
));
1426 /* A protocol ID of 0 DOES NOT mean IPPROTO_IP! */
1427 proto_id
= GET_U_1(doi_p
->proto_id
);
1428 if (!ndo
->ndo_nflag
&& proto_id
&& (p_name
= netdb_protoname(proto_id
)) != NULL
)
1429 ND_PRINT(" protoid=%s", p_name
);
1431 ND_PRINT(" protoid=%u", proto_id
);
1432 ND_PRINT(" port=%u", GET_BE_U_2(doi_p
->port
));
1437 ND_TCHECK_LEN(data
, len
);
1439 case IPSECDOI_ID_IPV4_ADDR
:
1441 ND_PRINT(" len=%u [bad: < 4]", len
);
1443 ND_PRINT(" len=%u %s", len
, GET_IPADDR_STRING(data
));
1446 case IPSECDOI_ID_FQDN
:
1447 case IPSECDOI_ID_USER_FQDN
:
1450 ND_PRINT(" len=%u ", len
);
1451 for (i
= 0; i
< len
; i
++)
1452 fn_print_char(ndo
, GET_U_1(data
+ i
));
1456 case IPSECDOI_ID_IPV4_ADDR_SUBNET
:
1460 ND_PRINT(" len=%u [bad: < 8]", len
);
1462 mask
= data
+ sizeof(nd_ipv4
);
1463 ND_PRINT(" len=%u %s/%u.%u.%u.%u", len
,
1464 GET_IPADDR_STRING(data
),
1465 GET_U_1(mask
), GET_U_1(mask
+ 1),
1472 case IPSECDOI_ID_IPV6_ADDR
:
1474 ND_PRINT(" len=%u [bad: < 16]", len
);
1476 ND_PRINT(" len=%u %s", len
, GET_IP6ADDR_STRING(data
));
1479 case IPSECDOI_ID_IPV6_ADDR_SUBNET
:
1483 ND_PRINT(" len=%u [bad: < 32]", len
);
1485 mask
= (const u_char
*)(data
+ sizeof(nd_ipv6
));
1487 ND_PRINT(" len=%u %s/0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", len
,
1488 GET_IP6ADDR_STRING(data
),
1489 GET_U_1(mask
), GET_U_1(mask
+ 1),
1503 GET_U_1(mask
+ 15));
1508 case IPSECDOI_ID_IPV4_ADDR_RANGE
:
1510 ND_PRINT(" len=%u [bad: < 8]", len
);
1512 ND_PRINT(" len=%u %s-%s", len
,
1513 GET_IPADDR_STRING(data
),
1514 GET_IPADDR_STRING(data
+ sizeof(nd_ipv4
)));
1518 case IPSECDOI_ID_IPV6_ADDR_RANGE
:
1520 ND_PRINT(" len=%u [bad: < 32]", len
);
1522 ND_PRINT(" len=%u %s-%s", len
,
1523 GET_IP6ADDR_STRING(data
),
1524 GET_IP6ADDR_STRING(data
+ sizeof(nd_ipv6
)));
1528 case IPSECDOI_ID_DER_ASN1_DN
:
1529 case IPSECDOI_ID_DER_ASN1_GN
:
1530 case IPSECDOI_ID_KEY_ID
:
1537 ND_PRINT(" len=%u", len
);
1538 if (2 < ndo
->ndo_vflag
) {
1540 if (!rawprint(ndo
, (const uint8_t *)data
, len
))
1544 return (const u_char
*)ext
+ item_len
;
1546 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_ID
));
1550 static const u_char
*
1551 ikev1_cert_print(netdissect_options
*ndo
, u_char tpay _U_
,
1552 const struct isakmp_gen
*ext
, u_int item_len
,
1553 const u_char
*ep _U_
, uint32_t phase _U_
,
1555 uint32_t proto0 _U_
, int depth _U_
)
1557 const struct ikev1_pl_cert
*p
;
1558 static const char *certstr
[] = {
1559 "none", "pkcs7", "pgp", "dns",
1560 "x509sign", "x509ke", "kerberos", "crl",
1561 "arl", "spki", "x509attr",
1564 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_CERT
));
1566 p
= (const struct ikev1_pl_cert
*)ext
;
1569 * Our caller has ensured that the length is >= 4.
1571 ND_PRINT(" len=%u", item_len
- 4);
1572 ND_PRINT(" type=%s", STR_OR_ID(GET_U_1(p
->encode
), certstr
));
1573 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1574 /* Print the entire payload in hex */
1576 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1579 return (const u_char
*)ext
+ item_len
;
1581 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_CERT
));
1585 static const u_char
*
1586 ikev1_cr_print(netdissect_options
*ndo
, u_char tpay _U_
,
1587 const struct isakmp_gen
*ext
, u_int item_len
,
1588 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1589 uint32_t proto0 _U_
, int depth _U_
)
1591 const struct ikev1_pl_cert
*p
;
1592 static const char *certstr
[] = {
1593 "none", "pkcs7", "pgp", "dns",
1594 "x509sign", "x509ke", "kerberos", "crl",
1595 "arl", "spki", "x509attr",
1598 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_CR
));
1600 p
= (const struct ikev1_pl_cert
*)ext
;
1603 * Our caller has ensured that the length is >= 4.
1605 ND_PRINT(" len=%u", item_len
- 4);
1606 ND_PRINT(" type=%s", STR_OR_ID(GET_U_1(p
->encode
), certstr
));
1607 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1608 /* Print the entire payload in hex */
1610 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1613 return (const u_char
*)ext
+ item_len
;
1615 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_CR
));
1619 static const u_char
*
1620 ikev1_hash_print(netdissect_options
*ndo
, u_char tpay _U_
,
1621 const struct isakmp_gen
*ext
, u_int item_len
,
1622 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1623 uint32_t proto _U_
, int depth _U_
)
1625 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_HASH
));
1627 ND_TCHECK_SIZE(ext
);
1629 * Our caller has ensured that the length is >= 4.
1631 ND_PRINT(" len=%u", item_len
- 4);
1632 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1633 /* Print the entire payload in hex */
1635 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1638 return (const u_char
*)ext
+ item_len
;
1640 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_HASH
));
1644 static const u_char
*
1645 ikev1_sig_print(netdissect_options
*ndo
, u_char tpay _U_
,
1646 const struct isakmp_gen
*ext
, u_int item_len
,
1647 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1648 uint32_t proto _U_
, int depth _U_
)
1650 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_SIG
));
1652 ND_TCHECK_SIZE(ext
);
1654 * Our caller has ensured that the length is >= 4.
1656 ND_PRINT(" len=%u", item_len
- 4);
1657 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1658 /* Print the entire payload in hex */
1660 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1663 return (const u_char
*)ext
+ item_len
;
1665 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_SIG
));
1669 static const u_char
*
1670 ikev1_nonce_print(netdissect_options
*ndo
, u_char tpay _U_
,
1671 const struct isakmp_gen
*ext
,
1674 uint32_t phase _U_
, uint32_t doi _U_
,
1675 uint32_t proto _U_
, int depth _U_
)
1677 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_NONCE
));
1679 ND_TCHECK_SIZE(ext
);
1681 * Our caller has ensured that the length is >= 4.
1683 ND_PRINT(" n len=%u", item_len
- 4);
1685 if (ndo
->ndo_vflag
> 2) {
1687 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1689 } else if (ndo
->ndo_vflag
> 1) {
1691 if (!ike_show_somedata(ndo
, (const u_char
*)(ext
+ 1), ep
))
1695 return (const u_char
*)ext
+ item_len
;
1697 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE
));
1701 static const u_char
*
1702 ikev1_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
1703 const struct isakmp_gen
*ext
, u_int item_len
,
1704 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1705 uint32_t proto0 _U_
, int depth _U_
)
1707 const struct ikev1_pl_n
*p
;
1714 static const char *notify_error_str
[] = {
1715 NULL
, "INVALID-PAYLOAD-TYPE",
1716 "DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED",
1717 "INVALID-COOKIE", "INVALID-MAJOR-VERSION",
1718 "INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE",
1719 "INVALID-FLAGS", "INVALID-MESSAGE-ID",
1720 "INVALID-PROTOCOL-ID", "INVALID-SPI",
1721 "INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED",
1722 "NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX",
1723 "PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION",
1724 "INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING",
1725 "INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED",
1726 "INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION",
1727 "AUTHENTICATION-FAILED", "INVALID-SIGNATURE",
1728 "ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME",
1729 "CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE",
1730 "UNEQUAL-PAYLOAD-LENGTHS",
1732 static const char *ipsec_notify_error_str
[] = {
1735 static const char *notify_status_str
[] = {
1738 static const char *ipsec_notify_status_str
[] = {
1739 "RESPONDER-LIFETIME", "REPLAY-STATUS",
1742 /* NOTE: these macro must be called with x in proper range */
1745 #define NOTIFY_ERROR_STR(x) \
1746 STR_OR_ID((x), notify_error_str)
1749 #define IPSEC_NOTIFY_ERROR_STR(x) \
1750 STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
1753 #define NOTIFY_STATUS_STR(x) \
1754 STR_OR_ID((u_int)((x) - 16384), notify_status_str)
1757 #define IPSEC_NOTIFY_STATUS_STR(x) \
1758 STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
1760 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_N
));
1762 p
= (const struct ikev1_pl_n
*)ext
;
1764 doi
= GET_BE_U_4(p
->doi
);
1765 proto
= GET_U_1(p
->prot_id
);
1767 ND_PRINT(" doi=%u", doi
);
1768 ND_PRINT(" proto=%u", proto
);
1769 type
= GET_BE_U_2(p
->type
);
1771 ND_PRINT(" type=%s", NOTIFY_ERROR_STR(type
));
1772 else if (type
< 16384)
1773 ND_PRINT(" type=%s", numstr(type
));
1774 else if (type
< 24576)
1775 ND_PRINT(" type=%s", NOTIFY_STATUS_STR(type
));
1777 ND_PRINT(" type=%s", numstr(type
));
1778 spi_size
= GET_U_1(p
->spi_size
);
1781 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1784 return (const u_char
*)(p
+ 1) + spi_size
;
1787 ND_PRINT(" doi=ipsec");
1788 ND_PRINT(" proto=%s", PROTOIDSTR(proto
));
1789 type
= GET_BE_U_2(p
->type
);
1791 ND_PRINT(" type=%s", NOTIFY_ERROR_STR(type
));
1792 else if (type
< 16384)
1793 ND_PRINT(" type=%s", IPSEC_NOTIFY_ERROR_STR(type
));
1794 else if (type
< 24576)
1795 ND_PRINT(" type=%s", NOTIFY_STATUS_STR(type
));
1796 else if (type
< 32768)
1797 ND_PRINT(" type=%s", IPSEC_NOTIFY_STATUS_STR(type
));
1799 ND_PRINT(" type=%s", numstr(type
));
1800 spi_size
= GET_U_1(p
->spi_size
);
1803 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1807 cp
= (const u_char
*)(p
+ 1) + spi_size
;
1808 ep2
= (const u_char
*)p
+ item_len
;
1812 case IPSECDOI_NTYPE_RESPONDER_LIFETIME
:
1814 const struct attrmap
*map
= oakley_t_map
;
1815 size_t nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1816 ND_PRINT(" attrs=(");
1817 while (cp
< ep
&& cp
< ep2
) {
1818 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
1827 case IPSECDOI_NTYPE_REPLAY_STATUS
:
1828 ND_PRINT(" status=(");
1829 ND_PRINT("replay detection %sabled",
1830 GET_BE_U_4(cp
) ? "en" : "dis");
1835 * XXX - fill in more types here; see, for example,
1836 * draft-ietf-ipsec-notifymsg-04.
1838 if (ndo
->ndo_vflag
> 3) {
1839 ND_PRINT(" data=(");
1840 if (!rawprint(ndo
, (const uint8_t *)(cp
), ep
- cp
))
1844 if (!ike_show_somedata(ndo
, cp
, ep
))
1850 return (const u_char
*)ext
+ item_len
;
1852 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_N
));
1856 static const u_char
*
1857 ikev1_d_print(netdissect_options
*ndo
, u_char tpay _U_
,
1858 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1859 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1860 uint32_t proto0 _U_
, int depth _U_
)
1862 const struct ikev1_pl_d
*p
;
1870 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_D
));
1872 p
= (const struct ikev1_pl_d
*)ext
;
1874 doi
= GET_BE_U_4(p
->doi
);
1875 proto
= GET_U_1(p
->prot_id
);
1877 ND_PRINT(" doi=%u", doi
);
1878 ND_PRINT(" proto=%u", proto
);
1880 ND_PRINT(" doi=ipsec");
1881 ND_PRINT(" proto=%s", PROTOIDSTR(proto
));
1883 spi_size
= GET_U_1(p
->spi_size
);
1884 ND_PRINT(" spilen=%u", spi_size
);
1885 num_spi
= GET_BE_U_2(p
->num_spi
);
1886 ND_PRINT(" nspi=%u", num_spi
);
1887 q
= (const uint8_t *)(p
+ 1);
1890 for (i
= 0; i
< num_spi
; i
++) {
1893 if (!rawprint(ndo
, (const uint8_t *)q
, spi_size
))
1900 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_D
));
1904 static const u_char
*
1905 ikev1_vid_print(netdissect_options
*ndo
, u_char tpay _U_
,
1906 const struct isakmp_gen
*ext
,
1907 u_int item_len
, const u_char
*ep _U_
,
1908 uint32_t phase _U_
, uint32_t doi _U_
,
1909 uint32_t proto _U_
, int depth _U_
)
1911 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_VID
));
1913 ND_TCHECK_SIZE(ext
);
1915 * Our caller has ensured that the length is >= 4.
1917 ND_PRINT(" len=%u", item_len
- 4);
1918 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1919 /* Print the entire payload in hex */
1921 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1924 return (const u_char
*)ext
+ item_len
;
1926 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_VID
));
1930 /************************************************************/
1932 /* IKE v2 - rfc4306 - dissector */
1934 /************************************************************/
1937 ikev2_pay_print(netdissect_options
*ndo
, const char *payname
, uint8_t critical
)
1939 ND_PRINT("%s%s:", payname
, critical
&0x80 ? "[C]" : "");
1942 static const u_char
*
1943 ikev2_gen_print(netdissect_options
*ndo
, u_char tpay
,
1944 const struct isakmp_gen
*ext
, u_int item_len
)
1946 const struct isakmp_gen
*p
= (const struct isakmp_gen
*)ext
;
1948 ND_TCHECK_SIZE(ext
);
1949 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(p
->critical
));
1952 * Our caller has ensured that the length is >= 4.
1954 ND_PRINT(" len=%u", item_len
- 4);
1955 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1956 /* Print the entire payload in hex */
1958 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1961 return (const u_char
*)ext
+ item_len
;
1963 ND_PRINT(" [|%s]", NPSTR(tpay
));
1967 static const u_char
*
1968 ikev2_t_print(netdissect_options
*ndo
, int tcount
,
1969 const struct isakmp_gen
*ext
, u_int item_len
,
1972 const struct ikev2_t
*p
;
1977 const struct attrmap
*map
;
1981 p
= (const struct ikev2_t
*)ext
;
1983 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_T
), GET_U_1(p
->h
.critical
));
1985 t_id
= GET_BE_U_2(p
->t_id
);
1990 t_type
= GET_U_1(p
->t_type
);
1993 idstr
= STR_OR_ID(t_id
, esp_p_map
);
1995 nmap
= sizeof(encr_t_map
)/sizeof(encr_t_map
[0]);
1999 idstr
= STR_OR_ID(t_id
, prf_p_map
);
2003 idstr
= STR_OR_ID(t_id
, integ_p_map
);
2007 idstr
= STR_OR_ID(t_id
, dh_p_map
);
2011 idstr
= STR_OR_ID(t_id
, esn_p_map
);
2020 ND_PRINT(" #%u type=%s id=%s ", tcount
,
2021 STR_OR_ID(t_type
, ikev2_t_type_map
),
2024 ND_PRINT(" #%u type=%s id=%u ", tcount
,
2025 STR_OR_ID(t_type
, ikev2_t_type_map
),
2027 cp
= (const u_char
*)(p
+ 1);
2028 ep2
= (const u_char
*)p
+ item_len
;
2029 while (cp
< ep
&& cp
< ep2
) {
2031 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
2033 cp
= ikev1_attr_print(ndo
, cp
, ep2
);
2041 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_T
));
2045 static const u_char
*
2046 ikev2_p_print(netdissect_options
*ndo
, u_char tpay _U_
, int pcount _U_
,
2047 const struct isakmp_gen
*ext
, u_int oprop_length
,
2048 const u_char
*ep
, int depth
)
2050 const struct ikev2_p
*p
;
2059 p
= (const struct ikev2_p
*)ext
;
2062 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_P
), GET_U_1(p
->h
.critical
));
2065 * ikev2_sa_print() guarantees that this is >= 4.
2067 prop_length
= oprop_length
- 4;
2068 ND_PRINT(" #%u protoid=%s transform=%u len=%u",
2069 GET_U_1(p
->p_no
), PROTOIDSTR(GET_U_1(p
->prot_id
)),
2070 GET_U_1(p
->num_t
), oprop_length
);
2071 cp
= (const u_char
*)(p
+ 1);
2073 spi_size
= GET_U_1(p
->spi_size
);
2075 if (prop_length
< spi_size
)
2078 if (!rawprint(ndo
, (const uint8_t *)cp
, spi_size
))
2081 prop_length
-= spi_size
;
2085 * Print the transforms.
2088 for (np
= ISAKMP_NPTYPE_T
; np
!= 0; np
= GET_U_1(ext
->np
)) {
2090 ext
= (const struct isakmp_gen
*)cp
;
2091 if (prop_length
< sizeof(*ext
))
2093 ND_TCHECK_SIZE(ext
);
2096 * Since we can't have a payload length of less than 4 bytes,
2097 * we need to bail out here if the generic header is nonsensical
2098 * or truncated, otherwise we could loop forever processing
2099 * zero-length items or otherwise misdissect the packet.
2101 item_len
= GET_BE_U_2(ext
->len
);
2105 if (prop_length
< item_len
)
2107 ND_TCHECK_LEN(cp
, item_len
);
2111 for (i
= 0; i
< depth
; i
++)
2114 if (np
== ISAKMP_NPTYPE_T
) {
2115 cp
= ikev2_t_print(ndo
, tcount
, ext
, item_len
, ep
);
2117 /* error, already reported */
2121 ND_PRINT("%s", NPSTR(np
));
2126 prop_length
-= item_len
;
2131 * Skip the rest of the proposal.
2134 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
2137 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
2141 static const u_char
*
2142 ikev2_sa_print(netdissect_options
*ndo
, u_char tpay
,
2143 const struct isakmp_gen
*ext1
,
2144 u_int osa_length
, const u_char
*ep
,
2145 uint32_t phase _U_
, uint32_t doi _U_
,
2146 uint32_t proto _U_
, int depth
)
2148 const struct isakmp_gen
*ext
;
2156 ND_TCHECK_SIZE(ext1
);
2157 ikev2_pay_print(ndo
, "sa", GET_U_1(ext1
->critical
));
2160 * ikev2_sub0_print() guarantees that this is >= 4.
2162 osa_length
= GET_BE_U_2(ext1
->len
);
2163 sa_length
= osa_length
- 4;
2164 ND_PRINT(" len=%u", sa_length
);
2167 * Print the payloads.
2169 cp
= (const u_char
*)(ext1
+ 1);
2171 for (np
= ISAKMP_NPTYPE_P
; np
!= 0; np
= GET_U_1(ext
->np
)) {
2173 ext
= (const struct isakmp_gen
*)cp
;
2174 if (sa_length
< sizeof(*ext
))
2176 ND_TCHECK_SIZE(ext
);
2179 * Since we can't have a payload length of less than 4 bytes,
2180 * we need to bail out here if the generic header is nonsensical
2181 * or truncated, otherwise we could loop forever processing
2182 * zero-length items or otherwise misdissect the packet.
2184 item_len
= GET_BE_U_2(ext
->len
);
2188 if (sa_length
< item_len
)
2190 ND_TCHECK_LEN(cp
, item_len
);
2194 for (i
= 0; i
< depth
; i
++)
2197 if (np
== ISAKMP_NPTYPE_P
) {
2198 cp
= ikev2_p_print(ndo
, np
, pcount
, ext
, item_len
,
2201 /* error, already reported */
2205 ND_PRINT("%s", NPSTR(np
));
2210 sa_length
-= item_len
;
2215 * Skip the rest of the SA.
2218 ND_PRINT(" [|%s]", NPSTR(tpay
));
2221 ND_PRINT(" [|%s]", NPSTR(tpay
));
2225 static const u_char
*
2226 ikev2_ke_print(netdissect_options
*ndo
, u_char tpay
,
2227 const struct isakmp_gen
*ext
,
2228 u_int item_len
, const u_char
*ep _U_
,
2229 uint32_t phase _U_
, uint32_t doi _U_
,
2230 uint32_t proto _U_
, int depth _U_
)
2232 const struct ikev2_ke
*k
;
2234 k
= (const struct ikev2_ke
*)ext
;
2236 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(k
->h
.critical
));
2239 ND_PRINT(" len=%u < 8", item_len
);
2240 return (const u_char
*)ext
+ item_len
;
2242 ND_PRINT(" len=%u group=%s", item_len
- 8,
2243 STR_OR_ID(GET_BE_U_2(k
->ke_group
), dh_p_map
));
2245 if (2 < ndo
->ndo_vflag
&& 8 < item_len
) {
2247 if (!rawprint(ndo
, (const uint8_t *)(k
+ 1), item_len
- 8))
2250 return (const u_char
*)ext
+ item_len
;
2252 ND_PRINT(" [|%s]", NPSTR(tpay
));
2256 static const u_char
*
2257 ikev2_ID_print(netdissect_options
*ndo
, u_char tpay
,
2258 const struct isakmp_gen
*ext
,
2259 u_int item_len
, const u_char
*ep _U_
,
2260 uint32_t phase _U_
, uint32_t doi _U_
,
2261 uint32_t proto _U_
, int depth _U_
)
2263 const struct ikev2_id
*idp
;
2264 u_int idtype_len
, i
;
2265 unsigned int dumpascii
, dumphex
;
2266 const unsigned char *typedata
;
2268 idp
= (const struct ikev2_id
*)ext
;
2269 ND_TCHECK_SIZE(idp
);
2270 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(idp
->h
.critical
));
2273 * Our caller has ensured that the length is >= 4.
2275 ND_PRINT(" len=%u", item_len
- 4);
2276 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
2277 /* Print the entire payload in hex */
2279 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2283 idtype_len
=item_len
- sizeof(struct ikev2_id
);
2286 typedata
= (const unsigned char *)(ext
)+sizeof(struct ikev2_id
);
2288 switch(GET_U_1(idp
->type
)) {
2297 case ID_RFC822_ADDR
:
2298 ND_PRINT(" rfc822:");
2305 case ID_DER_ASN1_DN
:
2309 case ID_DER_ASN1_GN
:
2314 ND_PRINT(" keyid:");
2320 ND_TCHECK_LEN(typedata
, idtype_len
);
2321 for(i
=0; i
<idtype_len
; i
++) {
2322 if(ND_ASCII_ISPRINT(GET_U_1(typedata
+ i
))) {
2323 ND_PRINT("%c", GET_U_1(typedata
+ i
));
2330 if (!rawprint(ndo
, (const uint8_t *)typedata
, idtype_len
))
2334 return (const u_char
*)ext
+ item_len
;
2336 ND_PRINT(" [|%s]", NPSTR(tpay
));
2340 static const u_char
*
2341 ikev2_cert_print(netdissect_options
*ndo
, u_char tpay
,
2342 const struct isakmp_gen
*ext
,
2343 u_int item_len
, const u_char
*ep _U_
,
2344 uint32_t phase _U_
, uint32_t doi _U_
,
2345 uint32_t proto _U_
, int depth _U_
)
2347 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2350 static const u_char
*
2351 ikev2_cr_print(netdissect_options
*ndo
, u_char tpay
,
2352 const struct isakmp_gen
*ext
,
2353 u_int item_len
, const u_char
*ep _U_
,
2354 uint32_t phase _U_
, uint32_t doi _U_
,
2355 uint32_t proto _U_
, int depth _U_
)
2357 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2360 static const u_char
*
2361 ikev2_auth_print(netdissect_options
*ndo
, u_char tpay
,
2362 const struct isakmp_gen
*ext
,
2363 u_int item_len
, const u_char
*ep
,
2364 uint32_t phase _U_
, uint32_t doi _U_
,
2365 uint32_t proto _U_
, int depth _U_
)
2367 const struct ikev2_auth
*p
;
2368 const char *v2_auth
[]={ "invalid", "rsasig",
2369 "shared-secret", "dsssig" };
2370 const u_char
*authdata
= (const u_char
*)ext
+ sizeof(struct ikev2_auth
);
2372 ND_TCHECK_LEN(ext
, sizeof(struct ikev2_auth
));
2373 p
= (const struct ikev2_auth
*)ext
;
2374 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(p
->h
.critical
));
2377 * Our caller has ensured that the length is >= 4.
2379 ND_PRINT(" len=%u method=%s", item_len
-4,
2380 STR_OR_ID(GET_U_1(p
->auth_method
), v2_auth
));
2382 if (ndo
->ndo_vflag
> 1) {
2383 ND_PRINT(" authdata=(");
2384 if (!rawprint(ndo
, (const uint8_t *)authdata
, item_len
- sizeof(struct ikev2_auth
)))
2387 } else if (ndo
->ndo_vflag
) {
2388 if (!ike_show_somedata(ndo
, authdata
, ep
))
2393 return (const u_char
*)ext
+ item_len
;
2395 ND_PRINT(" [|%s]", NPSTR(tpay
));
2399 static const u_char
*
2400 ikev2_nonce_print(netdissect_options
*ndo
, u_char tpay
,
2401 const struct isakmp_gen
*ext
,
2402 u_int item_len
, const u_char
*ep
,
2403 uint32_t phase _U_
, uint32_t doi _U_
,
2404 uint32_t proto _U_
, int depth _U_
)
2406 ND_TCHECK_SIZE(ext
);
2407 ikev2_pay_print(ndo
, "nonce", GET_U_1(ext
->critical
));
2410 * Our caller has ensured that the length is >= 4.
2412 ND_PRINT(" len=%u", item_len
- 4);
2413 if (1 < ndo
->ndo_vflag
&& 4 < item_len
) {
2414 ND_PRINT(" nonce=(");
2415 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2418 } else if(ndo
->ndo_vflag
&& 4 < item_len
) {
2419 if(!ike_show_somedata(ndo
, (const u_char
*)(ext
+1), ep
)) goto trunc
;
2422 return (const u_char
*)ext
+ item_len
;
2424 ND_PRINT(" [|%s]", NPSTR(tpay
));
2428 /* notify payloads */
2429 static const u_char
*
2430 ikev2_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
2431 const struct isakmp_gen
*ext
,
2432 u_int item_len
, const u_char
*ep
,
2433 uint32_t phase _U_
, uint32_t doi _U_
,
2434 uint32_t proto _U_
, int depth _U_
)
2436 const struct ikev2_n
*p
;
2440 u_char showspi
, showsomedata
;
2441 const char *notify_name
;
2443 p
= (const struct ikev2_n
*)ext
;
2445 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_N
), GET_U_1(p
->h
.critical
));
2451 ND_PRINT(" prot_id=%s", PROTOIDSTR(GET_U_1(p
->prot_id
)));
2453 type
= GET_BE_U_2(p
->type
);
2455 /* notify space is annoying sparse */
2457 case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
:
2458 notify_name
= "unsupported_critical_payload";
2461 case IV2_NOTIFY_INVALID_IKE_SPI
:
2462 notify_name
= "invalid_ike_spi";
2466 case IV2_NOTIFY_INVALID_MAJOR_VERSION
:
2467 notify_name
= "invalid_major_version";
2470 case IV2_NOTIFY_INVALID_SYNTAX
:
2471 notify_name
= "invalid_syntax";
2475 case IV2_NOTIFY_INVALID_MESSAGE_ID
:
2476 notify_name
= "invalid_message_id";
2480 case IV2_NOTIFY_INVALID_SPI
:
2481 notify_name
= "invalid_spi";
2485 case IV2_NOTIFY_NO_PROPOSAL_CHOSEN
:
2486 notify_name
= "no_proposal_chosen";
2490 case IV2_NOTIFY_INVALID_KE_PAYLOAD
:
2491 notify_name
= "invalid_ke_payload";
2495 case IV2_NOTIFY_AUTHENTICATION_FAILED
:
2496 notify_name
= "authentication_failed";
2500 case IV2_NOTIFY_SINGLE_PAIR_REQUIRED
:
2501 notify_name
= "single_pair_required";
2505 case IV2_NOTIFY_NO_ADDITIONAL_SAS
:
2506 notify_name
= "no_additional_sas";
2509 case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
:
2510 notify_name
= "internal_address_failure";
2513 case IV2_NOTIFY_FAILED_CP_REQUIRED
:
2514 notify_name
= "failed_cp_required";
2517 case IV2_NOTIFY_TS_UNACCEPTABLE
:
2518 notify_name
= "ts_unacceptable";
2521 case IV2_NOTIFY_INVALID_SELECTORS
:
2522 notify_name
= "invalid_selectors";
2525 case IV2_NOTIFY_UNACCEPTABLE_ADDRESSES
:
2526 notify_name
= "unacceptable_addresses";
2529 case IV2_NOTIFY_UNEXPECTED_NAT_DETECTED
:
2530 notify_name
= "unexpected_nat_detected";
2533 case IV2_NOTIFY_USE_ASSIGNED_HOA
:
2534 notify_name
= "use_assigned_hoa";
2537 case IV2_NOTIFY_TEMPORARY_FAILURE
:
2538 notify_name
= "temporary_failure";
2541 case IV2_NOTIFY_CHILD_SA_NOT_FOUND
:
2542 notify_name
= "child_sa_not_found";
2545 case IV2_NOTIFY_INVALID_GROUP_ID
:
2546 notify_name
= "invalid_group_id";
2549 case IV2_NOTIFY_AUTHORIZATION_FAILED
:
2550 notify_name
= "authorization_failed";
2553 case IV2_NOTIFY_STATE_NOT_FOUND
:
2554 notify_name
= "state_not_found";
2557 case IV2_NOTIFY_INITIAL_CONTACT
:
2558 notify_name
= "initial_contact";
2561 case IV2_NOTIFY_SET_WINDOW_SIZE
:
2562 notify_name
= "set_window_size";
2565 case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
:
2566 notify_name
= "additional_ts_possible";
2569 case IV2_NOTIFY_IPCOMP_SUPPORTED
:
2570 notify_name
= "ipcomp_supported";
2573 case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
:
2574 notify_name
= "nat_detection_source_ip";
2578 case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
:
2579 notify_name
= "nat_detection_destination_ip";
2583 case IV2_NOTIFY_COOKIE
:
2584 notify_name
= "cookie";
2589 case IV2_NOTIFY_USE_TRANSPORT_MODE
:
2590 notify_name
= "use_transport_mode";
2593 case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
:
2594 notify_name
= "http_cert_lookup_supported";
2597 case IV2_NOTIFY_REKEY_SA
:
2598 notify_name
= "rekey_sa";
2602 case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
:
2603 notify_name
= "tfc_padding_not_supported";
2606 case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
:
2607 notify_name
= "non_first_fragment_also";
2610 case IV2_NOTIFY_MOBIKE_SUPPORTED
:
2611 notify_name
= "mobike_supported";
2614 case IV2_NOTIFY_ADDITIONAL_IP4_ADDRESS
:
2615 notify_name
= "additional_ip4_address";
2618 case IV2_NOTIFY_ADDITIONAL_IP6_ADDRESS
:
2619 notify_name
= "additional_ip6_address";
2622 case IV2_NOTIFY_NO_ADDITIONAL_ADDRESSES
:
2623 notify_name
= "no_additional_addresses";
2626 case IV2_NOTIFY_UPDATE_SA_ADDRESSES
:
2627 notify_name
= "update_sa_addresses";
2630 case IV2_NOTIFY_COOKIE2
:
2631 notify_name
= "cookie2";
2634 case IV2_NOTIFY_NO_NATS_ALLOWED
:
2635 notify_name
= "no_nats_allowed";
2638 case IV2_NOTIFY_AUTH_LIFETIME
:
2639 notify_name
= "auth_lifetime";
2642 case IV2_NOTIFY_MULTIPLE_AUTH_SUPPORTED
:
2643 notify_name
= "multiple_auth_supported";
2646 case IV2_NOTIFY_ANOTHER_AUTH_FOLLOWS
:
2647 notify_name
= "another_auth_follows";
2650 case IV2_NOTIFY_REDIRECT_SUPPORTED
:
2651 notify_name
= "redirect_supported";
2654 case IV2_NOTIFY_REDIRECT
:
2655 notify_name
= "redirect";
2658 case IV2_NOTIFY_REDIRECTED_FROM
:
2659 notify_name
= "redirected_from";
2662 case IV2_NOTIFY_TICKET_LT_OPAQUE
:
2663 notify_name
= "ticket_lt_opaque";
2666 case IV2_NOTIFY_TICKET_REQUEST
:
2667 notify_name
= "ticket_request";
2670 case IV2_NOTIFY_TICKET_ACK
:
2671 notify_name
= "ticket_ack";
2674 case IV2_NOTIFY_TICKET_NACK
:
2675 notify_name
= "ticket_nack";
2678 case IV2_NOTIFY_TICKET_OPAQUE
:
2679 notify_name
= "ticket_opaque";
2682 case IV2_NOTIFY_LINK_ID
:
2683 notify_name
= "link_id";
2686 case IV2_NOTIFY_USE_WESP_MODE
:
2687 notify_name
= "use_wesp_mode";
2690 case IV2_NOTIFY_ROHC_SUPPORTED
:
2691 notify_name
= "rohc_supported";
2694 case IV2_NOTIFY_EAP_ONLY_AUTHENTICATION
:
2695 notify_name
= "eap_only_authentication";
2698 case IV2_NOTIFY_CHILDLESS_IKEV2_SUPPORTED
:
2699 notify_name
= "childless_ikev2_supported";
2702 case IV2_NOTIFY_QUICK_CRASH_DETECTION
:
2703 notify_name
= "quick_crash_detection";
2706 case IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC_SUPPORTED
:
2707 notify_name
= "ikev2_message_id_sync_supported";
2710 case IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED
:
2711 notify_name
= "ipsec_replay_counter_sync_supported";
2714 case IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC
:
2715 notify_name
= "ikev2_message_id_sync";
2718 case IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC
:
2719 notify_name
= "ipsec_replay_counter_sync";
2722 case IV2_NOTIFY_SECURE_PASSWORD_METHODS
:
2723 notify_name
= "secure_password_methods";
2726 case IV2_NOTIFY_PSK_PERSIST
:
2727 notify_name
= "psk_persist";
2730 case IV2_NOTIFY_PSK_CONFIRM
:
2731 notify_name
= "psk_confirm";
2734 case IV2_NOTIFY_ERX_SUPPORTED
:
2735 notify_name
= "erx_supported";
2738 case IV2_NOTIFY_IFOM_CAPABILITY
:
2739 notify_name
= "ifom_capability";
2742 case IV2_NOTIFY_SENDER_REQUEST_ID
:
2743 notify_name
= "sender_request_id";
2746 case IV2_NOTIFY_IKEV2_FRAGMENTATION_SUPPORTED
:
2747 notify_name
= "ikev2_fragmentation_supported";
2750 case IV2_NOTIFY_SIGNATURE_HASH_ALGORITHMS
:
2751 notify_name
= "signature_hash_algorithms";
2754 case IV2_NOTIFY_CLONE_IKE_SA_SUPPORTED
:
2755 notify_name
= "clone_ike_sa_supported";
2758 case IV2_NOTIFY_CLONE_IKE_SA
:
2759 notify_name
= "clone_ike_sa";
2762 case IV2_NOTIFY_PUZZLE
:
2763 notify_name
= "puzzle";
2766 case IV2_NOTIFY_USE_PPK
:
2767 notify_name
= "use_ppk";
2770 case IV2_NOTIFY_PPK_IDENTITY
:
2771 notify_name
= "ppk_identity";
2774 case IV2_NOTIFY_NO_PPK_AUTH
:
2775 notify_name
= "no_ppk_auth";
2778 case IV2_NOTIFY_INTERMEDIATE_EXCHANGE_SUPPORTED
:
2779 notify_name
= "intermediate_exchange_supported";
2782 case IV2_NOTIFY_IP4_ALLOWED
:
2783 notify_name
= "ip4_allowed";
2786 case IV2_NOTIFY_IP6_ALLOWED
:
2787 notify_name
= "ip6_allowed";
2790 case IV2_NOTIFY_ADDITIONAL_KEY_EXCHANGE
:
2791 notify_name
= "additional_key_exchange";
2794 case IV2_NOTIFY_USE_AGGFRAG
:
2795 notify_name
= "use_aggfrag";
2801 notify_name
="error";
2802 } else if(type
< 16384) {
2803 notify_name
="private-error";
2804 } else if(type
< 40960) {
2805 notify_name
="status";
2807 notify_name
="private-status";
2812 ND_PRINT(" type=%u(%s)", type
, notify_name
);
2816 spi_size
= GET_U_1(p
->spi_size
);
2817 if (showspi
&& spi_size
) {
2819 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
2823 cp
= (const u_char
*)(p
+ 1) + spi_size
;
2826 if (ndo
->ndo_vflag
> 3 || (showsomedata
&& ep
-cp
< 30)) {
2827 ND_PRINT(" data=(");
2828 if (!rawprint(ndo
, (const uint8_t *)(cp
), ep
- cp
))
2832 } else if (showsomedata
) {
2833 if (!ike_show_somedata(ndo
, cp
, ep
))
2838 return (const u_char
*)ext
+ item_len
;
2840 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_N
));
2844 static const u_char
*
2845 ikev2_d_print(netdissect_options
*ndo
, u_char tpay
,
2846 const struct isakmp_gen
*ext
,
2847 u_int item_len
, const u_char
*ep _U_
,
2848 uint32_t phase _U_
, uint32_t doi _U_
,
2849 uint32_t proto _U_
, int depth _U_
)
2851 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2854 static const u_char
*
2855 ikev2_vid_print(netdissect_options
*ndo
, u_char tpay
,
2856 const struct isakmp_gen
*ext
,
2857 u_int item_len
, const u_char
*ep _U_
,
2858 uint32_t phase _U_
, uint32_t doi _U_
,
2859 uint32_t proto _U_
, int depth _U_
)
2864 ND_TCHECK_SIZE(ext
);
2865 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(ext
->critical
));
2868 * Our caller has ensured that the length is >= 4.
2870 ND_PRINT(" len=%u vid=", item_len
- 4);
2872 vid
= (const u_char
*)(ext
+1);
2874 ND_TCHECK_LEN(vid
, len
);
2875 for(i
=0; i
<len
; i
++) {
2876 if(ND_ASCII_ISPRINT(GET_U_1(vid
+ i
)))
2877 ND_PRINT("%c", GET_U_1(vid
+ i
));
2880 if (2 < ndo
->ndo_vflag
&& 4 < len
) {
2881 /* Print the entire payload in hex */
2883 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2886 return (const u_char
*)ext
+ item_len
;
2888 ND_PRINT(" [|%s]", NPSTR(tpay
));
2892 static const u_char
*
2893 ikev2_TS_print(netdissect_options
*ndo
, u_char tpay
,
2894 const struct isakmp_gen
*ext
,
2895 u_int item_len
, const u_char
*ep _U_
,
2896 uint32_t phase _U_
, uint32_t doi _U_
,
2897 uint32_t proto _U_
, int depth _U_
)
2899 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2902 static const u_char
*
2903 ikev2_e_print(netdissect_options
*ndo
,
2904 #ifndef HAVE_LIBCRYPTO
2907 const struct isakmp
*base
,
2909 const struct isakmp_gen
*ext
,
2910 u_int item_len
, const u_char
*ep _U_
,
2911 #ifndef HAVE_LIBCRYPTO
2915 #ifndef HAVE_LIBCRYPTO
2919 #ifndef HAVE_LIBCRYPTO
2923 #ifndef HAVE_LIBCRYPTO
2930 #ifdef HAVE_LIBCRYPTO
2934 ND_TCHECK_SIZE(ext
);
2935 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(ext
->critical
));
2939 ND_PRINT(" len=%u", dlen
);
2940 if (2 < ndo
->ndo_vflag
&& 4 < dlen
) {
2942 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), dlen
))
2946 dat
= (const u_char
*)(ext
+1);
2947 ND_TCHECK_LEN(dat
, dlen
);
2949 #ifdef HAVE_LIBCRYPTO
2950 np
= GET_U_1(ext
->np
);
2952 /* try to decrypt it! */
2953 if(esp_decrypt_buffer_by_ikev2_print(ndo
,
2954 GET_U_1(base
->flags
) & ISAKMP_FLAG_I
,
2955 base
->i_ck
, base
->r_ck
,
2958 ext
= (const struct isakmp_gen
*)ndo
->ndo_packetp
;
2960 /* got it decrypted, print stuff inside. */
2961 ikev2_sub_print(ndo
, base
, np
, ext
,
2962 ndo
->ndo_snapend
, phase
, doi
, proto
, depth
+1);
2965 * esp_decrypt_buffer_by_ikev2_print pushed information
2966 * on the buffer stack; we're done with the buffer, so
2967 * pop it (which frees the buffer)
2969 nd_pop_packet_info(ndo
);
2974 /* always return NULL, because E must be at end, and NP refers
2975 * to what was inside.
2979 ND_PRINT(" [|%s]", NPSTR(tpay
));
2983 static const u_char
*
2984 ikev2_cp_print(netdissect_options
*ndo
, u_char tpay
,
2985 const struct isakmp_gen
*ext
,
2986 u_int item_len
, const u_char
*ep _U_
,
2987 uint32_t phase _U_
, uint32_t doi _U_
,
2988 uint32_t proto _U_
, int depth _U_
)
2990 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2993 static const u_char
*
2994 ikev2_eap_print(netdissect_options
*ndo
, u_char tpay
,
2995 const struct isakmp_gen
*ext
,
2996 u_int item_len
, const u_char
*ep _U_
,
2997 uint32_t phase _U_
, uint32_t doi _U_
,
2998 uint32_t proto _U_
, int depth _U_
)
3000 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
3003 static const u_char
*
3004 ike_sub0_print(netdissect_options
*ndo
,
3005 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
3007 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3012 cp
= (const u_char
*)ext
;
3013 ND_TCHECK_SIZE(ext
);
3016 * Since we can't have a payload length of less than 4 bytes,
3017 * we need to bail out here if the generic header is nonsensical
3018 * or truncated, otherwise we could loop forever processing
3019 * zero-length items or otherwise misdissect the packet.
3021 item_len
= GET_BE_U_2(ext
->len
);
3027 * XXX - what if item_len is too short, or too long,
3028 * for this payload type?
3030 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
, ep
, phase
, doi
, proto
, depth
);
3032 ND_PRINT("%s", NPSTR(np
));
3038 nd_print_trunc(ndo
);
3042 static const u_char
*
3043 ikev1_sub_print(netdissect_options
*ndo
,
3044 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
3045 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3051 cp
= (const u_char
*)ext
;
3054 ND_TCHECK_SIZE(ext
);
3056 item_len
= GET_BE_U_2(ext
->len
);
3057 ND_TCHECK_LEN(ext
, item_len
);
3061 for (i
= 0; i
< depth
; i
++)
3064 cp
= ike_sub0_print(ndo
, np
, ext
, ep
, phase
, doi
, proto
, depth
);
3069 /* Zero-length subitem */
3073 np
= GET_U_1(ext
->np
);
3074 ext
= (const struct isakmp_gen
*)cp
;
3078 ND_PRINT(" [|%s]", NPSTR(np
));
3085 static char buf
[20];
3086 snprintf(buf
, sizeof(buf
), "#%u", x
);
3091 ikev1_print(netdissect_options
*ndo
,
3092 const u_char
*bp
, u_int length
,
3093 const u_char
*bp2
, const struct isakmp
*base
)
3095 const struct isakmp
*p
;
3102 p
= (const struct isakmp
*)bp
;
3103 ep
= ndo
->ndo_snapend
;
3105 phase
= (GET_BE_U_4(base
->msgid
) == 0) ? 1 : 2;
3107 ND_PRINT(" phase %u", phase
);
3109 ND_PRINT(" phase %u/others", phase
);
3111 i
= cookie_find(&base
->i_ck
);
3113 if (iszero(ndo
, base
->r_ck
, sizeof(base
->r_ck
))) {
3114 /* the first packet */
3117 cookie_record(ndo
, &base
->i_ck
, bp2
);
3121 if (bp2
&& cookie_isinitiator(ndo
, i
, bp2
))
3123 else if (bp2
&& cookie_isresponder(ndo
, i
, bp2
))
3129 ND_PRINT(" %s", ETYPESTR(GET_U_1(base
->etype
)));
3130 flags
= GET_U_1(base
->flags
);
3132 ND_PRINT("[%s%s]", flags
& ISAKMP_FLAG_E
? "E" : "",
3133 flags
& ISAKMP_FLAG_C
? "C" : "");
3136 if (ndo
->ndo_vflag
) {
3137 const struct isakmp_gen
*ext
;
3141 np
= GET_U_1(base
->np
);
3143 /* regardless of phase... */
3144 if (flags
& ISAKMP_FLAG_E
) {
3146 * encrypted, nothing we can do right now.
3147 * we hope to decrypt the packet in the future...
3149 ND_PRINT(" [encrypted %s]", NPSTR(np
));
3153 CHECKLEN(p
+ 1, np
);
3154 ext
= (const struct isakmp_gen
*)(p
+ 1);
3155 ikev1_sub_print(ndo
, np
, ext
, ep
, phase
, 0, 0, 0);
3159 if (ndo
->ndo_vflag
) {
3160 if (GET_BE_U_4(base
->len
) != length
) {
3161 ND_PRINT(" (len mismatch: isakmp %u/ip %u)",
3162 GET_BE_U_4(base
->len
), length
);
3167 static const u_char
*
3168 ikev2_sub0_print(netdissect_options
*ndo
, const struct isakmp
*base
,
3170 const struct isakmp_gen
*ext
, const u_char
*ep
,
3171 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3176 cp
= (const u_char
*)ext
;
3177 ND_TCHECK_SIZE(ext
);
3180 * Since we can't have a payload length of less than 4 bytes,
3181 * we need to bail out here if the generic header is nonsensical
3182 * or truncated, otherwise we could loop forever processing
3183 * zero-length items or otherwise misdissect the packet.
3185 item_len
= GET_BE_U_2(ext
->len
);
3189 if (np
== ISAKMP_NPTYPE_v2E
) {
3190 cp
= ikev2_e_print(ndo
, base
, np
, ext
, item_len
,
3191 ep
, phase
, doi
, proto
, depth
);
3192 } else if (NPFUNC(np
)) {
3194 * XXX - what if item_len is too short, or too long,
3195 * for this payload type?
3197 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
,
3198 ep
, phase
, doi
, proto
, depth
);
3200 ND_PRINT("%s", NPSTR(np
));
3206 nd_print_trunc(ndo
);
3210 static const u_char
*
3211 ikev2_sub_print(netdissect_options
*ndo
,
3212 const struct isakmp
*base
,
3213 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
3214 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3219 cp
= (const u_char
*)ext
;
3221 ND_TCHECK_SIZE(ext
);
3223 ND_TCHECK_LEN(ext
, GET_BE_U_2(ext
->len
));
3227 for (i
= 0; i
< depth
; i
++)
3230 cp
= ikev2_sub0_print(ndo
, base
, np
,
3231 ext
, ep
, phase
, doi
, proto
, depth
);
3236 /* Zero-length subitem */
3240 np
= GET_U_1(ext
->np
);
3241 ext
= (const struct isakmp_gen
*)cp
;
3245 ND_PRINT(" [|%s]", NPSTR(np
));
3250 ikev2_print(netdissect_options
*ndo
,
3251 const u_char
*bp
, u_int length
,
3252 const u_char
*bp2 _U_
, const struct isakmp
*base
)
3254 const struct isakmp
*p
;
3260 p
= (const struct isakmp
*)bp
;
3261 ep
= ndo
->ndo_snapend
;
3263 phase
= (GET_BE_U_4(base
->msgid
) == 0) ? 1 : 2;
3265 ND_PRINT(" parent_sa");
3267 ND_PRINT(" child_sa ");
3269 ND_PRINT(" %s", ETYPESTR(GET_U_1(base
->etype
)));
3270 flags
= GET_U_1(base
->flags
);
3272 ND_PRINT("[%s%s%s]",
3273 flags
& ISAKMP_FLAG_I
? "I" : "",
3274 flags
& ISAKMP_FLAG_V
? "V" : "",
3275 flags
& ISAKMP_FLAG_R
? "R" : "");
3278 if (ndo
->ndo_vflag
) {
3279 const struct isakmp_gen
*ext
;
3283 np
= GET_U_1(base
->np
);
3285 /* regardless of phase... */
3286 if (flags
& ISAKMP_FLAG_E
) {
3288 * encrypted, nothing we can do right now.
3289 * we hope to decrypt the packet in the future...
3291 ND_PRINT(" [encrypted %s]", NPSTR(np
));
3296 ext
= (const struct isakmp_gen
*)(p
+ 1);
3297 ikev2_sub_print(ndo
, base
, np
, ext
, ep
, phase
, 0, 0, 0);
3301 if (ndo
->ndo_vflag
) {
3302 if (GET_BE_U_4(base
->len
) != length
) {
3303 ND_PRINT(" (len mismatch: isakmp %u/ip %u)",
3304 GET_BE_U_4(base
->len
), length
);
3310 isakmp_print(netdissect_options
*ndo
,
3311 const u_char
*bp
, u_int length
,
3314 const struct isakmp
*p
;
3318 ndo
->ndo_protocol
= "isakmp";
3319 #ifdef HAVE_LIBCRYPTO
3320 /* initialize SAs */
3321 if (ndo
->ndo_sa_list_head
== NULL
) {
3322 if (ndo
->ndo_espsecret
)
3323 esp_decodesecret_print(ndo
);
3327 p
= (const struct isakmp
*)bp
;
3328 ep
= ndo
->ndo_snapend
;
3330 if ((const struct isakmp
*)ep
< p
+ 1) {
3331 nd_print_trunc(ndo
);
3336 major
= (GET_U_1(p
->vers
) & ISAKMP_VERS_MAJOR
)
3337 >> ISAKMP_VERS_MAJOR_SHIFT
;
3338 minor
= (GET_U_1(p
->vers
) & ISAKMP_VERS_MINOR
)
3339 >> ISAKMP_VERS_MINOR_SHIFT
;
3341 if (ndo
->ndo_vflag
) {
3342 ND_PRINT(" %u.%u", major
, minor
);
3345 if (ndo
->ndo_vflag
) {
3346 ND_PRINT(" msgid ");
3347 hexprint(ndo
, p
->msgid
, sizeof(p
->msgid
));
3350 if (1 < ndo
->ndo_vflag
) {
3351 ND_PRINT(" cookie ");
3352 hexprint(ndo
, p
->i_ck
, sizeof(p
->i_ck
));
3354 hexprint(ndo
, p
->r_ck
, sizeof(p
->r_ck
));
3359 case IKEv1_MAJOR_VERSION
:
3360 ikev1_print(ndo
, bp
, length
, bp2
, p
);
3363 case IKEv2_MAJOR_VERSION
:
3364 ikev2_print(ndo
, bp
, length
, bp2
, p
);
3370 isakmp_rfc3948_print(netdissect_options
*ndo
,
3371 const u_char
*bp
, u_int length
,
3372 const u_char
*bp2
, int ver
, int fragmented
, u_int ttl_hl
)
3374 ndo
->ndo_protocol
= "isakmp_rfc3948";
3375 if(length
== 1 && GET_U_1(bp
)==0xff) {
3376 ND_PRINT("isakmp-nat-keep-alive");
3385 * see if this is an IKE packet
3387 if (GET_BE_U_4(bp
) == 0) {
3388 ND_PRINT("NONESP-encap: ");
3389 isakmp_print(ndo
, bp
+4, length
-4, bp2
);
3393 /* must be an ESP packet */
3395 ND_PRINT("UDP-encap: ");
3397 esp_print(ndo
, bp
, length
, bp2
, ver
, fragmented
, ttl_hl
);
3400 * Either this has decrypted the payload and
3401 * printed it, in which case there's nothing more
3402 * to do, or it hasn't, in which case there's
3403 * nothing more to do.
3409 nd_print_trunc(ndo
);