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"
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,
389 IV2_NOTIFY_INVALID_IKE_SPI
= 4,
390 IV2_NOTIFY_INVALID_MAJOR_VERSION
= 5,
391 IV2_NOTIFY_INVALID_SYNTAX
= 7,
392 IV2_NOTIFY_INVALID_MESSAGE_ID
= 9,
393 IV2_NOTIFY_INVALID_SPI
=11,
394 IV2_NOTIFY_NO_PROPOSAL_CHOSEN
=14,
395 IV2_NOTIFY_INVALID_KE_PAYLOAD
=17,
396 IV2_NOTIFY_AUTHENTICATION_FAILED
=24,
397 IV2_NOTIFY_SINGLE_PAIR_REQUIRED
=34,
398 IV2_NOTIFY_NO_ADDITIONAL_SAS
=35,
399 IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
=36,
400 IV2_NOTIFY_FAILED_CP_REQUIRED
=37,
401 IV2_NOTIFY_INVALID_SELECTORS
=39,
402 IV2_NOTIFY_INITIAL_CONTACT
=16384,
403 IV2_NOTIFY_SET_WINDOW_SIZE
=16385,
404 IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
=16386,
405 IV2_NOTIFY_IPCOMP_SUPPORTED
=16387,
406 IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
=16388,
407 IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
=16389,
408 IV2_NOTIFY_COOKIE
=16390,
409 IV2_NOTIFY_USE_TRANSPORT_MODE
=16391,
410 IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
=16392,
411 IV2_NOTIFY_REKEY_SA
=16393,
412 IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
=16394,
413 IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
=16395
416 struct notify_messages
{
421 /* 3.8 Authentication Payload */
424 nd_uint8_t auth_method
; /* Protocol-ID */
426 /* authentication data */
429 enum ikev2_auth_type
{
435 /* refer to RFC 2409 */
438 /* isakmp sa structure */
440 uint8_t proto_id
; /* OAKLEY */
441 vchar_t
*spi
; /* spi */
442 uint8_t dhgrp
; /* DH; group */
443 uint8_t auth_t
; /* method of authentication */
444 uint8_t prf_t
; /* type of prf */
445 uint8_t hash_t
; /* type of hash */
446 uint8_t enc_t
; /* type of cipher */
447 uint8_t life_t
; /* type of duration of lifetime */
448 uint32_t ldur
; /* life duration */
452 /* refer to RFC 2407 */
456 /* 4.2 IPSEC Situation Definition */
457 #define IPSECDOI_SIT_IDENTITY_ONLY 0x00000001
458 #define IPSECDOI_SIT_SECRECY 0x00000002
459 #define IPSECDOI_SIT_INTEGRITY 0x00000004
461 /* 4.4.1 IPSEC Security Protocol Identifiers */
462 /* 4.4.2 IPSEC ISAKMP Transform Values */
463 #define IPSECDOI_PROTO_ISAKMP 1
464 #define IPSECDOI_KEY_IKE 1
466 /* 4.4.1 IPSEC Security Protocol Identifiers */
467 #define IPSECDOI_PROTO_IPSEC_AH 2
468 /* 4.4.3 IPSEC AH Transform Values */
469 #define IPSECDOI_AH_MD5 2
470 #define IPSECDOI_AH_SHA 3
471 #define IPSECDOI_AH_DES 4
472 #define IPSECDOI_AH_SHA2_256 5
473 #define IPSECDOI_AH_SHA2_384 6
474 #define IPSECDOI_AH_SHA2_512 7
476 /* 4.4.1 IPSEC Security Protocol Identifiers */
477 #define IPSECDOI_PROTO_IPSEC_ESP 3
478 /* 4.4.4 IPSEC ESP Transform Identifiers */
479 #define IPSECDOI_ESP_DES_IV64 1
480 #define IPSECDOI_ESP_DES 2
481 #define IPSECDOI_ESP_3DES 3
482 #define IPSECDOI_ESP_RC5 4
483 #define IPSECDOI_ESP_IDEA 5
484 #define IPSECDOI_ESP_CAST 6
485 #define IPSECDOI_ESP_BLOWFISH 7
486 #define IPSECDOI_ESP_3IDEA 8
487 #define IPSECDOI_ESP_DES_IV32 9
488 #define IPSECDOI_ESP_RC4 10
489 #define IPSECDOI_ESP_NULL 11
490 #define IPSECDOI_ESP_RIJNDAEL 12
491 #define IPSECDOI_ESP_AES 12
493 /* 4.4.1 IPSEC Security Protocol Identifiers */
494 #define IPSECDOI_PROTO_IPCOMP 4
495 /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
496 #define IPSECDOI_IPCOMP_OUI 1
497 #define IPSECDOI_IPCOMP_DEFLATE 2
498 #define IPSECDOI_IPCOMP_LZS 3
500 /* 4.5 IPSEC Security Association Attributes */
501 #define IPSECDOI_ATTR_SA_LTYPE 1 /* B */
502 #define IPSECDOI_ATTR_SA_LTYPE_DEFAULT 1
503 #define IPSECDOI_ATTR_SA_LTYPE_SEC 1
504 #define IPSECDOI_ATTR_SA_LTYPE_KB 2
505 #define IPSECDOI_ATTR_SA_LDUR 2 /* V */
506 #define IPSECDOI_ATTR_SA_LDUR_DEFAULT 28800 /* 8 hours */
507 #define IPSECDOI_ATTR_GRP_DESC 3 /* B */
508 #define IPSECDOI_ATTR_ENC_MODE 4 /* B */
509 /* default value: host dependent */
510 #define IPSECDOI_ATTR_ENC_MODE_TUNNEL 1
511 #define IPSECDOI_ATTR_ENC_MODE_TRNS 2
512 #define IPSECDOI_ATTR_AUTH 5 /* B */
513 /* 0 means not to use authentication. */
514 #define IPSECDOI_ATTR_AUTH_HMAC_MD5 1
515 #define IPSECDOI_ATTR_AUTH_HMAC_SHA1 2
516 #define IPSECDOI_ATTR_AUTH_DES_MAC 3
517 #define IPSECDOI_ATTR_AUTH_KPDK 4 /*RFC-1826(Key/Pad/Data/Key)*/
519 * When negotiating ESP without authentication, the Auth
520 * Algorithm attribute MUST NOT be included in the proposal.
521 * When negotiating ESP without confidentiality, the Auth
522 * Algorithm attribute MUST be included in the proposal and
523 * the ESP transform ID must be ESP_NULL.
525 #define IPSECDOI_ATTR_KEY_LENGTH 6 /* B */
526 #define IPSECDOI_ATTR_KEY_ROUNDS 7 /* B */
527 #define IPSECDOI_ATTR_COMP_DICT_SIZE 8 /* B */
528 #define IPSECDOI_ATTR_COMP_PRIVALG 9 /* V */
530 /* 4.6.1 Security Association Payload */
533 nd_uint32_t doi
; /* Domain of Interpretation */
534 nd_uint32_t sit
; /* Situation */
537 struct ipsecdoi_secrecy_h
{
539 nd_uint16_t reserved
;
542 /* 4.6.2.1 Identification Type Values */
545 nd_uint8_t type
; /* ID Type */
546 nd_uint8_t proto_id
; /* Protocol ID */
547 nd_uint16_t port
; /* Port */
548 /* Identification Data */
551 #define IPSECDOI_ID_IPV4_ADDR 1
552 #define IPSECDOI_ID_FQDN 2
553 #define IPSECDOI_ID_USER_FQDN 3
554 #define IPSECDOI_ID_IPV4_ADDR_SUBNET 4
555 #define IPSECDOI_ID_IPV6_ADDR 5
556 #define IPSECDOI_ID_IPV6_ADDR_SUBNET 6
557 #define IPSECDOI_ID_IPV4_ADDR_RANGE 7
558 #define IPSECDOI_ID_IPV6_ADDR_RANGE 8
559 #define IPSECDOI_ID_DER_ASN1_DN 9
560 #define IPSECDOI_ID_DER_ASN1_GN 10
561 #define IPSECDOI_ID_KEY_ID 11
563 /* 4.6.3 IPSEC DOI Notify Message Types */
564 /* Notify Messages - Status Types */
565 #define IPSECDOI_NTYPE_RESPONDER_LIFETIME 24576
566 #define IPSECDOI_NTYPE_REPLAY_STATUS 24577
567 #define IPSECDOI_NTYPE_INITIAL_CONTACT 24578
569 #define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
570 netdissect_options *ndo, u_char tpay, \
571 const struct isakmp_gen *ext, \
573 const u_char *end_pointer, \
576 uint32_t proto0, int depth)
578 DECLARE_PRINTER(v1_sa
);
579 DECLARE_PRINTER(v1_p
);
580 DECLARE_PRINTER(v1_t
);
581 DECLARE_PRINTER(v1_ke
);
582 DECLARE_PRINTER(v1_id
);
583 DECLARE_PRINTER(v1_cert
);
584 DECLARE_PRINTER(v1_cr
);
585 DECLARE_PRINTER(v1_sig
);
586 DECLARE_PRINTER(v1_hash
);
587 DECLARE_PRINTER(v1_nonce
);
588 DECLARE_PRINTER(v1_n
);
589 DECLARE_PRINTER(v1_d
);
590 DECLARE_PRINTER(v1_vid
);
592 DECLARE_PRINTER(v2_sa
);
593 DECLARE_PRINTER(v2_ke
);
594 DECLARE_PRINTER(v2_ID
);
595 DECLARE_PRINTER(v2_cert
);
596 DECLARE_PRINTER(v2_cr
);
597 DECLARE_PRINTER(v2_auth
);
598 DECLARE_PRINTER(v2_nonce
);
599 DECLARE_PRINTER(v2_n
);
600 DECLARE_PRINTER(v2_d
);
601 DECLARE_PRINTER(v2_vid
);
602 DECLARE_PRINTER(v2_TS
);
603 DECLARE_PRINTER(v2_cp
);
604 DECLARE_PRINTER(v2_eap
);
606 static const u_char
*ikev2_e_print(netdissect_options
*ndo
,
607 const struct isakmp
*base
,
609 const struct isakmp_gen
*ext
,
611 const u_char
*end_pointer
,
614 uint32_t proto0
, int depth
);
617 static const u_char
*ike_sub0_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
618 const u_char
*, uint32_t, uint32_t, uint32_t, int);
619 static const u_char
*ikev1_sub_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
620 const u_char
*, uint32_t, uint32_t, uint32_t, int);
622 static const u_char
*ikev2_sub_print(netdissect_options
*ndo
,
623 const struct isakmp
*base
,
624 u_char np
, const struct isakmp_gen
*ext
,
625 const u_char
*ep
, uint32_t phase
,
626 uint32_t doi
, uint32_t proto
,
630 static char *numstr(u_int
);
633 ikev1_print(netdissect_options
*ndo
,
634 const u_char
*bp
, u_int length
,
635 const u_char
*bp2
, const struct isakmp
*base
);
637 #define MAXINITIATORS 20
638 static int ninitiator
= 0;
646 union inaddr_u iaddr
;
647 union inaddr_u raddr
;
648 } cookiecache
[MAXINITIATORS
];
651 static const char *protoidstr
[] = {
652 NULL
, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
656 static const char *npstr
[] = {
657 "none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
658 "sig", "nonce", "n", "d", "vid", /* 9 - 13 */
659 "pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
660 "pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
661 "pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
662 "pay29", "pay30", "pay31", "pay32", /* 29- 32 */
663 "v2sa", "v2ke", "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
664 "v2cr", "v2auth","v2nonce", "v2n", "v2d", /* 38- 42 */
665 "v2vid", "v2TSi", "v2TSr", "v2e", "v2cp", /* 43- 47 */
671 static const u_char
*(*npfunc
[])(netdissect_options
*ndo
, u_char tpay
,
672 const struct isakmp_gen
*ext
,
674 const u_char
*end_pointer
,
677 uint32_t proto0
, int depth
) = {
691 ikev1_vid_print
, /* 13 */
692 NULL
, NULL
, NULL
, NULL
, NULL
, /* 14- 18 */
693 NULL
, NULL
, NULL
, NULL
, NULL
, /* 19- 23 */
694 NULL
, NULL
, NULL
, NULL
, NULL
, /* 24- 28 */
695 NULL
, NULL
, NULL
, NULL
, /* 29- 32 */
696 ikev2_sa_print
, /* 33 */
697 ikev2_ke_print
, /* 34 */
698 ikev2_ID_print
, /* 35 */
699 ikev2_ID_print
, /* 36 */
700 ikev2_cert_print
, /* 37 */
701 ikev2_cr_print
, /* 38 */
702 ikev2_auth_print
, /* 39 */
703 ikev2_nonce_print
, /* 40 */
704 ikev2_n_print
, /* 41 */
705 ikev2_d_print
, /* 42 */
706 ikev2_vid_print
, /* 43 */
707 ikev2_TS_print
, /* 44 */
708 ikev2_TS_print
, /* 45 */
709 NULL
, /* ikev2_e_print,*/ /* 46 - special */
710 ikev2_cp_print
, /* 47 */
711 ikev2_eap_print
, /* 48 */
715 static const char *etypestr
[] = {
716 /* IKEv1 exchange types */
717 "none", "base", "ident", "auth", "agg", "inf", NULL
, NULL
, /* 0-7 */
718 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 8-15 */
719 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 16-23 */
720 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 24-31 */
721 "oakley-quick", "oakley-newgroup", /* 32-33 */
722 /* IKEv2 exchange types */
723 "ikev2_init", "ikev2_auth", "child_sa", "inf2" /* 34-37 */
726 #define STR_OR_ID(x, tab) \
727 (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
728 #define PROTOIDSTR(x) STR_OR_ID(x, protoidstr)
729 #define NPSTR(x) STR_OR_ID(x, npstr)
730 #define ETYPESTR(x) STR_OR_ID(x, etypestr)
732 #define CHECKLEN(p, np) \
733 if (ep < (const u_char *)(p)) { \
734 ND_PRINT(" [|%s]", NPSTR(np)); \
740 (((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
741 ? npfunc[(x)] : NULL)
744 iszero(const u_char
*p
, size_t l
)
755 /* find cookie from initiator cache */
757 cookie_find(const cookie_t
*in
)
761 for (i
= 0; i
< MAXINITIATORS
; i
++) {
762 if (memcmp(in
, &cookiecache
[i
].initiator
, sizeof(*in
)) == 0)
769 /* record initiator */
771 cookie_record(netdissect_options
*ndo
, const cookie_t
*in
, const u_char
*bp2
)
775 const struct ip6_hdr
*ip6
;
779 ninitiator
= (i
+ 1) % MAXINITIATORS
;
783 ip
= (const struct ip
*)bp2
;
786 cookiecache
[ninitiator
].version
= 4;
787 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in4
,
788 ip
->ip_src
, sizeof(nd_ipv4
));
789 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in4
,
790 ip
->ip_dst
, sizeof(nd_ipv4
));
793 ip6
= (const struct ip6_hdr
*)bp2
;
794 cookiecache
[ninitiator
].version
= 6;
795 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in6
,
796 ip6
->ip6_src
, sizeof(nd_ipv6
));
797 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in6
,
798 ip6
->ip6_dst
, sizeof(nd_ipv6
));
803 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].initiator
, in
, sizeof(*in
));
804 ninitiator
= (ninitiator
+ 1) % MAXINITIATORS
;
807 #define cookie_isinitiator(ndo, x, y) cookie_sidecheck(ndo, (x), (y), 1)
808 #define cookie_isresponder(ndo, x, y) cookie_sidecheck(ndo, (x), (y), 0)
810 cookie_sidecheck(netdissect_options
*ndo
, int i
, const u_char
*bp2
, int initiator
)
813 const struct ip6_hdr
*ip6
;
815 ip
= (const struct ip
*)bp2
;
818 if (cookiecache
[i
].version
!= 4)
821 if (UNALIGNED_MEMCMP(ip
->ip_src
, &cookiecache
[i
].iaddr
.in4
, sizeof(nd_ipv4
)) == 0)
824 if (UNALIGNED_MEMCMP(ip
->ip_src
, &cookiecache
[i
].raddr
.in4
, sizeof(nd_ipv4
)) == 0)
829 if (cookiecache
[i
].version
!= 6)
831 ip6
= (const struct ip6_hdr
*)bp2
;
833 if (UNALIGNED_MEMCMP(ip6
->ip6_src
, &cookiecache
[i
].iaddr
.in6
, sizeof(nd_ipv6
)) == 0)
836 if (UNALIGNED_MEMCMP(ip6
->ip6_src
, &cookiecache
[i
].raddr
.in6
, sizeof(nd_ipv6
)) == 0)
848 hexprint(netdissect_options
*ndo
, const uint8_t *loc
, size_t len
)
854 for (i
= 0; i
< len
; i
++)
855 ND_PRINT("%02x", p
[i
] & 0xff);
859 rawprint(netdissect_options
*ndo
, const uint8_t *loc
, size_t len
)
861 ND_TCHECK_LEN(loc
, len
);
863 hexprint(ndo
, loc
, len
);
871 * returns false if we run out of data buffer
873 static int ike_show_somedata(netdissect_options
*ndo
,
874 const u_char
*cp
, const u_char
*ep
)
876 /* there is too much data, just show some of it */
877 const u_char
*end
= ep
- 20;
879 size_t len
= ep
- cp
;
884 /* really shouldn't happen because of above */
891 if(!rawprint(ndo
, (const uint8_t *)(cp
), len
)) goto trunc
;
894 if(!rawprint(ndo
, (const uint8_t *)(end
), elen
)) goto trunc
;
906 const char *value
[30]; /*XXX*/
909 static const u_char
*
910 ikev1_attrmap_print(netdissect_options
*ndo
,
911 const u_char
*p
, const u_char
*ep2
,
912 const struct attrmap
*map
, size_t nmap
)
918 if (GET_U_1(p
) & 0x80)
922 totlen
= 4 + GET_BE_U_2(p
+ 2);
924 if (ep2
< p
+ totlen
) {
931 t
= GET_BE_U_2(p
) & 0x7fff;
932 if (map
&& t
< nmap
&& map
[t
].type
)
933 ND_PRINT("type=%s ", map
[t
].type
);
935 ND_PRINT("type=#%u ", t
);
936 if (GET_U_1(p
) & 0x80) {
939 v
= GET_BE_U_2(p
+ 2);
940 if (map
&& t
< nmap
&& v
< map
[t
].nvalue
&& map
[t
].value
[v
])
941 ND_PRINT("%s", map
[t
].value
[v
]);
943 if (!rawprint(ndo
, (const uint8_t *)(p
+ 2), 2)) {
949 ND_PRINT("len=%u value=", totlen
- 4);
950 if (!rawprint(ndo
, (const uint8_t *)(p
+ 4), totlen
- 4)) {
962 static const u_char
*
963 ikev1_attr_print(netdissect_options
*ndo
, const u_char
*p
, const u_char
*ep2
)
969 if (GET_U_1(p
) & 0x80)
973 totlen
= 4 + GET_BE_U_2(p
+ 2);
975 if (ep2
< p
+ totlen
) {
982 t
= GET_BE_U_2(p
) & 0x7fff;
983 ND_PRINT("type=#%u ", t
);
984 if (GET_U_1(p
) & 0x80) {
987 if (!rawprint(ndo
, (const uint8_t *)(p
+ 2), 2)) {
992 ND_PRINT("len=%u value=", totlen
- 4);
993 if (!rawprint(ndo
, (const uint8_t *)(p
+ 4), totlen
- 4)) {
1005 static const u_char
*
1006 ikev1_sa_print(netdissect_options
*ndo
, u_char tpay _U_
,
1007 const struct isakmp_gen
*ext
,
1009 const u_char
*ep
, uint32_t phase
, uint32_t doi0 _U_
,
1010 uint32_t proto0
, int depth
)
1012 const struct ikev1_pl_sa
*p
;
1013 uint32_t doi
, sit
, ident
;
1014 const u_char
*cp
, *np
;
1017 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_SA
));
1019 p
= (const struct ikev1_pl_sa
*)ext
;
1021 doi
= GET_BE_U_4(p
->doi
);
1022 sit
= GET_BE_U_4(p
->sit
);
1024 ND_PRINT(" doi=%u", doi
);
1025 ND_PRINT(" situation=%u", sit
);
1026 return (const u_char
*)(p
+ 1);
1029 ND_PRINT(" doi=ipsec");
1030 ND_PRINT(" situation=");
1033 ND_PRINT("identity");
1037 ND_PRINT("%ssecrecy", t
? "+" : "");
1041 ND_PRINT("%sintegrity", t
? "+" : "");
1043 np
= (const u_char
*)ext
+ sizeof(struct ikev1_pl_sa
);
1045 ND_TCHECK_4(ext
+ 1);
1046 ident
= GET_BE_U_4(ext
+ 1);
1047 ND_PRINT(" ident=%u", ident
);
1048 np
+= sizeof(ident
);
1051 ext
= (const struct isakmp_gen
*)np
;
1052 ND_TCHECK_SIZE(ext
);
1054 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_P
, ext
, ep
, phase
, doi
, proto0
,
1059 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_SA
));
1063 static const u_char
*
1064 ikev1_p_print(netdissect_options
*ndo
, u_char tpay _U_
,
1065 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1066 const u_char
*ep
, uint32_t phase
, uint32_t doi0
,
1067 uint32_t proto0 _U_
, int depth
)
1069 const struct ikev1_pl_p
*p
;
1073 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_P
));
1075 p
= (const struct ikev1_pl_p
*)ext
;
1077 ND_PRINT(" #%u protoid=%s transform=%u",
1078 GET_U_1(p
->p_no
), PROTOIDSTR(GET_U_1(p
->prot_id
)),
1080 spi_size
= GET_U_1(p
->spi_size
);
1083 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1087 ext
= (const struct isakmp_gen
*)((const u_char
*)(p
+ 1) + spi_size
);
1088 ND_TCHECK_SIZE(ext
);
1090 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_T
, ext
, ep
, phase
, doi0
,
1091 GET_U_1(p
->prot_id
), depth
);
1095 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
1099 static const char *ikev1_p_map
[] = {
1103 static const char *ikev2_t_type_map
[]={
1104 NULL
, "encr", "prf", "integ", "dh", "esn"
1107 static const char *ah_p_map
[] = {
1108 NULL
, "(reserved)", "md5", "sha", "1des",
1109 "sha2-256", "sha2-384", "sha2-512",
1112 static const char *prf_p_map
[] = {
1113 NULL
, "hmac-md5", "hmac-sha", "hmac-tiger",
1117 static const char *integ_p_map
[] = {
1118 NULL
, "hmac-md5", "hmac-sha", "dec-mac",
1119 "kpdk-md5", "aes-xcbc"
1122 static const char *esn_p_map
[] = {
1126 static const char *dh_p_map
[] = {
1128 "modp1024", /* group 2 */
1129 "EC2N 2^155", /* group 3 */
1130 "EC2N 2^185", /* group 4 */
1131 "modp1536", /* group 5 */
1132 "iana-grp06", "iana-grp07", /* reserved */
1133 "iana-grp08", "iana-grp09",
1134 "iana-grp10", "iana-grp11",
1135 "iana-grp12", "iana-grp13",
1136 "modp2048", /* group 14 */
1137 "modp3072", /* group 15 */
1138 "modp4096", /* group 16 */
1139 "modp6144", /* group 17 */
1140 "modp8192", /* group 18 */
1143 static const char *esp_p_map
[] = {
1144 NULL
, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
1145 "blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
1148 static const char *ipcomp_p_map
[] = {
1149 NULL
, "oui", "deflate", "lzs",
1152 static const struct attrmap ipsec_t_map
[] = {
1153 { NULL
, 0, { NULL
} },
1154 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1155 { "life", 0, { NULL
} },
1156 { "group desc", 18, { NULL
, "modp768",
1157 "modp1024", /* group 2 */
1158 "EC2N 2^155", /* group 3 */
1159 "EC2N 2^185", /* group 4 */
1160 "modp1536", /* group 5 */
1161 "iana-grp06", "iana-grp07", /* reserved */
1162 "iana-grp08", "iana-grp09",
1163 "iana-grp10", "iana-grp11",
1164 "iana-grp12", "iana-grp13",
1165 "modp2048", /* group 14 */
1166 "modp3072", /* group 15 */
1167 "modp4096", /* group 16 */
1168 "modp6144", /* group 17 */
1169 "modp8192", /* group 18 */
1171 { "enc mode", 3, { NULL
, "tunnel", "transport", }, },
1172 { "auth", 5, { NULL
, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
1173 { "keylen", 0, { NULL
} },
1174 { "rounds", 0, { NULL
} },
1175 { "dictsize", 0, { NULL
} },
1176 { "privalg", 0, { NULL
} },
1179 static const struct attrmap encr_t_map
[] = {
1180 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 0, 1 */
1181 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 2, 3 */
1182 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 4, 5 */
1183 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 6, 7 */
1184 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 8, 9 */
1185 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 10,11*/
1186 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 12,13*/
1187 { "keylen", 14, { NULL
}},
1190 static const struct attrmap oakley_t_map
[] = {
1191 { NULL
, 0, { NULL
} },
1192 { "enc", 8, { NULL
, "1des", "idea", "blowfish", "rc5",
1193 "3des", "cast", "aes", }, },
1194 { "hash", 7, { NULL
, "md5", "sha1", "tiger",
1195 "sha2-256", "sha2-384", "sha2-512", }, },
1196 { "auth", 6, { NULL
, "preshared", "dss", "rsa sig", "rsa enc",
1197 "rsa enc revised", }, },
1198 { "group desc", 18, { NULL
, "modp768",
1199 "modp1024", /* group 2 */
1200 "EC2N 2^155", /* group 3 */
1201 "EC2N 2^185", /* group 4 */
1202 "modp1536", /* group 5 */
1203 "iana-grp06", "iana-grp07", /* reserved */
1204 "iana-grp08", "iana-grp09",
1205 "iana-grp10", "iana-grp11",
1206 "iana-grp12", "iana-grp13",
1207 "modp2048", /* group 14 */
1208 "modp3072", /* group 15 */
1209 "modp4096", /* group 16 */
1210 "modp6144", /* group 17 */
1211 "modp8192", /* group 18 */
1213 { "group type", 4, { NULL
, "MODP", "ECP", "EC2N", }, },
1214 { "group prime", 0, { NULL
} },
1215 { "group gen1", 0, { NULL
} },
1216 { "group gen2", 0, { NULL
} },
1217 { "group curve A", 0, { NULL
} },
1218 { "group curve B", 0, { NULL
} },
1219 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1220 { "lifeduration", 0, { NULL
} },
1221 { "prf", 0, { NULL
} },
1222 { "keylen", 0, { NULL
} },
1223 { "field", 0, { NULL
} },
1224 { "order", 0, { NULL
} },
1227 static const u_char
*
1228 ikev1_t_print(netdissect_options
*ndo
, u_char tpay _U_
,
1229 const struct isakmp_gen
*ext
, u_int item_len
,
1230 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi _U_
,
1231 uint32_t proto
, int depth _U_
)
1233 const struct ikev1_pl_t
*p
;
1236 const struct attrmap
*map
;
1240 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_T
));
1242 p
= (const struct ikev1_pl_t
*)ext
;
1247 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ikev1_p_map
);
1249 nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1252 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ah_p_map
);
1254 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1257 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), esp_p_map
);
1259 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1262 idstr
= STR_OR_ID(GET_U_1(p
->t_id
), ipcomp_p_map
);
1264 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1274 ND_PRINT(" #%u id=%s ", GET_U_1(p
->t_no
), idstr
);
1276 ND_PRINT(" #%u id=%u ", GET_U_1(p
->t_no
), GET_U_1(p
->t_id
));
1277 cp
= (const u_char
*)(p
+ 1);
1278 ep2
= (const u_char
*)p
+ item_len
;
1279 while (cp
< ep
&& cp
< ep2
) {
1281 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
1283 cp
= ikev1_attr_print(ndo
, cp
, ep2
);
1291 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_T
));
1295 static const u_char
*
1296 ikev1_ke_print(netdissect_options
*ndo
, u_char tpay _U_
,
1297 const struct isakmp_gen
*ext
, u_int item_len
,
1298 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1299 uint32_t proto _U_
, int depth _U_
)
1301 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_KE
));
1303 ND_TCHECK_SIZE(ext
);
1305 * Our caller has ensured that the length is >= 4.
1307 ND_PRINT(" key len=%u", item_len
- 4);
1308 if (2 < ndo
->ndo_vflag
&& item_len
> 4) {
1309 /* Print the entire payload in hex */
1311 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1314 return (const u_char
*)ext
+ item_len
;
1316 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_KE
));
1320 static const u_char
*
1321 ikev1_id_print(netdissect_options
*ndo
, u_char tpay _U_
,
1322 const struct isakmp_gen
*ext
, u_int item_len
,
1323 const u_char
*ep _U_
, uint32_t phase
, uint32_t doi _U_
,
1324 uint32_t proto _U_
, int depth _U_
)
1326 #define USE_IPSECDOI_IN_PHASE1 1
1327 const struct ikev1_pl_id
*p
;
1328 static const char *idtypestr
[] = {
1329 "IPv4", "IPv4net", "IPv6", "IPv6net",
1331 static const char *ipsecidtypestr
[] = {
1332 NULL
, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
1333 "IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
1339 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_ID
));
1341 p
= (const struct ikev1_pl_id
*)ext
;
1343 if (sizeof(*p
) < item_len
) {
1344 data
= (const u_char
*)(p
+ 1);
1345 len
= item_len
- sizeof(*p
);
1352 ND_PRINT(" [phase=%u doi=%u proto=%u]", phase
, doi
, proto
);
1355 #ifndef USE_IPSECDOI_IN_PHASE1
1359 ND_PRINT(" idtype=%s",
1360 STR_OR_ID(GET_U_1(p
->d
.id_type
), idtypestr
));
1361 ND_PRINT(" doi_data=%u",
1362 GET_BE_U_4(p
->d
.doi_data
) & 0xffffff);
1365 #ifdef USE_IPSECDOI_IN_PHASE1
1370 const struct ipsecdoi_id
*doi_p
;
1372 uint8_t type
, proto_id
;
1374 doi_p
= (const struct ipsecdoi_id
*)ext
;
1375 ND_TCHECK_SIZE(doi_p
);
1376 type
= GET_U_1(doi_p
->type
);
1377 ND_PRINT(" idtype=%s", STR_OR_ID(type
, ipsecidtypestr
));
1378 /* A protocol ID of 0 DOES NOT mean IPPROTO_IP! */
1379 proto_id
= GET_U_1(doi_p
->proto_id
);
1380 if (!ndo
->ndo_nflag
&& proto_id
&& (p_name
= netdb_protoname(proto_id
)) != NULL
)
1381 ND_PRINT(" protoid=%s", p_name
);
1383 ND_PRINT(" protoid=%u", proto_id
);
1384 ND_PRINT(" port=%u", GET_BE_U_2(doi_p
->port
));
1389 ND_TCHECK_LEN(data
, len
);
1391 case IPSECDOI_ID_IPV4_ADDR
:
1393 ND_PRINT(" len=%u [bad: < 4]", len
);
1395 ND_PRINT(" len=%u %s", len
, GET_IPADDR_STRING(data
));
1398 case IPSECDOI_ID_FQDN
:
1399 case IPSECDOI_ID_USER_FQDN
:
1402 ND_PRINT(" len=%u ", len
);
1403 for (i
= 0; i
< len
; i
++)
1404 fn_print_char(ndo
, GET_U_1(data
+ i
));
1408 case IPSECDOI_ID_IPV4_ADDR_SUBNET
:
1412 ND_PRINT(" len=%u [bad: < 8]", len
);
1414 mask
= data
+ sizeof(nd_ipv4
);
1415 ND_PRINT(" len=%u %s/%u.%u.%u.%u", len
,
1416 GET_IPADDR_STRING(data
),
1417 GET_U_1(mask
), GET_U_1(mask
+ 1),
1424 case IPSECDOI_ID_IPV6_ADDR
:
1426 ND_PRINT(" len=%u [bad: < 16]", len
);
1428 ND_PRINT(" len=%u %s", len
, GET_IP6ADDR_STRING(data
));
1431 case IPSECDOI_ID_IPV6_ADDR_SUBNET
:
1435 ND_PRINT(" len=%u [bad: < 32]", len
);
1437 mask
= (const u_char
*)(data
+ sizeof(nd_ipv6
));
1439 ND_PRINT(" len=%u %s/0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", len
,
1440 GET_IP6ADDR_STRING(data
),
1441 GET_U_1(mask
), GET_U_1(mask
+ 1),
1455 GET_U_1(mask
+ 15));
1460 case IPSECDOI_ID_IPV4_ADDR_RANGE
:
1462 ND_PRINT(" len=%u [bad: < 8]", len
);
1464 ND_PRINT(" len=%u %s-%s", len
,
1465 GET_IPADDR_STRING(data
),
1466 GET_IPADDR_STRING(data
+ sizeof(nd_ipv4
)));
1470 case IPSECDOI_ID_IPV6_ADDR_RANGE
:
1472 ND_PRINT(" len=%u [bad: < 32]", len
);
1474 ND_PRINT(" len=%u %s-%s", len
,
1475 GET_IP6ADDR_STRING(data
),
1476 GET_IP6ADDR_STRING(data
+ sizeof(nd_ipv6
)));
1480 case IPSECDOI_ID_DER_ASN1_DN
:
1481 case IPSECDOI_ID_DER_ASN1_GN
:
1482 case IPSECDOI_ID_KEY_ID
:
1489 ND_PRINT(" len=%u", len
);
1490 if (2 < ndo
->ndo_vflag
) {
1492 if (!rawprint(ndo
, (const uint8_t *)data
, len
))
1496 return (const u_char
*)ext
+ item_len
;
1498 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_ID
));
1502 static const u_char
*
1503 ikev1_cert_print(netdissect_options
*ndo
, u_char tpay _U_
,
1504 const struct isakmp_gen
*ext
, u_int item_len
,
1505 const u_char
*ep _U_
, uint32_t phase _U_
,
1507 uint32_t proto0 _U_
, int depth _U_
)
1509 const struct ikev1_pl_cert
*p
;
1510 static const char *certstr
[] = {
1511 "none", "pkcs7", "pgp", "dns",
1512 "x509sign", "x509ke", "kerberos", "crl",
1513 "arl", "spki", "x509attr",
1516 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_CERT
));
1518 p
= (const struct ikev1_pl_cert
*)ext
;
1521 * Our caller has ensured that the length is >= 4.
1523 ND_PRINT(" len=%u", item_len
- 4);
1524 ND_PRINT(" type=%s", STR_OR_ID(GET_U_1(p
->encode
), certstr
));
1525 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1526 /* Print the entire payload in hex */
1528 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1531 return (const u_char
*)ext
+ item_len
;
1533 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_CERT
));
1537 static const u_char
*
1538 ikev1_cr_print(netdissect_options
*ndo
, u_char tpay _U_
,
1539 const struct isakmp_gen
*ext
, u_int item_len
,
1540 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1541 uint32_t proto0 _U_
, int depth _U_
)
1543 const struct ikev1_pl_cert
*p
;
1544 static const char *certstr
[] = {
1545 "none", "pkcs7", "pgp", "dns",
1546 "x509sign", "x509ke", "kerberos", "crl",
1547 "arl", "spki", "x509attr",
1550 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_CR
));
1552 p
= (const struct ikev1_pl_cert
*)ext
;
1555 * Our caller has ensured that the length is >= 4.
1557 ND_PRINT(" len=%u", item_len
- 4);
1558 ND_PRINT(" type=%s", STR_OR_ID(GET_U_1(p
->encode
), certstr
));
1559 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1560 /* Print the entire payload in hex */
1562 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1565 return (const u_char
*)ext
+ item_len
;
1567 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_CR
));
1571 static const u_char
*
1572 ikev1_hash_print(netdissect_options
*ndo
, u_char tpay _U_
,
1573 const struct isakmp_gen
*ext
, u_int item_len
,
1574 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1575 uint32_t proto _U_
, int depth _U_
)
1577 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_HASH
));
1579 ND_TCHECK_SIZE(ext
);
1581 * Our caller has ensured that the length is >= 4.
1583 ND_PRINT(" len=%u", item_len
- 4);
1584 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1585 /* Print the entire payload in hex */
1587 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1590 return (const u_char
*)ext
+ item_len
;
1592 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_HASH
));
1596 static const u_char
*
1597 ikev1_sig_print(netdissect_options
*ndo
, u_char tpay _U_
,
1598 const struct isakmp_gen
*ext
, u_int item_len
,
1599 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1600 uint32_t proto _U_
, int depth _U_
)
1602 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_SIG
));
1604 ND_TCHECK_SIZE(ext
);
1606 * Our caller has ensured that the length is >= 4.
1608 ND_PRINT(" len=%u", item_len
- 4);
1609 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1610 /* Print the entire payload in hex */
1612 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1615 return (const u_char
*)ext
+ item_len
;
1617 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_SIG
));
1621 static const u_char
*
1622 ikev1_nonce_print(netdissect_options
*ndo
, u_char tpay _U_
,
1623 const struct isakmp_gen
*ext
,
1626 uint32_t phase _U_
, uint32_t doi _U_
,
1627 uint32_t proto _U_
, int depth _U_
)
1629 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_NONCE
));
1631 ND_TCHECK_SIZE(ext
);
1633 * Our caller has ensured that the length is >= 4.
1635 ND_PRINT(" n len=%u", item_len
- 4);
1637 if (ndo
->ndo_vflag
> 2) {
1639 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1641 } else if (ndo
->ndo_vflag
> 1) {
1643 if (!ike_show_somedata(ndo
, (const u_char
*)(ext
+ 1), ep
))
1647 return (const u_char
*)ext
+ item_len
;
1649 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE
));
1653 static const u_char
*
1654 ikev1_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
1655 const struct isakmp_gen
*ext
, u_int item_len
,
1656 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1657 uint32_t proto0 _U_
, int depth _U_
)
1659 const struct ikev1_pl_n
*p
;
1666 static const char *notify_error_str
[] = {
1667 NULL
, "INVALID-PAYLOAD-TYPE",
1668 "DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED",
1669 "INVALID-COOKIE", "INVALID-MAJOR-VERSION",
1670 "INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE",
1671 "INVALID-FLAGS", "INVALID-MESSAGE-ID",
1672 "INVALID-PROTOCOL-ID", "INVALID-SPI",
1673 "INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED",
1674 "NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX",
1675 "PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION",
1676 "INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING",
1677 "INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED",
1678 "INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION",
1679 "AUTHENTICATION-FAILED", "INVALID-SIGNATURE",
1680 "ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME",
1681 "CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE",
1682 "UNEQUAL-PAYLOAD-LENGTHS",
1684 static const char *ipsec_notify_error_str
[] = {
1687 static const char *notify_status_str
[] = {
1690 static const char *ipsec_notify_status_str
[] = {
1691 "RESPONDER-LIFETIME", "REPLAY-STATUS",
1694 /* NOTE: these macro must be called with x in proper range */
1697 #define NOTIFY_ERROR_STR(x) \
1698 STR_OR_ID((x), notify_error_str)
1701 #define IPSEC_NOTIFY_ERROR_STR(x) \
1702 STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
1705 #define NOTIFY_STATUS_STR(x) \
1706 STR_OR_ID((u_int)((x) - 16384), notify_status_str)
1709 #define IPSEC_NOTIFY_STATUS_STR(x) \
1710 STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
1712 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_N
));
1714 p
= (const struct ikev1_pl_n
*)ext
;
1716 doi
= GET_BE_U_4(p
->doi
);
1717 proto
= GET_U_1(p
->prot_id
);
1719 ND_PRINT(" doi=%u", doi
);
1720 ND_PRINT(" proto=%u", proto
);
1721 type
= GET_BE_U_2(p
->type
);
1723 ND_PRINT(" type=%s", NOTIFY_ERROR_STR(type
));
1724 else if (type
< 16384)
1725 ND_PRINT(" type=%s", numstr(type
));
1726 else if (type
< 24576)
1727 ND_PRINT(" type=%s", NOTIFY_STATUS_STR(type
));
1729 ND_PRINT(" type=%s", numstr(type
));
1730 spi_size
= GET_U_1(p
->spi_size
);
1733 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1736 return (const u_char
*)(p
+ 1) + spi_size
;
1739 ND_PRINT(" doi=ipsec");
1740 ND_PRINT(" proto=%s", PROTOIDSTR(proto
));
1741 type
= GET_BE_U_2(p
->type
);
1743 ND_PRINT(" type=%s", NOTIFY_ERROR_STR(type
));
1744 else if (type
< 16384)
1745 ND_PRINT(" type=%s", IPSEC_NOTIFY_ERROR_STR(type
));
1746 else if (type
< 24576)
1747 ND_PRINT(" type=%s", NOTIFY_STATUS_STR(type
));
1748 else if (type
< 32768)
1749 ND_PRINT(" type=%s", IPSEC_NOTIFY_STATUS_STR(type
));
1751 ND_PRINT(" type=%s", numstr(type
));
1752 spi_size
= GET_U_1(p
->spi_size
);
1755 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
1759 cp
= (const u_char
*)(p
+ 1) + spi_size
;
1760 ep2
= (const u_char
*)p
+ item_len
;
1764 case IPSECDOI_NTYPE_RESPONDER_LIFETIME
:
1766 const struct attrmap
*map
= oakley_t_map
;
1767 size_t nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1768 ND_PRINT(" attrs=(");
1769 while (cp
< ep
&& cp
< ep2
) {
1770 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
1779 case IPSECDOI_NTYPE_REPLAY_STATUS
:
1780 ND_PRINT(" status=(");
1781 ND_PRINT("replay detection %sabled",
1782 GET_BE_U_4(cp
) ? "en" : "dis");
1787 * XXX - fill in more types here; see, for example,
1788 * draft-ietf-ipsec-notifymsg-04.
1790 if (ndo
->ndo_vflag
> 3) {
1791 ND_PRINT(" data=(");
1792 if (!rawprint(ndo
, (const uint8_t *)(cp
), ep
- cp
))
1796 if (!ike_show_somedata(ndo
, cp
, ep
))
1802 return (const u_char
*)ext
+ item_len
;
1804 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_N
));
1808 static const u_char
*
1809 ikev1_d_print(netdissect_options
*ndo
, u_char tpay _U_
,
1810 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1811 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1812 uint32_t proto0 _U_
, int depth _U_
)
1814 const struct ikev1_pl_d
*p
;
1822 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_D
));
1824 p
= (const struct ikev1_pl_d
*)ext
;
1826 doi
= GET_BE_U_4(p
->doi
);
1827 proto
= GET_U_1(p
->prot_id
);
1829 ND_PRINT(" doi=%u", doi
);
1830 ND_PRINT(" proto=%u", proto
);
1832 ND_PRINT(" doi=ipsec");
1833 ND_PRINT(" proto=%s", PROTOIDSTR(proto
));
1835 spi_size
= GET_U_1(p
->spi_size
);
1836 ND_PRINT(" spilen=%u", spi_size
);
1837 num_spi
= GET_BE_U_2(p
->num_spi
);
1838 ND_PRINT(" nspi=%u", num_spi
);
1840 q
= (const uint8_t *)(p
+ 1);
1841 for (i
= 0; i
< num_spi
; i
++) {
1844 if (!rawprint(ndo
, (const uint8_t *)q
, spi_size
))
1850 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_D
));
1854 static const u_char
*
1855 ikev1_vid_print(netdissect_options
*ndo
, u_char tpay _U_
,
1856 const struct isakmp_gen
*ext
,
1857 u_int item_len
, const u_char
*ep _U_
,
1858 uint32_t phase _U_
, uint32_t doi _U_
,
1859 uint32_t proto _U_
, int depth _U_
)
1861 ND_PRINT("%s:", NPSTR(ISAKMP_NPTYPE_VID
));
1863 ND_TCHECK_SIZE(ext
);
1865 * Our caller has ensured that the length is >= 4.
1867 ND_PRINT(" len=%u", item_len
- 4);
1868 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1869 /* Print the entire payload in hex */
1871 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1874 return (const u_char
*)ext
+ item_len
;
1876 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_VID
));
1880 /************************************************************/
1882 /* IKE v2 - rfc4306 - dissector */
1884 /************************************************************/
1887 ikev2_pay_print(netdissect_options
*ndo
, const char *payname
, uint8_t critical
)
1889 ND_PRINT("%s%s:", payname
, critical
&0x80 ? "[C]" : "");
1892 static const u_char
*
1893 ikev2_gen_print(netdissect_options
*ndo
, u_char tpay
,
1894 const struct isakmp_gen
*ext
, u_int item_len
)
1896 const struct isakmp_gen
*p
= (const struct isakmp_gen
*)ext
;
1898 ND_TCHECK_SIZE(ext
);
1899 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(p
->critical
));
1902 * Our caller has ensured that the length is >= 4.
1904 ND_PRINT(" len=%u", item_len
- 4);
1905 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1906 /* Print the entire payload in hex */
1908 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
1911 return (const u_char
*)ext
+ item_len
;
1913 ND_PRINT(" [|%s]", NPSTR(tpay
));
1917 static const u_char
*
1918 ikev2_t_print(netdissect_options
*ndo
, int tcount
,
1919 const struct isakmp_gen
*ext
, u_int item_len
,
1922 const struct ikev2_t
*p
;
1927 const struct attrmap
*map
;
1931 p
= (const struct ikev2_t
*)ext
;
1933 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_T
), GET_U_1(p
->h
.critical
));
1935 t_id
= GET_BE_U_2(p
->t_id
);
1940 t_type
= GET_U_1(p
->t_type
);
1943 idstr
= STR_OR_ID(t_id
, esp_p_map
);
1945 nmap
= sizeof(encr_t_map
)/sizeof(encr_t_map
[0]);
1949 idstr
= STR_OR_ID(t_id
, prf_p_map
);
1953 idstr
= STR_OR_ID(t_id
, integ_p_map
);
1957 idstr
= STR_OR_ID(t_id
, dh_p_map
);
1961 idstr
= STR_OR_ID(t_id
, esn_p_map
);
1970 ND_PRINT(" #%u type=%s id=%s ", tcount
,
1971 STR_OR_ID(t_type
, ikev2_t_type_map
),
1974 ND_PRINT(" #%u type=%s id=%u ", tcount
,
1975 STR_OR_ID(t_type
, ikev2_t_type_map
),
1977 cp
= (const u_char
*)(p
+ 1);
1978 ep2
= (const u_char
*)p
+ item_len
;
1979 while (cp
< ep
&& cp
< ep2
) {
1981 cp
= ikev1_attrmap_print(ndo
, cp
, ep2
, map
, nmap
);
1983 cp
= ikev1_attr_print(ndo
, cp
, ep2
);
1991 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_T
));
1995 static const u_char
*
1996 ikev2_p_print(netdissect_options
*ndo
, u_char tpay _U_
, int pcount _U_
,
1997 const struct isakmp_gen
*ext
, u_int oprop_length
,
1998 const u_char
*ep
, int depth
)
2000 const struct ikev2_p
*p
;
2009 p
= (const struct ikev2_p
*)ext
;
2012 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_P
), GET_U_1(p
->h
.critical
));
2015 * ikev2_sa_print() guarantees that this is >= 4.
2017 prop_length
= oprop_length
- 4;
2018 ND_PRINT(" #%u protoid=%s transform=%u len=%u",
2019 GET_U_1(p
->p_no
), PROTOIDSTR(GET_U_1(p
->prot_id
)),
2020 GET_U_1(p
->num_t
), oprop_length
);
2021 cp
= (const u_char
*)(p
+ 1);
2023 spi_size
= GET_U_1(p
->spi_size
);
2025 if (prop_length
< spi_size
)
2028 if (!rawprint(ndo
, (const uint8_t *)cp
, spi_size
))
2031 prop_length
-= spi_size
;
2035 * Print the transforms.
2038 for (np
= ISAKMP_NPTYPE_T
; np
!= 0; np
= GET_U_1(ext
->np
)) {
2040 ext
= (const struct isakmp_gen
*)cp
;
2041 if (prop_length
< sizeof(*ext
))
2043 ND_TCHECK_SIZE(ext
);
2046 * Since we can't have a payload length of less than 4 bytes,
2047 * we need to bail out here if the generic header is nonsensical
2048 * or truncated, otherwise we could loop forever processing
2049 * zero-length items or otherwise misdissect the packet.
2051 item_len
= GET_BE_U_2(ext
->len
);
2055 if (prop_length
< item_len
)
2057 ND_TCHECK_LEN(cp
, item_len
);
2061 for (i
= 0; i
< depth
; i
++)
2064 if (np
== ISAKMP_NPTYPE_T
) {
2065 cp
= ikev2_t_print(ndo
, tcount
, ext
, item_len
, ep
);
2067 /* error, already reported */
2071 ND_PRINT("%s", NPSTR(np
));
2076 prop_length
-= item_len
;
2081 * Skip the rest of the proposal.
2084 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
2087 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_P
));
2091 static const u_char
*
2092 ikev2_sa_print(netdissect_options
*ndo
, u_char tpay
,
2093 const struct isakmp_gen
*ext1
,
2094 u_int osa_length
, const u_char
*ep
,
2095 uint32_t phase _U_
, uint32_t doi _U_
,
2096 uint32_t proto _U_
, int depth
)
2098 const struct isakmp_gen
*ext
;
2106 ND_TCHECK_SIZE(ext1
);
2107 ikev2_pay_print(ndo
, "sa", GET_U_1(ext1
->critical
));
2110 * ikev2_sub0_print() guarantees that this is >= 4.
2112 osa_length
= GET_BE_U_2(ext1
->len
);
2113 sa_length
= osa_length
- 4;
2114 ND_PRINT(" len=%u", sa_length
);
2117 * Print the payloads.
2119 cp
= (const u_char
*)(ext1
+ 1);
2121 for (np
= ISAKMP_NPTYPE_P
; np
!= 0; np
= GET_U_1(ext
->np
)) {
2123 ext
= (const struct isakmp_gen
*)cp
;
2124 if (sa_length
< sizeof(*ext
))
2126 ND_TCHECK_SIZE(ext
);
2129 * Since we can't have a payload length of less than 4 bytes,
2130 * we need to bail out here if the generic header is nonsensical
2131 * or truncated, otherwise we could loop forever processing
2132 * zero-length items or otherwise misdissect the packet.
2134 item_len
= GET_BE_U_2(ext
->len
);
2138 if (sa_length
< item_len
)
2140 ND_TCHECK_LEN(cp
, item_len
);
2144 for (i
= 0; i
< depth
; i
++)
2147 if (np
== ISAKMP_NPTYPE_P
) {
2148 cp
= ikev2_p_print(ndo
, np
, pcount
, ext
, item_len
,
2151 /* error, already reported */
2155 ND_PRINT("%s", NPSTR(np
));
2160 sa_length
-= item_len
;
2165 * Skip the rest of the SA.
2168 ND_PRINT(" [|%s]", NPSTR(tpay
));
2171 ND_PRINT(" [|%s]", NPSTR(tpay
));
2175 static const u_char
*
2176 ikev2_ke_print(netdissect_options
*ndo
, u_char tpay
,
2177 const struct isakmp_gen
*ext
,
2178 u_int item_len
, const u_char
*ep _U_
,
2179 uint32_t phase _U_
, uint32_t doi _U_
,
2180 uint32_t proto _U_
, int depth _U_
)
2182 const struct ikev2_ke
*k
;
2184 k
= (const struct ikev2_ke
*)ext
;
2186 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(k
->h
.critical
));
2189 ND_PRINT(" len=%u < 8", item_len
);
2190 return (const u_char
*)ext
+ item_len
;
2192 ND_PRINT(" len=%u group=%s", item_len
- 8,
2193 STR_OR_ID(GET_BE_U_2(k
->ke_group
), dh_p_map
));
2195 if (2 < ndo
->ndo_vflag
&& 8 < item_len
) {
2197 if (!rawprint(ndo
, (const uint8_t *)(k
+ 1), item_len
- 8))
2200 return (const u_char
*)ext
+ item_len
;
2202 ND_PRINT(" [|%s]", NPSTR(tpay
));
2206 static const u_char
*
2207 ikev2_ID_print(netdissect_options
*ndo
, u_char tpay
,
2208 const struct isakmp_gen
*ext
,
2209 u_int item_len
, const u_char
*ep _U_
,
2210 uint32_t phase _U_
, uint32_t doi _U_
,
2211 uint32_t proto _U_
, int depth _U_
)
2213 const struct ikev2_id
*idp
;
2214 u_int idtype_len
, i
;
2215 unsigned int dumpascii
, dumphex
;
2216 const unsigned char *typedata
;
2218 idp
= (const struct ikev2_id
*)ext
;
2219 ND_TCHECK_SIZE(idp
);
2220 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(idp
->h
.critical
));
2223 * Our caller has ensured that the length is >= 4.
2225 ND_PRINT(" len=%u", item_len
- 4);
2226 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
2227 /* Print the entire payload in hex */
2229 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2233 idtype_len
=item_len
- sizeof(struct ikev2_id
);
2236 typedata
= (const unsigned char *)(ext
)+sizeof(struct ikev2_id
);
2238 switch(GET_U_1(idp
->type
)) {
2247 case ID_RFC822_ADDR
:
2248 ND_PRINT(" rfc822:");
2255 case ID_DER_ASN1_DN
:
2259 case ID_DER_ASN1_GN
:
2264 ND_PRINT(" keyid:");
2270 ND_TCHECK_LEN(typedata
, idtype_len
);
2271 for(i
=0; i
<idtype_len
; i
++) {
2272 if(ND_ASCII_ISPRINT(GET_U_1(typedata
+ i
))) {
2273 ND_PRINT("%c", GET_U_1(typedata
+ i
));
2280 if (!rawprint(ndo
, (const uint8_t *)typedata
, idtype_len
))
2284 return (const u_char
*)ext
+ item_len
;
2286 ND_PRINT(" [|%s]", NPSTR(tpay
));
2290 static const u_char
*
2291 ikev2_cert_print(netdissect_options
*ndo
, u_char tpay
,
2292 const struct isakmp_gen
*ext
,
2293 u_int item_len
, const u_char
*ep _U_
,
2294 uint32_t phase _U_
, uint32_t doi _U_
,
2295 uint32_t proto _U_
, int depth _U_
)
2297 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2300 static const u_char
*
2301 ikev2_cr_print(netdissect_options
*ndo
, u_char tpay
,
2302 const struct isakmp_gen
*ext
,
2303 u_int item_len
, const u_char
*ep _U_
,
2304 uint32_t phase _U_
, uint32_t doi _U_
,
2305 uint32_t proto _U_
, int depth _U_
)
2307 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2310 static const u_char
*
2311 ikev2_auth_print(netdissect_options
*ndo
, u_char tpay
,
2312 const struct isakmp_gen
*ext
,
2313 u_int item_len
, const u_char
*ep
,
2314 uint32_t phase _U_
, uint32_t doi _U_
,
2315 uint32_t proto _U_
, int depth _U_
)
2317 const struct ikev2_auth
*p
;
2318 const char *v2_auth
[]={ "invalid", "rsasig",
2319 "shared-secret", "dsssig" };
2320 const u_char
*authdata
= (const u_char
*)ext
+ sizeof(struct ikev2_auth
);
2322 ND_TCHECK_LEN(ext
, sizeof(struct ikev2_auth
));
2323 p
= (const struct ikev2_auth
*)ext
;
2324 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(p
->h
.critical
));
2327 * Our caller has ensured that the length is >= 4.
2329 ND_PRINT(" len=%u method=%s", item_len
-4,
2330 STR_OR_ID(GET_U_1(p
->auth_method
), v2_auth
));
2332 if (ndo
->ndo_vflag
> 1) {
2333 ND_PRINT(" authdata=(");
2334 if (!rawprint(ndo
, (const uint8_t *)authdata
, item_len
- sizeof(struct ikev2_auth
)))
2337 } else if (ndo
->ndo_vflag
) {
2338 if (!ike_show_somedata(ndo
, authdata
, ep
))
2343 return (const u_char
*)ext
+ item_len
;
2345 ND_PRINT(" [|%s]", NPSTR(tpay
));
2349 static const u_char
*
2350 ikev2_nonce_print(netdissect_options
*ndo
, u_char tpay
,
2351 const struct isakmp_gen
*ext
,
2352 u_int item_len
, const u_char
*ep
,
2353 uint32_t phase _U_
, uint32_t doi _U_
,
2354 uint32_t proto _U_
, int depth _U_
)
2356 ND_TCHECK_SIZE(ext
);
2357 ikev2_pay_print(ndo
, "nonce", GET_U_1(ext
->critical
));
2360 * Our caller has ensured that the length is >= 4.
2362 ND_PRINT(" len=%u", item_len
- 4);
2363 if (1 < ndo
->ndo_vflag
&& 4 < item_len
) {
2364 ND_PRINT(" nonce=(");
2365 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2368 } else if(ndo
->ndo_vflag
&& 4 < item_len
) {
2369 if(!ike_show_somedata(ndo
, (const u_char
*)(ext
+1), ep
)) goto trunc
;
2372 return (const u_char
*)ext
+ item_len
;
2374 ND_PRINT(" [|%s]", NPSTR(tpay
));
2378 /* notify payloads */
2379 static const u_char
*
2380 ikev2_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
2381 const struct isakmp_gen
*ext
,
2382 u_int item_len
, const u_char
*ep
,
2383 uint32_t phase _U_
, uint32_t doi _U_
,
2384 uint32_t proto _U_
, int depth _U_
)
2386 const struct ikev2_n
*p
;
2390 u_char showspi
, showsomedata
;
2391 const char *notify_name
;
2393 p
= (const struct ikev2_n
*)ext
;
2395 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_N
), GET_U_1(p
->h
.critical
));
2401 ND_PRINT(" prot_id=%s", PROTOIDSTR(GET_U_1(p
->prot_id
)));
2403 type
= GET_BE_U_2(p
->type
);
2405 /* notify space is annoying sparse */
2407 case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
:
2408 notify_name
= "unsupported_critical_payload";
2412 case IV2_NOTIFY_INVALID_IKE_SPI
:
2413 notify_name
= "invalid_ike_spi";
2417 case IV2_NOTIFY_INVALID_MAJOR_VERSION
:
2418 notify_name
= "invalid_major_version";
2422 case IV2_NOTIFY_INVALID_SYNTAX
:
2423 notify_name
= "invalid_syntax";
2427 case IV2_NOTIFY_INVALID_MESSAGE_ID
:
2428 notify_name
= "invalid_message_id";
2432 case IV2_NOTIFY_INVALID_SPI
:
2433 notify_name
= "invalid_spi";
2437 case IV2_NOTIFY_NO_PROPOSAL_CHOSEN
:
2438 notify_name
= "no_protocol_chosen";
2442 case IV2_NOTIFY_INVALID_KE_PAYLOAD
:
2443 notify_name
= "invalid_ke_payload";
2447 case IV2_NOTIFY_AUTHENTICATION_FAILED
:
2448 notify_name
= "authentication_failed";
2452 case IV2_NOTIFY_SINGLE_PAIR_REQUIRED
:
2453 notify_name
= "single_pair_required";
2457 case IV2_NOTIFY_NO_ADDITIONAL_SAS
:
2458 notify_name
= "no_additional_sas";
2462 case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
:
2463 notify_name
= "internal_address_failure";
2467 case IV2_NOTIFY_FAILED_CP_REQUIRED
:
2468 notify_name
= "failed:cp_required";
2472 case IV2_NOTIFY_INVALID_SELECTORS
:
2473 notify_name
= "invalid_selectors";
2477 case IV2_NOTIFY_INITIAL_CONTACT
:
2478 notify_name
= "initial_contact";
2482 case IV2_NOTIFY_SET_WINDOW_SIZE
:
2483 notify_name
= "set_window_size";
2487 case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
:
2488 notify_name
= "additional_ts_possible";
2492 case IV2_NOTIFY_IPCOMP_SUPPORTED
:
2493 notify_name
= "ipcomp_supported";
2497 case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
:
2498 notify_name
= "nat_detection_source_ip";
2502 case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
:
2503 notify_name
= "nat_detection_destination_ip";
2507 case IV2_NOTIFY_COOKIE
:
2508 notify_name
= "cookie";
2513 case IV2_NOTIFY_USE_TRANSPORT_MODE
:
2514 notify_name
= "use_transport_mode";
2518 case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
:
2519 notify_name
= "http_cert_lookup_supported";
2523 case IV2_NOTIFY_REKEY_SA
:
2524 notify_name
= "rekey_sa";
2528 case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
:
2529 notify_name
= "tfc_padding_not_supported";
2533 case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
:
2534 notify_name
= "non_first_fragment_also";
2540 notify_name
="error";
2541 } else if(type
< 16384) {
2542 notify_name
="private-error";
2543 } else if(type
< 40960) {
2544 notify_name
="status";
2546 notify_name
="private-status";
2551 ND_PRINT(" type=%u(%s)", type
, notify_name
);
2555 spi_size
= GET_U_1(p
->spi_size
);
2556 if (showspi
&& spi_size
) {
2558 if (!rawprint(ndo
, (const uint8_t *)(p
+ 1), spi_size
))
2562 cp
= (const u_char
*)(p
+ 1) + spi_size
;
2565 if (ndo
->ndo_vflag
> 3 || (showsomedata
&& ep
-cp
< 30)) {
2566 ND_PRINT(" data=(");
2567 if (!rawprint(ndo
, (const uint8_t *)(cp
), ep
- cp
))
2571 } else if (showsomedata
) {
2572 if (!ike_show_somedata(ndo
, cp
, ep
))
2577 return (const u_char
*)ext
+ item_len
;
2579 ND_PRINT(" [|%s]", NPSTR(ISAKMP_NPTYPE_N
));
2583 static const u_char
*
2584 ikev2_d_print(netdissect_options
*ndo
, u_char tpay
,
2585 const struct isakmp_gen
*ext
,
2586 u_int item_len
, const u_char
*ep _U_
,
2587 uint32_t phase _U_
, uint32_t doi _U_
,
2588 uint32_t proto _U_
, int depth _U_
)
2590 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2593 static const u_char
*
2594 ikev2_vid_print(netdissect_options
*ndo
, u_char tpay
,
2595 const struct isakmp_gen
*ext
,
2596 u_int item_len
, const u_char
*ep _U_
,
2597 uint32_t phase _U_
, uint32_t doi _U_
,
2598 uint32_t proto _U_
, int depth _U_
)
2603 ND_TCHECK_SIZE(ext
);
2604 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(ext
->critical
));
2607 * Our caller has ensured that the length is >= 4.
2609 ND_PRINT(" len=%u vid=", item_len
- 4);
2611 vid
= (const u_char
*)(ext
+1);
2613 ND_TCHECK_LEN(vid
, len
);
2614 for(i
=0; i
<len
; i
++) {
2615 if(ND_ASCII_ISPRINT(GET_U_1(vid
+ i
)))
2616 ND_PRINT("%c", GET_U_1(vid
+ i
));
2619 if (2 < ndo
->ndo_vflag
&& 4 < len
) {
2620 /* Print the entire payload in hex */
2622 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), item_len
- 4))
2625 return (const u_char
*)ext
+ item_len
;
2627 ND_PRINT(" [|%s]", NPSTR(tpay
));
2631 static const u_char
*
2632 ikev2_TS_print(netdissect_options
*ndo
, u_char tpay
,
2633 const struct isakmp_gen
*ext
,
2634 u_int item_len
, const u_char
*ep _U_
,
2635 uint32_t phase _U_
, uint32_t doi _U_
,
2636 uint32_t proto _U_
, int depth _U_
)
2638 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2641 static const u_char
*
2642 ikev2_e_print(netdissect_options
*ndo
,
2643 #ifndef HAVE_LIBCRYPTO
2646 const struct isakmp
*base
,
2648 const struct isakmp_gen
*ext
,
2649 u_int item_len
, const u_char
*ep _U_
,
2650 #ifndef HAVE_LIBCRYPTO
2654 #ifndef HAVE_LIBCRYPTO
2658 #ifndef HAVE_LIBCRYPTO
2662 #ifndef HAVE_LIBCRYPTO
2669 #ifdef HAVE_LIBCRYPTO
2673 ND_TCHECK_SIZE(ext
);
2674 ikev2_pay_print(ndo
, NPSTR(tpay
), GET_U_1(ext
->critical
));
2678 ND_PRINT(" len=%u", dlen
);
2679 if (2 < ndo
->ndo_vflag
&& 4 < dlen
) {
2681 if (!rawprint(ndo
, (const uint8_t *)(ext
+ 1), dlen
))
2685 dat
= (const u_char
*)(ext
+1);
2686 ND_TCHECK_LEN(dat
, dlen
);
2688 #ifdef HAVE_LIBCRYPTO
2689 np
= GET_U_1(ext
->np
);
2691 /* try to decrypt it! */
2692 if(esp_decrypt_buffer_by_ikev2_print(ndo
,
2693 GET_U_1(base
->flags
) & ISAKMP_FLAG_I
,
2694 base
->i_ck
, base
->r_ck
,
2697 ext
= (const struct isakmp_gen
*)ndo
->ndo_packetp
;
2699 /* got it decrypted, print stuff inside. */
2700 ikev2_sub_print(ndo
, base
, np
, ext
,
2701 ndo
->ndo_snapend
, phase
, doi
, proto
, depth
+1);
2704 * esp_decrypt_buffer_by_ikev2_print pushed information
2705 * on the buffer stack; we're done with the buffer, so
2706 * pop it (which frees the buffer)
2708 nd_pop_packet_info(ndo
);
2713 /* always return NULL, because E must be at end, and NP refers
2714 * to what was inside.
2718 ND_PRINT(" [|%s]", NPSTR(tpay
));
2722 static const u_char
*
2723 ikev2_cp_print(netdissect_options
*ndo
, u_char tpay
,
2724 const struct isakmp_gen
*ext
,
2725 u_int item_len
, const u_char
*ep _U_
,
2726 uint32_t phase _U_
, uint32_t doi _U_
,
2727 uint32_t proto _U_
, int depth _U_
)
2729 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2732 static const u_char
*
2733 ikev2_eap_print(netdissect_options
*ndo
, u_char tpay
,
2734 const struct isakmp_gen
*ext
,
2735 u_int item_len
, const u_char
*ep _U_
,
2736 uint32_t phase _U_
, uint32_t doi _U_
,
2737 uint32_t proto _U_
, int depth _U_
)
2739 return ikev2_gen_print(ndo
, tpay
, ext
, item_len
);
2742 static const u_char
*
2743 ike_sub0_print(netdissect_options
*ndo
,
2744 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2746 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2751 cp
= (const u_char
*)ext
;
2752 ND_TCHECK_SIZE(ext
);
2755 * Since we can't have a payload length of less than 4 bytes,
2756 * we need to bail out here if the generic header is nonsensical
2757 * or truncated, otherwise we could loop forever processing
2758 * zero-length items or otherwise misdissect the packet.
2760 item_len
= GET_BE_U_2(ext
->len
);
2766 * XXX - what if item_len is too short, or too long,
2767 * for this payload type?
2769 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
, ep
, phase
, doi
, proto
, depth
);
2771 ND_PRINT("%s", NPSTR(np
));
2777 nd_print_trunc(ndo
);
2781 static const u_char
*
2782 ikev1_sub_print(netdissect_options
*ndo
,
2783 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2784 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2790 cp
= (const u_char
*)ext
;
2793 ND_TCHECK_SIZE(ext
);
2795 item_len
= GET_BE_U_2(ext
->len
);
2796 ND_TCHECK_LEN(ext
, item_len
);
2800 for (i
= 0; i
< depth
; i
++)
2803 cp
= ike_sub0_print(ndo
, np
, ext
, ep
, phase
, doi
, proto
, depth
);
2808 /* Zero-length subitem */
2812 np
= GET_U_1(ext
->np
);
2813 ext
= (const struct isakmp_gen
*)cp
;
2817 ND_PRINT(" [|%s]", NPSTR(np
));
2824 static char buf
[20];
2825 snprintf(buf
, sizeof(buf
), "#%u", x
);
2830 ikev1_print(netdissect_options
*ndo
,
2831 const u_char
*bp
, u_int length
,
2832 const u_char
*bp2
, const struct isakmp
*base
)
2834 const struct isakmp
*p
;
2841 p
= (const struct isakmp
*)bp
;
2842 ep
= ndo
->ndo_snapend
;
2844 phase
= (GET_BE_U_4(base
->msgid
) == 0) ? 1 : 2;
2846 ND_PRINT(" phase %u", phase
);
2848 ND_PRINT(" phase %u/others", phase
);
2850 i
= cookie_find(&base
->i_ck
);
2852 if (iszero((const u_char
*)&base
->r_ck
, sizeof(base
->r_ck
))) {
2853 /* the first packet */
2856 cookie_record(ndo
, &base
->i_ck
, bp2
);
2860 if (bp2
&& cookie_isinitiator(ndo
, i
, bp2
))
2862 else if (bp2
&& cookie_isresponder(ndo
, i
, bp2
))
2868 ND_PRINT(" %s", ETYPESTR(GET_U_1(base
->etype
)));
2869 flags
= GET_U_1(base
->flags
);
2871 ND_PRINT("[%s%s]", flags
& ISAKMP_FLAG_E
? "E" : "",
2872 flags
& ISAKMP_FLAG_C
? "C" : "");
2875 if (ndo
->ndo_vflag
) {
2876 const struct isakmp_gen
*ext
;
2880 np
= GET_U_1(base
->np
);
2882 /* regardless of phase... */
2883 if (flags
& ISAKMP_FLAG_E
) {
2885 * encrypted, nothing we can do right now.
2886 * we hope to decrypt the packet in the future...
2888 ND_PRINT(" [encrypted %s]", NPSTR(np
));
2892 CHECKLEN(p
+ 1, np
);
2893 ext
= (const struct isakmp_gen
*)(p
+ 1);
2894 ikev1_sub_print(ndo
, np
, ext
, ep
, phase
, 0, 0, 0);
2898 if (ndo
->ndo_vflag
) {
2899 if (GET_BE_U_4(base
->len
) != length
) {
2900 ND_PRINT(" (len mismatch: isakmp %u/ip %u)",
2901 GET_BE_U_4(base
->len
), length
);
2906 static const u_char
*
2907 ikev2_sub0_print(netdissect_options
*ndo
, const struct isakmp
*base
,
2909 const struct isakmp_gen
*ext
, const u_char
*ep
,
2910 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2915 cp
= (const u_char
*)ext
;
2916 ND_TCHECK_SIZE(ext
);
2919 * Since we can't have a payload length of less than 4 bytes,
2920 * we need to bail out here if the generic header is nonsensical
2921 * or truncated, otherwise we could loop forever processing
2922 * zero-length items or otherwise misdissect the packet.
2924 item_len
= GET_BE_U_2(ext
->len
);
2928 if (np
== ISAKMP_NPTYPE_v2E
) {
2929 cp
= ikev2_e_print(ndo
, base
, np
, ext
, item_len
,
2930 ep
, phase
, doi
, proto
, depth
);
2931 } else if (NPFUNC(np
)) {
2933 * XXX - what if item_len is too short, or too long,
2934 * for this payload type?
2936 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
,
2937 ep
, phase
, doi
, proto
, depth
);
2939 ND_PRINT("%s", NPSTR(np
));
2945 nd_print_trunc(ndo
);
2949 static const u_char
*
2950 ikev2_sub_print(netdissect_options
*ndo
,
2951 const struct isakmp
*base
,
2952 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2953 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2958 cp
= (const u_char
*)ext
;
2960 ND_TCHECK_SIZE(ext
);
2962 ND_TCHECK_LEN(ext
, GET_BE_U_2(ext
->len
));
2966 for (i
= 0; i
< depth
; i
++)
2969 cp
= ikev2_sub0_print(ndo
, base
, np
,
2970 ext
, ep
, phase
, doi
, proto
, depth
);
2975 /* Zero-length subitem */
2979 np
= GET_U_1(ext
->np
);
2980 ext
= (const struct isakmp_gen
*)cp
;
2984 ND_PRINT(" [|%s]", NPSTR(np
));
2989 ikev2_print(netdissect_options
*ndo
,
2990 const u_char
*bp
, u_int length
,
2991 const u_char
*bp2 _U_
, const struct isakmp
*base
)
2993 const struct isakmp
*p
;
2999 p
= (const struct isakmp
*)bp
;
3000 ep
= ndo
->ndo_snapend
;
3002 phase
= (GET_BE_U_4(base
->msgid
) == 0) ? 1 : 2;
3004 ND_PRINT(" parent_sa");
3006 ND_PRINT(" child_sa ");
3008 ND_PRINT(" %s", ETYPESTR(GET_U_1(base
->etype
)));
3009 flags
= GET_U_1(base
->flags
);
3011 ND_PRINT("[%s%s%s]",
3012 flags
& ISAKMP_FLAG_I
? "I" : "",
3013 flags
& ISAKMP_FLAG_V
? "V" : "",
3014 flags
& ISAKMP_FLAG_R
? "R" : "");
3017 if (ndo
->ndo_vflag
) {
3018 const struct isakmp_gen
*ext
;
3022 np
= GET_U_1(base
->np
);
3024 /* regardless of phase... */
3025 if (flags
& ISAKMP_FLAG_E
) {
3027 * encrypted, nothing we can do right now.
3028 * we hope to decrypt the packet in the future...
3030 ND_PRINT(" [encrypted %s]", NPSTR(np
));
3035 ext
= (const struct isakmp_gen
*)(p
+ 1);
3036 ikev2_sub_print(ndo
, base
, np
, ext
, ep
, phase
, 0, 0, 0);
3040 if (ndo
->ndo_vflag
) {
3041 if (GET_BE_U_4(base
->len
) != length
) {
3042 ND_PRINT(" (len mismatch: isakmp %u/ip %u)",
3043 GET_BE_U_4(base
->len
), length
);
3049 isakmp_print(netdissect_options
*ndo
,
3050 const u_char
*bp
, u_int length
,
3053 const struct isakmp
*p
;
3057 ndo
->ndo_protocol
= "isakmp";
3058 #ifdef HAVE_LIBCRYPTO
3059 /* initialize SAs */
3060 if (ndo
->ndo_sa_list_head
== NULL
) {
3061 if (ndo
->ndo_espsecret
)
3062 esp_decodesecret_print(ndo
);
3066 p
= (const struct isakmp
*)bp
;
3067 ep
= ndo
->ndo_snapend
;
3069 if ((const struct isakmp
*)ep
< p
+ 1) {
3070 nd_print_trunc(ndo
);
3075 major
= (GET_U_1(p
->vers
) & ISAKMP_VERS_MAJOR
)
3076 >> ISAKMP_VERS_MAJOR_SHIFT
;
3077 minor
= (GET_U_1(p
->vers
) & ISAKMP_VERS_MINOR
)
3078 >> ISAKMP_VERS_MINOR_SHIFT
;
3080 if (ndo
->ndo_vflag
) {
3081 ND_PRINT(" %u.%u", major
, minor
);
3084 if (ndo
->ndo_vflag
) {
3085 ND_PRINT(" msgid ");
3086 hexprint(ndo
, p
->msgid
, sizeof(p
->msgid
));
3089 if (1 < ndo
->ndo_vflag
) {
3090 ND_PRINT(" cookie ");
3091 hexprint(ndo
, p
->i_ck
, sizeof(p
->i_ck
));
3093 hexprint(ndo
, p
->r_ck
, sizeof(p
->r_ck
));
3098 case IKEv1_MAJOR_VERSION
:
3099 ikev1_print(ndo
, bp
, length
, bp2
, p
);
3102 case IKEv2_MAJOR_VERSION
:
3103 ikev2_print(ndo
, bp
, length
, bp2
, p
);
3109 isakmp_rfc3948_print(netdissect_options
*ndo
,
3110 const u_char
*bp
, u_int length
,
3111 const u_char
*bp2
, int ver
, int fragmented
, u_int ttl_hl
)
3113 ndo
->ndo_protocol
= "isakmp_rfc3948";
3115 if(length
== 1 && GET_U_1(bp
)==0xff) {
3116 ND_PRINT("isakmp-nat-keep-alive");
3123 ND_TCHECK_1(bp
+ 3);
3126 * see if this is an IKE packet
3128 if (GET_BE_U_4(bp
) == 0) {
3129 ND_PRINT("NONESP-encap: ");
3130 isakmp_print(ndo
, bp
+4, length
-4, bp2
);
3134 /* must be an ESP packet */
3136 ND_PRINT("UDP-encap: ");
3138 esp_print(ndo
, bp
, length
, bp2
, ver
, fragmented
, ttl_hl
);
3141 * Either this has decrypted the payload and
3142 * printed it, in which case there's nothing more
3143 * to do, or it hasn't, in which case there's
3144 * nothing more to do.
3150 nd_print_trunc(ndo
);