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 */
37 /* The functions from print-esp.c used in this file are only defined when both
38 * OpenSSL and evp.h are detected. Employ the same preprocessor device here.
40 #ifndef HAVE_OPENSSL_EVP_H
44 #include "netdissect-stdinc.h"
48 #include "netdissect-ctype.h"
50 #include "netdissect.h"
51 #include "addrtoname.h"
56 #include "ipproto.h" /* for netdb_protoname() */
58 typedef nd_byte cookie_t
[8];
59 typedef nd_byte msgid_t
[4];
61 #define PORT_ISAKMP 500
63 /* 3.1 ISAKMP Header Format (IKEv1 and IKEv2)
64 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
65 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
73 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
75 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80 cookie_t i_ck
; /* Initiator Cookie */
81 cookie_t r_ck
; /* Responder Cookie */
82 nd_uint8_t np
; /* Next Payload Type */
84 #define ISAKMP_VERS_MAJOR 0xf0
85 #define ISAKMP_VERS_MAJOR_SHIFT 4
86 #define ISAKMP_VERS_MINOR 0x0f
87 #define ISAKMP_VERS_MINOR_SHIFT 0
88 nd_uint8_t etype
; /* Exchange Type */
89 nd_uint8_t flags
; /* Flags */
91 nd_uint32_t len
; /* Length */
94 /* Next Payload Type */
95 #define ISAKMP_NPTYPE_NONE 0 /* NONE*/
96 #define ISAKMP_NPTYPE_SA 1 /* Security Association */
97 #define ISAKMP_NPTYPE_P 2 /* Proposal */
98 #define ISAKMP_NPTYPE_T 3 /* Transform */
99 #define ISAKMP_NPTYPE_KE 4 /* Key Exchange */
100 #define ISAKMP_NPTYPE_ID 5 /* Identification */
101 #define ISAKMP_NPTYPE_CERT 6 /* Certificate */
102 #define ISAKMP_NPTYPE_CR 7 /* Certificate Request */
103 #define ISAKMP_NPTYPE_HASH 8 /* Hash */
104 #define ISAKMP_NPTYPE_SIG 9 /* Signature */
105 #define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
106 #define ISAKMP_NPTYPE_N 11 /* Notification */
107 #define ISAKMP_NPTYPE_D 12 /* Delete */
108 #define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
109 #define ISAKMP_NPTYPE_v2E 46 /* v2 Encrypted payload */
111 #define IKEv1_MAJOR_VERSION 1
112 #define IKEv1_MINOR_VERSION 0
114 #define IKEv2_MAJOR_VERSION 2
115 #define IKEv2_MINOR_VERSION 0
118 #define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
119 #define ISAKMP_FLAG_C 0x02 /* Commit Bit */
120 #define ISAKMP_FLAG_extra 0x04
123 #define ISAKMP_FLAG_I (1 << 3) /* (I)nitiator */
124 #define ISAKMP_FLAG_V (1 << 4) /* (V)ersion */
125 #define ISAKMP_FLAG_R (1 << 5) /* (R)esponse */
128 /* 3.2 Payload Generic Header
129 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
130 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
131 ! Next Payload ! RESERVED ! Payload Length !
132 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
135 nd_uint8_t np
; /* Next Payload */
136 nd_uint8_t critical
; /* bit 7 - critical, rest is RESERVED */
137 nd_uint16_t len
; /* Payload Length */
140 /* 3.3 Data Attributes
141 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
142 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
143 !A! Attribute Type ! AF=0 Attribute Length !
144 !F! ! AF=1 Attribute Value !
145 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
146 . AF=0 Attribute Value .
147 . AF=1 Not Transmitted .
148 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
151 nd_uint16_t type
; /* defined by DOI-spec, and Attribute Format */
152 nd_uint16_t lorv
; /* if f equal 1, Attribute Length */
153 /* if f equal 0, Attribute Value */
154 /* if f equal 1, Attribute Value */
157 /* 3.4 Security Association Payload */
158 /* MAY NOT be used, because of being defined in ipsec-doi. */
160 If the current payload is the last in the message,
161 then the value of the next payload field will be 0.
162 This field MUST NOT contain the
163 values for the Proposal or Transform payloads as they are considered
164 part of the security association negotiation. For example, this
165 field would contain the value "10" (Nonce payload) in the first
166 message of a Base Exchange (see Section 4.4) and the value "0" in the
167 first message of an Identity Protect Exchange (see Section 4.5).
171 nd_uint32_t doi
; /* Domain of Interpretation */
172 nd_uint32_t sit
; /* Situation */
175 /* 3.5 Proposal Payload */
177 The value of the next payload field MUST only contain the value "2"
178 or "0". If there are additional Proposal payloads in the message,
179 then this field will be 2. If the current Proposal payload is the
180 last within the security association proposal, then this field will
185 nd_uint8_t p_no
; /* Proposal # */
186 nd_uint8_t prot_id
; /* Protocol */
187 nd_uint8_t spi_size
; /* SPI Size */
188 nd_uint8_t num_t
; /* Number of Transforms */
192 /* 3.6 Transform Payload */
194 The value of the next payload field MUST only contain the value "3"
195 or "0". If there are additional Transform payloads in the proposal,
196 then this field will be 3. If the current Transform payload is the
197 last within the proposal, then this field will be 0.
201 nd_uint8_t t_no
; /* Transform # */
202 nd_uint8_t t_id
; /* Transform-Id */
203 nd_byte reserved
[2]; /* RESERVED2 */
207 /* 3.7 Key Exchange Payload */
210 /* Key Exchange Data */
213 /* 3.8 Identification Payload */
214 /* MUST NOT to be used, because of being defined in ipsec-doi. */
218 nd_uint8_t id_type
; /* ID Type */
219 nd_uint32_t doi_data
; /* DOI Specific ID Data */
221 /* Identification Data */
224 /* 3.9 Certificate Payload */
225 struct ikev1_pl_cert
{
227 nd_uint8_t encode
; /* Cert Encoding */
228 nd_uint8_t cert
; /* Certificate Data */
230 This field indicates the type of
231 certificate or certificate-related information contained in the
232 Certificate Data field.
236 /* 3.10 Certificate Request Payload */
239 nd_uint8_t num_cert
; /* # Cert. Types */
241 Certificate Types (variable length)
242 -- Contains a list of the types of certificates requested,
243 sorted in order of preference. Each individual certificate
244 type is 1 octet. This field is NOT requiredo
246 /* # Certificate Authorities (1 octet) */
247 /* Certificate Authorities (variable length) */
250 /* 3.11 Hash Payload */
251 /* may not be used, because of having only data. */
252 struct ikev1_pl_hash
{
257 /* 3.12 Signature Payload */
258 /* may not be used, because of having only data. */
259 struct ikev1_pl_sig
{
264 /* 3.13 Nonce Payload */
265 /* may not be used, because of having only data. */
266 struct ikev1_pl_nonce
{
271 /* 3.14 Notification Payload */
274 nd_uint32_t doi
; /* Domain of Interpretation */
275 nd_uint8_t prot_id
; /* Protocol-ID */
276 nd_uint8_t spi_size
; /* SPI Size */
277 nd_uint16_t type
; /* Notify Message Type */
279 /* Notification Data */
282 /* 3.14.1 Notify Message Types */
283 /* NOTIFY MESSAGES - ERROR TYPES */
284 #define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE 1
285 #define ISAKMP_NTYPE_DOI_NOT_SUPPORTED 2
286 #define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED 3
287 #define ISAKMP_NTYPE_INVALID_COOKIE 4
288 #define ISAKMP_NTYPE_INVALID_MAJOR_VERSION 5
289 #define ISAKMP_NTYPE_INVALID_MINOR_VERSION 6
290 #define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE 7
291 #define ISAKMP_NTYPE_INVALID_FLAGS 8
292 #define ISAKMP_NTYPE_INVALID_MESSAGE_ID 9
293 #define ISAKMP_NTYPE_INVALID_PROTOCOL_ID 10
294 #define ISAKMP_NTYPE_INVALID_SPI 11
295 #define ISAKMP_NTYPE_INVALID_TRANSFORM_ID 12
296 #define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED 13
297 #define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN 14
298 #define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX 15
299 #define ISAKMP_NTYPE_PAYLOAD_MALFORMED 16
300 #define ISAKMP_NTYPE_INVALID_KEY_INFORMATION 17
301 #define ISAKMP_NTYPE_INVALID_ID_INFORMATION 18
302 #define ISAKMP_NTYPE_INVALID_CERT_ENCODING 19
303 #define ISAKMP_NTYPE_INVALID_CERTIFICATE 20
304 #define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX 21
305 #define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY 22
306 #define ISAKMP_NTYPE_INVALID_HASH_INFORMATION 23
307 #define ISAKMP_NTYPE_AUTHENTICATION_FAILED 24
308 #define ISAKMP_NTYPE_INVALID_SIGNATURE 25
309 #define ISAKMP_NTYPE_ADDRESS_NOTIFICATION 26
311 /* 3.15 Delete Payload */
314 nd_uint32_t doi
; /* Domain of Interpretation */
315 nd_uint8_t prot_id
; /* Protocol-Id */
316 nd_uint8_t spi_size
; /* SPI Size */
317 nd_uint16_t num_spi
; /* # of SPIs */
321 /* IKEv2 (RFC4306) */
323 /* 3.3 Security Association Payload -- generic header */
324 /* 3.3.1. Proposal Substructure */
327 nd_uint8_t p_no
; /* Proposal # */
328 nd_uint8_t prot_id
; /* Protocol */
329 nd_uint8_t spi_size
; /* SPI Size */
330 nd_uint8_t num_t
; /* Number of Transforms */
333 /* 3.3.2. Transform Substructure */
336 nd_uint8_t t_type
; /* Transform Type (ENCR,PRF,INTEG,etc.*/
337 nd_byte res2
; /* reserved byte */
338 nd_uint16_t t_id
; /* Transform ID */
349 /* 3.4. Key Exchange Payload */
352 nd_uint16_t ke_group
;
358 /* 3.5. Identification Payloads */
370 nd_uint8_t type
; /* ID type */
374 /* Notification Data */
377 /* 3.10 Notification Payload */
380 nd_uint8_t prot_id
; /* Protocol-ID */
381 nd_uint8_t spi_size
; /* SPI Size */
382 nd_uint16_t type
; /* Notify Message Type */
386 IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
= 1, /* [RFC7296] */
387 IV2_NOTIFY_INVALID_IKE_SPI
= 4, /* [RFC7296] */
388 IV2_NOTIFY_INVALID_MAJOR_VERSION
= 5, /* [RFC7296] */
389 IV2_NOTIFY_INVALID_SYNTAX
= 7, /* [RFC7296] */
390 IV2_NOTIFY_INVALID_MESSAGE_ID
= 9, /* [RFC7296] */
391 IV2_NOTIFY_INVALID_SPI
=11, /* [RFC7296] */
392 IV2_NOTIFY_NO_PROPOSAL_CHOSEN
=14, /* [RFC7296] */
393 IV2_NOTIFY_INVALID_KE_PAYLOAD
=17, /* [RFC7296] */
394 IV2_NOTIFY_AUTHENTICATION_FAILED
=24, /* [RFC7296] */
395 IV2_NOTIFY_SINGLE_PAIR_REQUIRED
=34, /* [RFC7296] */
396 IV2_NOTIFY_NO_ADDITIONAL_SAS
=35, /* [RFC7296] */
397 IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
=36, /* [RFC7296] */
398 IV2_NOTIFY_FAILED_CP_REQUIRED
=37, /* [RFC7296] */
399 IV2_NOTIFY_TS_UNACCEPTABLE
=38, /* [RFC7296] */
400 IV2_NOTIFY_INVALID_SELECTORS
=39, /* [RFC7296] */
401 IV2_NOTIFY_UNACCEPTABLE_ADDRESSES
=40, /* [RFC4555] */
402 IV2_NOTIFY_UNEXPECTED_NAT_DETECTED
=41, /* [RFC4555] */
403 IV2_NOTIFY_USE_ASSIGNED_HOA
=42, /* [RFC5026] */
404 IV2_NOTIFY_TEMPORARY_FAILURE
=43, /* [RFC7296] */
405 IV2_NOTIFY_CHILD_SA_NOT_FOUND
=44, /* [RFC7296] */
406 IV2_NOTIFY_INVALID_GROUP_ID
=45, /* [draft-yeung-g-ikev2] */
407 IV2_NOTIFY_AUTHORIZATION_FAILED
=46, /* [draft-yeung-g-ikev2] */
408 IV2_NOTIFY_STATE_NOT_FOUND
=47, /* [RFC-ietf-ipsecme-ikev2-multiple-ke-12] */
409 IV2_NOTIFY_INITIAL_CONTACT
=16384, /* [RFC7296] */
410 IV2_NOTIFY_SET_WINDOW_SIZE
=16385, /* [RFC7296] */
411 IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
=16386, /* [RFC7296] */
412 IV2_NOTIFY_IPCOMP_SUPPORTED
=16387, /* [RFC7296] */
413 IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
=16388, /* [RFC7296] */
414 IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
=16389, /* [RFC7296] */
415 IV2_NOTIFY_COOKIE
=16390, /* [RFC7296] */
416 IV2_NOTIFY_USE_TRANSPORT_MODE
=16391, /* [RFC7296] */
417 IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
=16392, /* [RFC7296] */
418 IV2_NOTIFY_REKEY_SA
=16393, /* [RFC7296] */
419 IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
=16394, /* [RFC7296] */
420 IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
=16395, /* [RFC7296] */
421 IV2_NOTIFY_MOBIKE_SUPPORTED
=16396, /* [RFC4555] */
422 IV2_NOTIFY_ADDITIONAL_IP4_ADDRESS
=16397, /* [RFC4555] */
423 IV2_NOTIFY_ADDITIONAL_IP6_ADDRESS
=16398, /* [RFC4555] */
424 IV2_NOTIFY_NO_ADDITIONAL_ADDRESSES
=16399, /* [RFC4555] */
425 IV2_NOTIFY_UPDATE_SA_ADDRESSES
=16400, /* [RFC4555] */
426 IV2_NOTIFY_COOKIE2
=16401, /* [RFC4555] */
427 IV2_NOTIFY_NO_NATS_ALLOWED
=16402, /* [RFC4555] */
428 IV2_NOTIFY_AUTH_LIFETIME
=16403, /* [RFC4478] */
429 IV2_NOTIFY_MULTIPLE_AUTH_SUPPORTED
=16404, /* [RFC4739] */
430 IV2_NOTIFY_ANOTHER_AUTH_FOLLOWS
=16405, /* [RFC4739] */
431 IV2_NOTIFY_REDIRECT_SUPPORTED
=16406, /* [RFC5685] */
432 IV2_NOTIFY_REDIRECT
=16407, /* [RFC5685] */
433 IV2_NOTIFY_REDIRECTED_FROM
=16408, /* [RFC5685] */
434 IV2_NOTIFY_TICKET_LT_OPAQUE
=16409, /* [RFC5723] */
435 IV2_NOTIFY_TICKET_REQUEST
=16410, /* [RFC5723] */
436 IV2_NOTIFY_TICKET_ACK
=16411, /* [RFC5723] */
437 IV2_NOTIFY_TICKET_NACK
=16412, /* [RFC5723] */
438 IV2_NOTIFY_TICKET_OPAQUE
=16413, /* [RFC5723] */
439 IV2_NOTIFY_LINK_ID
=16414, /* [RFC5739] */
440 IV2_NOTIFY_USE_WESP_MODE
=16415, /* [RFC5840] */
441 IV2_NOTIFY_ROHC_SUPPORTED
=16416, /* [RFC5857] */
442 IV2_NOTIFY_EAP_ONLY_AUTHENTICATION
=16417, /* [RFC5998] */
443 IV2_NOTIFY_CHILDLESS_IKEV2_SUPPORTED
=16418, /* [RFC6023] */
444 IV2_NOTIFY_QUICK_CRASH_DETECTION
=16419, /* [RFC6290] */
445 IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC_SUPPORTED
=16420, /* [RFC6311] */
446 IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED
=16421, /* [RFC6311] */
447 IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC
=16422, /* [RFC6311] */
448 IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC
=16423, /* [RFC6311] */
449 IV2_NOTIFY_SECURE_PASSWORD_METHODS
=16424, /* [RFC6467] */
450 IV2_NOTIFY_PSK_PERSIST
=16425, /* [RFC6631] */
451 IV2_NOTIFY_PSK_CONFIRM
=16426, /* [RFC6631] */
452 IV2_NOTIFY_ERX_SUPPORTED
=16427, /* [RFC6867] */
453 IV2_NOTIFY_IFOM_CAPABILITY
=16428, /* [Frederic_Firmin][3GPP TS 24.303 v10.6.0 annex B.2] */
454 IV2_NOTIFY_SENDER_REQUEST_ID
=16429, /* [draft-yeung-g-ikev2] */
455 IV2_NOTIFY_IKEV2_FRAGMENTATION_SUPPORTED
=16430, /* [RFC7383] */
456 IV2_NOTIFY_SIGNATURE_HASH_ALGORITHMS
=16431, /* [RFC7427] */
457 IV2_NOTIFY_CLONE_IKE_SA_SUPPORTED
=16432, /* [RFC7791] */
458 IV2_NOTIFY_CLONE_IKE_SA
=16433, /* [RFC7791] */
459 IV2_NOTIFY_PUZZLE
=16434, /* [RFC8019] */
460 IV2_NOTIFY_USE_PPK
=16435, /* [RFC8784] */
461 IV2_NOTIFY_PPK_IDENTITY
=16436, /* [RFC8784] */
462 IV2_NOTIFY_NO_PPK_AUTH
=16437, /* [RFC8784] */
463 IV2_NOTIFY_INTERMEDIATE_EXCHANGE_SUPPORTED
=16438, /* [RFC9242] */
464 IV2_NOTIFY_IP4_ALLOWED
=16439, /* [RFC8983] */
465 IV2_NOTIFY_IP6_ALLOWED
=16440, /* [RFC8983] */
466 IV2_NOTIFY_ADDITIONAL_KEY_EXCHANGE
=16441, /* [RFC-ietf-ipsecme-ikev2-multiple-ke-12] */
467 IV2_NOTIFY_USE_AGGFRAG
=16442 /* [RFC9347] */
470 struct notify_messages
{
475 /* 3.8 Authentication Payload */
478 nd_uint8_t auth_method
; /* Protocol-ID */
480 /* authentication data */
483 enum ikev2_auth_type
{
489 /* refer to RFC 2409 */
492 /* isakmp sa structure */
494 uint8_t proto_id
; /* OAKLEY */
495 vchar_t
*spi
; /* spi */
496 uint8_t dhgrp
; /* DH; group */
497 uint8_t auth_t
; /* method of authentication */
498 uint8_t prf_t
; /* type of prf */
499 uint8_t hash_t
; /* type of hash */
500 uint8_t enc_t
; /* type of cipher */
501 uint8_t life_t
; /* type of duration of lifetime */
502 uint32_t ldur
; /* life duration */
506 /* refer to RFC 2407 */
510 /* 4.2 IPSEC Situation Definition */
511 #define IPSECDOI_SIT_IDENTITY_ONLY 0x00000001
512 #define IPSECDOI_SIT_SECRECY 0x00000002
513 #define IPSECDOI_SIT_INTEGRITY 0x00000004
515 /* 4.4.1 IPSEC Security Protocol Identifiers */
516 /* 4.4.2 IPSEC ISAKMP Transform Values */
517 #define IPSECDOI_PROTO_ISAKMP 1
518 #define IPSECDOI_KEY_IKE 1
520 /* 4.4.1 IPSEC Security Protocol Identifiers */
521 #define IPSECDOI_PROTO_IPSEC_AH 2
522 /* 4.4.3 IPSEC AH Transform Values */
523 #define IPSECDOI_AH_MD5 2
524 #define IPSECDOI_AH_SHA 3
525 #define IPSECDOI_AH_DES 4
526 #define IPSECDOI_AH_SHA2_256 5
527 #define IPSECDOI_AH_SHA2_384 6
528 #define IPSECDOI_AH_SHA2_512 7
530 /* 4.4.1 IPSEC Security Protocol Identifiers */
531 #define IPSECDOI_PROTO_IPSEC_ESP 3
532 /* 4.4.4 IPSEC ESP Transform Identifiers */
533 #define IPSECDOI_ESP_DES_IV64 1
534 #define IPSECDOI_ESP_DES 2
535 #define IPSECDOI_ESP_3DES 3
536 #define IPSECDOI_ESP_RC5 4
537 #define IPSECDOI_ESP_IDEA 5
538 #define IPSECDOI_ESP_CAST 6
539 #define IPSECDOI_ESP_BLOWFISH 7
540 #define IPSECDOI_ESP_3IDEA 8
541 #define IPSECDOI_ESP_DES_IV32 9
542 #define IPSECDOI_ESP_RC4 10
543 #define IPSECDOI_ESP_NULL 11
544 #define IPSECDOI_ESP_RIJNDAEL 12
545 #define IPSECDOI_ESP_AES 12
547 /* 4.4.1 IPSEC Security Protocol Identifiers */
548 #define IPSECDOI_PROTO_IPCOMP 4
549 /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
550 #define IPSECDOI_IPCOMP_OUI 1
551 #define IPSECDOI_IPCOMP_DEFLATE 2
552 #define IPSECDOI_IPCOMP_LZS 3
554 /* 4.5 IPSEC Security Association Attributes */
555 #define IPSECDOI_ATTR_SA_LTYPE 1 /* B */
556 #define IPSECDOI_ATTR_SA_LTYPE_DEFAULT 1
557 #define IPSECDOI_ATTR_SA_LTYPE_SEC 1
558 #define IPSECDOI_ATTR_SA_LTYPE_KB 2
559 #define IPSECDOI_ATTR_SA_LDUR 2 /* V */
560 #define IPSECDOI_ATTR_SA_LDUR_DEFAULT 28800 /* 8 hours */
561 #define IPSECDOI_ATTR_GRP_DESC 3 /* B */
562 #define IPSECDOI_ATTR_ENC_MODE 4 /* B */
563 /* default value: host dependent */
564 #define IPSECDOI_ATTR_ENC_MODE_TUNNEL 1
565 #define IPSECDOI_ATTR_ENC_MODE_TRNS 2
566 #define IPSECDOI_ATTR_AUTH 5 /* B */
567 /* 0 means not to use authentication. */
568 #define IPSECDOI_ATTR_AUTH_HMAC_MD5 1
569 #define IPSECDOI_ATTR_AUTH_HMAC_SHA1 2
570 #define IPSECDOI_ATTR_AUTH_DES_MAC 3
571 #define IPSECDOI_ATTR_AUTH_KPDK 4 /*RFC-1826(Key/Pad/Data/Key)*/
573 * When negotiating ESP without authentication, the Auth
574 * Algorithm attribute MUST NOT be included in the proposal.
575 * When negotiating ESP without confidentiality, the Auth
576 * Algorithm attribute MUST be included in the proposal and
577 * the ESP transform ID must be ESP_NULL.
579 #define IPSECDOI_ATTR_KEY_LENGTH 6 /* B */
580 #define IPSECDOI_ATTR_KEY_ROUNDS 7 /* B */
581 #define IPSECDOI_ATTR_COMP_DICT_SIZE 8 /* B */
582 #define IPSECDOI_ATTR_COMP_PRIVALG 9 /* V */
584 /* 4.6.1 Security Association Payload */
587 nd_uint32_t doi
; /* Domain of Interpretation */
588 nd_uint32_t sit
; /* Situation */
591 struct ipsecdoi_secrecy_h
{
593 nd_uint16_t reserved
;
596 /* 4.6.2.1 Identification Type Values */
599 nd_uint8_t type
; /* ID Type */
600 nd_uint8_t proto_id
; /* Protocol ID */
601 nd_uint16_t port
; /* Port */
602 /* Identification Data */
605 #define IPSECDOI_ID_IPV4_ADDR 1
606 #define IPSECDOI_ID_FQDN 2
607 #define IPSECDOI_ID_USER_FQDN 3
608 #define IPSECDOI_ID_IPV4_ADDR_SUBNET 4
609 #define IPSECDOI_ID_IPV6_ADDR 5
610 #define IPSECDOI_ID_IPV6_ADDR_SUBNET 6
611 #define IPSECDOI_ID_IPV4_ADDR_RANGE 7
612 #define IPSECDOI_ID_IPV6_ADDR_RANGE 8
613 #define IPSECDOI_ID_DER_ASN1_DN 9
614 #define IPSECDOI_ID_DER_ASN1_GN 10
615 #define IPSECDOI_ID_KEY_ID 11
617 /* 4.6.3 IPSEC DOI Notify Message Types */
618 /* Notify Messages - Status Types */
619 #define IPSECDOI_NTYPE_RESPONDER_LIFETIME 24576
620 #define IPSECDOI_NTYPE_REPLAY_STATUS 24577
621 #define IPSECDOI_NTYPE_INITIAL_CONTACT 24578
623 #define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
624 netdissect_options *ndo, u_char tpay, \
625 const struct isakmp_gen *ext, \
627 const u_char *end_pointer, \
630 uint32_t proto0, int depth)
632 DECLARE_PRINTER(v1_sa
);
633 DECLARE_PRINTER(v1_p
);
634 DECLARE_PRINTER(v1_t
);
635 DECLARE_PRINTER(v1_ke
);
636 DECLARE_PRINTER(v1_id
);
637 DECLARE_PRINTER(v1_cert
);
638 DECLARE_PRINTER(v1_cr
);
639 DECLARE_PRINTER(v1_sig
);
640 DECLARE_PRINTER(v1_hash
);
641 DECLARE_PRINTER(v1_nonce
);
642 DECLARE_PRINTER(v1_n
);
643 DECLARE_PRINTER(v1_d
);
644 DECLARE_PRINTER(v1_vid
);
646 DECLARE_PRINTER(v2_sa
);
647 DECLARE_PRINTER(v2_ke
);
648 DECLARE_PRINTER(v2_ID
);
649 DECLARE_PRINTER(v2_cert
);
650 DECLARE_PRINTER(v2_cr
);
651 DECLARE_PRINTER(v2_auth
);
652 DECLARE_PRINTER(v2_nonce
);
653 DECLARE_PRINTER(v2_n
);
654 DECLARE_PRINTER(v2_d
);
655 DECLARE_PRINTER(v2_vid
);
656 DECLARE_PRINTER(v2_TS
);
657 DECLARE_PRINTER(v2_cp
);
658 DECLARE_PRINTER(v2_eap
);
660 static const u_char
*ikev2_e_print(netdissect_options
*ndo
,
661 const struct isakmp
*base
,
663 const struct isakmp_gen
*ext
,
665 const u_char
*end_pointer
,
668 uint32_t proto0
, int depth
);
671 static const u_char
*ike_sub0_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
672 const u_char
*, uint32_t, uint32_t, uint32_t, int);
673 static const u_char
*ikev1_sub_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
674 const u_char
*, uint32_t, uint32_t, uint32_t, int);
676 static const u_char
*ikev2_sub_print(netdissect_options
*ndo
,
677 const struct isakmp
*base
,
678 u_char np
, const struct isakmp_gen
*ext
,
679 const u_char
*ep
, uint32_t phase
,
680 uint32_t doi
, uint32_t proto
,
684 static char *numstr(u_int
);
687 ikev1_print(netdissect_options
*ndo
,
688 const u_char
*bp
, u_int length
,
689 const u_char
*bp2
, const struct isakmp
*base
);
691 #define MAXINITIATORS 20
692 static int ninitiator
= 0;
700 union inaddr_u iaddr
;
701 union inaddr_u raddr
;
702 } cookiecache
[MAXINITIATORS
];
705 static const char *protoidstr
[] = {
706 NULL
, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
710 static const char *npstr
[] = {
711 "none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
712 "sig", "nonce", "n", "d", "vid", /* 9 - 13 */
713 "pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
714 "pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
715 "pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
716 "pay29", "pay30", "pay31", "pay32", /* 29- 32 */
717 "v2sa", "v2ke", "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
718 "v2cr", "v2auth","v2nonce", "v2n", "v2d", /* 38- 42 */
719 "v2vid", "v2TSi", "v2TSr", "v2e", "v2cp", /* 43- 47 */
725 static const u_char
*(*npfunc
[])(netdissect_options
*ndo
, u_char tpay
,
726 const struct isakmp_gen
*ext
,
728 const u_char
*end_pointer
,
731 uint32_t proto0
, int depth
) = {
745 ikev1_vid_print
, /* 13 */
746 NULL
, NULL
, NULL
, NULL
, NULL
, /* 14- 18 */
747 NULL
, NULL
, NULL
, NULL
, NULL
, /* 19- 23 */
748 NULL
, NULL
, NULL
, NULL
, NULL
, /* 24- 28 */
749 NULL
, NULL
, NULL
, NULL
, /* 29- 32 */
750 ikev2_sa_print
, /* 33 */
751 ikev2_ke_print
, /* 34 */
752 ikev2_ID_print
, /* 35 */
753 ikev2_ID_print
, /* 36 */
754 ikev2_cert_print
, /* 37 */
755 ikev2_cr_print
, /* 38 */
756 ikev2_auth_print
, /* 39 */
757 ikev2_nonce_print
, /* 40 */
758 ikev2_n_print
, /* 41 */
759 ikev2_d_print
, /* 42 */
760 ikev2_vid_print
, /* 43 */
761 ikev2_TS_print
, /* 44 */
762 ikev2_TS_print
, /* 45 */
763 NULL
, /* ikev2_e_print,*/ /* 46 - special */
764 ikev2_cp_print
, /* 47 */
765 ikev2_eap_print
, /* 48 */
769 static const char *etypestr
[] = {
770 /* IKEv1 exchange types */
771 "none", "base", "ident", "auth", "agg", "inf", NULL
, NULL
, /* 0-7 */
772 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 8-15 */
773 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 16-23 */
774 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 24-31 */
775 "oakley-quick", "oakley-newgroup", /* 32-33 */
776 /* IKEv2 exchange types */
777 "ikev2_init", "ikev2_auth", "child_sa", "inf2" /* 34-37 */
780 #define STR_OR_ID(x, tab) \
781 (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
782 #define PROTOIDSTR(x) STR_OR_ID(x, protoidstr)
783 #define NPSTR(x) STR_OR_ID(x, npstr)
784 #define ETYPESTR(x) STR_OR_ID(x, etypestr)
786 #define CHECKLEN(p, np) \
787 if (ep < (const u_char *)(p)) { \
788 ND_PRINT(" [|%s]", NPSTR(np)); \
794 (((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
795 ? npfunc[(x)] : NULL)
798 iszero(netdissect_options
*ndo
, const u_char
*p
, size_t l
)
809 /* find cookie from initiator cache */
811 cookie_find(const cookie_t
*in
)
815 for (i
= 0; i
< MAXINITIATORS
; i
++) {
816 if (memcmp(in
, &cookiecache
[i
].initiator
, sizeof(*in
)) == 0)
823 /* record initiator */
825 cookie_record(netdissect_options
*ndo
, const cookie_t
*in
, const u_char
*bp2
)
829 const struct ip6_hdr
*ip6
;
833 ninitiator
= (i
+ 1) % MAXINITIATORS
;
837 ip
= (const struct ip
*)bp2
;
840 cookiecache
[ninitiator
].version
= 4;
841 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in4
,
842 ip
->ip_src
, sizeof(nd_ipv4
));
843 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in4
,
844 ip
->ip_dst
, sizeof(nd_ipv4
));
847 ip6
= (const struct ip6_hdr
*)bp2
;
848 cookiecache
[ninitiator
].version
= 6;
849 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in6
,
850 ip6
->ip6_src
, sizeof(nd_ipv6
));
851 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in6
,
852 ip6
->ip6_dst
, sizeof(nd_ipv6
));
857 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].initiator
, in
, sizeof(*in
));
858 ninitiator
= (ninitiator
+ 1) % MAXINITIATORS
;
861 #define cookie_isinitiator(ndo, x, y) cookie_sidecheck(ndo, (x), (y), 1)
862 #define cookie_isresponder(ndo, x, y) cookie_sidecheck(ndo, (x), (y), 0)
864 cookie_sidecheck(netdissect_options
*ndo
, int i
, const u_char
*bp2
, int initiator
)
867 const struct ip6_hdr
*ip6
;
869 ip
= (const struct ip
*)bp2
;
872 if (cookiecache
[i
].version
!= 4)
875 if (UNALIGNED_MEMCMP(ip
->ip_src
, &cookiecache
[i
].iaddr
.in4
, sizeof(nd_ipv4
)) == 0)
878 if (UNALIGNED_MEMCMP(ip
->ip_src
, &cookiecache
[i
].raddr
.in4
, sizeof(nd_ipv4
)) == 0)
883 if (cookiecache
[i
].version
!= 6)
885 ip6
= (const struct ip6_hdr
*)bp2
;
887 if (UNALIGNED_MEMCMP(ip6
->ip6_src
, &cookiecache
[i
].iaddr
.in6
, sizeof(nd_ipv6
)) == 0)
890 if (UNALIGNED_MEMCMP(ip6
->ip6_src
, &cookiecache
[i
].raddr
.in6
, sizeof(nd_ipv6
)) == 0)
902 hexprint(netdissect_options
*ndo
, const uint8_t *loc
, size_t len
)
908 for (i
= 0; i
< len
; i
++)
909 ND_PRINT("%02x", p
[i
] & 0xff);
913 rawprint(netdissect_options
*ndo
, const uint8_t *loc
, size_t len
)
915 ND_TCHECK_LEN(loc
, len
);
917 hexprint(ndo
, loc
, len
);
925 * returns false if we run out of data buffer
927 static int ike_show_somedata(netdissect_options
*ndo
,
928 const u_char
*cp
, const u_char
*ep
)
930 /* there is too much data, just show some of it */
931 const u_char
*end
= ep
- 20;
933 size_t len
= ep
- cp
;
938 /* really shouldn't happen because of above */
945 if(!rawprint(ndo
, (const uint8_t *)(cp
), len
)) goto trunc
;
948 if(!rawprint(ndo
, (const uint8_t *)(end
), elen
)) goto trunc
;
960 const char *value
[30]; /*XXX*/
963 static const u_char
*
964 ikev1_attrmap_print(netdissect_options
*ndo
,
965 const u_char
*p
, const u_char
*ep2
,
966 const struct attrmap
*map
, size_t nmap
)
971 if (GET_U_1(p
) & 0x80)
974 totlen
= 4 + GET_BE_U_2(p
+ 2);
976 if (ep2
< p
+ totlen
) {
982 t
= GET_BE_U_2(p
) & 0x7fff;
983 if (map
&& t
< nmap
&& map
[t
].type
)
984 ND_PRINT("type=%s ", map
[t
].type
);
986 ND_PRINT("type=#%u ", t
);
987 if (GET_U_1(p
) & 0x80) {
989 v
= GET_BE_U_2(p
+ 2);
990 if (map
&& t
< nmap
&& v
< map
[t
].nvalue
&& map
[t
].value
[v
])
991 ND_PRINT("%s", map
[t
].value
[v
]);
993 if (!rawprint(ndo
, (const uint8_t *)(p
+ 2), 2)) {
999 ND_PRINT("len=%u value=", totlen
- 4);
1000 if (!rawprint(ndo
, (const uint8_t *)(p
+ 4), totlen
- 4)) {
1012 static const u_char
*
1013 ikev1_attr_print(netdissect_options
*ndo
, const u_char
*p
, const u_char
*ep2
)
1018 if (GET_U_1(p
) & 0x80)
1021 totlen
= 4 + GET_BE_U_2(p
+ 2);
1023 if (ep2
< p
+ totlen
) {
1024 ND_PRINT("[|attr]");
1029 t
= GET_BE_U_2(p
) & 0x7fff;
1030 ND_PRINT("type=#%u ", t
);
1031 if (GET_U_1(p
) & 0x80) {
1034 if (!rawprint(ndo
, (const uint8_t *)(p
+ 2), 2)) {
1039 ND_PRINT("len=%u value=", totlen
- 4);
1040 if (!rawprint(ndo
, (const uint8_t *)(p
+ 4), totlen
- 4)) {
1052 static const u_char
*
1053 ikev1_sa_print(netdissect_options
*ndo
, u_char tpay _U_
,
1054 const struct isakmp_gen
*ext
,
1056 const u_char
*ep
, uint32_t phase
, uint32_t doi0 _U_
,
1057 uint32_t proto0
, int depth
)
1059 const struct ikev1_pl_sa
*p
;
1060 uint32_t doi
, sit
, ident
;
1061 const u_char
*cp
, *np
;
1064 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_SA
));
1066 p
= (const struct ikev1_pl_sa
*)ext
;
1068 doi
= GET_BE_U_4(p
->doi
);
1069 sit
= GET_BE_U_4(p
->sit
);
1071 ND_PRINT(" doi=%u", doi
);
1072 ND_PRINT(" situation=%u", sit
);
1073 return (const u_char
*)(p
+ 1);
1076 ND_PRINT(" doi=ipsec");
1077 ND_PRINT(" situation=");
1080 ND_PRINT("identity");
1084 ND_PRINT("%ssecrecy", t
? "+" : "");
1088 ND_PRINT("%sintegrity", t
? "+" : "");
1090 np
= (const u_char
*)ext
+ sizeof(struct ikev1_pl_sa
);
1092 ident
= GET_BE_U_4(ext
+ 1);
1093 ND_PRINT(" ident=%u", ident
);
1094 np
+= sizeof(ident
);
1097 ext
= (const struct isakmp_gen
*)np
;
1098 ND_TCHECK_SIZE(ext
);
1100 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_P
, ext
, ep
, phase
, doi
, proto0
,
1105 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_SA
));
1109 static const u_char
*
1110 ikev1_p_print(netdissect_options
*ndo
, u_char tpay _U_
,
1111 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1112 const u_char
*ep
, uint32_t phase
, uint32_t doi0
,
1113 uint32_t proto0 _U_
, int depth
)
1115 const struct ikev1_pl_p
*p
;
1119 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_P
));
1121 p
= (const struct ikev1_pl_p
*)ext
;
1123 ND_PRINT(" #%u protoid=%s transform=%u",
1124 GET_U_1(p
->p_no
), PROTOIDSTR(GET_U_1(p
->prot_id
)),
1126 spi_size
= GET_U_1(p
->spi_size
);
1129 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1133 ext
= (const struct isakmp_gen
*)((const u_char
*)(p
+ 1) + spi_size
);
1134 ND_TCHECK_SIZE(ext
);
1136 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_T
, ext
, ep
, phase
, doi0
,
1137 GET_U_1(p
->prot_id
), depth
);
1141 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
1145 static const char *ikev1_p_map
[] = {
1149 static const char *ikev2_t_type_map
[]={
1150 NULL
, "encr", "prf", "integ", "dh", "esn"
1153 static const char *ah_p_map
[] = {
1154 NULL
, "(reserved)", "md5", "sha", "1des",
1155 "sha2-256", "sha2-384", "sha2-512",
1158 static const char *prf_p_map
[] = {
1159 NULL
, "hmac-md5", "hmac-sha", "hmac-tiger",
1163 static const char *integ_p_map
[] = {
1164 NULL
, "hmac-md5", "hmac-sha", "dec-mac",
1165 "kpdk-md5", "aes-xcbc"
1168 static const char *esn_p_map
[] = {
1172 static const char *dh_p_map
[] = {
1174 "modp1024", /* group 2 */
1175 "EC2N 2^155", /* group 3 */
1176 "EC2N 2^185", /* group 4 */
1177 "modp1536", /* group 5 */
1178 "iana-grp06", "iana-grp07", /* reserved */
1179 "iana-grp08", "iana-grp09",
1180 "iana-grp10", "iana-grp11",
1181 "iana-grp12", "iana-grp13",
1182 "modp2048", /* group 14 */
1183 "modp3072", /* group 15 */
1184 "modp4096", /* group 16 */
1185 "modp6144", /* group 17 */
1186 "modp8192", /* group 18 */
1189 static const char *esp_p_map
[] = {
1190 NULL
, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
1191 "blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
1194 static const char *ipcomp_p_map
[] = {
1195 NULL
, "oui", "deflate", "lzs",
1198 static const struct attrmap ipsec_t_map
[] = {
1199 { NULL
, 0, { NULL
} },
1200 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1201 { "life", 0, { NULL
} },
1202 { "group desc", 18, { NULL
, "modp768",
1203 "modp1024", /* group 2 */
1204 "EC2N 2^155", /* group 3 */
1205 "EC2N 2^185", /* group 4 */
1206 "modp1536", /* group 5 */
1207 "iana-grp06", "iana-grp07", /* reserved */
1208 "iana-grp08", "iana-grp09",
1209 "iana-grp10", "iana-grp11",
1210 "iana-grp12", "iana-grp13",
1211 "modp2048", /* group 14 */
1212 "modp3072", /* group 15 */
1213 "modp4096", /* group 16 */
1214 "modp6144", /* group 17 */
1215 "modp8192", /* group 18 */
1217 { "enc mode", 3, { NULL
, "tunnel", "transport", }, },
1218 { "auth", 5, { NULL
, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
1219 { "keylen", 0, { NULL
} },
1220 { "rounds", 0, { NULL
} },
1221 { "dictsize", 0, { NULL
} },
1222 { "privalg", 0, { NULL
} },
1225 static const struct attrmap encr_t_map
[] = {
1226 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 0, 1 */
1227 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 2, 3 */
1228 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 4, 5 */
1229 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 6, 7 */
1230 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 8, 9 */
1231 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 10,11*/
1232 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 12,13*/
1233 { "keylen", 14, { NULL
}},
1236 static const struct attrmap oakley_t_map
[] = {
1237 { NULL
, 0, { NULL
} },
1238 { "enc", 8, { NULL
, "1des", "idea", "blowfish", "rc5",
1239 "3des", "cast", "aes", }, },
1240 { "hash", 7, { NULL
, "md5", "sha1", "tiger",
1241 "sha2-256", "sha2-384", "sha2-512", }, },
1242 { "auth", 6, { NULL
, "preshared", "dss", "rsa sig", "rsa enc",
1243 "rsa enc revised", }, },
1244 { "group desc", 18, { NULL
, "modp768",
1245 "modp1024", /* group 2 */
1246 "EC2N 2^155", /* group 3 */
1247 "EC2N 2^185", /* group 4 */
1248 "modp1536", /* group 5 */
1249 "iana-grp06", "iana-grp07", /* reserved */
1250 "iana-grp08", "iana-grp09",
1251 "iana-grp10", "iana-grp11",
1252 "iana-grp12", "iana-grp13",
1253 "modp2048", /* group 14 */
1254 "modp3072", /* group 15 */
1255 "modp4096", /* group 16 */
1256 "modp6144", /* group 17 */
1257 "modp8192", /* group 18 */
1259 { "group type", 4, { NULL
, "MODP", "ECP", "EC2N", }, },
1260 { "group prime", 0, { NULL
} },
1261 { "group gen1", 0, { NULL
} },
1262 { "group gen2", 0, { NULL
} },
1263 { "group curve A", 0, { NULL
} },
1264 { "group curve B", 0, { NULL
} },
1265 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1266 { "lifeduration", 0, { NULL
} },
1267 { "prf", 0, { NULL
} },
1268 { "keylen", 0, { NULL
} },
1269 { "field", 0, { NULL
} },
1270 { "order", 0, { NULL
} },
1273 static const u_char
*
1274 ikev1_t_print(netdissect_options
*ndo
, u_char tpay _U_
,
1275 const struct isakmp_gen
*ext
, u_int item_len
,
1276 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi _U_
,
1277 uint32_t proto
, int depth _U_
)
1279 const struct ikev1_pl_t
*p
;
1282 const struct attrmap
*map
;
1286 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_T
));
1288 p
= (const struct ikev1_pl_t
*)ext
;
1293 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ikev1_p_map
);
1295 nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1298 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ah_p_map
);
1300 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1303 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), esp_p_map
);
1305 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1308 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ipcomp_p_map
);
1310 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1320 ND_PRINT(" #%u id=%s ", GET_U_1(p
->t_no
), idstr
);
1322 ND_PRINT(" #%u id=%u ", GET_U_1(p
->t_no
), GET_U_1(p
->t_id
));
1323 cp
= (const u_char
*)(p
+ 1);
1324 ep2
= (const u_char
*)p
+ item_len
;
1325 while (cp
< ep
&& cp
< ep2
) {
1327 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
1329 cp
= ikev1_attr_print(ndo
, cp
, ep2
);
1337 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_T
));
1341 static const u_char
*
1342 ikev1_ke_print(netdissect_options
*ndo
, u_char tpay _U_
,
1343 const struct isakmp_gen
*ext
, u_int item_len
,
1344 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1345 uint32_t proto _U_
, int depth _U_
)
1347 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_KE
));
1349 ND_TCHECK_SIZE(ext
);
1351 * Our caller has ensured that the length is >= 4.
1353 ND_PRINT(" key len=%u", item_len
- 4);
1354 if (2 < ndo
->ndo_vflag
&& item_len
> 4) {
1355 /* Print the entire payload in hex */
1357 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1360 return (const u_char
*)ext
+ item_len
;
1362 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_KE
));
1366 static const u_char
*
1367 ikev1_id_print(netdissect_options
*ndo
, u_char tpay _U_
,
1368 const struct isakmp_gen
*ext
, u_int item_len
,
1369 const u_char
*ep _U_
, uint32_t phase
, uint32_t doi _U_
,
1370 uint32_t proto _U_
, int depth _U_
)
1372 #define USE_IPSECDOI_IN_PHASE1 1
1373 const struct ikev1_pl_id
*p
;
1374 static const char *idtypestr
[] = {
1375 "IPv4", "IPv4net", "IPv6", "IPv6net",
1377 static const char *ipsecidtypestr
[] = {
1378 NULL
, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
1379 "IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
1385 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_ID
));
1387 p
= (const struct ikev1_pl_id
*)ext
;
1389 if (sizeof(*p
) < item_len
) {
1390 data
= (const u_char
*)(p
+ 1);
1391 len
= item_len
- sizeof(*p
);
1398 ND_PRINT(" [phase=%u doi=%u proto=%u]", phase
, doi
, proto
);
1401 #ifndef USE_IPSECDOI_IN_PHASE1
1405 ND_PRINT(" idtype=%s",
1406 STR_OR_ID(GET_U_1(p
->d
.id_type
), idtypestr
));
1407 ND_PRINT(" doi_data=%u",
1408 GET_BE_U_4(p
->d
.doi_data
) & 0xffffff);
1411 #ifdef USE_IPSECDOI_IN_PHASE1
1416 const struct ipsecdoi_id
*doi_p
;
1418 uint8_t type
, proto_id
;
1420 doi_p
= (const struct ipsecdoi_id
*)ext
;
1421 ND_TCHECK_SIZE(doi_p
);
1422 type
= GET_U_1(doi_p
->type
);
1423 ND_PRINT(" idtype=%s", STR_OR_ID(type
, ipsecidtypestr
));
1424 /* A protocol ID of 0 DOES NOT mean IPPROTO_IP! */
1425 proto_id
= GET_U_1(doi_p
->proto_id
);
1426 if (!ndo
->ndo_nflag
&& proto_id
&& (p_name
= netdb_protoname(proto_id
)) != NULL
)
1427 ND_PRINT(" protoid=%s", p_name
);
1429 ND_PRINT(" protoid=%u", proto_id
);
1430 ND_PRINT(" port=%u", GET_BE_U_2(doi_p
->port
));
1435 ND_TCHECK_LEN(data
, len
);
1437 case IPSECDOI_ID_IPV4_ADDR
:
1439 ND_PRINT(" len=%u [bad: < 4]", len
);
1441 ND_PRINT(" len=%u %s", len
, GET_IPADDR_STRING(data
));
1444 case IPSECDOI_ID_FQDN
:
1445 case IPSECDOI_ID_USER_FQDN
:
1448 ND_PRINT(" len=%u ", len
);
1449 for (i
= 0; i
< len
; i
++)
1450 fn_print_char(ndo
, GET_U_1(data
+ i
));
1454 case IPSECDOI_ID_IPV4_ADDR_SUBNET
:
1458 ND_PRINT(" len=%u [bad: < 8]", len
);
1460 mask
= data
+ sizeof(nd_ipv4
);
1461 ND_PRINT(" len=%u %s/%u.%u.%u.%u", len
,
1462 GET_IPADDR_STRING(data
),
1463 GET_U_1(mask
), GET_U_1(mask
+ 1),
1470 case IPSECDOI_ID_IPV6_ADDR
:
1472 ND_PRINT(" len=%u [bad: < 16]", len
);
1474 ND_PRINT(" len=%u %s", len
, GET_IP6ADDR_STRING(data
));
1477 case IPSECDOI_ID_IPV6_ADDR_SUBNET
:
1481 ND_PRINT(" len=%u [bad: < 32]", len
);
1483 mask
= (const u_char
*)(data
+ sizeof(nd_ipv6
));
1485 ND_PRINT(" len=%u %s/0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", len
,
1486 GET_IP6ADDR_STRING(data
),
1487 GET_U_1(mask
), GET_U_1(mask
+ 1),
1501 GET_U_1(mask
+ 15));
1506 case IPSECDOI_ID_IPV4_ADDR_RANGE
:
1508 ND_PRINT(" len=%u [bad: < 8]", len
);
1510 ND_PRINT(" len=%u %s-%s", len
,
1511 GET_IPADDR_STRING(data
),
1512 GET_IPADDR_STRING(data
+ sizeof(nd_ipv4
)));
1516 case IPSECDOI_ID_IPV6_ADDR_RANGE
:
1518 ND_PRINT(" len=%u [bad: < 32]", len
);
1520 ND_PRINT(" len=%u %s-%s", len
,
1521 GET_IP6ADDR_STRING(data
),
1522 GET_IP6ADDR_STRING(data
+ sizeof(nd_ipv6
)));
1526 case IPSECDOI_ID_DER_ASN1_DN
:
1527 case IPSECDOI_ID_DER_ASN1_GN
:
1528 case IPSECDOI_ID_KEY_ID
:
1535 ND_PRINT(" len=%u", len
);
1536 if (2 < ndo
->ndo_vflag
) {
1538 if (!rawprint(ndo
, (const uint8_t *)data
, len
))
1542 return (const u_char
*)ext
+ item_len
;
1544 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_ID
));
1548 static const u_char
*
1549 ikev1_cert_print(netdissect_options
*ndo
, u_char tpay _U_
,
1550 const struct isakmp_gen
*ext
, u_int item_len
,
1551 const u_char
*ep _U_
, uint32_t phase _U_
,
1553 uint32_t proto0 _U_
, int depth _U_
)
1555 const struct ikev1_pl_cert
*p
;
1556 static const char *certstr
[] = {
1557 "none", "pkcs7", "pgp", "dns",
1558 "x509sign", "x509ke", "kerberos", "crl",
1559 "arl", "spki", "x509attr",
1562 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_CERT
));
1564 p
= (const struct ikev1_pl_cert
*)ext
;
1567 * Our caller has ensured that the length is >= 4.
1569 ND_PRINT(" len=%u", item_len
- 4);
1570 ND_PRINT(" type=%s", STR_OR_ID(GET_U_1(p
->encode
), certstr
));
1571 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1572 /* Print the entire payload in hex */
1574 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1577 return (const u_char
*)ext
+ item_len
;
1579 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_CERT
));
1583 static const u_char
*
1584 ikev1_cr_print(netdissect_options
*ndo
, u_char tpay _U_
,
1585 const struct isakmp_gen
*ext
, u_int item_len
,
1586 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1587 uint32_t proto0 _U_
, int depth _U_
)
1589 const struct ikev1_pl_cert
*p
;
1590 static const char *certstr
[] = {
1591 "none", "pkcs7", "pgp", "dns",
1592 "x509sign", "x509ke", "kerberos", "crl",
1593 "arl", "spki", "x509attr",
1596 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_CR
));
1598 p
= (const struct ikev1_pl_cert
*)ext
;
1601 * Our caller has ensured that the length is >= 4.
1603 ND_PRINT(" len=%u", item_len
- 4);
1604 ND_PRINT(" type=%s", STR_OR_ID(GET_U_1(p
->encode
), certstr
));
1605 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1606 /* Print the entire payload in hex */
1608 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1611 return (const u_char
*)ext
+ item_len
;
1613 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_CR
));
1617 static const u_char
*
1618 ikev1_hash_print(netdissect_options
*ndo
, u_char tpay _U_
,
1619 const struct isakmp_gen
*ext
, u_int item_len
,
1620 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1621 uint32_t proto _U_
, int depth _U_
)
1623 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_HASH
));
1625 ND_TCHECK_SIZE(ext
);
1627 * Our caller has ensured that the length is >= 4.
1629 ND_PRINT(" len=%u", item_len
- 4);
1630 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1631 /* Print the entire payload in hex */
1633 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1636 return (const u_char
*)ext
+ item_len
;
1638 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_HASH
));
1642 static const u_char
*
1643 ikev1_sig_print(netdissect_options
*ndo
, u_char tpay _U_
,
1644 const struct isakmp_gen
*ext
, u_int item_len
,
1645 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1646 uint32_t proto _U_
, int depth _U_
)
1648 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_SIG
));
1650 ND_TCHECK_SIZE(ext
);
1652 * Our caller has ensured that the length is >= 4.
1654 ND_PRINT(" len=%u", item_len
- 4);
1655 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1656 /* Print the entire payload in hex */
1658 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1661 return (const u_char
*)ext
+ item_len
;
1663 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_SIG
));
1667 static const u_char
*
1668 ikev1_nonce_print(netdissect_options
*ndo
, u_char tpay _U_
,
1669 const struct isakmp_gen
*ext
,
1672 uint32_t phase _U_
, uint32_t doi _U_
,
1673 uint32_t proto _U_
, int depth _U_
)
1675 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_NONCE
));
1677 ND_TCHECK_SIZE(ext
);
1679 * Our caller has ensured that the length is >= 4.
1681 ND_PRINT(" n len=%u", item_len
- 4);
1683 if (ndo
->ndo_vflag
> 2) {
1685 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1687 } else if (ndo
->ndo_vflag
> 1) {
1689 if (!ike_show_somedata(ndo
, (const u_char
*)(ext
+ 1), ep
))
1693 return (const u_char
*)ext
+ item_len
;
1695 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE
));
1699 static const u_char
*
1700 ikev1_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
1701 const struct isakmp_gen
*ext
, u_int item_len
,
1702 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1703 uint32_t proto0 _U_
, int depth _U_
)
1705 const struct ikev1_pl_n
*p
;
1712 static const char *notify_error_str
[] = {
1713 NULL
, "INVALID-PAYLOAD-TYPE",
1714 "DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED",
1715 "INVALID-COOKIE", "INVALID-MAJOR-VERSION",
1716 "INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE",
1717 "INVALID-FLAGS", "INVALID-MESSAGE-ID",
1718 "INVALID-PROTOCOL-ID", "INVALID-SPI",
1719 "INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED",
1720 "NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX",
1721 "PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION",
1722 "INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING",
1723 "INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED",
1724 "INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION",
1725 "AUTHENTICATION-FAILED", "INVALID-SIGNATURE",
1726 "ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME",
1727 "CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE",
1728 "UNEQUAL-PAYLOAD-LENGTHS",
1730 static const char *ipsec_notify_error_str
[] = {
1733 static const char *notify_status_str
[] = {
1736 static const char *ipsec_notify_status_str
[] = {
1737 "RESPONDER-LIFETIME", "REPLAY-STATUS",
1740 /* NOTE: these macro must be called with x in proper range */
1743 #define NOTIFY_ERROR_STR(x) \
1744 STR_OR_ID((x), notify_error_str)
1747 #define IPSEC_NOTIFY_ERROR_STR(x) \
1748 STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
1751 #define NOTIFY_STATUS_STR(x) \
1752 STR_OR_ID((u_int)((x) - 16384), notify_status_str)
1755 #define IPSEC_NOTIFY_STATUS_STR(x) \
1756 STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
1758 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_N
));
1760 p
= (const struct ikev1_pl_n
*)ext
;
1762 doi
= GET_BE_U_4(p
->doi
);
1763 proto
= GET_U_1(p
->prot_id
);
1765 ND_PRINT(" doi=%u", doi
);
1766 ND_PRINT(" proto=%u", proto
);
1767 type
= GET_BE_U_2(p
->type
);
1769 ND_PRINT(" type=%s", NOTIFY_ERROR_STR(type
));
1770 else if (type
< 16384)
1771 ND_PRINT(" type=%s", numstr(type
));
1772 else if (type
< 24576)
1773 ND_PRINT(" type=%s", NOTIFY_STATUS_STR(type
));
1775 ND_PRINT(" type=%s", numstr(type
));
1776 spi_size
= GET_U_1(p
->spi_size
);
1779 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1782 return (const u_char
*)(p
+ 1) + spi_size
;
1785 ND_PRINT(" doi=ipsec");
1786 ND_PRINT(" proto=%s", PROTOIDSTR(proto
));
1787 type
= GET_BE_U_2(p
->type
);
1789 ND_PRINT(" type=%s", NOTIFY_ERROR_STR(type
));
1790 else if (type
< 16384)
1791 ND_PRINT(" type=%s", IPSEC_NOTIFY_ERROR_STR(type
));
1792 else if (type
< 24576)
1793 ND_PRINT(" type=%s", NOTIFY_STATUS_STR(type
));
1794 else if (type
< 32768)
1795 ND_PRINT(" type=%s", IPSEC_NOTIFY_STATUS_STR(type
));
1797 ND_PRINT(" type=%s", numstr(type
));
1798 spi_size
= GET_U_1(p
->spi_size
);
1801 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1805 cp
= (const u_char
*)(p
+ 1) + spi_size
;
1806 ep2
= (const u_char
*)p
+ item_len
;
1810 case IPSECDOI_NTYPE_RESPONDER_LIFETIME
:
1812 const struct attrmap
*map
= oakley_t_map
;
1813 size_t nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1814 ND_PRINT(" attrs=(");
1815 while (cp
< ep
&& cp
< ep2
) {
1816 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
1825 case IPSECDOI_NTYPE_REPLAY_STATUS
:
1826 ND_PRINT(" status=(");
1827 ND_PRINT("replay detection %sabled",
1828 GET_BE_U_4(cp
) ? "en" : "dis");
1833 * XXX - fill in more types here; see, for example,
1834 * draft-ietf-ipsec-notifymsg-04.
1836 if (ndo
->ndo_vflag
> 3) {
1837 ND_PRINT(" data=(");
1838 if (!rawprint(ndo
, (const uint8_t *)(cp
), ep
- cp
))
1842 if (!ike_show_somedata(ndo
, cp
, ep
))
1848 return (const u_char
*)ext
+ item_len
;
1850 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_N
));
1854 static const u_char
*
1855 ikev1_d_print(netdissect_options
*ndo
, u_char tpay _U_
,
1856 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1857 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1858 uint32_t proto0 _U_
, int depth _U_
)
1860 const struct ikev1_pl_d
*p
;
1868 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_D
));
1870 p
= (const struct ikev1_pl_d
*)ext
;
1872 doi
= GET_BE_U_4(p
->doi
);
1873 proto
= GET_U_1(p
->prot_id
);
1875 ND_PRINT(" doi=%u", doi
);
1876 ND_PRINT(" proto=%u", proto
);
1878 ND_PRINT(" doi=ipsec");
1879 ND_PRINT(" proto=%s", PROTOIDSTR(proto
));
1881 spi_size
= GET_U_1(p
->spi_size
);
1882 ND_PRINT(" spilen=%u", spi_size
);
1883 num_spi
= GET_BE_U_2(p
->num_spi
);
1884 ND_PRINT(" nspi=%u", num_spi
);
1885 q
= (const uint8_t *)(p
+ 1);
1888 for (i
= 0; i
< num_spi
; i
++) {
1891 if (!rawprint(ndo
, (const uint8_t *)q
, spi_size
))
1898 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_D
));
1902 static const u_char
*
1903 ikev1_vid_print(netdissect_options
*ndo
, u_char tpay _U_
,
1904 const struct isakmp_gen
*ext
,
1905 u_int item_len
, const u_char
*ep _U_
,
1906 uint32_t phase _U_
, uint32_t doi _U_
,
1907 uint32_t proto _U_
, int depth _U_
)
1909 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_VID
));
1911 ND_TCHECK_SIZE(ext
);
1913 * Our caller has ensured that the length is >= 4.
1915 ND_PRINT(" len=%u", item_len
- 4);
1916 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1917 /* Print the entire payload in hex */
1919 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1922 return (const u_char
*)ext
+ item_len
;
1924 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_VID
));
1928 /************************************************************/
1930 /* IKE v2 - rfc4306 - dissector */
1932 /************************************************************/
1935 ikev2_pay_print(netdissect_options
*ndo
, const char *payname
, uint8_t critical
)
1937 ND_PRINT("%s%s:", payname
, critical
&0x80 ? "[C]" : "");
1940 static const u_char
*
1941 ikev2_gen_print(netdissect_options
*ndo
, u_char tpay
,
1942 const struct isakmp_gen
*ext
, u_int item_len
)
1944 const struct isakmp_gen
*p
= (const struct isakmp_gen
*)ext
;
1946 ND_TCHECK_SIZE(ext
);
1947 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(p
->critical
));
1950 * Our caller has ensured that the length is >= 4.
1952 ND_PRINT(" len=%u", item_len
- 4);
1953 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1954 /* Print the entire payload in hex */
1956 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1959 return (const u_char
*)ext
+ item_len
;
1961 ND_PRINT(" [|%s]", NPSTR(tpay
));
1965 static const u_char
*
1966 ikev2_t_print(netdissect_options
*ndo
, int tcount
,
1967 const struct isakmp_gen
*ext
, u_int item_len
,
1970 const struct ikev2_t
*p
;
1975 const struct attrmap
*map
;
1979 p
= (const struct ikev2_t
*)ext
;
1981 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_T
), GET_U_1(p
->h
.critical
));
1983 t_id
= GET_BE_U_2(p
->t_id
);
1988 t_type
= GET_U_1(p
->t_type
);
1991 idstr
= STR_OR_ID(t_id
, esp_p_map
);
1993 nmap
= sizeof(encr_t_map
)/sizeof(encr_t_map
[0]);
1997 idstr
= STR_OR_ID(t_id
, prf_p_map
);
2001 idstr
= STR_OR_ID(t_id
, integ_p_map
);
2005 idstr
= STR_OR_ID(t_id
, dh_p_map
);
2009 idstr
= STR_OR_ID(t_id
, esn_p_map
);
2018 ND_PRINT(" #%u type=%s id=%s ", tcount
,
2019 STR_OR_ID(t_type
, ikev2_t_type_map
),
2022 ND_PRINT(" #%u type=%s id=%u ", tcount
,
2023 STR_OR_ID(t_type
, ikev2_t_type_map
),
2025 cp
= (const u_char
*)(p
+ 1);
2026 ep2
= (const u_char
*)p
+ item_len
;
2027 while (cp
< ep
&& cp
< ep2
) {
2029 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
2031 cp
= ikev1_attr_print(ndo
, cp
, ep2
);
2039 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_T
));
2043 static const u_char
*
2044 ikev2_p_print(netdissect_options
*ndo
, u_char tpay _U_
, int pcount _U_
,
2045 const struct isakmp_gen
*ext
, u_int oprop_length
,
2046 const u_char
*ep
, int depth
)
2048 const struct ikev2_p
*p
;
2057 p
= (const struct ikev2_p
*)ext
;
2060 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_P
), GET_U_1(p
->h
.critical
));
2063 * ikev2_sa_print() guarantees that this is >= 4.
2065 prop_length
= oprop_length
- 4;
2066 ND_PRINT(" #%u protoid=%s transform=%u len=%u",
2067 GET_U_1(p
->p_no
), PROTOIDSTR(GET_U_1(p
->prot_id
)),
2068 GET_U_1(p
->num_t
), oprop_length
);
2069 cp
= (const u_char
*)(p
+ 1);
2071 spi_size
= GET_U_1(p
->spi_size
);
2073 if (prop_length
< spi_size
)
2076 if (!rawprint(ndo
, (const uint8_t *)cp
, spi_size
))
2079 prop_length
-= spi_size
;
2083 * Print the transforms.
2086 for (np
= ISAKMP_NPTYPE_T
; np
!= 0; np
= GET_U_1(ext
->np
)) {
2088 ext
= (const struct isakmp_gen
*)cp
;
2089 if (prop_length
< sizeof(*ext
))
2091 ND_TCHECK_SIZE(ext
);
2094 * Since we can't have a payload length of less than 4 bytes,
2095 * we need to bail out here if the generic header is nonsensical
2096 * or truncated, otherwise we could loop forever processing
2097 * zero-length items or otherwise misdissect the packet.
2099 item_len
= GET_BE_U_2(ext
->len
);
2103 if (prop_length
< item_len
)
2105 ND_TCHECK_LEN(cp
, item_len
);
2109 for (i
= 0; i
< depth
; i
++)
2112 if (np
== ISAKMP_NPTYPE_T
) {
2113 cp
= ikev2_t_print(ndo
, tcount
, ext
, item_len
, ep
);
2115 /* error, already reported */
2119 ND_PRINT("%s", NPSTR(np
));
2124 prop_length
-= item_len
;
2129 * Skip the rest of the proposal.
2132 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
2135 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
2139 static const u_char
*
2140 ikev2_sa_print(netdissect_options
*ndo
, u_char tpay
,
2141 const struct isakmp_gen
*ext1
,
2142 u_int osa_length
, const u_char
*ep
,
2143 uint32_t phase _U_
, uint32_t doi _U_
,
2144 uint32_t proto _U_
, int depth
)
2146 const struct isakmp_gen
*ext
;
2154 ND_TCHECK_SIZE(ext1
);
2155 ikev2_pay_print(ndo
, "sa", GET_U_1(ext1
->critical
));
2158 * ikev2_sub0_print() guarantees that this is >= 4.
2160 osa_length
= GET_BE_U_2(ext1
->len
);
2161 sa_length
= osa_length
- 4;
2162 ND_PRINT(" len=%u", sa_length
);
2165 * Print the payloads.
2167 cp
= (const u_char
*)(ext1
+ 1);
2169 for (np
= ISAKMP_NPTYPE_P
; np
!= 0; np
= GET_U_1(ext
->np
)) {
2171 ext
= (const struct isakmp_gen
*)cp
;
2172 if (sa_length
< sizeof(*ext
))
2174 ND_TCHECK_SIZE(ext
);
2177 * Since we can't have a payload length of less than 4 bytes,
2178 * we need to bail out here if the generic header is nonsensical
2179 * or truncated, otherwise we could loop forever processing
2180 * zero-length items or otherwise misdissect the packet.
2182 item_len
= GET_BE_U_2(ext
->len
);
2186 if (sa_length
< item_len
)
2188 ND_TCHECK_LEN(cp
, item_len
);
2192 for (i
= 0; i
< depth
; i
++)
2195 if (np
== ISAKMP_NPTYPE_P
) {
2196 cp
= ikev2_p_print(ndo
, np
, pcount
, ext
, item_len
,
2199 /* error, already reported */
2203 ND_PRINT("%s", NPSTR(np
));
2208 sa_length
-= item_len
;
2213 * Skip the rest of the SA.
2216 ND_PRINT(" [|%s]", NPSTR(tpay
));
2219 ND_PRINT(" [|%s]", NPSTR(tpay
));
2223 static const u_char
*
2224 ikev2_ke_print(netdissect_options
*ndo
, u_char tpay
,
2225 const struct isakmp_gen
*ext
,
2226 u_int item_len
, const u_char
*ep _U_
,
2227 uint32_t phase _U_
, uint32_t doi _U_
,
2228 uint32_t proto _U_
, int depth _U_
)
2230 const struct ikev2_ke
*k
;
2232 k
= (const struct ikev2_ke
*)ext
;
2234 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(k
->h
.critical
));
2237 ND_PRINT(" len=%u < 8", item_len
);
2238 return (const u_char
*)ext
+ item_len
;
2240 ND_PRINT(" len=%u group=%s", item_len
- 8,
2241 STR_OR_ID(GET_BE_U_2(k
->ke_group
), dh_p_map
));
2243 if (2 < ndo
->ndo_vflag
&& 8 < item_len
) {
2245 if (!rawprint(ndo
, (const uint8_t *)(k
+ 1), item_len
- 8))
2248 return (const u_char
*)ext
+ item_len
;
2250 ND_PRINT(" [|%s]", NPSTR(tpay
));
2254 static const u_char
*
2255 ikev2_ID_print(netdissect_options
*ndo
, u_char tpay
,
2256 const struct isakmp_gen
*ext
,
2257 u_int item_len
, const u_char
*ep _U_
,
2258 uint32_t phase _U_
, uint32_t doi _U_
,
2259 uint32_t proto _U_
, int depth _U_
)
2261 const struct ikev2_id
*idp
;
2262 u_int idtype_len
, i
;
2263 unsigned int dumpascii
, dumphex
;
2264 const unsigned char *typedata
;
2266 idp
= (const struct ikev2_id
*)ext
;
2267 ND_TCHECK_SIZE(idp
);
2268 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(idp
->h
.critical
));
2271 * Our caller has ensured that the length is >= 4.
2273 ND_PRINT(" len=%u", item_len
- 4);
2274 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
2275 /* Print the entire payload in hex */
2277 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2281 idtype_len
=item_len
- sizeof(struct ikev2_id
);
2284 typedata
= (const unsigned char *)(ext
)+sizeof(struct ikev2_id
);
2286 switch(GET_U_1(idp
->type
)) {
2295 case ID_RFC822_ADDR
:
2296 ND_PRINT(" rfc822:");
2303 case ID_DER_ASN1_DN
:
2307 case ID_DER_ASN1_GN
:
2312 ND_PRINT(" keyid:");
2318 ND_TCHECK_LEN(typedata
, idtype_len
);
2319 for(i
=0; i
<idtype_len
; i
++) {
2320 if(ND_ASCII_ISPRINT(GET_U_1(typedata
+ i
))) {
2321 ND_PRINT("%c", GET_U_1(typedata
+ i
));
2328 if (!rawprint(ndo
, (const uint8_t *)typedata
, idtype_len
))
2332 return (const u_char
*)ext
+ item_len
;
2334 ND_PRINT(" [|%s]", NPSTR(tpay
));
2338 static const u_char
*
2339 ikev2_cert_print(netdissect_options
*ndo
, u_char tpay
,
2340 const struct isakmp_gen
*ext
,
2341 u_int item_len
, const u_char
*ep _U_
,
2342 uint32_t phase _U_
, uint32_t doi _U_
,
2343 uint32_t proto _U_
, int depth _U_
)
2345 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2348 static const u_char
*
2349 ikev2_cr_print(netdissect_options
*ndo
, u_char tpay
,
2350 const struct isakmp_gen
*ext
,
2351 u_int item_len
, const u_char
*ep _U_
,
2352 uint32_t phase _U_
, uint32_t doi _U_
,
2353 uint32_t proto _U_
, int depth _U_
)
2355 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2358 static const u_char
*
2359 ikev2_auth_print(netdissect_options
*ndo
, u_char tpay
,
2360 const struct isakmp_gen
*ext
,
2361 u_int item_len
, const u_char
*ep
,
2362 uint32_t phase _U_
, uint32_t doi _U_
,
2363 uint32_t proto _U_
, int depth _U_
)
2365 const struct ikev2_auth
*p
;
2366 const char *v2_auth
[]={ "invalid", "rsasig",
2367 "shared-secret", "dsssig" };
2368 const u_char
*authdata
= (const u_char
*)ext
+ sizeof(struct ikev2_auth
);
2370 ND_TCHECK_LEN(ext
, sizeof(struct ikev2_auth
));
2371 p
= (const struct ikev2_auth
*)ext
;
2372 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(p
->h
.critical
));
2375 * Our caller has ensured that the length is >= 4.
2377 ND_PRINT(" len=%u method=%s", item_len
-4,
2378 STR_OR_ID(GET_U_1(p
->auth_method
), v2_auth
));
2380 if (ndo
->ndo_vflag
> 1) {
2381 ND_PRINT(" authdata=(");
2382 if (!rawprint(ndo
, (const uint8_t *)authdata
, item_len
- sizeof(struct ikev2_auth
)))
2385 } else if (ndo
->ndo_vflag
) {
2386 if (!ike_show_somedata(ndo
, authdata
, ep
))
2391 return (const u_char
*)ext
+ item_len
;
2393 ND_PRINT(" [|%s]", NPSTR(tpay
));
2397 static const u_char
*
2398 ikev2_nonce_print(netdissect_options
*ndo
, u_char tpay
,
2399 const struct isakmp_gen
*ext
,
2400 u_int item_len
, const u_char
*ep
,
2401 uint32_t phase _U_
, uint32_t doi _U_
,
2402 uint32_t proto _U_
, int depth _U_
)
2404 ND_TCHECK_SIZE(ext
);
2405 ikev2_pay_print(ndo
, "nonce", GET_U_1(ext
->critical
));
2408 * Our caller has ensured that the length is >= 4.
2410 ND_PRINT(" len=%u", item_len
- 4);
2411 if (1 < ndo
->ndo_vflag
&& 4 < item_len
) {
2412 ND_PRINT(" nonce=(");
2413 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2416 } else if(ndo
->ndo_vflag
&& 4 < item_len
) {
2417 if(!ike_show_somedata(ndo
, (const u_char
*)(ext
+1), ep
)) goto trunc
;
2420 return (const u_char
*)ext
+ item_len
;
2422 ND_PRINT(" [|%s]", NPSTR(tpay
));
2426 /* notify payloads */
2427 static const u_char
*
2428 ikev2_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
2429 const struct isakmp_gen
*ext
,
2430 u_int item_len
, const u_char
*ep
,
2431 uint32_t phase _U_
, uint32_t doi _U_
,
2432 uint32_t proto _U_
, int depth _U_
)
2434 const struct ikev2_n
*p
;
2438 u_char showspi
, showsomedata
;
2439 const char *notify_name
;
2441 p
= (const struct ikev2_n
*)ext
;
2443 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_N
), GET_U_1(p
->h
.critical
));
2449 ND_PRINT(" prot_id=%s", PROTOIDSTR(GET_U_1(p
->prot_id
)));
2451 type
= GET_BE_U_2(p
->type
);
2453 /* notify space is annoying sparse */
2455 case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
:
2456 notify_name
= "unsupported_critical_payload";
2459 case IV2_NOTIFY_INVALID_IKE_SPI
:
2460 notify_name
= "invalid_ike_spi";
2464 case IV2_NOTIFY_INVALID_MAJOR_VERSION
:
2465 notify_name
= "invalid_major_version";
2468 case IV2_NOTIFY_INVALID_SYNTAX
:
2469 notify_name
= "invalid_syntax";
2473 case IV2_NOTIFY_INVALID_MESSAGE_ID
:
2474 notify_name
= "invalid_message_id";
2478 case IV2_NOTIFY_INVALID_SPI
:
2479 notify_name
= "invalid_spi";
2483 case IV2_NOTIFY_NO_PROPOSAL_CHOSEN
:
2484 notify_name
= "no_proposal_chosen";
2488 case IV2_NOTIFY_INVALID_KE_PAYLOAD
:
2489 notify_name
= "invalid_ke_payload";
2493 case IV2_NOTIFY_AUTHENTICATION_FAILED
:
2494 notify_name
= "authentication_failed";
2498 case IV2_NOTIFY_SINGLE_PAIR_REQUIRED
:
2499 notify_name
= "single_pair_required";
2503 case IV2_NOTIFY_NO_ADDITIONAL_SAS
:
2504 notify_name
= "no_additional_sas";
2507 case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
:
2508 notify_name
= "internal_address_failure";
2511 case IV2_NOTIFY_FAILED_CP_REQUIRED
:
2512 notify_name
= "failed_cp_required";
2515 case IV2_NOTIFY_TS_UNACCEPTABLE
:
2516 notify_name
= "ts_unacceptable";
2519 case IV2_NOTIFY_INVALID_SELECTORS
:
2520 notify_name
= "invalid_selectors";
2523 case IV2_NOTIFY_UNACCEPTABLE_ADDRESSES
:
2524 notify_name
= "unacceptable_addresses";
2527 case IV2_NOTIFY_UNEXPECTED_NAT_DETECTED
:
2528 notify_name
= "unexpected_nat_detected";
2531 case IV2_NOTIFY_USE_ASSIGNED_HOA
:
2532 notify_name
= "use_assigned_hoa";
2535 case IV2_NOTIFY_TEMPORARY_FAILURE
:
2536 notify_name
= "temporary_failure";
2539 case IV2_NOTIFY_CHILD_SA_NOT_FOUND
:
2540 notify_name
= "child_sa_not_found";
2543 case IV2_NOTIFY_INVALID_GROUP_ID
:
2544 notify_name
= "invalid_group_id";
2547 case IV2_NOTIFY_AUTHORIZATION_FAILED
:
2548 notify_name
= "authorization_failed";
2551 case IV2_NOTIFY_STATE_NOT_FOUND
:
2552 notify_name
= "state_not_found";
2555 case IV2_NOTIFY_INITIAL_CONTACT
:
2556 notify_name
= "initial_contact";
2559 case IV2_NOTIFY_SET_WINDOW_SIZE
:
2560 notify_name
= "set_window_size";
2563 case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
:
2564 notify_name
= "additional_ts_possible";
2567 case IV2_NOTIFY_IPCOMP_SUPPORTED
:
2568 notify_name
= "ipcomp_supported";
2571 case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
:
2572 notify_name
= "nat_detection_source_ip";
2576 case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
:
2577 notify_name
= "nat_detection_destination_ip";
2581 case IV2_NOTIFY_COOKIE
:
2582 notify_name
= "cookie";
2587 case IV2_NOTIFY_USE_TRANSPORT_MODE
:
2588 notify_name
= "use_transport_mode";
2591 case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
:
2592 notify_name
= "http_cert_lookup_supported";
2595 case IV2_NOTIFY_REKEY_SA
:
2596 notify_name
= "rekey_sa";
2600 case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
:
2601 notify_name
= "tfc_padding_not_supported";
2604 case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
:
2605 notify_name
= "non_first_fragment_also";
2608 case IV2_NOTIFY_MOBIKE_SUPPORTED
:
2609 notify_name
= "mobike_supported";
2612 case IV2_NOTIFY_ADDITIONAL_IP4_ADDRESS
:
2613 notify_name
= "additional_ip4_address";
2616 case IV2_NOTIFY_ADDITIONAL_IP6_ADDRESS
:
2617 notify_name
= "additional_ip6_address";
2620 case IV2_NOTIFY_NO_ADDITIONAL_ADDRESSES
:
2621 notify_name
= "no_additional_addresses";
2624 case IV2_NOTIFY_UPDATE_SA_ADDRESSES
:
2625 notify_name
= "update_sa_addresses";
2628 case IV2_NOTIFY_COOKIE2
:
2629 notify_name
= "cookie2";
2632 case IV2_NOTIFY_NO_NATS_ALLOWED
:
2633 notify_name
= "no_nats_allowed";
2636 case IV2_NOTIFY_AUTH_LIFETIME
:
2637 notify_name
= "auth_lifetime";
2640 case IV2_NOTIFY_MULTIPLE_AUTH_SUPPORTED
:
2641 notify_name
= "multiple_auth_supported";
2644 case IV2_NOTIFY_ANOTHER_AUTH_FOLLOWS
:
2645 notify_name
= "another_auth_follows";
2648 case IV2_NOTIFY_REDIRECT_SUPPORTED
:
2649 notify_name
= "redirect_supported";
2652 case IV2_NOTIFY_REDIRECT
:
2653 notify_name
= "redirect";
2656 case IV2_NOTIFY_REDIRECTED_FROM
:
2657 notify_name
= "redirected_from";
2660 case IV2_NOTIFY_TICKET_LT_OPAQUE
:
2661 notify_name
= "ticket_lt_opaque";
2664 case IV2_NOTIFY_TICKET_REQUEST
:
2665 notify_name
= "ticket_request";
2668 case IV2_NOTIFY_TICKET_ACK
:
2669 notify_name
= "ticket_ack";
2672 case IV2_NOTIFY_TICKET_NACK
:
2673 notify_name
= "ticket_nack";
2676 case IV2_NOTIFY_TICKET_OPAQUE
:
2677 notify_name
= "ticket_opaque";
2680 case IV2_NOTIFY_LINK_ID
:
2681 notify_name
= "link_id";
2684 case IV2_NOTIFY_USE_WESP_MODE
:
2685 notify_name
= "use_wesp_mode";
2688 case IV2_NOTIFY_ROHC_SUPPORTED
:
2689 notify_name
= "rohc_supported";
2692 case IV2_NOTIFY_EAP_ONLY_AUTHENTICATION
:
2693 notify_name
= "eap_only_authentication";
2696 case IV2_NOTIFY_CHILDLESS_IKEV2_SUPPORTED
:
2697 notify_name
= "childless_ikev2_supported";
2700 case IV2_NOTIFY_QUICK_CRASH_DETECTION
:
2701 notify_name
= "quick_crash_detection";
2704 case IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC_SUPPORTED
:
2705 notify_name
= "ikev2_message_id_sync_supported";
2708 case IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC_SUPPORTED
:
2709 notify_name
= "ipsec_replay_counter_sync_supported";
2712 case IV2_NOTIFY_IKEV2_MESSAGE_ID_SYNC
:
2713 notify_name
= "ikev2_message_id_sync";
2716 case IV2_NOTIFY_IPSEC_REPLAY_COUNTER_SYNC
:
2717 notify_name
= "ipsec_replay_counter_sync";
2720 case IV2_NOTIFY_SECURE_PASSWORD_METHODS
:
2721 notify_name
= "secure_password_methods";
2724 case IV2_NOTIFY_PSK_PERSIST
:
2725 notify_name
= "psk_persist";
2728 case IV2_NOTIFY_PSK_CONFIRM
:
2729 notify_name
= "psk_confirm";
2732 case IV2_NOTIFY_ERX_SUPPORTED
:
2733 notify_name
= "erx_supported";
2736 case IV2_NOTIFY_IFOM_CAPABILITY
:
2737 notify_name
= "ifom_capability";
2740 case IV2_NOTIFY_SENDER_REQUEST_ID
:
2741 notify_name
= "sender_request_id";
2744 case IV2_NOTIFY_IKEV2_FRAGMENTATION_SUPPORTED
:
2745 notify_name
= "ikev2_fragmentation_supported";
2748 case IV2_NOTIFY_SIGNATURE_HASH_ALGORITHMS
:
2749 notify_name
= "signature_hash_algorithms";
2752 case IV2_NOTIFY_CLONE_IKE_SA_SUPPORTED
:
2753 notify_name
= "clone_ike_sa_supported";
2756 case IV2_NOTIFY_CLONE_IKE_SA
:
2757 notify_name
= "clone_ike_sa";
2760 case IV2_NOTIFY_PUZZLE
:
2761 notify_name
= "puzzle";
2764 case IV2_NOTIFY_USE_PPK
:
2765 notify_name
= "use_ppk";
2768 case IV2_NOTIFY_PPK_IDENTITY
:
2769 notify_name
= "ppk_identity";
2772 case IV2_NOTIFY_NO_PPK_AUTH
:
2773 notify_name
= "no_ppk_auth";
2776 case IV2_NOTIFY_INTERMEDIATE_EXCHANGE_SUPPORTED
:
2777 notify_name
= "intermediate_exchange_supported";
2780 case IV2_NOTIFY_IP4_ALLOWED
:
2781 notify_name
= "ip4_allowed";
2784 case IV2_NOTIFY_IP6_ALLOWED
:
2785 notify_name
= "ip6_allowed";
2788 case IV2_NOTIFY_ADDITIONAL_KEY_EXCHANGE
:
2789 notify_name
= "additional_key_exchange";
2792 case IV2_NOTIFY_USE_AGGFRAG
:
2793 notify_name
= "use_aggfrag";
2799 notify_name
="error";
2800 } else if(type
< 16384) {
2801 notify_name
="private-error";
2802 } else if(type
< 40960) {
2803 notify_name
="status";
2805 notify_name
="private-status";
2810 ND_PRINT(" type=%u(%s)", type
, notify_name
);
2814 spi_size
= GET_U_1(p
->spi_size
);
2815 if (showspi
&& spi_size
) {
2817 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
2821 cp
= (const u_char
*)(p
+ 1) + spi_size
;
2824 if (ndo
->ndo_vflag
> 3 || (showsomedata
&& ep
-cp
< 30)) {
2825 ND_PRINT(" data=(");
2826 if (!rawprint(ndo
, (const uint8_t *)(cp
), ep
- cp
))
2830 } else if (showsomedata
) {
2831 if (!ike_show_somedata(ndo
, cp
, ep
))
2836 return (const u_char
*)ext
+ item_len
;
2838 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_N
));
2842 static const u_char
*
2843 ikev2_d_print(netdissect_options
*ndo
, u_char tpay
,
2844 const struct isakmp_gen
*ext
,
2845 u_int item_len
, const u_char
*ep _U_
,
2846 uint32_t phase _U_
, uint32_t doi _U_
,
2847 uint32_t proto _U_
, int depth _U_
)
2849 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2852 static const u_char
*
2853 ikev2_vid_print(netdissect_options
*ndo
, u_char tpay
,
2854 const struct isakmp_gen
*ext
,
2855 u_int item_len
, const u_char
*ep _U_
,
2856 uint32_t phase _U_
, uint32_t doi _U_
,
2857 uint32_t proto _U_
, int depth _U_
)
2862 ND_TCHECK_SIZE(ext
);
2863 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(ext
->critical
));
2866 * Our caller has ensured that the length is >= 4.
2868 ND_PRINT(" len=%u vid=", item_len
- 4);
2870 vid
= (const u_char
*)(ext
+1);
2872 ND_TCHECK_LEN(vid
, len
);
2873 for(i
=0; i
<len
; i
++) {
2874 if(ND_ASCII_ISPRINT(GET_U_1(vid
+ i
)))
2875 ND_PRINT("%c", GET_U_1(vid
+ i
));
2878 if (2 < ndo
->ndo_vflag
&& 4 < len
) {
2879 /* Print the entire payload in hex */
2881 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2884 return (const u_char
*)ext
+ item_len
;
2886 ND_PRINT(" [|%s]", NPSTR(tpay
));
2890 static const u_char
*
2891 ikev2_TS_print(netdissect_options
*ndo
, u_char tpay
,
2892 const struct isakmp_gen
*ext
,
2893 u_int item_len
, const u_char
*ep _U_
,
2894 uint32_t phase _U_
, uint32_t doi _U_
,
2895 uint32_t proto _U_
, int depth _U_
)
2897 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2900 static const u_char
*
2901 ikev2_e_print(netdissect_options
*ndo
,
2902 #ifndef HAVE_LIBCRYPTO
2905 const struct isakmp
*base
,
2907 const struct isakmp_gen
*ext
,
2908 u_int item_len
, const u_char
*ep _U_
,
2909 #ifndef HAVE_LIBCRYPTO
2913 #ifndef HAVE_LIBCRYPTO
2917 #ifndef HAVE_LIBCRYPTO
2921 #ifndef HAVE_LIBCRYPTO
2928 #ifdef HAVE_LIBCRYPTO
2932 ND_TCHECK_SIZE(ext
);
2933 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(ext
->critical
));
2937 ND_PRINT(" len=%u", dlen
);
2938 if (2 < ndo
->ndo_vflag
&& 4 < dlen
) {
2940 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), dlen
))
2944 dat
= (const u_char
*)(ext
+1);
2945 ND_TCHECK_LEN(dat
, dlen
);
2947 #ifdef HAVE_LIBCRYPTO
2948 np
= GET_U_1(ext
->np
);
2950 /* try to decrypt it! */
2951 if(esp_decrypt_buffer_by_ikev2_print(ndo
,
2952 GET_U_1(base
->flags
) & ISAKMP_FLAG_I
,
2953 base
->i_ck
, base
->r_ck
,
2956 ext
= (const struct isakmp_gen
*)ndo
->ndo_packetp
;
2958 /* got it decrypted, print stuff inside. */
2959 ikev2_sub_print(ndo
, base
, np
, ext
,
2960 ndo
->ndo_snapend
, phase
, doi
, proto
, depth
+1);
2963 * esp_decrypt_buffer_by_ikev2_print pushed information
2964 * on the buffer stack; we're done with the buffer, so
2965 * pop it (which frees the buffer)
2967 nd_pop_packet_info(ndo
);
2972 /* always return NULL, because E must be at end, and NP refers
2973 * to what was inside.
2977 ND_PRINT(" [|%s]", NPSTR(tpay
));
2981 static const u_char
*
2982 ikev2_cp_print(netdissect_options
*ndo
, u_char tpay
,
2983 const struct isakmp_gen
*ext
,
2984 u_int item_len
, const u_char
*ep _U_
,
2985 uint32_t phase _U_
, uint32_t doi _U_
,
2986 uint32_t proto _U_
, int depth _U_
)
2988 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2991 static const u_char
*
2992 ikev2_eap_print(netdissect_options
*ndo
, u_char tpay
,
2993 const struct isakmp_gen
*ext
,
2994 u_int item_len
, const u_char
*ep _U_
,
2995 uint32_t phase _U_
, uint32_t doi _U_
,
2996 uint32_t proto _U_
, int depth _U_
)
2998 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
3001 static const u_char
*
3002 ike_sub0_print(netdissect_options
*ndo
,
3003 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
3005 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3010 cp
= (const u_char
*)ext
;
3011 ND_TCHECK_SIZE(ext
);
3014 * Since we can't have a payload length of less than 4 bytes,
3015 * we need to bail out here if the generic header is nonsensical
3016 * or truncated, otherwise we could loop forever processing
3017 * zero-length items or otherwise misdissect the packet.
3019 item_len
= GET_BE_U_2(ext
->len
);
3025 * XXX - what if item_len is too short, or too long,
3026 * for this payload type?
3028 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
, ep
, phase
, doi
, proto
, depth
);
3030 ND_PRINT("%s", NPSTR(np
));
3036 nd_print_trunc(ndo
);
3040 static const u_char
*
3041 ikev1_sub_print(netdissect_options
*ndo
,
3042 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
3043 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3049 cp
= (const u_char
*)ext
;
3052 ND_TCHECK_SIZE(ext
);
3054 item_len
= GET_BE_U_2(ext
->len
);
3055 ND_TCHECK_LEN(ext
, item_len
);
3059 for (i
= 0; i
< depth
; i
++)
3062 cp
= ike_sub0_print(ndo
, np
, ext
, ep
, phase
, doi
, proto
, depth
);
3067 /* Zero-length subitem */
3071 np
= GET_U_1(ext
->np
);
3072 ext
= (const struct isakmp_gen
*)cp
;
3076 ND_PRINT(" [|%s]", NPSTR(np
));
3083 static char buf
[20];
3084 snprintf(buf
, sizeof(buf
), "#%u", x
);
3089 ikev1_print(netdissect_options
*ndo
,
3090 const u_char
*bp
, u_int length
,
3091 const u_char
*bp2
, const struct isakmp
*base
)
3093 const struct isakmp
*p
;
3100 p
= (const struct isakmp
*)bp
;
3101 ep
= ndo
->ndo_snapend
;
3103 phase
= (GET_BE_U_4(base
->msgid
) == 0) ? 1 : 2;
3105 ND_PRINT(" phase %u", phase
);
3107 ND_PRINT(" phase %u/others", phase
);
3109 i
= cookie_find(&base
->i_ck
);
3111 if (iszero(ndo
, base
->r_ck
, sizeof(base
->r_ck
))) {
3112 /* the first packet */
3115 cookie_record(ndo
, &base
->i_ck
, bp2
);
3119 if (bp2
&& cookie_isinitiator(ndo
, i
, bp2
))
3121 else if (bp2
&& cookie_isresponder(ndo
, i
, bp2
))
3127 ND_PRINT(" %s", ETYPESTR(GET_U_1(base
->etype
)));
3128 flags
= GET_U_1(base
->flags
);
3130 ND_PRINT("[%s%s]", flags
& ISAKMP_FLAG_E
? "E" : "",
3131 flags
& ISAKMP_FLAG_C
? "C" : "");
3134 if (ndo
->ndo_vflag
) {
3135 const struct isakmp_gen
*ext
;
3139 np
= GET_U_1(base
->np
);
3141 /* regardless of phase... */
3142 if (flags
& ISAKMP_FLAG_E
) {
3144 * encrypted, nothing we can do right now.
3145 * we hope to decrypt the packet in the future...
3147 ND_PRINT(" [encrypted %s]", NPSTR(np
));
3151 CHECKLEN(p
+ 1, np
);
3152 ext
= (const struct isakmp_gen
*)(p
+ 1);
3153 ikev1_sub_print(ndo
, np
, ext
, ep
, phase
, 0, 0, 0);
3157 if (ndo
->ndo_vflag
) {
3158 if (GET_BE_U_4(base
->len
) != length
) {
3159 ND_PRINT(" (len mismatch: isakmp %u/ip %u)",
3160 GET_BE_U_4(base
->len
), length
);
3165 static const u_char
*
3166 ikev2_sub0_print(netdissect_options
*ndo
, const struct isakmp
*base
,
3168 const struct isakmp_gen
*ext
, const u_char
*ep
,
3169 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3174 cp
= (const u_char
*)ext
;
3175 ND_TCHECK_SIZE(ext
);
3178 * Since we can't have a payload length of less than 4 bytes,
3179 * we need to bail out here if the generic header is nonsensical
3180 * or truncated, otherwise we could loop forever processing
3181 * zero-length items or otherwise misdissect the packet.
3183 item_len
= GET_BE_U_2(ext
->len
);
3187 if (np
== ISAKMP_NPTYPE_v2E
) {
3188 cp
= ikev2_e_print(ndo
, base
, np
, ext
, item_len
,
3189 ep
, phase
, doi
, proto
, depth
);
3190 } else if (NPFUNC(np
)) {
3192 * XXX - what if item_len is too short, or too long,
3193 * for this payload type?
3195 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
,
3196 ep
, phase
, doi
, proto
, depth
);
3198 ND_PRINT("%s", NPSTR(np
));
3204 nd_print_trunc(ndo
);
3208 static const u_char
*
3209 ikev2_sub_print(netdissect_options
*ndo
,
3210 const struct isakmp
*base
,
3211 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
3212 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
3217 cp
= (const u_char
*)ext
;
3219 ND_TCHECK_SIZE(ext
);
3221 ND_TCHECK_LEN(ext
, GET_BE_U_2(ext
->len
));
3225 for (i
= 0; i
< depth
; i
++)
3228 cp
= ikev2_sub0_print(ndo
, base
, np
,
3229 ext
, ep
, phase
, doi
, proto
, depth
);
3234 /* Zero-length subitem */
3238 np
= GET_U_1(ext
->np
);
3239 ext
= (const struct isakmp_gen
*)cp
;
3243 ND_PRINT(" [|%s]", NPSTR(np
));
3248 ikev2_print(netdissect_options
*ndo
,
3249 const u_char
*bp
, u_int length
,
3250 const u_char
*bp2 _U_
, const struct isakmp
*base
)
3252 const struct isakmp
*p
;
3258 p
= (const struct isakmp
*)bp
;
3259 ep
= ndo
->ndo_snapend
;
3261 phase
= (GET_BE_U_4(base
->msgid
) == 0) ? 1 : 2;
3263 ND_PRINT(" parent_sa");
3265 ND_PRINT(" child_sa ");
3267 ND_PRINT(" %s", ETYPESTR(GET_U_1(base
->etype
)));
3268 flags
= GET_U_1(base
->flags
);
3270 ND_PRINT("[%s%s%s]",
3271 flags
& ISAKMP_FLAG_I
? "I" : "",
3272 flags
& ISAKMP_FLAG_V
? "V" : "",
3273 flags
& ISAKMP_FLAG_R
? "R" : "");
3276 if (ndo
->ndo_vflag
) {
3277 const struct isakmp_gen
*ext
;
3281 np
= GET_U_1(base
->np
);
3283 /* regardless of phase... */
3284 if (flags
& ISAKMP_FLAG_E
) {
3286 * encrypted, nothing we can do right now.
3287 * we hope to decrypt the packet in the future...
3289 ND_PRINT(" [encrypted %s]", NPSTR(np
));
3294 ext
= (const struct isakmp_gen
*)(p
+ 1);
3295 ikev2_sub_print(ndo
, base
, np
, ext
, ep
, phase
, 0, 0, 0);
3299 if (ndo
->ndo_vflag
) {
3300 if (GET_BE_U_4(base
->len
) != length
) {
3301 ND_PRINT(" (len mismatch: isakmp %u/ip %u)",
3302 GET_BE_U_4(base
->len
), length
);
3308 isakmp_print(netdissect_options
*ndo
,
3309 const u_char
*bp
, u_int length
,
3312 const struct isakmp
*p
;
3316 ndo
->ndo_protocol
= "isakmp";
3317 #ifdef HAVE_LIBCRYPTO
3318 /* initialize SAs */
3319 if (ndo
->ndo_sa_list_head
== NULL
) {
3320 if (ndo
->ndo_espsecret
)
3321 esp_decodesecret_print(ndo
);
3325 p
= (const struct isakmp
*)bp
;
3326 ep
= ndo
->ndo_snapend
;
3328 if ((const struct isakmp
*)ep
< p
+ 1) {
3329 nd_print_trunc(ndo
);
3334 major
= (GET_U_1(p
->vers
) & ISAKMP_VERS_MAJOR
)
3335 >> ISAKMP_VERS_MAJOR_SHIFT
;
3336 minor
= (GET_U_1(p
->vers
) & ISAKMP_VERS_MINOR
)
3337 >> ISAKMP_VERS_MINOR_SHIFT
;
3339 if (ndo
->ndo_vflag
) {
3340 ND_PRINT(" %u.%u", major
, minor
);
3343 if (ndo
->ndo_vflag
) {
3344 ND_PRINT(" msgid ");
3345 hexprint(ndo
, p
->msgid
, sizeof(p
->msgid
));
3348 if (1 < ndo
->ndo_vflag
) {
3349 ND_PRINT(" cookie ");
3350 hexprint(ndo
, p
->i_ck
, sizeof(p
->i_ck
));
3352 hexprint(ndo
, p
->r_ck
, sizeof(p
->r_ck
));
3357 case IKEv1_MAJOR_VERSION
:
3358 ikev1_print(ndo
, bp
, length
, bp2
, p
);
3361 case IKEv2_MAJOR_VERSION
:
3362 ikev2_print(ndo
, bp
, length
, bp2
, p
);
3368 isakmp_rfc3948_print(netdissect_options
*ndo
,
3369 const u_char
*bp
, u_int length
,
3370 const u_char
*bp2
, int ver
, int fragmented
, u_int ttl_hl
)
3372 ndo
->ndo_protocol
= "isakmp_rfc3948";
3373 if(length
== 1 && GET_U_1(bp
)==0xff) {
3374 ND_PRINT("isakmp-nat-keep-alive");
3383 * see if this is an IKE packet
3385 if (GET_BE_U_4(bp
) == 0) {
3386 ND_PRINT("NONESP-encap: ");
3387 isakmp_print(ndo
, bp
+4, length
-4, bp2
);
3391 /* must be an ESP packet */
3393 ND_PRINT("UDP-encap: ");
3395 esp_print(ndo
, bp
, length
, bp2
, ver
, fragmented
, ttl_hl
);
3398 * Either this has decrypted the payload and
3399 * printed it, in which case there's nothing more
3400 * to do, or it hasn't, in which case there's
3401 * nothing more to do.
3407 nd_print_trunc(ndo
);