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
35 /* The functions from print-esp.c used in this file are only defined when both
36 * OpenSSL and evp.h are detected. Employ the same preprocessor device here.
38 #ifndef HAVE_OPENSSL_EVP_H
42 #include <tcpdump-stdinc.h>
46 #include "interface.h"
47 #include "addrtoname.h"
48 #include "extract.h" /* must come after interface.h */
55 /* refer to RFC 2408 */
57 typedef u_char cookie_t
[8];
58 typedef u_char msgid_t
[4];
60 #define PORT_ISAKMP 500
62 /* 3.1 ISAKMP Header Format (IKEv1 and IKEv2)
63 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
64 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
71 ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
72 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
79 cookie_t i_ck
; /* Initiator Cookie */
80 cookie_t r_ck
; /* Responder Cookie */
81 uint8_t np
; /* Next Payload Type */
83 #define ISAKMP_VERS_MAJOR 0xf0
84 #define ISAKMP_VERS_MAJOR_SHIFT 4
85 #define ISAKMP_VERS_MINOR 0x0f
86 #define ISAKMP_VERS_MINOR_SHIFT 0
87 uint8_t etype
; /* Exchange Type */
88 uint8_t flags
; /* Flags */
90 uint32_t len
; /* Length */
93 /* Next Payload Type */
94 #define ISAKMP_NPTYPE_NONE 0 /* NONE*/
95 #define ISAKMP_NPTYPE_SA 1 /* Security Association */
96 #define ISAKMP_NPTYPE_P 2 /* Proposal */
97 #define ISAKMP_NPTYPE_T 3 /* Transform */
98 #define ISAKMP_NPTYPE_KE 4 /* Key Exchange */
99 #define ISAKMP_NPTYPE_ID 5 /* Identification */
100 #define ISAKMP_NPTYPE_CERT 6 /* Certificate */
101 #define ISAKMP_NPTYPE_CR 7 /* Certificate Request */
102 #define ISAKMP_NPTYPE_HASH 8 /* Hash */
103 #define ISAKMP_NPTYPE_SIG 9 /* Signature */
104 #define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
105 #define ISAKMP_NPTYPE_N 11 /* Notification */
106 #define ISAKMP_NPTYPE_D 12 /* Delete */
107 #define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
108 #define ISAKMP_NPTYPE_v2E 46 /* v2 Encrypted payload */
110 #define IKEv1_MAJOR_VERSION 1
111 #define IKEv1_MINOR_VERSION 0
113 #define IKEv2_MAJOR_VERSION 2
114 #define IKEv2_MINOR_VERSION 0
117 #define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
118 #define ISAKMP_FLAG_C 0x02 /* Commit Bit */
119 #define ISAKMP_FLAG_extra 0x04
122 #define ISAKMP_FLAG_I (1 << 3) /* (I)nitiator */
123 #define ISAKMP_FLAG_V (1 << 4) /* (V)ersion */
124 #define ISAKMP_FLAG_R (1 << 5) /* (R)esponse */
127 /* 3.2 Payload Generic Header
128 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
129 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
130 ! Next Payload ! RESERVED ! Payload Length !
131 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
134 uint8_t np
; /* Next Payload */
135 uint8_t critical
; /* bit 7 - critical, rest is RESERVED */
136 uint16_t len
; /* Payload Length */
139 /* 3.3 Data Attributes
140 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
141 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
142 !A! Attribute Type ! AF=0 Attribute Length !
143 !F! ! AF=1 Attribute Value !
144 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
145 . AF=0 Attribute Value .
146 . AF=1 Not Transmitted .
147 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
150 uint16_t type
; /* defined by DOI-spec, and Attribute Format */
151 uint16_t lorv
; /* if f equal 1, Attribute Length */
152 /* if f equal 0, Attribute Value */
153 /* if f equal 1, Attribute Value */
156 /* 3.4 Security Association Payload */
157 /* MAY NOT be used, because of being defined in ipsec-doi. */
159 If the current payload is the last in the message,
160 then the value of the next payload field will be 0.
161 This field MUST NOT contain the
162 values for the Proposal or Transform payloads as they are considered
163 part of the security association negotiation. For example, this
164 field would contain the value "10" (Nonce payload) in the first
165 message of a Base Exchange (see Section 4.4) and the value "0" in the
166 first message of an Identity Protect Exchange (see Section 4.5).
170 uint32_t doi
; /* Domain of Interpretation */
171 uint32_t sit
; /* Situation */
174 /* 3.5 Proposal Payload */
176 The value of the next payload field MUST only contain the value "2"
177 or "0". If there are additional Proposal payloads in the message,
178 then this field will be 2. If the current Proposal payload is the
179 last within the security association proposal, then this field will
184 uint8_t p_no
; /* Proposal # */
185 uint8_t prot_id
; /* Protocol */
186 uint8_t spi_size
; /* SPI Size */
187 uint8_t num_t
; /* Number of Transforms */
191 /* 3.6 Transform Payload */
193 The value of the next payload field MUST only contain the value "3"
194 or "0". If there are additional Transform payloads in the proposal,
195 then this field will be 3. If the current Transform payload is the
196 last within the proposal, then this field will be 0.
200 uint8_t t_no
; /* Transform # */
201 uint8_t t_id
; /* Transform-Id */
202 uint16_t reserved
; /* RESERVED2 */
206 /* 3.7 Key Exchange Payload */
209 /* Key Exchange Data */
212 /* 3.8 Identification Payload */
213 /* MUST NOT to be used, because of being defined in ipsec-doi. */
217 uint8_t id_type
; /* ID Type */
218 uint32_t doi_data
; /* DOI Specific ID Data */
220 /* Identification Data */
223 /* 3.9 Certificate Payload */
224 struct ikev1_pl_cert
{
226 uint8_t encode
; /* Cert Encoding */
227 char cert
; /* Certificate Data */
229 This field indicates the type of
230 certificate or certificate-related information contained in the
231 Certificate Data field.
235 /* 3.10 Certificate Request Payload */
238 uint8_t num_cert
; /* # Cert. Types */
240 Certificate Types (variable length)
241 -- Contains a list of the types of certificates requested,
242 sorted in order of preference. Each individual certificate
243 type is 1 octet. This field is NOT requiredo
245 /* # Certificate Authorities (1 octet) */
246 /* Certificate Authorities (variable length) */
249 /* 3.11 Hash Payload */
250 /* may not be used, because of having only data. */
251 struct ikev1_pl_hash
{
256 /* 3.12 Signature Payload */
257 /* may not be used, because of having only data. */
258 struct ikev1_pl_sig
{
263 /* 3.13 Nonce Payload */
264 /* may not be used, because of having only data. */
265 struct ikev1_pl_nonce
{
270 /* 3.14 Notification Payload */
273 uint32_t doi
; /* Domain of Interpretation */
274 uint8_t prot_id
; /* Protocol-ID */
275 uint8_t spi_size
; /* SPI Size */
276 uint16_t type
; /* Notify Message Type */
278 /* Notification Data */
281 /* 3.14.1 Notify Message Types */
282 /* NOTIFY MESSAGES - ERROR TYPES */
283 #define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE 1
284 #define ISAKMP_NTYPE_DOI_NOT_SUPPORTED 2
285 #define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED 3
286 #define ISAKMP_NTYPE_INVALID_COOKIE 4
287 #define ISAKMP_NTYPE_INVALID_MAJOR_VERSION 5
288 #define ISAKMP_NTYPE_INVALID_MINOR_VERSION 6
289 #define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE 7
290 #define ISAKMP_NTYPE_INVALID_FLAGS 8
291 #define ISAKMP_NTYPE_INVALID_MESSAGE_ID 9
292 #define ISAKMP_NTYPE_INVALID_PROTOCOL_ID 10
293 #define ISAKMP_NTYPE_INVALID_SPI 11
294 #define ISAKMP_NTYPE_INVALID_TRANSFORM_ID 12
295 #define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED 13
296 #define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN 14
297 #define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX 15
298 #define ISAKMP_NTYPE_PAYLOAD_MALFORMED 16
299 #define ISAKMP_NTYPE_INVALID_KEY_INFORMATION 17
300 #define ISAKMP_NTYPE_INVALID_ID_INFORMATION 18
301 #define ISAKMP_NTYPE_INVALID_CERT_ENCODING 19
302 #define ISAKMP_NTYPE_INVALID_CERTIFICATE 20
303 #define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX 21
304 #define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY 22
305 #define ISAKMP_NTYPE_INVALID_HASH_INFORMATION 23
306 #define ISAKMP_NTYPE_AUTHENTICATION_FAILED 24
307 #define ISAKMP_NTYPE_INVALID_SIGNATURE 25
308 #define ISAKMP_NTYPE_ADDRESS_NOTIFICATION 26
310 /* 3.15 Delete Payload */
313 uint32_t doi
; /* Domain of Interpretation */
314 uint8_t prot_id
; /* Protocol-Id */
315 uint8_t spi_size
; /* SPI Size */
316 uint16_t num_spi
; /* # of SPIs */
320 struct ikev1_ph1tab
{
321 struct ikev1_ph1
*head
;
322 struct ikev1_ph1
*tail
;
326 struct isakmp_ph2tab
{
327 struct ikev1_ph2
*head
;
328 struct ikev1_ph2
*tail
;
332 /* IKEv2 (RFC4306) */
334 /* 3.3 Security Association Payload -- generic header */
335 /* 3.3.1. Proposal Substructure */
338 uint8_t p_no
; /* Proposal # */
339 uint8_t prot_id
; /* Protocol */
340 uint8_t spi_size
; /* SPI Size */
341 uint8_t num_t
; /* Number of Transforms */
344 /* 3.3.2. Transform Substructure */
347 uint8_t t_type
; /* Transform Type (ENCR,PRF,INTEG,etc.*/
348 uint8_t res2
; /* reserved byte */
349 uint16_t t_id
; /* Transform ID */
360 /* 3.4. Key Exchange Payload */
369 /* 3.5. Identification Payloads */
381 uint8_t type
; /* ID type */
385 /* Notification Data */
388 /* 3.10 Notification Payload */
391 uint8_t prot_id
; /* Protocol-ID */
392 uint8_t spi_size
; /* SPI Size */
393 uint16_t type
; /* Notify Message Type */
397 IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
= 1,
398 IV2_NOTIFY_INVALID_IKE_SPI
= 4,
399 IV2_NOTIFY_INVALID_MAJOR_VERSION
= 5,
400 IV2_NOTIFY_INVALID_SYNTAX
= 7,
401 IV2_NOTIFY_INVALID_MESSAGE_ID
= 9,
402 IV2_NOTIFY_INVALID_SPI
=11,
403 IV2_NOTIFY_NO_PROPOSAL_CHOSEN
=14,
404 IV2_NOTIFY_INVALID_KE_PAYLOAD
=17,
405 IV2_NOTIFY_AUTHENTICATION_FAILED
=24,
406 IV2_NOTIFY_SINGLE_PAIR_REQUIRED
=34,
407 IV2_NOTIFY_NO_ADDITIONAL_SAS
=35,
408 IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
=36,
409 IV2_NOTIFY_FAILED_CP_REQUIRED
=37,
410 IV2_NOTIFY_INVALID_SELECTORS
=39,
411 IV2_NOTIFY_INITIAL_CONTACT
=16384,
412 IV2_NOTIFY_SET_WINDOW_SIZE
=16385,
413 IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
=16386,
414 IV2_NOTIFY_IPCOMP_SUPPORTED
=16387,
415 IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
=16388,
416 IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
=16389,
417 IV2_NOTIFY_COOKIE
=16390,
418 IV2_NOTIFY_USE_TRANSPORT_MODE
=16391,
419 IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
=16392,
420 IV2_NOTIFY_REKEY_SA
=16393,
421 IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
=16394,
422 IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
=16395
425 struct notify_messages
{
430 /* 3.8 Notification Payload */
433 uint8_t auth_method
; /* Protocol-ID */
435 /* authentication data */
438 enum ikev2_auth_type
{
444 /* refer to RFC 2409 */
447 /* isakmp sa structure */
449 uint8_t proto_id
; /* OAKLEY */
450 vchar_t
*spi
; /* spi */
451 uint8_t dhgrp
; /* DH; group */
452 uint8_t auth_t
; /* method of authentication */
453 uint8_t prf_t
; /* type of prf */
454 uint8_t hash_t
; /* type of hash */
455 uint8_t enc_t
; /* type of cipher */
456 uint8_t life_t
; /* type of duration of lifetime */
457 uint32_t ldur
; /* life duration */
461 /* refer to RFC 2407 */
465 /* 4.2 IPSEC Situation Definition */
466 #define IPSECDOI_SIT_IDENTITY_ONLY 0x00000001
467 #define IPSECDOI_SIT_SECRECY 0x00000002
468 #define IPSECDOI_SIT_INTEGRITY 0x00000004
470 /* 4.4.1 IPSEC Security Protocol Identifiers */
471 /* 4.4.2 IPSEC ISAKMP Transform Values */
472 #define IPSECDOI_PROTO_ISAKMP 1
473 #define IPSECDOI_KEY_IKE 1
475 /* 4.4.1 IPSEC Security Protocol Identifiers */
476 #define IPSECDOI_PROTO_IPSEC_AH 2
477 /* 4.4.3 IPSEC AH Transform Values */
478 #define IPSECDOI_AH_MD5 2
479 #define IPSECDOI_AH_SHA 3
480 #define IPSECDOI_AH_DES 4
481 #define IPSECDOI_AH_SHA2_256 5
482 #define IPSECDOI_AH_SHA2_384 6
483 #define IPSECDOI_AH_SHA2_512 7
485 /* 4.4.1 IPSEC Security Protocol Identifiers */
486 #define IPSECDOI_PROTO_IPSEC_ESP 3
487 /* 4.4.4 IPSEC ESP Transform Identifiers */
488 #define IPSECDOI_ESP_DES_IV64 1
489 #define IPSECDOI_ESP_DES 2
490 #define IPSECDOI_ESP_3DES 3
491 #define IPSECDOI_ESP_RC5 4
492 #define IPSECDOI_ESP_IDEA 5
493 #define IPSECDOI_ESP_CAST 6
494 #define IPSECDOI_ESP_BLOWFISH 7
495 #define IPSECDOI_ESP_3IDEA 8
496 #define IPSECDOI_ESP_DES_IV32 9
497 #define IPSECDOI_ESP_RC4 10
498 #define IPSECDOI_ESP_NULL 11
499 #define IPSECDOI_ESP_RIJNDAEL 12
500 #define IPSECDOI_ESP_AES 12
502 /* 4.4.1 IPSEC Security Protocol Identifiers */
503 #define IPSECDOI_PROTO_IPCOMP 4
504 /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
505 #define IPSECDOI_IPCOMP_OUI 1
506 #define IPSECDOI_IPCOMP_DEFLATE 2
507 #define IPSECDOI_IPCOMP_LZS 3
509 /* 4.5 IPSEC Security Association Attributes */
510 #define IPSECDOI_ATTR_SA_LTYPE 1 /* B */
511 #define IPSECDOI_ATTR_SA_LTYPE_DEFAULT 1
512 #define IPSECDOI_ATTR_SA_LTYPE_SEC 1
513 #define IPSECDOI_ATTR_SA_LTYPE_KB 2
514 #define IPSECDOI_ATTR_SA_LDUR 2 /* V */
515 #define IPSECDOI_ATTR_SA_LDUR_DEFAULT 28800 /* 8 hours */
516 #define IPSECDOI_ATTR_GRP_DESC 3 /* B */
517 #define IPSECDOI_ATTR_ENC_MODE 4 /* B */
518 /* default value: host dependent */
519 #define IPSECDOI_ATTR_ENC_MODE_TUNNEL 1
520 #define IPSECDOI_ATTR_ENC_MODE_TRNS 2
521 #define IPSECDOI_ATTR_AUTH 5 /* B */
522 /* 0 means not to use authentication. */
523 #define IPSECDOI_ATTR_AUTH_HMAC_MD5 1
524 #define IPSECDOI_ATTR_AUTH_HMAC_SHA1 2
525 #define IPSECDOI_ATTR_AUTH_DES_MAC 3
526 #define IPSECDOI_ATTR_AUTH_KPDK 4 /*RFC-1826(Key/Pad/Data/Key)*/
528 * When negotiating ESP without authentication, the Auth
529 * Algorithm attribute MUST NOT be included in the proposal.
530 * When negotiating ESP without confidentiality, the Auth
531 * Algorithm attribute MUST be included in the proposal and
532 * the ESP transform ID must be ESP_NULL.
534 #define IPSECDOI_ATTR_KEY_LENGTH 6 /* B */
535 #define IPSECDOI_ATTR_KEY_ROUNDS 7 /* B */
536 #define IPSECDOI_ATTR_COMP_DICT_SIZE 8 /* B */
537 #define IPSECDOI_ATTR_COMP_PRIVALG 9 /* V */
539 /* 4.6.1 Security Association Payload */
542 uint32_t doi
; /* Domain of Interpretation */
543 uint32_t sit
; /* Situation */
546 struct ipsecdoi_secrecy_h
{
551 /* 4.6.2.1 Identification Type Values */
554 uint8_t type
; /* ID Type */
555 uint8_t proto_id
; /* Protocol ID */
556 uint16_t port
; /* Port */
557 /* Identification Data */
560 #define IPSECDOI_ID_IPV4_ADDR 1
561 #define IPSECDOI_ID_FQDN 2
562 #define IPSECDOI_ID_USER_FQDN 3
563 #define IPSECDOI_ID_IPV4_ADDR_SUBNET 4
564 #define IPSECDOI_ID_IPV6_ADDR 5
565 #define IPSECDOI_ID_IPV6_ADDR_SUBNET 6
566 #define IPSECDOI_ID_IPV4_ADDR_RANGE 7
567 #define IPSECDOI_ID_IPV6_ADDR_RANGE 8
568 #define IPSECDOI_ID_DER_ASN1_DN 9
569 #define IPSECDOI_ID_DER_ASN1_GN 10
570 #define IPSECDOI_ID_KEY_ID 11
572 /* 4.6.3 IPSEC DOI Notify Message Types */
573 /* Notify Messages - Status Types */
574 #define IPSECDOI_NTYPE_RESPONDER_LIFETIME 24576
575 #define IPSECDOI_NTYPE_REPLAY_STATUS 24577
576 #define IPSECDOI_NTYPE_INITIAL_CONTACT 24578
578 #define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
579 netdissect_options *ndo, u_char tpay, \
580 const struct isakmp_gen *ext, \
582 const u_char *end_pointer, \
585 uint32_t proto0, int depth)
587 DECLARE_PRINTER(v1_sa
);
588 DECLARE_PRINTER(v1_p
);
589 DECLARE_PRINTER(v1_t
);
590 DECLARE_PRINTER(v1_ke
);
591 DECLARE_PRINTER(v1_id
);
592 DECLARE_PRINTER(v1_cert
);
593 DECLARE_PRINTER(v1_cr
);
594 DECLARE_PRINTER(v1_sig
);
595 DECLARE_PRINTER(v1_hash
);
596 DECLARE_PRINTER(v1_nonce
);
597 DECLARE_PRINTER(v1_n
);
598 DECLARE_PRINTER(v1_d
);
599 DECLARE_PRINTER(v1_vid
);
601 DECLARE_PRINTER(v2_sa
);
602 DECLARE_PRINTER(v2_ke
);
603 DECLARE_PRINTER(v2_ID
);
604 DECLARE_PRINTER(v2_cert
);
605 DECLARE_PRINTER(v2_cr
);
606 DECLARE_PRINTER(v2_auth
);
607 DECLARE_PRINTER(v2_nonce
);
608 DECLARE_PRINTER(v2_n
);
609 DECLARE_PRINTER(v2_d
);
610 DECLARE_PRINTER(v2_vid
);
611 DECLARE_PRINTER(v2_TS
);
612 DECLARE_PRINTER(v2_cp
);
613 DECLARE_PRINTER(v2_eap
);
615 static const u_char
*ikev2_e_print(netdissect_options
*ndo
,
618 const struct isakmp_gen
*ext
,
620 const u_char
*end_pointer
,
623 uint32_t proto0
, int depth
);
626 static const u_char
*ike_sub0_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
627 const u_char
*, uint32_t, uint32_t, uint32_t, int);
628 static const u_char
*ikev1_sub_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
629 const u_char
*, uint32_t, uint32_t, uint32_t, int);
631 static const u_char
*ikev2_sub_print(netdissect_options
*ndo
,
633 u_char np
, const struct isakmp_gen
*ext
,
634 const u_char
*ep
, uint32_t phase
,
635 uint32_t doi
, uint32_t proto
,
639 static char *numstr(int);
642 ikev1_print(netdissect_options
*ndo
,
643 const u_char
*bp
, u_int length
,
644 const u_char
*bp2
, struct isakmp
*base
);
646 #define MAXINITIATORS 20
657 union inaddr_u iaddr
;
658 union inaddr_u raddr
;
659 } cookiecache
[MAXINITIATORS
];
662 static const char *protoidstr
[] = {
663 NULL
, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
667 static const char *npstr
[] = {
668 "none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
669 "sig", "nonce", "n", "d", "vid", /* 9 - 13 */
670 "pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
671 "pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
672 "pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
673 "pay29", "pay30", "pay31", "pay32", /* 29- 32 */
674 "v2sa", "v2ke", "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
675 "v2cr", "v2auth","v2nonce", "v2n", "v2d", /* 38- 42 */
676 "v2vid", "v2TSi", "v2TSr", "v2e", "v2cp", /* 43- 47 */
682 static const u_char
*(*npfunc
[])(netdissect_options
*ndo
, u_char tpay
,
683 const struct isakmp_gen
*ext
,
685 const u_char
*end_pointer
,
688 uint32_t proto0
, int depth
) = {
702 ikev1_vid_print
, /* 13 */
703 NULL
, NULL
, NULL
, NULL
, NULL
, /* 14- 18 */
704 NULL
, NULL
, NULL
, NULL
, NULL
, /* 19- 23 */
705 NULL
, NULL
, NULL
, NULL
, NULL
, /* 24- 28 */
706 NULL
, NULL
, NULL
, NULL
, /* 29- 32 */
707 ikev2_sa_print
, /* 33 */
708 ikev2_ke_print
, /* 34 */
709 ikev2_ID_print
, /* 35 */
710 ikev2_ID_print
, /* 36 */
711 ikev2_cert_print
, /* 37 */
712 ikev2_cr_print
, /* 38 */
713 ikev2_auth_print
, /* 39 */
714 ikev2_nonce_print
, /* 40 */
715 ikev2_n_print
, /* 41 */
716 ikev2_d_print
, /* 42 */
717 ikev2_vid_print
, /* 43 */
718 ikev2_TS_print
, /* 44 */
719 ikev2_TS_print
, /* 45 */
720 NULL
, /* ikev2_e_print,*/ /* 46 - special */
721 ikev2_cp_print
, /* 47 */
722 ikev2_eap_print
, /* 48 */
726 static const char *etypestr
[] = {
727 /* IKEv1 exchange types */
728 "none", "base", "ident", "auth", "agg", "inf", NULL
, NULL
, /* 0-7 */
729 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 8-15 */
730 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 16-23 */
731 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 24-31 */
732 "oakley-quick", "oakley-newgroup", /* 32-33 */
733 /* IKEv2 exchange types */
734 "ikev2_init", "ikev2_auth", "child_sa", "inf2" /* 34-37 */
737 #define STR_OR_ID(x, tab) \
738 (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
739 #define PROTOIDSTR(x) STR_OR_ID(x, protoidstr)
740 #define NPSTR(x) STR_OR_ID(x, npstr)
741 #define ETYPESTR(x) STR_OR_ID(x, etypestr)
743 #define CHECKLEN(p, np) \
744 if (ep < (u_char *)(p)) { \
745 ND_PRINT((ndo," [|%s]", NPSTR(np))); \
751 (((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
752 ? npfunc[(x)] : NULL)
755 iszero(u_char
*p
, size_t l
)
764 /* find cookie from initiator cache */
766 cookie_find(cookie_t
*in
)
770 for (i
= 0; i
< MAXINITIATORS
; i
++) {
771 if (memcmp(in
, &cookiecache
[i
].initiator
, sizeof(*in
)) == 0)
778 /* record initiator */
780 cookie_record(cookie_t
*in
, const u_char
*bp2
)
790 ninitiator
= (i
+ 1) % MAXINITIATORS
;
794 ip
= (struct ip
*)bp2
;
797 cookiecache
[ninitiator
].version
= 4;
798 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in4
, &ip
->ip_src
, sizeof(struct in_addr
));
799 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in4
, &ip
->ip_dst
, sizeof(struct in_addr
));
803 ip6
= (struct ip6_hdr
*)bp2
;
804 cookiecache
[ninitiator
].version
= 6;
805 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].iaddr
.in6
, &ip6
->ip6_src
, sizeof(struct in6_addr
));
806 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].raddr
.in6
, &ip6
->ip6_dst
, sizeof(struct in6_addr
));
812 UNALIGNED_MEMCPY(&cookiecache
[ninitiator
].initiator
, in
, sizeof(*in
));
813 ninitiator
= (ninitiator
+ 1) % MAXINITIATORS
;
816 #define cookie_isinitiator(x, y) cookie_sidecheck((x), (y), 1)
817 #define cookie_isresponder(x, y) cookie_sidecheck((x), (y), 0)
819 cookie_sidecheck(int i
, const u_char
*bp2
, int initiator
)
826 ip
= (struct ip
*)bp2
;
829 if (cookiecache
[i
].version
!= 4)
832 if (UNALIGNED_MEMCMP(&ip
->ip_src
, &cookiecache
[i
].iaddr
.in4
, sizeof(struct in_addr
)) == 0)
835 if (UNALIGNED_MEMCMP(&ip
->ip_src
, &cookiecache
[i
].raddr
.in4
, sizeof(struct in_addr
)) == 0)
841 if (cookiecache
[i
].version
!= 6)
843 ip6
= (struct ip6_hdr
*)bp2
;
845 if (UNALIGNED_MEMCMP(&ip6
->ip6_src
, &cookiecache
[i
].iaddr
.in6
, sizeof(struct in6_addr
)) == 0)
848 if (UNALIGNED_MEMCMP(&ip6
->ip6_src
, &cookiecache
[i
].raddr
.in6
, sizeof(struct in6_addr
)) == 0)
861 hexprint(netdissect_options
*ndo
, caddr_t loc
, size_t len
)
867 for (i
= 0; i
< len
; i
++)
868 ND_PRINT((ndo
,"%02x", p
[i
] & 0xff));
872 rawprint(netdissect_options
*ndo
, caddr_t loc
, size_t len
)
874 ND_TCHECK2(*loc
, len
);
876 hexprint(ndo
, loc
, len
);
884 * returns false if we run out of data buffer
886 static int ike_show_somedata(netdissect_options
*ndo
,
887 const u_char
*cp
, const u_char
*ep
)
889 /* there is too much data, just show some of it */
890 const u_char
*end
= ep
- 20;
897 /* really shouldn't happen because of above */
903 ND_PRINT((ndo
," data=("));
904 if(!rawprint(ndo
, (caddr_t
)(cp
), len
)) goto trunc
;
905 ND_PRINT((ndo
, "..."));
907 if(!rawprint(ndo
, (caddr_t
)(end
), elen
)) goto trunc
;
919 const char *value
[30]; /*XXX*/
922 static const u_char
*
923 ikev1_attrmap_print(netdissect_options
*ndo
,
924 const u_char
*p
, const u_char
*ep
,
925 const struct attrmap
*map
, size_t nmap
)
933 totlen
= 4 + EXTRACT_16BITS(&p
[2]);
934 if (ep
< p
+ totlen
) {
935 ND_PRINT((ndo
,"[|attr]"));
940 t
= EXTRACT_16BITS(&p
[0]) & 0x7fff;
941 if (map
&& t
< nmap
&& map
[t
].type
)
942 ND_PRINT((ndo
,"type=%s ", map
[t
].type
));
944 ND_PRINT((ndo
,"type=#%d ", t
));
946 ND_PRINT((ndo
,"value="));
947 v
= EXTRACT_16BITS(&p
[2]);
948 if (map
&& t
< nmap
&& v
< map
[t
].nvalue
&& map
[t
].value
[v
])
949 ND_PRINT((ndo
,"%s", map
[t
].value
[v
]));
951 rawprint(ndo
, (caddr_t
)&p
[2], 2);
953 ND_PRINT((ndo
,"len=%d value=", EXTRACT_16BITS(&p
[2])));
954 rawprint(ndo
, (caddr_t
)&p
[4], EXTRACT_16BITS(&p
[2]));
960 static const u_char
*
961 ikev1_attr_print(netdissect_options
*ndo
, const u_char
*p
, const u_char
*ep
)
969 totlen
= 4 + EXTRACT_16BITS(&p
[2]);
970 if (ep
< p
+ totlen
) {
971 ND_PRINT((ndo
,"[|attr]"));
976 t
= EXTRACT_16BITS(&p
[0]) & 0x7fff;
977 ND_PRINT((ndo
,"type=#%d ", t
));
979 ND_PRINT((ndo
,"value="));
981 rawprint(ndo
, (caddr_t
)&p
[2], 2);
983 ND_PRINT((ndo
,"len=%d value=", EXTRACT_16BITS(&p
[2])));
984 rawprint(ndo
, (caddr_t
)&p
[4], EXTRACT_16BITS(&p
[2]));
990 static const u_char
*
991 ikev1_sa_print(netdissect_options
*ndo
, u_char tpay _U_
,
992 const struct isakmp_gen
*ext
,
994 const u_char
*ep
, uint32_t phase
, uint32_t doi0 _U_
,
995 uint32_t proto0
, int depth
)
997 const struct ikev1_pl_sa
*p
;
998 struct ikev1_pl_sa sa
;
999 uint32_t doi
, sit
, ident
;
1000 const u_char
*cp
, *np
;
1003 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_SA
)));
1005 p
= (struct ikev1_pl_sa
*)ext
;
1007 UNALIGNED_MEMCPY(&sa
, ext
, sizeof(sa
));
1008 doi
= ntohl(sa
.doi
);
1009 sit
= ntohl(sa
.sit
);
1011 ND_PRINT((ndo
," doi=%d", doi
));
1012 ND_PRINT((ndo
," situation=%u", (uint32_t)ntohl(sa
.sit
)));
1013 return (u_char
*)(p
+ 1);
1016 ND_PRINT((ndo
," doi=ipsec"));
1017 ND_PRINT((ndo
," situation="));
1020 ND_PRINT((ndo
,"identity"));
1024 ND_PRINT((ndo
,"%ssecrecy", t
? "+" : ""));
1028 ND_PRINT((ndo
,"%sintegrity", t
? "+" : ""));
1030 np
= (u_char
*)ext
+ sizeof(sa
);
1032 ND_TCHECK2(*(ext
+ 1), sizeof(ident
));
1033 UNALIGNED_MEMCPY(&ident
, ext
+ 1, sizeof(ident
));
1034 ND_PRINT((ndo
," ident=%u", (uint32_t)ntohl(ident
)));
1035 np
+= sizeof(ident
);
1038 ext
= (struct isakmp_gen
*)np
;
1041 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_P
, ext
, ep
, phase
, doi
, proto0
,
1046 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_SA
)));
1050 static const u_char
*
1051 ikev1_p_print(netdissect_options
*ndo
, u_char tpay _U_
,
1052 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1053 const u_char
*ep
, uint32_t phase
, uint32_t doi0
,
1054 uint32_t proto0 _U_
, int depth
)
1056 const struct ikev1_pl_p
*p
;
1057 struct ikev1_pl_p prop
;
1060 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_P
)));
1062 p
= (struct ikev1_pl_p
*)ext
;
1064 UNALIGNED_MEMCPY(&prop
, ext
, sizeof(prop
));
1065 ND_PRINT((ndo
," #%d protoid=%s transform=%d",
1066 prop
.p_no
, PROTOIDSTR(prop
.prot_id
), prop
.num_t
));
1067 if (prop
.spi_size
) {
1068 ND_PRINT((ndo
," spi="));
1069 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), prop
.spi_size
))
1073 ext
= (struct isakmp_gen
*)((u_char
*)(p
+ 1) + prop
.spi_size
);
1076 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_T
, ext
, ep
, phase
, doi0
,
1077 prop
.prot_id
, depth
);
1081 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_P
)));
1085 static const char *ikev1_p_map
[] = {
1089 static const char *ikev2_t_type_map
[]={
1090 NULL
, "encr", "prf", "integ", "dh", "esn"
1093 static const char *ah_p_map
[] = {
1094 NULL
, "(reserved)", "md5", "sha", "1des",
1095 "sha2-256", "sha2-384", "sha2-512",
1098 static const char *prf_p_map
[] = {
1099 NULL
, "hmac-md5", "hmac-sha", "hmac-tiger",
1103 static const char *integ_p_map
[] = {
1104 NULL
, "hmac-md5", "hmac-sha", "dec-mac",
1105 "kpdk-md5", "aes-xcbc"
1108 static const char *esn_p_map
[] = {
1112 static const char *dh_p_map
[] = {
1114 "modp1024", /* group 2 */
1115 "EC2N 2^155", /* group 3 */
1116 "EC2N 2^185", /* group 4 */
1117 "modp1536", /* group 5 */
1118 "iana-grp06", "iana-grp07", /* reserved */
1119 "iana-grp08", "iana-grp09",
1120 "iana-grp10", "iana-grp11",
1121 "iana-grp12", "iana-grp13",
1122 "modp2048", /* group 14 */
1123 "modp3072", /* group 15 */
1124 "modp4096", /* group 16 */
1125 "modp6144", /* group 17 */
1126 "modp8192", /* group 18 */
1129 static const char *esp_p_map
[] = {
1130 NULL
, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
1131 "blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
1134 static const char *ipcomp_p_map
[] = {
1135 NULL
, "oui", "deflate", "lzs",
1138 static const struct attrmap ipsec_t_map
[] = {
1139 { NULL
, 0, { NULL
} },
1140 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1141 { "life", 0, { NULL
} },
1142 { "group desc", 18, { NULL
, "modp768",
1143 "modp1024", /* group 2 */
1144 "EC2N 2^155", /* group 3 */
1145 "EC2N 2^185", /* group 4 */
1146 "modp1536", /* group 5 */
1147 "iana-grp06", "iana-grp07", /* reserved */
1148 "iana-grp08", "iana-grp09",
1149 "iana-grp10", "iana-grp11",
1150 "iana-grp12", "iana-grp13",
1151 "modp2048", /* group 14 */
1152 "modp3072", /* group 15 */
1153 "modp4096", /* group 16 */
1154 "modp6144", /* group 17 */
1155 "modp8192", /* group 18 */
1157 { "enc mode", 3, { NULL
, "tunnel", "transport", }, },
1158 { "auth", 5, { NULL
, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
1159 { "keylen", 0, { NULL
} },
1160 { "rounds", 0, { NULL
} },
1161 { "dictsize", 0, { NULL
} },
1162 { "privalg", 0, { NULL
} },
1165 static const struct attrmap encr_t_map
[] = {
1166 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 0, 1 */
1167 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 2, 3 */
1168 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 4, 5 */
1169 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 6, 7 */
1170 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 8, 9 */
1171 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 10,11*/
1172 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 12,13*/
1173 { "keylen", 14, { NULL
}},
1176 static const struct attrmap oakley_t_map
[] = {
1177 { NULL
, 0, { NULL
} },
1178 { "enc", 8, { NULL
, "1des", "idea", "blowfish", "rc5",
1179 "3des", "cast", "aes", }, },
1180 { "hash", 7, { NULL
, "md5", "sha1", "tiger",
1181 "sha2-256", "sha2-384", "sha2-512", }, },
1182 { "auth", 6, { NULL
, "preshared", "dss", "rsa sig", "rsa enc",
1183 "rsa enc revised", }, },
1184 { "group desc", 18, { NULL
, "modp768",
1185 "modp1024", /* group 2 */
1186 "EC2N 2^155", /* group 3 */
1187 "EC2N 2^185", /* group 4 */
1188 "modp1536", /* group 5 */
1189 "iana-grp06", "iana-grp07", /* reserved */
1190 "iana-grp08", "iana-grp09",
1191 "iana-grp10", "iana-grp11",
1192 "iana-grp12", "iana-grp13",
1193 "modp2048", /* group 14 */
1194 "modp3072", /* group 15 */
1195 "modp4096", /* group 16 */
1196 "modp6144", /* group 17 */
1197 "modp8192", /* group 18 */
1199 { "group type", 4, { NULL
, "MODP", "ECP", "EC2N", }, },
1200 { "group prime", 0, { NULL
} },
1201 { "group gen1", 0, { NULL
} },
1202 { "group gen2", 0, { NULL
} },
1203 { "group curve A", 0, { NULL
} },
1204 { "group curve B", 0, { NULL
} },
1205 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1206 { "lifeduration", 0, { NULL
} },
1207 { "prf", 0, { NULL
} },
1208 { "keylen", 0, { NULL
} },
1209 { "field", 0, { NULL
} },
1210 { "order", 0, { NULL
} },
1213 static const u_char
*
1214 ikev1_t_print(netdissect_options
*ndo
, u_char tpay _U_
,
1215 const struct isakmp_gen
*ext
, u_int item_len
,
1216 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi _U_
,
1217 uint32_t proto
, int depth _U_
)
1219 const struct ikev1_pl_t
*p
;
1220 struct ikev1_pl_t t
;
1223 const struct attrmap
*map
;
1227 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_T
)));
1229 p
= (struct ikev1_pl_t
*)ext
;
1231 UNALIGNED_MEMCPY(&t
, ext
, sizeof(t
));
1235 idstr
= STR_OR_ID(t
.t_id
, ikev1_p_map
);
1237 nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1240 idstr
= STR_OR_ID(t
.t_id
, ah_p_map
);
1242 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1245 idstr
= STR_OR_ID(t
.t_id
, esp_p_map
);
1247 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1250 idstr
= STR_OR_ID(t
.t_id
, ipcomp_p_map
);
1252 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1262 ND_PRINT((ndo
," #%d id=%s ", t
.t_no
, idstr
));
1264 ND_PRINT((ndo
," #%d id=%d ", t
.t_no
, t
.t_id
));
1265 cp
= (u_char
*)(p
+ 1);
1266 ep2
= (u_char
*)p
+ item_len
;
1267 while (cp
< ep
&& cp
< ep2
) {
1269 cp
= ikev1_attrmap_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
,
1272 cp
= ikev1_attr_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
);
1275 ND_PRINT((ndo
,"..."));
1278 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_T
)));
1282 static const u_char
*
1283 ikev1_ke_print(netdissect_options
*ndo
, u_char tpay _U_
,
1284 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1285 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1286 uint32_t proto _U_
, int depth _U_
)
1288 struct isakmp_gen e
;
1290 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_KE
)));
1293 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
1294 ND_PRINT((ndo
," key len=%d", ntohs(e
.len
) - 4));
1295 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1296 ND_PRINT((ndo
," "));
1297 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1300 return (u_char
*)ext
+ ntohs(e
.len
);
1302 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_KE
)));
1306 static const u_char
*
1307 ikev1_id_print(netdissect_options
*ndo
, u_char tpay _U_
,
1308 const struct isakmp_gen
*ext
, u_int item_len
,
1309 const u_char
*ep _U_
, uint32_t phase
, uint32_t doi _U_
,
1310 uint32_t proto _U_
, int depth _U_
)
1312 #define USE_IPSECDOI_IN_PHASE1 1
1313 const struct ikev1_pl_id
*p
;
1314 struct ikev1_pl_id id
;
1315 static const char *idtypestr
[] = {
1316 "IPv4", "IPv4net", "IPv6", "IPv6net",
1318 static const char *ipsecidtypestr
[] = {
1319 NULL
, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
1320 "IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
1326 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_ID
)));
1328 p
= (struct ikev1_pl_id
*)ext
;
1330 UNALIGNED_MEMCPY(&id
, ext
, sizeof(id
));
1331 if (sizeof(*p
) < item_len
) {
1332 data
= (u_char
*)(p
+ 1);
1333 len
= item_len
- sizeof(*p
);
1340 ND_PRINT((ndo
," [phase=%d doi=%d proto=%d]", phase
, doi
, proto
));
1343 #ifndef USE_IPSECDOI_IN_PHASE1
1347 ND_PRINT((ndo
," idtype=%s", STR_OR_ID(id
.d
.id_type
, idtypestr
)));
1348 ND_PRINT((ndo
," doi_data=%u",
1349 (uint32_t)(ntohl(id
.d
.doi_data
) & 0xffffff)));
1352 #ifdef USE_IPSECDOI_IN_PHASE1
1357 const struct ipsecdoi_id
*p
;
1358 struct ipsecdoi_id id
;
1359 struct protoent
*pe
;
1361 p
= (struct ipsecdoi_id
*)ext
;
1363 UNALIGNED_MEMCPY(&id
, ext
, sizeof(id
));
1364 ND_PRINT((ndo
," idtype=%s", STR_OR_ID(id
.type
, ipsecidtypestr
)));
1365 /* A protocol ID of 0 DOES NOT mean IPPROTO_IP! */
1366 pe
= id
.proto_id
? getprotobynumber(id
.proto_id
) : NULL
;
1368 ND_PRINT((ndo
," protoid=%s", pe
->p_name
));
1370 ND_PRINT((ndo
," protoid=%u", id
.proto_id
));
1371 ND_PRINT((ndo
," port=%d", ntohs(id
.port
)));
1376 ND_TCHECK2(*data
, len
);
1378 case IPSECDOI_ID_IPV4_ADDR
:
1380 ND_PRINT((ndo
," len=%d [bad: < 4]", len
));
1382 ND_PRINT((ndo
," len=%d %s", len
, ipaddr_string(ndo
, data
)));
1385 case IPSECDOI_ID_FQDN
:
1386 case IPSECDOI_ID_USER_FQDN
:
1389 ND_PRINT((ndo
," len=%d ", len
));
1390 for (i
= 0; i
< len
; i
++)
1391 safeputchar(ndo
, data
[i
]);
1395 case IPSECDOI_ID_IPV4_ADDR_SUBNET
:
1399 ND_PRINT((ndo
," len=%d [bad: < 8]", len
));
1401 mask
= data
+ sizeof(struct in_addr
);
1402 ND_PRINT((ndo
," len=%d %s/%u.%u.%u.%u", len
,
1403 ipaddr_string(ndo
, data
),
1404 mask
[0], mask
[1], mask
[2], mask
[3]));
1410 case IPSECDOI_ID_IPV6_ADDR
:
1412 ND_PRINT((ndo
," len=%d [bad: < 16]", len
));
1414 ND_PRINT((ndo
," len=%d %s", len
, ip6addr_string(ndo
, data
)));
1417 case IPSECDOI_ID_IPV6_ADDR_SUBNET
:
1421 ND_PRINT((ndo
," len=%d [bad: < 20]", len
));
1423 mask
= (u_char
*)(data
+ sizeof(struct in6_addr
));
1425 ND_PRINT((ndo
," len=%d %s/0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", len
,
1426 ip6addr_string(ndo
, data
),
1427 mask
[0], mask
[1], mask
[2], mask
[3],
1428 mask
[4], mask
[5], mask
[6], mask
[7],
1429 mask
[8], mask
[9], mask
[10], mask
[11],
1430 mask
[12], mask
[13], mask
[14], mask
[15]));
1436 case IPSECDOI_ID_IPV4_ADDR_RANGE
:
1438 ND_PRINT((ndo
," len=%d [bad: < 8]", len
));
1440 ND_PRINT((ndo
," len=%d %s-%s", len
,
1441 ipaddr_string(ndo
, data
),
1442 ipaddr_string(ndo
, data
+ sizeof(struct in_addr
))));
1447 case IPSECDOI_ID_IPV6_ADDR_RANGE
:
1449 ND_PRINT((ndo
," len=%d [bad: < 32]", len
));
1451 ND_PRINT((ndo
," len=%d %s-%s", len
,
1452 ip6addr_string(ndo
, data
),
1453 ip6addr_string(ndo
, data
+ sizeof(struct in6_addr
))));
1458 case IPSECDOI_ID_DER_ASN1_DN
:
1459 case IPSECDOI_ID_DER_ASN1_GN
:
1460 case IPSECDOI_ID_KEY_ID
:
1467 ND_PRINT((ndo
," len=%d", len
));
1468 if (2 < ndo
->ndo_vflag
) {
1469 ND_PRINT((ndo
," "));
1470 if (!rawprint(ndo
, (caddr_t
)data
, len
))
1474 return (u_char
*)ext
+ item_len
;
1476 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_ID
)));
1480 static const u_char
*
1481 ikev1_cert_print(netdissect_options
*ndo
, u_char tpay _U_
,
1482 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1483 const u_char
*ep _U_
, uint32_t phase _U_
,
1485 uint32_t proto0 _U_
, int depth _U_
)
1487 const struct ikev1_pl_cert
*p
;
1488 struct ikev1_pl_cert cert
;
1489 static const char *certstr
[] = {
1490 "none", "pkcs7", "pgp", "dns",
1491 "x509sign", "x509ke", "kerberos", "crl",
1492 "arl", "spki", "x509attr",
1495 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_CERT
)));
1497 p
= (struct ikev1_pl_cert
*)ext
;
1499 UNALIGNED_MEMCPY(&cert
, ext
, sizeof(cert
));
1500 ND_PRINT((ndo
," len=%d", item_len
- 4));
1501 ND_PRINT((ndo
," type=%s", STR_OR_ID((cert
.encode
), certstr
)));
1502 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1503 ND_PRINT((ndo
," "));
1504 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), item_len
- 4))
1507 return (u_char
*)ext
+ item_len
;
1509 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_CERT
)));
1513 static const u_char
*
1514 ikev1_cr_print(netdissect_options
*ndo
, u_char tpay _U_
,
1515 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1516 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1517 uint32_t proto0 _U_
, int depth _U_
)
1519 const struct ikev1_pl_cert
*p
;
1520 struct ikev1_pl_cert cert
;
1521 static const char *certstr
[] = {
1522 "none", "pkcs7", "pgp", "dns",
1523 "x509sign", "x509ke", "kerberos", "crl",
1524 "arl", "spki", "x509attr",
1527 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_CR
)));
1529 p
= (struct ikev1_pl_cert
*)ext
;
1531 UNALIGNED_MEMCPY(&cert
, ext
, sizeof(cert
));
1532 ND_PRINT((ndo
," len=%d", item_len
- 4));
1533 ND_PRINT((ndo
," type=%s", STR_OR_ID((cert
.encode
), certstr
)));
1534 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1535 ND_PRINT((ndo
," "));
1536 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), item_len
- 4))
1539 return (u_char
*)ext
+ item_len
;
1541 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_CR
)));
1545 static const u_char
*
1546 ikev1_hash_print(netdissect_options
*ndo
, u_char tpay _U_
,
1547 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1548 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1549 uint32_t proto _U_
, int depth _U_
)
1551 struct isakmp_gen e
;
1553 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_HASH
)));
1556 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
1557 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1558 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1559 ND_PRINT((ndo
," "));
1560 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1563 return (u_char
*)ext
+ ntohs(e
.len
);
1565 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_HASH
)));
1569 static const u_char
*
1570 ikev1_sig_print(netdissect_options
*ndo
, u_char tpay _U_
,
1571 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1572 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi _U_
,
1573 uint32_t proto _U_
, int depth _U_
)
1575 struct isakmp_gen e
;
1577 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_SIG
)));
1580 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
1581 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1582 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1583 ND_PRINT((ndo
," "));
1584 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1587 return (u_char
*)ext
+ ntohs(e
.len
);
1589 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_SIG
)));
1593 static const u_char
*
1594 ikev1_nonce_print(netdissect_options
*ndo
, u_char tpay _U_
,
1595 const struct isakmp_gen
*ext
,
1597 const u_char
*ep _U_
,
1598 uint32_t phase _U_
, uint32_t doi _U_
,
1599 uint32_t proto _U_
, int depth _U_
)
1601 struct isakmp_gen e
;
1603 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_NONCE
)));
1606 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
1607 ND_PRINT((ndo
," n len=%d", ntohs(e
.len
) - 4));
1608 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1609 ND_PRINT((ndo
," "));
1610 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1612 } else if (1 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1613 ND_PRINT((ndo
," "));
1614 if (!ike_show_somedata(ndo
, (u_char
*)(caddr_t
)(ext
+ 1), ep
))
1617 return (u_char
*)ext
+ ntohs(e
.len
);
1619 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE
)));
1623 static const u_char
*
1624 ikev1_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
1625 const struct isakmp_gen
*ext
, u_int item_len
,
1626 const u_char
*ep
, uint32_t phase
, uint32_t doi0 _U_
,
1627 uint32_t proto0 _U_
, int depth
)
1629 struct ikev1_pl_n
*p
, n
;
1634 static const char *notify_error_str
[] = {
1635 NULL
, "INVALID-PAYLOAD-TYPE",
1636 "DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED",
1637 "INVALID-COOKIE", "INVALID-MAJOR-VERSION",
1638 "INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE",
1639 "INVALID-FLAGS", "INVALID-MESSAGE-ID",
1640 "INVALID-PROTOCOL-ID", "INVALID-SPI",
1641 "INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED",
1642 "NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX",
1643 "PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION",
1644 "INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING",
1645 "INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED",
1646 "INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION",
1647 "AUTHENTICATION-FAILED", "INVALID-SIGNATURE",
1648 "ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME",
1649 "CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE",
1650 "UNEQUAL-PAYLOAD-LENGTHS",
1652 static const char *ipsec_notify_error_str
[] = {
1655 static const char *notify_status_str
[] = {
1658 static const char *ipsec_notify_status_str
[] = {
1659 "RESPONDER-LIFETIME", "REPLAY-STATUS",
1662 /* NOTE: these macro must be called with x in proper range */
1665 #define NOTIFY_ERROR_STR(x) \
1666 STR_OR_ID((x), notify_error_str)
1669 #define IPSEC_NOTIFY_ERROR_STR(x) \
1670 STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
1673 #define NOTIFY_STATUS_STR(x) \
1674 STR_OR_ID((u_int)((x) - 16384), notify_status_str)
1677 #define IPSEC_NOTIFY_STATUS_STR(x) \
1678 STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
1680 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_N
)));
1682 p
= (struct ikev1_pl_n
*)ext
;
1684 UNALIGNED_MEMCPY(&n
, ext
, sizeof(n
));
1688 ND_PRINT((ndo
," doi=%d", doi
));
1689 ND_PRINT((ndo
," proto=%d", proto
));
1690 if (ntohs(n
.type
) < 8192)
1691 ND_PRINT((ndo
," type=%s", NOTIFY_ERROR_STR(ntohs(n
.type
))));
1692 else if (ntohs(n
.type
) < 16384)
1693 ND_PRINT((ndo
," type=%s", numstr(ntohs(n
.type
))));
1694 else if (ntohs(n
.type
) < 24576)
1695 ND_PRINT((ndo
," type=%s", NOTIFY_STATUS_STR(ntohs(n
.type
))));
1697 ND_PRINT((ndo
," type=%s", numstr(ntohs(n
.type
))));
1699 ND_PRINT((ndo
," spi="));
1700 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), n
.spi_size
))
1703 return (u_char
*)(p
+ 1) + n
.spi_size
;
1706 ND_PRINT((ndo
," doi=ipsec"));
1707 ND_PRINT((ndo
," proto=%s", PROTOIDSTR(proto
)));
1708 if (ntohs(n
.type
) < 8192)
1709 ND_PRINT((ndo
," type=%s", NOTIFY_ERROR_STR(ntohs(n
.type
))));
1710 else if (ntohs(n
.type
) < 16384)
1711 ND_PRINT((ndo
," type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n
.type
))));
1712 else if (ntohs(n
.type
) < 24576)
1713 ND_PRINT((ndo
," type=%s", NOTIFY_STATUS_STR(ntohs(n
.type
))));
1714 else if (ntohs(n
.type
) < 32768)
1715 ND_PRINT((ndo
," type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n
.type
))));
1717 ND_PRINT((ndo
," type=%s", numstr(ntohs(n
.type
))));
1719 ND_PRINT((ndo
," spi="));
1720 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), n
.spi_size
))
1724 cp
= (u_char
*)(p
+ 1) + n
.spi_size
;
1725 ep2
= (u_char
*)p
+ item_len
;
1728 ND_PRINT((ndo
," orig=("));
1729 switch (ntohs(n
.type
)) {
1730 case IPSECDOI_NTYPE_RESPONDER_LIFETIME
:
1732 const struct attrmap
*map
= oakley_t_map
;
1733 size_t nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1734 while (cp
< ep
&& cp
< ep2
) {
1735 cp
= ikev1_attrmap_print(ndo
, cp
,
1736 (ep
< ep2
) ? ep
: ep2
, map
, nmap
);
1740 case IPSECDOI_NTYPE_REPLAY_STATUS
:
1741 ND_PRINT((ndo
,"replay detection %sabled",
1742 EXTRACT_32BITS(cp
) ? "en" : "dis"));
1744 case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN
:
1745 if (ikev1_sub_print(ndo
, ISAKMP_NPTYPE_SA
,
1746 (struct isakmp_gen
*)cp
, ep
, phase
, doi
, proto
,
1752 isakmp_print(ndo
, cp
,
1753 item_len
- sizeof(*p
) - n
.spi_size
,
1756 ND_PRINT((ndo
,")"));
1758 return (u_char
*)ext
+ item_len
;
1760 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_N
)));
1764 static const u_char
*
1765 ikev1_d_print(netdissect_options
*ndo
, u_char tpay _U_
,
1766 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1767 const u_char
*ep _U_
, uint32_t phase _U_
, uint32_t doi0 _U_
,
1768 uint32_t proto0 _U_
, int depth _U_
)
1770 const struct ikev1_pl_d
*p
;
1771 struct ikev1_pl_d d
;
1777 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_D
)));
1779 p
= (struct ikev1_pl_d
*)ext
;
1781 UNALIGNED_MEMCPY(&d
, ext
, sizeof(d
));
1785 ND_PRINT((ndo
," doi=%u", doi
));
1786 ND_PRINT((ndo
," proto=%u", proto
));
1788 ND_PRINT((ndo
," doi=ipsec"));
1789 ND_PRINT((ndo
," proto=%s", PROTOIDSTR(proto
)));
1791 ND_PRINT((ndo
," spilen=%u", d
.spi_size
));
1792 ND_PRINT((ndo
," nspi=%u", ntohs(d
.num_spi
)));
1793 ND_PRINT((ndo
," spi="));
1794 q
= (uint8_t *)(p
+ 1);
1795 for (i
= 0; i
< ntohs(d
.num_spi
); i
++) {
1797 ND_PRINT((ndo
,","));
1798 if (!rawprint(ndo
, (caddr_t
)q
, d
.spi_size
))
1804 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_D
)));
1808 static const u_char
*
1809 ikev1_vid_print(netdissect_options
*ndo
, u_char tpay _U_
,
1810 const struct isakmp_gen
*ext
,
1811 u_int item_len _U_
, const u_char
*ep _U_
,
1812 uint32_t phase _U_
, uint32_t doi _U_
,
1813 uint32_t proto _U_
, int depth _U_
)
1815 struct isakmp_gen e
;
1817 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_VID
)));
1820 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
1821 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1822 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1823 ND_PRINT((ndo
," "));
1824 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1827 return (u_char
*)ext
+ ntohs(e
.len
);
1829 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_VID
)));
1833 /************************************************************/
1835 /* IKE v2 - rfc4306 - dissector */
1837 /************************************************************/
1840 ikev2_pay_print(netdissect_options
*ndo
, const char *payname
, int critical
)
1842 ND_PRINT((ndo
,"%s%s:", payname
, critical
&0x80 ? "[C]" : ""));
1845 static const u_char
*
1846 ikev2_gen_print(netdissect_options
*ndo
, u_char tpay
,
1847 const struct isakmp_gen
*ext
)
1849 struct isakmp_gen e
;
1852 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
1853 ikev2_pay_print(ndo
, NPSTR(tpay
), e
.critical
);
1855 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1856 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1857 ND_PRINT((ndo
," "));
1858 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1861 return (u_char
*)ext
+ ntohs(e
.len
);
1863 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
1867 static const u_char
*
1868 ikev2_t_print(netdissect_options
*ndo
, u_char tpay _U_
, int pcount
,
1869 const struct isakmp_gen
*ext
, u_int item_len
,
1870 const u_char
*ep
, uint32_t phase _U_
, uint32_t doi _U_
,
1871 uint32_t proto _U_
, int depth _U_
)
1873 const struct ikev2_t
*p
;
1878 const struct attrmap
*map
;
1882 p
= (struct ikev2_t
*)ext
;
1884 UNALIGNED_MEMCPY(&t
, ext
, sizeof(t
));
1885 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_T
), t
.h
.critical
);
1887 t_id
= ntohs(t
.t_id
);
1894 idstr
= STR_OR_ID(t_id
, esp_p_map
);
1896 nmap
= sizeof(encr_t_map
)/sizeof(encr_t_map
[0]);
1900 idstr
= STR_OR_ID(t_id
, prf_p_map
);
1904 idstr
= STR_OR_ID(t_id
, integ_p_map
);
1908 idstr
= STR_OR_ID(t_id
, dh_p_map
);
1912 idstr
= STR_OR_ID(t_id
, esn_p_map
);
1921 ND_PRINT((ndo
," #%u type=%s id=%s ", pcount
,
1922 STR_OR_ID(t
.t_type
, ikev2_t_type_map
),
1925 ND_PRINT((ndo
," #%u type=%s id=%u ", pcount
,
1926 STR_OR_ID(t
.t_type
, ikev2_t_type_map
),
1928 cp
= (u_char
*)(p
+ 1);
1929 ep2
= (u_char
*)p
+ item_len
;
1930 while (cp
< ep
&& cp
< ep2
) {
1932 cp
= ikev1_attrmap_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
,
1935 cp
= ikev1_attr_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
);
1938 ND_PRINT((ndo
,"..."));
1941 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_T
)));
1945 static const u_char
*
1946 ikev2_p_print(netdissect_options
*ndo
, u_char tpay _U_
, int pcount _U_
,
1947 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1948 const u_char
*ep
, uint32_t phase
, uint32_t doi0
,
1949 uint32_t proto0 _U_
, int depth
)
1951 const struct ikev2_p
*p
;
1952 struct ikev2_p prop
;
1955 p
= (struct ikev2_p
*)ext
;
1957 UNALIGNED_MEMCPY(&prop
, ext
, sizeof(prop
));
1958 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_P
), prop
.h
.critical
);
1960 ND_PRINT((ndo
," #%u protoid=%s transform=%d len=%u",
1961 prop
.p_no
, PROTOIDSTR(prop
.prot_id
),
1962 prop
.num_t
, ntohs(prop
.h
.len
)));
1963 if (prop
.spi_size
) {
1964 ND_PRINT((ndo
," spi="));
1965 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), prop
.spi_size
))
1969 ext
= (struct isakmp_gen
*)((u_char
*)(p
+ 1) + prop
.spi_size
);
1972 cp
= ikev2_sub_print(ndo
, NULL
, ISAKMP_NPTYPE_T
, ext
, ep
, phase
, doi0
,
1973 prop
.prot_id
, depth
);
1977 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_P
)));
1981 static const u_char
*
1982 ikev2_sa_print(netdissect_options
*ndo
, u_char tpay
,
1983 const struct isakmp_gen
*ext1
,
1984 u_int item_len _U_
, const u_char
*ep _U_
,
1985 uint32_t phase _U_
, uint32_t doi _U_
,
1986 uint32_t proto _U_
, int depth _U_
)
1988 struct isakmp_gen e
;
1989 int osa_length
, sa_length
;
1992 UNALIGNED_MEMCPY(&e
, ext1
, sizeof(e
));
1993 ikev2_pay_print(ndo
, "sa", e
.critical
);
1995 osa_length
= ntohs(e
.len
);
1996 sa_length
= osa_length
- 4;
1997 ND_PRINT((ndo
," len=%d", sa_length
));
1999 ikev2_sub_print(ndo
, NULL
, ISAKMP_NPTYPE_P
,
2003 return (u_char
*)ext1
+ osa_length
;
2005 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2009 static const u_char
*
2010 ikev2_ke_print(netdissect_options
*ndo
, u_char tpay
,
2011 const struct isakmp_gen
*ext
,
2012 u_int item_len _U_
, const u_char
*ep _U_
,
2013 uint32_t phase _U_
, uint32_t doi _U_
,
2014 uint32_t proto _U_
, int depth _U_
)
2019 k
= (struct ikev2_ke
*)ext
;
2021 UNALIGNED_MEMCPY(&ke
, ext
, sizeof(ke
));
2022 ikev2_pay_print(ndo
, NPSTR(tpay
), ke
.h
.critical
);
2024 ND_PRINT((ndo
," len=%u group=%s", ntohs(ke
.h
.len
) - 8,
2025 STR_OR_ID(ntohs(ke
.ke_group
), dh_p_map
)));
2027 if (2 < ndo
->ndo_vflag
&& 8 < ntohs(ke
.h
.len
)) {
2028 ND_PRINT((ndo
," "));
2029 if (!rawprint(ndo
, (caddr_t
)(k
+ 1), ntohs(ke
.h
.len
) - 8))
2032 return (u_char
*)ext
+ ntohs(ke
.h
.len
);
2034 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2038 static const u_char
*
2039 ikev2_ID_print(netdissect_options
*ndo
, u_char tpay
,
2040 const struct isakmp_gen
*ext
,
2041 u_int item_len _U_
, const u_char
*ep _U_
,
2042 uint32_t phase _U_
, uint32_t doi _U_
,
2043 uint32_t proto _U_
, int depth _U_
)
2046 int id_len
, idtype_len
, i
;
2047 unsigned int dumpascii
, dumphex
;
2048 unsigned char *typedata
;
2051 UNALIGNED_MEMCPY(&id
, ext
, sizeof(id
));
2052 ikev2_pay_print(ndo
, NPSTR(tpay
), id
.h
.critical
);
2054 id_len
= ntohs(id
.h
.len
);
2056 ND_PRINT((ndo
," len=%d", id_len
- 4));
2057 if (2 < ndo
->ndo_vflag
&& 4 < id_len
) {
2058 ND_PRINT((ndo
," "));
2059 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), id_len
- 4))
2063 idtype_len
=id_len
- sizeof(struct ikev2_id
);
2066 typedata
= (unsigned char *)(ext
)+sizeof(struct ikev2_id
);
2070 ND_PRINT((ndo
, " ipv4:"));
2074 ND_PRINT((ndo
, " fqdn:"));
2077 case ID_RFC822_ADDR
:
2078 ND_PRINT((ndo
, " rfc822:"));
2082 ND_PRINT((ndo
, " ipv6:"));
2085 case ID_DER_ASN1_DN
:
2086 ND_PRINT((ndo
, " dn:"));
2089 case ID_DER_ASN1_GN
:
2090 ND_PRINT((ndo
, " gn:"));
2094 ND_PRINT((ndo
, " keyid:"));
2100 ND_TCHECK2(*typedata
, idtype_len
);
2101 for(i
=0; i
<idtype_len
; i
++) {
2102 if(ND_ISPRINT(typedata
[i
])) {
2103 ND_PRINT((ndo
, "%c", typedata
[i
]));
2105 ND_PRINT((ndo
, "."));
2110 if (!rawprint(ndo
, (caddr_t
)typedata
, idtype_len
))
2114 return (u_char
*)ext
+ id_len
;
2116 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2120 static const u_char
*
2121 ikev2_cert_print(netdissect_options
*ndo
, u_char tpay
,
2122 const struct isakmp_gen
*ext
,
2123 u_int item_len _U_
, const u_char
*ep _U_
,
2124 uint32_t phase _U_
, uint32_t doi _U_
,
2125 uint32_t proto _U_
, int depth _U_
)
2127 return ikev2_gen_print(ndo
, tpay
, ext
);
2130 static const u_char
*
2131 ikev2_cr_print(netdissect_options
*ndo
, u_char tpay
,
2132 const struct isakmp_gen
*ext
,
2133 u_int item_len _U_
, const u_char
*ep _U_
,
2134 uint32_t phase _U_
, uint32_t doi _U_
,
2135 uint32_t proto _U_
, int depth _U_
)
2137 return ikev2_gen_print(ndo
, tpay
, ext
);
2140 static const u_char
*
2141 ikev2_auth_print(netdissect_options
*ndo
, u_char tpay
,
2142 const struct isakmp_gen
*ext
,
2143 u_int item_len _U_
, const u_char
*ep _U_
,
2144 uint32_t phase _U_
, uint32_t doi _U_
,
2145 uint32_t proto _U_
, int depth _U_
)
2147 struct ikev2_auth a
;
2148 const char *v2_auth
[]={ "invalid", "rsasig",
2149 "shared-secret", "dsssig" };
2150 u_char
*authdata
= (u_char
*)ext
+ sizeof(a
);
2154 UNALIGNED_MEMCPY(&a
, ext
, sizeof(a
));
2155 ikev2_pay_print(ndo
, NPSTR(tpay
), a
.h
.critical
);
2156 len
= ntohs(a
.h
.len
);
2158 ND_PRINT((ndo
," len=%d method=%s", len
-4,
2159 STR_OR_ID(a
.auth_method
, v2_auth
)));
2161 if (1 < ndo
->ndo_vflag
&& 4 < len
) {
2162 ND_PRINT((ndo
," authdata=("));
2163 if (!rawprint(ndo
, (caddr_t
)authdata
, len
- sizeof(a
)))
2165 ND_PRINT((ndo
,") "));
2166 } else if(ndo
->ndo_vflag
&& 4 < len
) {
2167 if(!ike_show_somedata(ndo
, authdata
, ep
)) goto trunc
;
2170 return (u_char
*)ext
+ len
;
2172 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2176 static const u_char
*
2177 ikev2_nonce_print(netdissect_options
*ndo
, u_char tpay
,
2178 const struct isakmp_gen
*ext
,
2179 u_int item_len _U_
, const u_char
*ep _U_
,
2180 uint32_t phase _U_
, uint32_t doi _U_
,
2181 uint32_t proto _U_
, int depth _U_
)
2183 struct isakmp_gen e
;
2186 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
2187 ikev2_pay_print(ndo
, "nonce", e
.critical
);
2189 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
2190 if (1 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
2191 ND_PRINT((ndo
," nonce=("));
2192 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
2194 ND_PRINT((ndo
,") "));
2195 } else if(ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
2196 if(!ike_show_somedata(ndo
, (const u_char
*)(ext
+1), ep
)) goto trunc
;
2199 return (u_char
*)ext
+ ntohs(e
.len
);
2201 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2205 /* notify payloads */
2206 static const u_char
*
2207 ikev2_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
2208 const struct isakmp_gen
*ext
,
2209 u_int item_len _U_
, const u_char
*ep _U_
,
2210 uint32_t phase _U_
, uint32_t doi _U_
,
2211 uint32_t proto _U_
, int depth _U_
)
2213 struct ikev2_n
*p
, n
;
2215 u_char showspi
, showdata
, showsomedata
;
2216 const char *notify_name
;
2219 p
= (struct ikev2_n
*)ext
;
2221 UNALIGNED_MEMCPY(&n
, ext
, sizeof(n
));
2222 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_N
), n
.h
.critical
);
2229 ND_PRINT((ndo
," prot_id=%s", PROTOIDSTR(n
.prot_id
)));
2231 type
= ntohs(n
.type
);
2233 /* notify space is annoying sparse */
2235 case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
:
2236 notify_name
= "unsupported_critical_payload";
2240 case IV2_NOTIFY_INVALID_IKE_SPI
:
2241 notify_name
= "invalid_ike_spi";
2245 case IV2_NOTIFY_INVALID_MAJOR_VERSION
:
2246 notify_name
= "invalid_major_version";
2250 case IV2_NOTIFY_INVALID_SYNTAX
:
2251 notify_name
= "invalid_syntax";
2255 case IV2_NOTIFY_INVALID_MESSAGE_ID
:
2256 notify_name
= "invalid_message_id";
2260 case IV2_NOTIFY_INVALID_SPI
:
2261 notify_name
= "invalid_spi";
2265 case IV2_NOTIFY_NO_PROPOSAL_CHOSEN
:
2266 notify_name
= "no_protocol_chosen";
2270 case IV2_NOTIFY_INVALID_KE_PAYLOAD
:
2271 notify_name
= "invalid_ke_payload";
2275 case IV2_NOTIFY_AUTHENTICATION_FAILED
:
2276 notify_name
= "authentication_failed";
2280 case IV2_NOTIFY_SINGLE_PAIR_REQUIRED
:
2281 notify_name
= "single_pair_required";
2285 case IV2_NOTIFY_NO_ADDITIONAL_SAS
:
2286 notify_name
= "no_additional_sas";
2290 case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
:
2291 notify_name
= "internal_address_failure";
2295 case IV2_NOTIFY_FAILED_CP_REQUIRED
:
2296 notify_name
= "failed:cp_required";
2300 case IV2_NOTIFY_INVALID_SELECTORS
:
2301 notify_name
= "invalid_selectors";
2305 case IV2_NOTIFY_INITIAL_CONTACT
:
2306 notify_name
= "initial_contact";
2310 case IV2_NOTIFY_SET_WINDOW_SIZE
:
2311 notify_name
= "set_window_size";
2315 case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
:
2316 notify_name
= "additional_ts_possible";
2320 case IV2_NOTIFY_IPCOMP_SUPPORTED
:
2321 notify_name
= "ipcomp_supported";
2325 case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
:
2326 notify_name
= "nat_detection_source_ip";
2330 case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
:
2331 notify_name
= "nat_detection_destination_ip";
2335 case IV2_NOTIFY_COOKIE
:
2336 notify_name
= "cookie";
2342 case IV2_NOTIFY_USE_TRANSPORT_MODE
:
2343 notify_name
= "use_transport_mode";
2347 case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
:
2348 notify_name
= "http_cert_lookup_supported";
2352 case IV2_NOTIFY_REKEY_SA
:
2353 notify_name
= "rekey_sa";
2357 case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
:
2358 notify_name
= "tfc_padding_not_supported";
2362 case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
:
2363 notify_name
= "non_first_fragment_also";
2369 notify_name
="error";
2370 } else if(type
< 16384) {
2371 notify_name
="private-error";
2372 } else if(type
< 40960) {
2373 notify_name
="status";
2375 notify_name
="private-status";
2380 ND_PRINT((ndo
," type=%u(%s)", type
, notify_name
));
2384 if (showspi
&& n
.spi_size
) {
2385 ND_PRINT((ndo
," spi="));
2386 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), n
.spi_size
))
2390 cp
= (u_char
*)(p
+ 1) + n
.spi_size
;
2392 if(3 < ndo
->ndo_vflag
) {
2396 if ((showdata
|| (showsomedata
&& ep
-cp
< 30)) && cp
< ep
) {
2397 ND_PRINT((ndo
," data=("));
2398 if (!rawprint(ndo
, (caddr_t
)(cp
), ep
- cp
))
2401 ND_PRINT((ndo
,")"));
2403 } else if(showsomedata
&& cp
< ep
) {
2404 if(!ike_show_somedata(ndo
, cp
, ep
)) goto trunc
;
2407 return (u_char
*)ext
+ item_len
;
2409 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_N
)));
2413 static const u_char
*
2414 ikev2_d_print(netdissect_options
*ndo
, u_char tpay
,
2415 const struct isakmp_gen
*ext
,
2416 u_int item_len _U_
, const u_char
*ep _U_
,
2417 uint32_t phase _U_
, uint32_t doi _U_
,
2418 uint32_t proto _U_
, int depth _U_
)
2420 return ikev2_gen_print(ndo
, tpay
, ext
);
2423 static const u_char
*
2424 ikev2_vid_print(netdissect_options
*ndo
, u_char tpay
,
2425 const struct isakmp_gen
*ext
,
2426 u_int item_len _U_
, const u_char
*ep _U_
,
2427 uint32_t phase _U_
, uint32_t doi _U_
,
2428 uint32_t proto _U_
, int depth _U_
)
2430 struct isakmp_gen e
;
2435 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
2436 ikev2_pay_print(ndo
, NPSTR(tpay
), e
.critical
);
2437 ND_PRINT((ndo
," len=%d vid=", ntohs(e
.len
) - 4));
2439 vid
= (const u_char
*)(ext
+1);
2440 len
= ntohs(e
.len
) - 4;
2441 ND_TCHECK2(*vid
, len
);
2442 for(i
=0; i
<len
; i
++) {
2443 if(ND_ISPRINT(vid
[i
])) ND_PRINT((ndo
, "%c", vid
[i
]));
2444 else ND_PRINT((ndo
, "."));
2446 if (2 < ndo
->ndo_vflag
&& 4 < len
) {
2447 ND_PRINT((ndo
," "));
2448 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
2451 return (u_char
*)ext
+ ntohs(e
.len
);
2453 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2457 static const u_char
*
2458 ikev2_TS_print(netdissect_options
*ndo
, u_char tpay
,
2459 const struct isakmp_gen
*ext
,
2460 u_int item_len _U_
, const u_char
*ep _U_
,
2461 uint32_t phase _U_
, uint32_t doi _U_
,
2462 uint32_t proto _U_
, int depth _U_
)
2464 return ikev2_gen_print(ndo
, tpay
, ext
);
2467 static const u_char
*
2468 ikev2_e_print(netdissect_options
*ndo
,
2469 #ifndef HAVE_LIBCRYPTO
2472 struct isakmp
*base
,
2474 const struct isakmp_gen
*ext
,
2475 u_int item_len _U_
, const u_char
*ep _U_
,
2476 #ifndef HAVE_LIBCRYPTO
2480 #ifndef HAVE_LIBCRYPTO
2484 #ifndef HAVE_LIBCRYPTO
2488 #ifndef HAVE_LIBCRYPTO
2493 struct isakmp_gen e
;
2498 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
2499 ikev2_pay_print(ndo
, NPSTR(tpay
), e
.critical
);
2501 dlen
= ntohs(e
.len
)-4;
2503 ND_PRINT((ndo
," len=%d", dlen
));
2504 if (2 < ndo
->ndo_vflag
&& 4 < dlen
) {
2505 ND_PRINT((ndo
," "));
2506 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), dlen
))
2510 dat
= (u_char
*)(ext
+1);
2511 ND_TCHECK2(*dat
, dlen
);
2513 #ifdef HAVE_LIBCRYPTO
2514 /* try to decypt it! */
2515 if(esp_print_decrypt_buffer_by_ikev2(ndo
,
2516 base
->flags
& ISAKMP_FLAG_I
,
2517 base
->i_ck
, base
->r_ck
,
2520 ext
= (const struct isakmp_gen
*)ndo
->ndo_packetp
;
2522 /* got it decrypted, print stuff inside. */
2523 ikev2_sub_print(ndo
, base
, e
.np
, ext
, ndo
->ndo_snapend
,
2524 phase
, doi
, proto
, depth
+1);
2529 /* always return NULL, because E must be at end, and NP refers
2530 * to what was inside.
2534 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2538 static const u_char
*
2539 ikev2_cp_print(netdissect_options
*ndo
, u_char tpay
,
2540 const struct isakmp_gen
*ext
,
2541 u_int item_len _U_
, const u_char
*ep _U_
,
2542 uint32_t phase _U_
, uint32_t doi _U_
,
2543 uint32_t proto _U_
, int depth _U_
)
2545 return ikev2_gen_print(ndo
, tpay
, ext
);
2548 static const u_char
*
2549 ikev2_eap_print(netdissect_options
*ndo
, u_char tpay
,
2550 const struct isakmp_gen
*ext
,
2551 u_int item_len _U_
, const u_char
*ep _U_
,
2552 uint32_t phase _U_
, uint32_t doi _U_
,
2553 uint32_t proto _U_
, int depth _U_
)
2555 return ikev2_gen_print(ndo
, tpay
, ext
);
2558 static const u_char
*
2559 ike_sub0_print(netdissect_options
*ndo
,
2560 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2562 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2565 struct isakmp_gen e
;
2570 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
2573 * Since we can't have a payload length of less than 4 bytes,
2574 * we need to bail out here if the generic header is nonsensical
2575 * or truncated, otherwise we could loop forever processing
2576 * zero-length items or otherwise misdissect the packet.
2578 item_len
= ntohs(e
.len
);
2584 * XXX - what if item_len is too short, or too long,
2585 * for this payload type?
2587 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
, ep
, phase
, doi
, proto
, depth
);
2589 ND_PRINT((ndo
,"%s", NPSTR(np
)));
2595 ND_PRINT((ndo
," [|isakmp]"));
2599 static const u_char
*
2600 ikev1_sub_print(netdissect_options
*ndo
,
2601 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2602 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2606 struct isakmp_gen e
;
2608 cp
= (const u_char
*)ext
;
2613 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
2615 ND_TCHECK2(*ext
, ntohs(e
.len
));
2618 ND_PRINT((ndo
,"\n"));
2619 for (i
= 0; i
< depth
; i
++)
2620 ND_PRINT((ndo
," "));
2621 ND_PRINT((ndo
,"("));
2622 cp
= ike_sub0_print(ndo
, np
, ext
, ep
, phase
, doi
, proto
, depth
);
2623 ND_PRINT((ndo
,")"));
2627 /* Zero-length subitem */
2632 ext
= (struct isakmp_gen
*)cp
;
2636 ND_PRINT((ndo
," [|%s]", NPSTR(np
)));
2643 static char buf
[20];
2644 snprintf(buf
, sizeof(buf
), "#%d", x
);
2649 ikev1_print(netdissect_options
*ndo
,
2650 const u_char
*bp
, u_int length
,
2651 const u_char
*bp2
, struct isakmp
*base
)
2653 const struct isakmp
*p
;
2659 p
= (const struct isakmp
*)bp
;
2660 ep
= ndo
->ndo_snapend
;
2662 phase
= (EXTRACT_32BITS(base
->msgid
) == 0) ? 1 : 2;
2664 ND_PRINT((ndo
," phase %d", phase
));
2666 ND_PRINT((ndo
," phase %d/others", phase
));
2668 i
= cookie_find(&base
->i_ck
);
2670 if (iszero((u_char
*)&base
->r_ck
, sizeof(base
->r_ck
))) {
2671 /* the first packet */
2672 ND_PRINT((ndo
," I"));
2674 cookie_record(&base
->i_ck
, bp2
);
2676 ND_PRINT((ndo
," ?"));
2678 if (bp2
&& cookie_isinitiator(i
, bp2
))
2679 ND_PRINT((ndo
," I"));
2680 else if (bp2
&& cookie_isresponder(i
, bp2
))
2681 ND_PRINT((ndo
," R"));
2683 ND_PRINT((ndo
," ?"));
2686 ND_PRINT((ndo
," %s", ETYPESTR(base
->etype
)));
2688 ND_PRINT((ndo
,"[%s%s]", base
->flags
& ISAKMP_FLAG_E
? "E" : "",
2689 base
->flags
& ISAKMP_FLAG_C
? "C" : ""));
2692 if (ndo
->ndo_vflag
) {
2693 const struct isakmp_gen
*ext
;
2695 ND_PRINT((ndo
,":"));
2697 /* regardless of phase... */
2698 if (base
->flags
& ISAKMP_FLAG_E
) {
2700 * encrypted, nothing we can do right now.
2701 * we hope to decrypt the packet in the future...
2703 ND_PRINT((ndo
," [encrypted %s]", NPSTR(base
->np
)));
2707 CHECKLEN(p
+ 1, base
->np
);
2709 ext
= (struct isakmp_gen
*)(p
+ 1);
2710 ikev1_sub_print(ndo
, np
, ext
, ep
, phase
, 0, 0, 0);
2714 if (ndo
->ndo_vflag
) {
2715 if (ntohl(base
->len
) != length
) {
2716 ND_PRINT((ndo
," (len mismatch: isakmp %u/ip %u)",
2717 (uint32_t)ntohl(base
->len
), length
));
2722 static const u_char
*
2723 ikev2_sub0_print(netdissect_options
*ndo
, struct isakmp
*base
,
2724 u_char np
, int pcount
,
2725 const struct isakmp_gen
*ext
, const u_char
*ep
,
2726 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2729 struct isakmp_gen e
;
2734 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
2737 * Since we can't have a payload length of less than 4 bytes,
2738 * we need to bail out here if the generic header is nonsensical
2739 * or truncated, otherwise we could loop forever processing
2740 * zero-length items or otherwise misdissect the packet.
2742 item_len
= ntohs(e
.len
);
2746 if(np
== ISAKMP_NPTYPE_P
) {
2747 cp
= ikev2_p_print(ndo
, np
, pcount
, ext
, item_len
,
2748 ep
, phase
, doi
, proto
, depth
);
2749 } else if(np
== ISAKMP_NPTYPE_T
) {
2750 cp
= ikev2_t_print(ndo
, np
, pcount
, ext
, item_len
,
2751 ep
, phase
, doi
, proto
, depth
);
2752 } else if(np
== ISAKMP_NPTYPE_v2E
) {
2753 cp
= ikev2_e_print(ndo
, base
, np
, ext
, item_len
,
2754 ep
, phase
, doi
, proto
, depth
);
2755 } else if (NPFUNC(np
)) {
2757 * XXX - what if item_len is too short, or too long,
2758 * for this payload type?
2760 cp
= (*npfunc
[np
])(ndo
, np
, /*pcount,*/ ext
, item_len
,
2761 ep
, phase
, doi
, proto
, depth
);
2763 ND_PRINT((ndo
,"%s", NPSTR(np
)));
2769 ND_PRINT((ndo
," [|isakmp]"));
2773 static const u_char
*
2774 ikev2_sub_print(netdissect_options
*ndo
,
2775 struct isakmp
*base
,
2776 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2777 uint32_t phase
, uint32_t doi
, uint32_t proto
, int depth
)
2782 struct isakmp_gen e
;
2784 cp
= (const u_char
*)ext
;
2790 UNALIGNED_MEMCPY(&e
, ext
, sizeof(e
));
2792 ND_TCHECK2(*ext
, ntohs(e
.len
));
2795 ND_PRINT((ndo
,"\n"));
2796 for (i
= 0; i
< depth
; i
++)
2797 ND_PRINT((ndo
," "));
2798 ND_PRINT((ndo
,"("));
2799 cp
= ikev2_sub0_print(ndo
, base
, np
, pcount
,
2800 ext
, ep
, phase
, doi
, proto
, depth
);
2801 ND_PRINT((ndo
,")"));
2805 /* Zero-length subitem */
2810 ext
= (struct isakmp_gen
*)cp
;
2814 ND_PRINT((ndo
," [|%s]", NPSTR(np
)));
2819 ikev2_print(netdissect_options
*ndo
,
2820 const u_char
*bp
, u_int length
,
2821 const u_char
*bp2 _U_
, struct isakmp
*base
)
2823 const struct isakmp
*p
;
2828 p
= (const struct isakmp
*)bp
;
2829 ep
= ndo
->ndo_snapend
;
2831 phase
= (EXTRACT_32BITS(base
->msgid
) == 0) ? 1 : 2;
2833 ND_PRINT((ndo
, " parent_sa"));
2835 ND_PRINT((ndo
, " child_sa "));
2837 ND_PRINT((ndo
, " %s", ETYPESTR(base
->etype
)));
2839 ND_PRINT((ndo
, "[%s%s%s]",
2840 base
->flags
& ISAKMP_FLAG_I
? "I" : "",
2841 base
->flags
& ISAKMP_FLAG_V
? "V" : "",
2842 base
->flags
& ISAKMP_FLAG_R
? "R" : ""));
2845 if (ndo
->ndo_vflag
) {
2846 const struct isakmp_gen
*ext
;
2848 ND_PRINT((ndo
, ":"));
2850 /* regardless of phase... */
2851 if (base
->flags
& ISAKMP_FLAG_E
) {
2853 * encrypted, nothing we can do right now.
2854 * we hope to decrypt the packet in the future...
2856 ND_PRINT((ndo
, " [encrypted %s]", NPSTR(base
->np
)));
2860 CHECKLEN(p
+ 1, base
->np
)
2863 ext
= (struct isakmp_gen
*)(p
+ 1);
2864 ikev2_sub_print(ndo
, base
, np
, ext
, ep
, phase
, 0, 0, 0);
2868 if (ndo
->ndo_vflag
) {
2869 if (ntohl(base
->len
) != length
) {
2870 ND_PRINT((ndo
, " (len mismatch: isakmp %u/ip %u)",
2871 (uint32_t)ntohl(base
->len
), length
));
2877 isakmp_print(netdissect_options
*ndo
,
2878 const u_char
*bp
, u_int length
,
2881 const struct isakmp
*p
;
2886 #ifdef HAVE_LIBCRYPTO
2887 /* initialize SAs */
2888 if (ndo
->ndo_sa_list_head
== NULL
) {
2889 if (ndo
->ndo_espsecret
)
2890 esp_print_decodesecret(ndo
);
2894 p
= (const struct isakmp
*)bp
;
2895 ep
= ndo
->ndo_snapend
;
2897 if ((struct isakmp
*)ep
< p
+ 1) {
2898 ND_PRINT((ndo
,"[|isakmp]"));
2902 UNALIGNED_MEMCPY(&base
, p
, sizeof(base
));
2904 ND_PRINT((ndo
,"isakmp"));
2905 major
= (base
.vers
& ISAKMP_VERS_MAJOR
)
2906 >> ISAKMP_VERS_MAJOR_SHIFT
;
2907 minor
= (base
.vers
& ISAKMP_VERS_MINOR
)
2908 >> ISAKMP_VERS_MINOR_SHIFT
;
2910 if (ndo
->ndo_vflag
) {
2911 ND_PRINT((ndo
," %d.%d", major
, minor
));
2914 if (ndo
->ndo_vflag
) {
2915 ND_PRINT((ndo
," msgid "));
2916 hexprint(ndo
, (caddr_t
)&base
.msgid
, sizeof(base
.msgid
));
2919 if (1 < ndo
->ndo_vflag
) {
2920 ND_PRINT((ndo
," cookie "));
2921 hexprint(ndo
, (caddr_t
)&base
.i_ck
, sizeof(base
.i_ck
));
2922 ND_PRINT((ndo
,"->"));
2923 hexprint(ndo
, (caddr_t
)&base
.r_ck
, sizeof(base
.r_ck
));
2925 ND_PRINT((ndo
,":"));
2928 case IKEv1_MAJOR_VERSION
:
2929 ikev1_print(ndo
, bp
, length
, bp2
, &base
);
2932 case IKEv2_MAJOR_VERSION
:
2933 ikev2_print(ndo
, bp
, length
, bp2
, &base
);
2939 isakmp_rfc3948_print(netdissect_options
*ndo
,
2940 const u_char
*bp
, u_int length
,
2944 if(length
== 1 && bp
[0]==0xff) {
2945 ND_PRINT((ndo
, "isakmp-nat-keep-alive"));
2954 * see if this is an IKE packet
2956 if(bp
[0]==0 && bp
[1]==0 && bp
[2]==0 && bp
[3]==0) {
2957 ND_PRINT((ndo
, "NONESP-encap: "));
2958 isakmp_print(ndo
, bp
+4, length
-4, bp2
);
2962 /* must be an ESP packet */
2964 int nh
, enh
, padlen
;
2967 ND_PRINT((ndo
, "UDP-encap: "));
2969 advance
= esp_print(ndo
, bp
, length
, bp2
, &enh
, &padlen
);
2974 length
-= advance
+ padlen
;
2977 ip_print_inner(ndo
, bp
, length
, nh
, bp2
);
2982 ND_PRINT((ndo
,"[|isakmp]"));
2988 * c-style: whitesmith