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 #define NETDISSECT_REWORKED
36 /* The functions from print-esp.c used in this file are only defined when both
37 * OpenSSL and evp.h are detected. Employ the same preprocessor device here.
39 #ifndef HAVE_OPENSSL_EVP_H
43 #include <tcpdump-stdinc.h>
49 #include "interface.h"
50 #include "addrtoname.h"
51 #include "extract.h" /* must come after interface.h */
58 #ifndef HAVE_SOCKADDR_STORAGE
59 #define sockaddr_storage sockaddr
62 /* refer to RFC 2408 */
64 typedef u_char cookie_t
[8];
65 typedef u_char msgid_t
[4];
67 #define PORT_ISAKMP 500
69 /* 3.1 ISAKMP Header Format (IKEv1 and IKEv2)
70 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
71 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
78 ! Next Payload ! MjVer ! MnVer ! Exchange Type ! Flags !
79 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
83 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
86 cookie_t i_ck
; /* Initiator Cookie */
87 cookie_t r_ck
; /* Responder Cookie */
88 u_int8_t np
; /* Next Payload Type */
90 #define ISAKMP_VERS_MAJOR 0xf0
91 #define ISAKMP_VERS_MAJOR_SHIFT 4
92 #define ISAKMP_VERS_MINOR 0x0f
93 #define ISAKMP_VERS_MINOR_SHIFT 0
94 u_int8_t etype
; /* Exchange Type */
95 u_int8_t flags
; /* Flags */
97 u_int32_t len
; /* Length */
100 /* Next Payload Type */
101 #define ISAKMP_NPTYPE_NONE 0 /* NONE*/
102 #define ISAKMP_NPTYPE_SA 1 /* Security Association */
103 #define ISAKMP_NPTYPE_P 2 /* Proposal */
104 #define ISAKMP_NPTYPE_T 3 /* Transform */
105 #define ISAKMP_NPTYPE_KE 4 /* Key Exchange */
106 #define ISAKMP_NPTYPE_ID 5 /* Identification */
107 #define ISAKMP_NPTYPE_CERT 6 /* Certificate */
108 #define ISAKMP_NPTYPE_CR 7 /* Certificate Request */
109 #define ISAKMP_NPTYPE_HASH 8 /* Hash */
110 #define ISAKMP_NPTYPE_SIG 9 /* Signature */
111 #define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
112 #define ISAKMP_NPTYPE_N 11 /* Notification */
113 #define ISAKMP_NPTYPE_D 12 /* Delete */
114 #define ISAKMP_NPTYPE_VID 13 /* Vendor ID */
115 #define ISAKMP_NPTYPE_v2E 46 /* v2 Encrypted payload */
117 #define IKEv1_MAJOR_VERSION 1
118 #define IKEv1_MINOR_VERSION 0
120 #define IKEv2_MAJOR_VERSION 2
121 #define IKEv2_MINOR_VERSION 0
124 #define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
125 #define ISAKMP_FLAG_C 0x02 /* Commit Bit */
126 #define ISAKMP_FLAG_extra 0x04
129 #define ISAKMP_FLAG_I (1 << 3) /* (I)nitiator */
130 #define ISAKMP_FLAG_V (1 << 4) /* (V)ersion */
131 #define ISAKMP_FLAG_R (1 << 5) /* (R)esponse */
134 /* 3.2 Payload Generic Header
135 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
136 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
137 ! Next Payload ! RESERVED ! Payload Length !
138 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
141 u_int8_t np
; /* Next Payload */
142 u_int8_t critical
; /* bit 7 - critical, rest is RESERVED */
143 u_int16_t len
; /* Payload Length */
146 /* 3.3 Data Attributes
147 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
148 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
149 !A! Attribute Type ! AF=0 Attribute Length !
150 !F! ! AF=1 Attribute Value !
151 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
152 . AF=0 Attribute Value .
153 . AF=1 Not Transmitted .
154 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
157 u_int16_t type
; /* defined by DOI-spec, and Attribute Format */
158 u_int16_t lorv
; /* if f equal 1, Attribute Length */
159 /* if f equal 0, Attribute Value */
160 /* if f equal 1, Attribute Value */
163 /* 3.4 Security Association Payload */
164 /* MAY NOT be used, because of being defined in ipsec-doi. */
166 If the current payload is the last in the message,
167 then the value of the next payload field will be 0.
168 This field MUST NOT contain the
169 values for the Proposal or Transform payloads as they are considered
170 part of the security association negotiation. For example, this
171 field would contain the value "10" (Nonce payload) in the first
172 message of a Base Exchange (see Section 4.4) and the value "0" in the
173 first message of an Identity Protect Exchange (see Section 4.5).
177 u_int32_t doi
; /* Domain of Interpretation */
178 u_int32_t sit
; /* Situation */
181 /* 3.5 Proposal Payload */
183 The value of the next payload field MUST only contain the value "2"
184 or "0". If there are additional Proposal payloads in the message,
185 then this field will be 2. If the current Proposal payload is the
186 last within the security association proposal, then this field will
191 u_int8_t p_no
; /* Proposal # */
192 u_int8_t prot_id
; /* Protocol */
193 u_int8_t spi_size
; /* SPI Size */
194 u_int8_t num_t
; /* Number of Transforms */
198 /* 3.6 Transform Payload */
200 The value of the next payload field MUST only contain the value "3"
201 or "0". If there are additional Transform payloads in the proposal,
202 then this field will be 3. If the current Transform payload is the
203 last within the proposal, then this field will be 0.
207 u_int8_t t_no
; /* Transform # */
208 u_int8_t t_id
; /* Transform-Id */
209 u_int16_t reserved
; /* RESERVED2 */
213 /* 3.7 Key Exchange Payload */
216 /* Key Exchange Data */
219 /* 3.8 Identification Payload */
220 /* MUST NOT to be used, because of being defined in ipsec-doi. */
224 u_int8_t id_type
; /* ID Type */
225 u_int32_t doi_data
; /* DOI Specific ID Data */
227 /* Identification Data */
230 /* 3.9 Certificate Payload */
231 struct ikev1_pl_cert
{
233 u_int8_t encode
; /* Cert Encoding */
234 char cert
; /* Certificate Data */
236 This field indicates the type of
237 certificate or certificate-related information contained in the
238 Certificate Data field.
242 /* 3.10 Certificate Request Payload */
245 u_int8_t num_cert
; /* # Cert. Types */
247 Certificate Types (variable length)
248 -- Contains a list of the types of certificates requested,
249 sorted in order of preference. Each individual certificate
250 type is 1 octet. This field is NOT requiredo
252 /* # Certificate Authorities (1 octet) */
253 /* Certificate Authorities (variable length) */
256 /* 3.11 Hash Payload */
257 /* may not be used, because of having only data. */
258 struct ikev1_pl_hash
{
263 /* 3.12 Signature Payload */
264 /* may not be used, because of having only data. */
265 struct ikev1_pl_sig
{
270 /* 3.13 Nonce Payload */
271 /* may not be used, because of having only data. */
272 struct ikev1_pl_nonce
{
277 /* 3.14 Notification Payload */
280 u_int32_t doi
; /* Domain of Interpretation */
281 u_int8_t prot_id
; /* Protocol-ID */
282 u_int8_t spi_size
; /* SPI Size */
283 u_int16_t type
; /* Notify Message Type */
285 /* Notification Data */
288 /* 3.14.1 Notify Message Types */
289 /* NOTIFY MESSAGES - ERROR TYPES */
290 #define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE 1
291 #define ISAKMP_NTYPE_DOI_NOT_SUPPORTED 2
292 #define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED 3
293 #define ISAKMP_NTYPE_INVALID_COOKIE 4
294 #define ISAKMP_NTYPE_INVALID_MAJOR_VERSION 5
295 #define ISAKMP_NTYPE_INVALID_MINOR_VERSION 6
296 #define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE 7
297 #define ISAKMP_NTYPE_INVALID_FLAGS 8
298 #define ISAKMP_NTYPE_INVALID_MESSAGE_ID 9
299 #define ISAKMP_NTYPE_INVALID_PROTOCOL_ID 10
300 #define ISAKMP_NTYPE_INVALID_SPI 11
301 #define ISAKMP_NTYPE_INVALID_TRANSFORM_ID 12
302 #define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED 13
303 #define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN 14
304 #define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX 15
305 #define ISAKMP_NTYPE_PAYLOAD_MALFORMED 16
306 #define ISAKMP_NTYPE_INVALID_KEY_INFORMATION 17
307 #define ISAKMP_NTYPE_INVALID_ID_INFORMATION 18
308 #define ISAKMP_NTYPE_INVALID_CERT_ENCODING 19
309 #define ISAKMP_NTYPE_INVALID_CERTIFICATE 20
310 #define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX 21
311 #define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY 22
312 #define ISAKMP_NTYPE_INVALID_HASH_INFORMATION 23
313 #define ISAKMP_NTYPE_AUTHENTICATION_FAILED 24
314 #define ISAKMP_NTYPE_INVALID_SIGNATURE 25
315 #define ISAKMP_NTYPE_ADDRESS_NOTIFICATION 26
317 /* 3.15 Delete Payload */
320 u_int32_t doi
; /* Domain of Interpretation */
321 u_int8_t prot_id
; /* Protocol-Id */
322 u_int8_t spi_size
; /* SPI Size */
323 u_int16_t num_spi
; /* # of SPIs */
328 struct ikev1_ph1tab
{
329 struct ikev1_ph1
*head
;
330 struct ikev1_ph1
*tail
;
334 struct isakmp_ph2tab
{
335 struct ikev1_ph2
*head
;
336 struct ikev1_ph2
*tail
;
340 /* IKEv2 (RFC4306) */
342 /* 3.3 Security Association Payload -- generic header */
343 /* 3.3.1. Proposal Substructure */
346 u_int8_t p_no
; /* Proposal # */
347 u_int8_t prot_id
; /* Protocol */
348 u_int8_t spi_size
; /* SPI Size */
349 u_int8_t num_t
; /* Number of Transforms */
352 /* 3.3.2. Transform Substructure */
355 u_int8_t t_type
; /* Transform Type (ENCR,PRF,INTEG,etc.*/
356 u_int8_t res2
; /* reserved byte */
357 u_int16_t t_id
; /* Transform ID */
368 /* 3.4. Key Exchange Payload */
377 /* 3.5. Identification Payloads */
389 u_int8_t type
; /* ID type */
393 /* Notification Data */
396 /* 3.10 Notification Payload */
399 u_int8_t prot_id
; /* Protocol-ID */
400 u_int8_t spi_size
; /* SPI Size */
401 u_int16_t type
; /* Notify Message Type */
405 IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
= 1,
406 IV2_NOTIFY_INVALID_IKE_SPI
= 4,
407 IV2_NOTIFY_INVALID_MAJOR_VERSION
= 5,
408 IV2_NOTIFY_INVALID_SYNTAX
= 7,
409 IV2_NOTIFY_INVALID_MESSAGE_ID
= 9,
410 IV2_NOTIFY_INVALID_SPI
=11,
411 IV2_NOTIFY_NO_PROPOSAL_CHOSEN
=14,
412 IV2_NOTIFY_INVALID_KE_PAYLOAD
=17,
413 IV2_NOTIFY_AUTHENTICATION_FAILED
=24,
414 IV2_NOTIFY_SINGLE_PAIR_REQUIRED
=34,
415 IV2_NOTIFY_NO_ADDITIONAL_SAS
=35,
416 IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
=36,
417 IV2_NOTIFY_FAILED_CP_REQUIRED
=37,
418 IV2_NOTIFY_INVALID_SELECTORS
=39,
419 IV2_NOTIFY_INITIAL_CONTACT
=16384,
420 IV2_NOTIFY_SET_WINDOW_SIZE
=16385,
421 IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
=16386,
422 IV2_NOTIFY_IPCOMP_SUPPORTED
=16387,
423 IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
=16388,
424 IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
=16389,
425 IV2_NOTIFY_COOKIE
=16390,
426 IV2_NOTIFY_USE_TRANSPORT_MODE
=16391,
427 IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
=16392,
428 IV2_NOTIFY_REKEY_SA
=16393,
429 IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
=16394,
430 IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
=16395
433 struct notify_messages
{
438 /* 3.8 Notification Payload */
441 u_int8_t auth_method
; /* Protocol-ID */
442 u_int8_t reserved
[3];
443 /* authentication data */
446 enum ikev2_auth_type
{
452 /* refer to RFC 2409 */
455 /* isakmp sa structure */
457 u_int8_t proto_id
; /* OAKLEY */
458 vchar_t
*spi
; /* spi */
459 u_int8_t dhgrp
; /* DH; group */
460 u_int8_t auth_t
; /* method of authentication */
461 u_int8_t prf_t
; /* type of prf */
462 u_int8_t hash_t
; /* type of hash */
463 u_int8_t enc_t
; /* type of cipher */
464 u_int8_t life_t
; /* type of duration of lifetime */
465 u_int32_t ldur
; /* life duration */
469 /* refer to RFC 2407 */
473 /* 4.2 IPSEC Situation Definition */
474 #define IPSECDOI_SIT_IDENTITY_ONLY 0x00000001
475 #define IPSECDOI_SIT_SECRECY 0x00000002
476 #define IPSECDOI_SIT_INTEGRITY 0x00000004
478 /* 4.4.1 IPSEC Security Protocol Identifiers */
479 /* 4.4.2 IPSEC ISAKMP Transform Values */
480 #define IPSECDOI_PROTO_ISAKMP 1
481 #define IPSECDOI_KEY_IKE 1
483 /* 4.4.1 IPSEC Security Protocol Identifiers */
484 #define IPSECDOI_PROTO_IPSEC_AH 2
485 /* 4.4.3 IPSEC AH Transform Values */
486 #define IPSECDOI_AH_MD5 2
487 #define IPSECDOI_AH_SHA 3
488 #define IPSECDOI_AH_DES 4
489 #define IPSECDOI_AH_SHA2_256 5
490 #define IPSECDOI_AH_SHA2_384 6
491 #define IPSECDOI_AH_SHA2_512 7
493 /* 4.4.1 IPSEC Security Protocol Identifiers */
494 #define IPSECDOI_PROTO_IPSEC_ESP 3
495 /* 4.4.4 IPSEC ESP Transform Identifiers */
496 #define IPSECDOI_ESP_DES_IV64 1
497 #define IPSECDOI_ESP_DES 2
498 #define IPSECDOI_ESP_3DES 3
499 #define IPSECDOI_ESP_RC5 4
500 #define IPSECDOI_ESP_IDEA 5
501 #define IPSECDOI_ESP_CAST 6
502 #define IPSECDOI_ESP_BLOWFISH 7
503 #define IPSECDOI_ESP_3IDEA 8
504 #define IPSECDOI_ESP_DES_IV32 9
505 #define IPSECDOI_ESP_RC4 10
506 #define IPSECDOI_ESP_NULL 11
507 #define IPSECDOI_ESP_RIJNDAEL 12
508 #define IPSECDOI_ESP_AES 12
510 /* 4.4.1 IPSEC Security Protocol Identifiers */
511 #define IPSECDOI_PROTO_IPCOMP 4
512 /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
513 #define IPSECDOI_IPCOMP_OUI 1
514 #define IPSECDOI_IPCOMP_DEFLATE 2
515 #define IPSECDOI_IPCOMP_LZS 3
517 /* 4.5 IPSEC Security Association Attributes */
518 #define IPSECDOI_ATTR_SA_LTYPE 1 /* B */
519 #define IPSECDOI_ATTR_SA_LTYPE_DEFAULT 1
520 #define IPSECDOI_ATTR_SA_LTYPE_SEC 1
521 #define IPSECDOI_ATTR_SA_LTYPE_KB 2
522 #define IPSECDOI_ATTR_SA_LDUR 2 /* V */
523 #define IPSECDOI_ATTR_SA_LDUR_DEFAULT 28800 /* 8 hours */
524 #define IPSECDOI_ATTR_GRP_DESC 3 /* B */
525 #define IPSECDOI_ATTR_ENC_MODE 4 /* B */
526 /* default value: host dependent */
527 #define IPSECDOI_ATTR_ENC_MODE_TUNNEL 1
528 #define IPSECDOI_ATTR_ENC_MODE_TRNS 2
529 #define IPSECDOI_ATTR_AUTH 5 /* B */
530 /* 0 means not to use authentication. */
531 #define IPSECDOI_ATTR_AUTH_HMAC_MD5 1
532 #define IPSECDOI_ATTR_AUTH_HMAC_SHA1 2
533 #define IPSECDOI_ATTR_AUTH_DES_MAC 3
534 #define IPSECDOI_ATTR_AUTH_KPDK 4 /*RFC-1826(Key/Pad/Data/Key)*/
536 * When negotiating ESP without authentication, the Auth
537 * Algorithm attribute MUST NOT be included in the proposal.
538 * When negotiating ESP without confidentiality, the Auth
539 * Algorithm attribute MUST be included in the proposal and
540 * the ESP transform ID must be ESP_NULL.
542 #define IPSECDOI_ATTR_KEY_LENGTH 6 /* B */
543 #define IPSECDOI_ATTR_KEY_ROUNDS 7 /* B */
544 #define IPSECDOI_ATTR_COMP_DICT_SIZE 8 /* B */
545 #define IPSECDOI_ATTR_COMP_PRIVALG 9 /* V */
547 /* 4.6.1 Security Association Payload */
550 u_int32_t doi
; /* Domain of Interpretation */
551 u_int32_t sit
; /* Situation */
554 struct ipsecdoi_secrecy_h
{
559 /* 4.6.2.1 Identification Type Values */
562 u_int8_t type
; /* ID Type */
563 u_int8_t proto_id
; /* Protocol ID */
564 u_int16_t port
; /* Port */
565 /* Identification Data */
568 #define IPSECDOI_ID_IPV4_ADDR 1
569 #define IPSECDOI_ID_FQDN 2
570 #define IPSECDOI_ID_USER_FQDN 3
571 #define IPSECDOI_ID_IPV4_ADDR_SUBNET 4
572 #define IPSECDOI_ID_IPV6_ADDR 5
573 #define IPSECDOI_ID_IPV6_ADDR_SUBNET 6
574 #define IPSECDOI_ID_IPV4_ADDR_RANGE 7
575 #define IPSECDOI_ID_IPV6_ADDR_RANGE 8
576 #define IPSECDOI_ID_DER_ASN1_DN 9
577 #define IPSECDOI_ID_DER_ASN1_GN 10
578 #define IPSECDOI_ID_KEY_ID 11
580 /* 4.6.3 IPSEC DOI Notify Message Types */
581 /* Notify Messages - Status Types */
582 #define IPSECDOI_NTYPE_RESPONDER_LIFETIME 24576
583 #define IPSECDOI_NTYPE_REPLAY_STATUS 24577
584 #define IPSECDOI_NTYPE_INITIAL_CONTACT 24578
586 #define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
587 netdissect_options *ndo, u_char tpay, \
588 const struct isakmp_gen *ext, \
590 const u_char *end_pointer, \
593 u_int32_t proto0, int depth)
595 DECLARE_PRINTER(v1_sa
);
596 DECLARE_PRINTER(v1_p
);
597 DECLARE_PRINTER(v1_t
);
598 DECLARE_PRINTER(v1_ke
);
599 DECLARE_PRINTER(v1_id
);
600 DECLARE_PRINTER(v1_cert
);
601 DECLARE_PRINTER(v1_cr
);
602 DECLARE_PRINTER(v1_sig
);
603 DECLARE_PRINTER(v1_hash
);
604 DECLARE_PRINTER(v1_nonce
);
605 DECLARE_PRINTER(v1_n
);
606 DECLARE_PRINTER(v1_d
);
607 DECLARE_PRINTER(v1_vid
);
609 DECLARE_PRINTER(v2_sa
);
610 DECLARE_PRINTER(v2_ke
);
611 DECLARE_PRINTER(v2_ID
);
612 DECLARE_PRINTER(v2_cert
);
613 DECLARE_PRINTER(v2_cr
);
614 DECLARE_PRINTER(v2_auth
);
615 DECLARE_PRINTER(v2_nonce
);
616 DECLARE_PRINTER(v2_n
);
617 DECLARE_PRINTER(v2_d
);
618 DECLARE_PRINTER(v2_vid
);
619 DECLARE_PRINTER(v2_TS
);
620 DECLARE_PRINTER(v2_cp
);
621 DECLARE_PRINTER(v2_eap
);
623 static const u_char
*ikev2_e_print(netdissect_options
*ndo
,
626 const struct isakmp_gen
*ext
,
628 const u_char
*end_pointer
,
631 u_int32_t proto0
, int depth
);
634 static const u_char
*ike_sub0_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
635 const u_char
*, u_int32_t
, u_int32_t
, u_int32_t
, int);
636 static const u_char
*ikev1_sub_print(netdissect_options
*ndo
,u_char
, const struct isakmp_gen
*,
637 const u_char
*, u_int32_t
, u_int32_t
, u_int32_t
, int);
639 static const u_char
*ikev2_sub_print(netdissect_options
*ndo
,
641 u_char np
, const struct isakmp_gen
*ext
,
642 const u_char
*ep
, u_int32_t phase
,
643 u_int32_t doi
, u_int32_t proto
,
647 static char *numstr(int);
650 ikev1_print(netdissect_options
*ndo
,
651 const u_char
*bp
, u_int length
,
652 const u_char
*bp2
, struct isakmp
*base
);
654 #define MAXINITIATORS 20
658 struct sockaddr_storage iaddr
;
659 struct sockaddr_storage raddr
;
660 } cookiecache
[MAXINITIATORS
];
663 static const char *protoidstr
[] = {
664 NULL
, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
668 static const char *npstr
[] = {
669 "none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
670 "sig", "nonce", "n", "d", "vid", /* 9 - 13 */
671 "pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
672 "pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
673 "pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
674 "pay29", "pay30", "pay31", "pay32", /* 29- 32 */
675 "v2sa", "v2ke", "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
676 "v2cr", "v2auth","v2nonce", "v2n", "v2d", /* 38- 42 */
677 "v2vid", "v2TSi", "v2TSr", "v2e", "v2cp", /* 43- 47 */
683 static const u_char
*(*npfunc
[])(netdissect_options
*ndo
, u_char tpay
,
684 const struct isakmp_gen
*ext
,
686 const u_char
*end_pointer
,
689 u_int32_t proto0
, int depth
) = {
703 ikev1_vid_print
, /* 13 */
704 NULL
, NULL
, NULL
, NULL
, NULL
, /* 14- 18 */
705 NULL
, NULL
, NULL
, NULL
, NULL
, /* 19- 23 */
706 NULL
, NULL
, NULL
, NULL
, NULL
, /* 24- 28 */
707 NULL
, NULL
, NULL
, NULL
, /* 29- 32 */
708 ikev2_sa_print
, /* 33 */
709 ikev2_ke_print
, /* 34 */
710 ikev2_ID_print
, /* 35 */
711 ikev2_ID_print
, /* 36 */
712 ikev2_cert_print
, /* 37 */
713 ikev2_cr_print
, /* 38 */
714 ikev2_auth_print
, /* 39 */
715 ikev2_nonce_print
, /* 40 */
716 ikev2_n_print
, /* 41 */
717 ikev2_d_print
, /* 42 */
718 ikev2_vid_print
, /* 43 */
719 ikev2_TS_print
, /* 44 */
720 ikev2_TS_print
, /* 45 */
721 NULL
, /* ikev2_e_print,*/ /* 46 - special */
722 ikev2_cp_print
, /* 47 */
723 ikev2_eap_print
, /* 48 */
727 static const char *etypestr
[] = {
728 /* IKEv1 exchange types */
729 "none", "base", "ident", "auth", "agg", "inf", NULL
, NULL
, /* 0-7 */
730 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 8-15 */
731 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 16-23 */
732 NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, /* 24-31 */
733 "oakley-quick", "oakley-newgroup", /* 32-33 */
734 /* IKEv2 exchange types */
735 "ikev2_init", "ikev2_auth", "child_sa", "inf2" /* 34-37 */
738 #define STR_OR_ID(x, tab) \
739 (((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
740 #define PROTOIDSTR(x) STR_OR_ID(x, protoidstr)
741 #define NPSTR(x) STR_OR_ID(x, npstr)
742 #define ETYPESTR(x) STR_OR_ID(x, etypestr)
744 #define CHECKLEN(p, np) \
745 if (ep < (u_char *)(p)) { \
746 ND_PRINT((ndo," [|%s]", NPSTR(np))); \
752 (((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
753 ? npfunc[(x)] : NULL)
756 iszero(u_char
*p
, size_t l
)
765 /* find cookie from initiator cache */
767 cookie_find(cookie_t
*in
)
771 for (i
= 0; i
< MAXINITIATORS
; i
++) {
772 if (memcmp(in
, &cookiecache
[i
].initiator
, sizeof(*in
)) == 0)
779 /* record initiator */
781 cookie_record(cookie_t
*in
, const u_char
*bp2
)
785 struct sockaddr_in
*sin
;
788 struct sockaddr_in6
*sin6
;
793 ninitiator
= (i
+ 1) % MAXINITIATORS
;
797 ip
= (struct ip
*)bp2
;
800 memset(&cookiecache
[ninitiator
].iaddr
, 0,
801 sizeof(cookiecache
[ninitiator
].iaddr
));
802 memset(&cookiecache
[ninitiator
].raddr
, 0,
803 sizeof(cookiecache
[ninitiator
].raddr
));
805 sin
= (struct sockaddr_in
*)&cookiecache
[ninitiator
].iaddr
;
806 #ifdef HAVE_SOCKADDR_SA_LEN
807 sin
->sin_len
= sizeof(struct sockaddr_in
);
809 sin
->sin_family
= AF_INET
;
810 unaligned_memcpy(&sin
->sin_addr
, &ip
->ip_src
, sizeof(ip
->ip_src
));
811 sin
= (struct sockaddr_in
*)&cookiecache
[ninitiator
].raddr
;
812 #ifdef HAVE_SOCKADDR_SA_LEN
813 sin
->sin_len
= sizeof(struct sockaddr_in
);
815 sin
->sin_family
= AF_INET
;
816 unaligned_memcpy(&sin
->sin_addr
, &ip
->ip_dst
, sizeof(ip
->ip_dst
));
820 memset(&cookiecache
[ninitiator
].iaddr
, 0,
821 sizeof(cookiecache
[ninitiator
].iaddr
));
822 memset(&cookiecache
[ninitiator
].raddr
, 0,
823 sizeof(cookiecache
[ninitiator
].raddr
));
825 ip6
= (struct ip6_hdr
*)bp2
;
826 sin6
= (struct sockaddr_in6
*)&cookiecache
[ninitiator
].iaddr
;
827 #ifdef HAVE_SOCKADDR_SA_LEN
828 sin6
->sin6_len
= sizeof(struct sockaddr_in6
);
830 sin6
->sin6_family
= AF_INET6
;
831 unaligned_memcpy(&sin6
->sin6_addr
, &ip6
->ip6_src
, sizeof(ip6
->ip6_src
));
832 sin6
= (struct sockaddr_in6
*)&cookiecache
[ninitiator
].raddr
;
833 #ifdef HAVE_SOCKADDR_SA_LEN
834 sin6
->sin6_len
= sizeof(struct sockaddr_in6
);
836 sin6
->sin6_family
= AF_INET6
;
837 unaligned_memcpy(&sin6
->sin6_addr
, &ip6
->ip6_dst
, sizeof(ip6
->ip6_dst
));
843 unaligned_memcpy(&cookiecache
[ninitiator
].initiator
, in
, sizeof(*in
));
844 ninitiator
= (ninitiator
+ 1) % MAXINITIATORS
;
847 #define cookie_isinitiator(x, y) cookie_sidecheck((x), (y), 1)
848 #define cookie_isresponder(x, y) cookie_sidecheck((x), (y), 0)
850 cookie_sidecheck(int i
, const u_char
*bp2
, int initiator
)
852 struct sockaddr_storage ss
;
855 struct sockaddr_in
*sin
;
858 struct sockaddr_in6
*sin6
;
862 memset(&ss
, 0, sizeof(ss
));
863 ip
= (struct ip
*)bp2
;
866 sin
= (struct sockaddr_in
*)&ss
;
867 #ifdef HAVE_SOCKADDR_SA_LEN
868 sin
->sin_len
= sizeof(struct sockaddr_in
);
870 sin
->sin_family
= AF_INET
;
871 unaligned_memcpy(&sin
->sin_addr
, &ip
->ip_src
, sizeof(ip
->ip_src
));
875 ip6
= (struct ip6_hdr
*)bp2
;
876 sin6
= (struct sockaddr_in6
*)&ss
;
877 #ifdef HAVE_SOCKADDR_SA_LEN
878 sin6
->sin6_len
= sizeof(struct sockaddr_in6
);
880 sin6
->sin6_family
= AF_INET6
;
881 unaligned_memcpy(&sin6
->sin6_addr
, &ip6
->ip6_src
, sizeof(ip6
->ip6_src
));
888 sa
= (struct sockaddr
*)&ss
;
890 if (sa
->sa_family
!= ((struct sockaddr
*)&cookiecache
[i
].iaddr
)->sa_family
)
892 #ifdef HAVE_SOCKADDR_SA_LEN
896 if (sa
->sa_family
== AF_INET6
)
897 salen
= sizeof(struct sockaddr_in6
);
899 salen
= sizeof(struct sockaddr
);
901 salen
= sizeof(struct sockaddr
);
904 if (memcmp(&ss
, &cookiecache
[i
].iaddr
, salen
) == 0)
907 if (sa
->sa_family
!= ((struct sockaddr
*)&cookiecache
[i
].raddr
)->sa_family
)
909 #ifdef HAVE_SOCKADDR_SA_LEN
913 if (sa
->sa_family
== AF_INET6
)
914 salen
= sizeof(struct sockaddr_in6
);
916 salen
= sizeof(struct sockaddr
);
918 salen
= sizeof(struct sockaddr
);
921 if (memcmp(&ss
, &cookiecache
[i
].raddr
, salen
) == 0)
928 hexprint(netdissect_options
*ndo
, caddr_t loc
, size_t len
)
934 for (i
= 0; i
< len
; i
++)
935 ND_PRINT((ndo
,"%02x", p
[i
] & 0xff));
939 rawprint(netdissect_options
*ndo
, caddr_t loc
, size_t len
)
941 ND_TCHECK2(*loc
, len
);
943 hexprint(ndo
, loc
, len
);
951 * returns false if we run out of data buffer
953 static int ike_show_somedata(struct netdissect_options
*ndo
,
954 const u_char
*cp
, const u_char
*ep
)
956 /* there is too much data, just show some of it */
957 const u_char
*end
= ep
- 20;
964 /* really shouldn't happen because of above */
970 ND_PRINT((ndo
," data=("));
971 if(!rawprint(ndo
, (caddr_t
)(cp
), len
)) goto trunc
;
972 ND_PRINT((ndo
, "..."));
974 if(!rawprint(ndo
, (caddr_t
)(end
), elen
)) goto trunc
;
986 const char *value
[30]; /*XXX*/
989 static const u_char
*
990 ikev1_attrmap_print(netdissect_options
*ndo
,
991 const u_char
*p
, const u_char
*ep
,
992 const struct attrmap
*map
, size_t nmap
)
1000 totlen
= 4 + EXTRACT_16BITS(&p
[2]);
1001 if (ep
< p
+ totlen
) {
1002 ND_PRINT((ndo
,"[|attr]"));
1006 ND_PRINT((ndo
,"("));
1007 t
= EXTRACT_16BITS(&p
[0]) & 0x7fff;
1008 if (map
&& t
< nmap
&& map
[t
].type
)
1009 ND_PRINT((ndo
,"type=%s ", map
[t
].type
));
1011 ND_PRINT((ndo
,"type=#%d ", t
));
1013 ND_PRINT((ndo
,"value="));
1014 v
= EXTRACT_16BITS(&p
[2]);
1015 if (map
&& t
< nmap
&& v
< map
[t
].nvalue
&& map
[t
].value
[v
])
1016 ND_PRINT((ndo
,"%s", map
[t
].value
[v
]));
1018 rawprint(ndo
, (caddr_t
)&p
[2], 2);
1020 ND_PRINT((ndo
,"len=%d value=", EXTRACT_16BITS(&p
[2])));
1021 rawprint(ndo
, (caddr_t
)&p
[4], EXTRACT_16BITS(&p
[2]));
1023 ND_PRINT((ndo
,")"));
1027 static const u_char
*
1028 ikev1_attr_print(netdissect_options
*ndo
, const u_char
*p
, const u_char
*ep
)
1036 totlen
= 4 + EXTRACT_16BITS(&p
[2]);
1037 if (ep
< p
+ totlen
) {
1038 ND_PRINT((ndo
,"[|attr]"));
1042 ND_PRINT((ndo
,"("));
1043 t
= EXTRACT_16BITS(&p
[0]) & 0x7fff;
1044 ND_PRINT((ndo
,"type=#%d ", t
));
1046 ND_PRINT((ndo
,"value="));
1048 rawprint(ndo
, (caddr_t
)&p
[2], 2);
1050 ND_PRINT((ndo
,"len=%d value=", EXTRACT_16BITS(&p
[2])));
1051 rawprint(ndo
, (caddr_t
)&p
[4], EXTRACT_16BITS(&p
[2]));
1053 ND_PRINT((ndo
,")"));
1057 static const u_char
*
1058 ikev1_sa_print(netdissect_options
*ndo
, u_char tpay _U_
,
1059 const struct isakmp_gen
*ext
,
1061 const u_char
*ep
, u_int32_t phase
, u_int32_t doi0 _U_
,
1062 u_int32_t proto0
, int depth
)
1064 const struct ikev1_pl_sa
*p
;
1065 struct ikev1_pl_sa sa
;
1066 u_int32_t doi
, sit
, ident
;
1067 const u_char
*cp
, *np
;
1070 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_SA
)));
1072 p
= (struct ikev1_pl_sa
*)ext
;
1074 unaligned_memcpy(&sa
, ext
, sizeof(sa
));
1075 doi
= ntohl(sa
.doi
);
1076 sit
= ntohl(sa
.sit
);
1078 ND_PRINT((ndo
," doi=%d", doi
));
1079 ND_PRINT((ndo
," situation=%u", (u_int32_t
)ntohl(sa
.sit
)));
1080 return (u_char
*)(p
+ 1);
1083 ND_PRINT((ndo
," doi=ipsec"));
1084 ND_PRINT((ndo
," situation="));
1087 ND_PRINT((ndo
,"identity"));
1091 ND_PRINT((ndo
,"%ssecrecy", t
? "+" : ""));
1095 ND_PRINT((ndo
,"%sintegrity", t
? "+" : ""));
1097 np
= (u_char
*)ext
+ sizeof(sa
);
1099 ND_TCHECK2(*(ext
+ 1), sizeof(ident
));
1100 unaligned_memcpy(&ident
, ext
+ 1, sizeof(ident
));
1101 ND_PRINT((ndo
," ident=%u", (u_int32_t
)ntohl(ident
)));
1102 np
+= sizeof(ident
);
1105 ext
= (struct isakmp_gen
*)np
;
1108 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_P
, ext
, ep
, phase
, doi
, proto0
,
1113 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_SA
)));
1117 static const u_char
*
1118 ikev1_p_print(netdissect_options
*ndo
, u_char tpay _U_
,
1119 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1120 const u_char
*ep
, u_int32_t phase
, u_int32_t doi0
,
1121 u_int32_t proto0 _U_
, int depth
)
1123 const struct ikev1_pl_p
*p
;
1124 struct ikev1_pl_p prop
;
1127 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_P
)));
1129 p
= (struct ikev1_pl_p
*)ext
;
1131 unaligned_memcpy(&prop
, ext
, sizeof(prop
));
1132 ND_PRINT((ndo
," #%d protoid=%s transform=%d",
1133 prop
.p_no
, PROTOIDSTR(prop
.prot_id
), prop
.num_t
));
1134 if (prop
.spi_size
) {
1135 ND_PRINT((ndo
," spi="));
1136 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), prop
.spi_size
))
1140 ext
= (struct isakmp_gen
*)((u_char
*)(p
+ 1) + prop
.spi_size
);
1143 cp
= ikev1_sub_print(ndo
, ISAKMP_NPTYPE_T
, ext
, ep
, phase
, doi0
,
1144 prop
.prot_id
, depth
);
1148 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_P
)));
1152 static const char *ikev1_p_map
[] = {
1156 static const char *ikev2_t_type_map
[]={
1157 NULL
, "encr", "prf", "integ", "dh", "esn"
1160 static const char *ah_p_map
[] = {
1161 NULL
, "(reserved)", "md5", "sha", "1des",
1162 "sha2-256", "sha2-384", "sha2-512",
1165 static const char *prf_p_map
[] = {
1166 NULL
, "hmac-md5", "hmac-sha", "hmac-tiger",
1170 static const char *integ_p_map
[] = {
1171 NULL
, "hmac-md5", "hmac-sha", "dec-mac",
1172 "kpdk-md5", "aes-xcbc"
1175 static const char *esn_p_map
[] = {
1179 static const char *dh_p_map
[] = {
1181 "modp1024", /* group 2 */
1182 "EC2N 2^155", /* group 3 */
1183 "EC2N 2^185", /* group 4 */
1184 "modp1536", /* group 5 */
1185 "iana-grp06", "iana-grp07", /* reserved */
1186 "iana-grp08", "iana-grp09",
1187 "iana-grp10", "iana-grp11",
1188 "iana-grp12", "iana-grp13",
1189 "modp2048", /* group 14 */
1190 "modp3072", /* group 15 */
1191 "modp4096", /* group 16 */
1192 "modp6144", /* group 17 */
1193 "modp8192", /* group 18 */
1196 static const char *esp_p_map
[] = {
1197 NULL
, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
1198 "blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
1201 static const char *ipcomp_p_map
[] = {
1202 NULL
, "oui", "deflate", "lzs",
1205 static const struct attrmap ipsec_t_map
[] = {
1206 { NULL
, 0, { NULL
} },
1207 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1208 { "life", 0, { NULL
} },
1209 { "group desc", 18, { NULL
, "modp768",
1210 "modp1024", /* group 2 */
1211 "EC2N 2^155", /* group 3 */
1212 "EC2N 2^185", /* group 4 */
1213 "modp1536", /* group 5 */
1214 "iana-grp06", "iana-grp07", /* reserved */
1215 "iana-grp08", "iana-grp09",
1216 "iana-grp10", "iana-grp11",
1217 "iana-grp12", "iana-grp13",
1218 "modp2048", /* group 14 */
1219 "modp3072", /* group 15 */
1220 "modp4096", /* group 16 */
1221 "modp6144", /* group 17 */
1222 "modp8192", /* group 18 */
1224 { "enc mode", 3, { NULL
, "tunnel", "transport", }, },
1225 { "auth", 5, { NULL
, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
1226 { "keylen", 0, { NULL
} },
1227 { "rounds", 0, { NULL
} },
1228 { "dictsize", 0, { NULL
} },
1229 { "privalg", 0, { NULL
} },
1232 static const struct attrmap encr_t_map
[] = {
1233 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 0, 1 */
1234 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 2, 3 */
1235 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 4, 5 */
1236 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 6, 7 */
1237 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 8, 9 */
1238 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 10,11*/
1239 { NULL
, 0, { NULL
} }, { NULL
, 0, { NULL
} }, /* 12,13*/
1240 { "keylen", 14, { NULL
}},
1243 static const struct attrmap oakley_t_map
[] = {
1244 { NULL
, 0, { NULL
} },
1245 { "enc", 8, { NULL
, "1des", "idea", "blowfish", "rc5",
1246 "3des", "cast", "aes", }, },
1247 { "hash", 7, { NULL
, "md5", "sha1", "tiger",
1248 "sha2-256", "sha2-384", "sha2-512", }, },
1249 { "auth", 6, { NULL
, "preshared", "dss", "rsa sig", "rsa enc",
1250 "rsa enc revised", }, },
1251 { "group desc", 18, { NULL
, "modp768",
1252 "modp1024", /* group 2 */
1253 "EC2N 2^155", /* group 3 */
1254 "EC2N 2^185", /* group 4 */
1255 "modp1536", /* group 5 */
1256 "iana-grp06", "iana-grp07", /* reserved */
1257 "iana-grp08", "iana-grp09",
1258 "iana-grp10", "iana-grp11",
1259 "iana-grp12", "iana-grp13",
1260 "modp2048", /* group 14 */
1261 "modp3072", /* group 15 */
1262 "modp4096", /* group 16 */
1263 "modp6144", /* group 17 */
1264 "modp8192", /* group 18 */
1266 { "group type", 4, { NULL
, "MODP", "ECP", "EC2N", }, },
1267 { "group prime", 0, { NULL
} },
1268 { "group gen1", 0, { NULL
} },
1269 { "group gen2", 0, { NULL
} },
1270 { "group curve A", 0, { NULL
} },
1271 { "group curve B", 0, { NULL
} },
1272 { "lifetype", 3, { NULL
, "sec", "kb", }, },
1273 { "lifeduration", 0, { NULL
} },
1274 { "prf", 0, { NULL
} },
1275 { "keylen", 0, { NULL
} },
1276 { "field", 0, { NULL
} },
1277 { "order", 0, { NULL
} },
1280 static const u_char
*
1281 ikev1_t_print(netdissect_options
*ndo
, u_char tpay _U_
,
1282 const struct isakmp_gen
*ext
, u_int item_len
,
1283 const u_char
*ep
, u_int32_t phase _U_
, u_int32_t doi _U_
,
1284 u_int32_t proto
, int depth _U_
)
1286 const struct ikev1_pl_t
*p
;
1287 struct ikev1_pl_t t
;
1290 const struct attrmap
*map
;
1294 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_T
)));
1296 p
= (struct ikev1_pl_t
*)ext
;
1298 unaligned_memcpy(&t
, ext
, sizeof(t
));
1302 idstr
= STR_OR_ID(t
.t_id
, ikev1_p_map
);
1304 nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1307 idstr
= STR_OR_ID(t
.t_id
, ah_p_map
);
1309 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1312 idstr
= STR_OR_ID(t
.t_id
, esp_p_map
);
1314 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1317 idstr
= STR_OR_ID(t
.t_id
, ipcomp_p_map
);
1319 nmap
= sizeof(ipsec_t_map
)/sizeof(ipsec_t_map
[0]);
1329 ND_PRINT((ndo
," #%d id=%s ", t
.t_no
, idstr
));
1331 ND_PRINT((ndo
," #%d id=%d ", t
.t_no
, t
.t_id
));
1332 cp
= (u_char
*)(p
+ 1);
1333 ep2
= (u_char
*)p
+ item_len
;
1334 while (cp
< ep
&& cp
< ep2
) {
1336 cp
= ikev1_attrmap_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
,
1339 cp
= ikev1_attr_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
);
1342 ND_PRINT((ndo
,"..."));
1345 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_T
)));
1349 static const u_char
*
1350 ikev1_ke_print(netdissect_options
*ndo
, u_char tpay _U_
,
1351 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1352 const u_char
*ep _U_
, u_int32_t phase _U_
, u_int32_t doi _U_
,
1353 u_int32_t proto _U_
, int depth _U_
)
1355 struct isakmp_gen e
;
1357 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_KE
)));
1360 unaligned_memcpy(&e
, ext
, sizeof(e
));
1361 ND_PRINT((ndo
," key len=%d", ntohs(e
.len
) - 4));
1362 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1363 ND_PRINT((ndo
," "));
1364 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1367 return (u_char
*)ext
+ ntohs(e
.len
);
1369 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_KE
)));
1373 static const u_char
*
1374 ikev1_id_print(netdissect_options
*ndo
, u_char tpay _U_
,
1375 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1376 const u_char
*ep _U_
, u_int32_t phase
, u_int32_t doi _U_
,
1377 u_int32_t proto _U_
, int depth _U_
)
1379 #define USE_IPSECDOI_IN_PHASE1 1
1380 const struct ikev1_pl_id
*p
;
1381 struct ikev1_pl_id id
;
1382 static const char *idtypestr
[] = {
1383 "IPv4", "IPv4net", "IPv6", "IPv6net",
1385 static const char *ipsecidtypestr
[] = {
1386 NULL
, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
1387 "IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
1393 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_ID
)));
1395 p
= (struct ikev1_pl_id
*)ext
;
1397 unaligned_memcpy(&id
, ext
, sizeof(id
));
1398 if (sizeof(*p
) < item_len
) {
1399 data
= (u_char
*)(p
+ 1);
1400 len
= item_len
- sizeof(*p
);
1407 ND_PRINT((ndo
," [phase=%d doi=%d proto=%d]", phase
, doi
, proto
));
1410 #ifndef USE_IPSECDOI_IN_PHASE1
1414 ND_PRINT((ndo
," idtype=%s", STR_OR_ID(id
.d
.id_type
, idtypestr
)));
1415 ND_PRINT((ndo
," doi_data=%u",
1416 (u_int32_t
)(ntohl(id
.d
.doi_data
) & 0xffffff)));
1419 #ifdef USE_IPSECDOI_IN_PHASE1
1424 const struct ipsecdoi_id
*p
;
1425 struct ipsecdoi_id id
;
1426 struct protoent
*pe
;
1428 p
= (struct ipsecdoi_id
*)ext
;
1430 unaligned_memcpy(&id
, ext
, sizeof(id
));
1431 ND_PRINT((ndo
," idtype=%s", STR_OR_ID(id
.type
, ipsecidtypestr
)));
1436 pe
= getprotobynumber(id
.proto_id
);
1438 ND_PRINT((ndo
," protoid=%s", pe
->p_name
));
1443 /* it DOES NOT mean IPPROTO_IP! */
1444 ND_PRINT((ndo
," protoid=%s", "0"));
1446 ND_PRINT((ndo
," port=%d", ntohs(id
.port
)));
1451 ND_TCHECK2(*data
, len
);
1453 case IPSECDOI_ID_IPV4_ADDR
:
1455 ND_PRINT((ndo
," len=%d [bad: < 4]", len
));
1457 ND_PRINT((ndo
," len=%d %s", len
, ipaddr_string(data
)));
1460 case IPSECDOI_ID_FQDN
:
1461 case IPSECDOI_ID_USER_FQDN
:
1464 ND_PRINT((ndo
," len=%d ", len
));
1465 for (i
= 0; i
< len
; i
++)
1466 safeputchar(data
[i
]);
1470 case IPSECDOI_ID_IPV4_ADDR_SUBNET
:
1474 ND_PRINT((ndo
," len=%d [bad: < 8]", len
));
1476 mask
= data
+ sizeof(struct in_addr
);
1477 ND_PRINT((ndo
," len=%d %s/%u.%u.%u.%u", len
,
1478 ipaddr_string(data
),
1479 mask
[0], mask
[1], mask
[2], mask
[3]));
1485 case IPSECDOI_ID_IPV6_ADDR
:
1487 ND_PRINT((ndo
," len=%d [bad: < 16]", len
));
1489 ND_PRINT((ndo
," len=%d %s", len
, ip6addr_string(data
)));
1492 case IPSECDOI_ID_IPV6_ADDR_SUBNET
:
1494 const u_int32_t
*mask
;
1496 ND_PRINT((ndo
," len=%d [bad: < 20]", len
));
1498 mask
= (u_int32_t
*)(data
+ sizeof(struct in6_addr
));
1500 ND_PRINT((ndo
," len=%d %s/0x%08x%08x%08x%08x", len
,
1501 ip6addr_string(data
),
1502 mask
[0], mask
[1], mask
[2], mask
[3]));
1508 case IPSECDOI_ID_IPV4_ADDR_RANGE
:
1510 ND_PRINT((ndo
," len=%d [bad: < 8]", len
));
1512 ND_PRINT((ndo
," len=%d %s-%s", len
,
1513 ipaddr_string(data
),
1514 ipaddr_string(data
+ sizeof(struct in_addr
))));
1519 case IPSECDOI_ID_IPV6_ADDR_RANGE
:
1521 ND_PRINT((ndo
," len=%d [bad: < 32]", len
));
1523 ND_PRINT((ndo
," len=%d %s-%s", len
,
1524 ip6addr_string(data
),
1525 ip6addr_string(data
+ sizeof(struct in6_addr
))));
1530 case IPSECDOI_ID_DER_ASN1_DN
:
1531 case IPSECDOI_ID_DER_ASN1_GN
:
1532 case IPSECDOI_ID_KEY_ID
:
1539 ND_PRINT((ndo
," len=%d", len
));
1540 if (2 < ndo
->ndo_vflag
) {
1541 ND_PRINT((ndo
," "));
1542 if (!rawprint(ndo
, (caddr_t
)data
, len
))
1546 return (u_char
*)ext
+ item_len
;
1548 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_ID
)));
1552 static const u_char
*
1553 ikev1_cert_print(netdissect_options
*ndo
, u_char tpay _U_
,
1554 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1555 const u_char
*ep _U_
, u_int32_t phase _U_
,
1557 u_int32_t proto0 _U_
, int depth _U_
)
1559 const struct ikev1_pl_cert
*p
;
1560 struct ikev1_pl_cert cert
;
1561 static const char *certstr
[] = {
1562 "none", "pkcs7", "pgp", "dns",
1563 "x509sign", "x509ke", "kerberos", "crl",
1564 "arl", "spki", "x509attr",
1567 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_CERT
)));
1569 p
= (struct ikev1_pl_cert
*)ext
;
1571 unaligned_memcpy(&cert
, ext
, sizeof(cert
));
1572 ND_PRINT((ndo
," len=%d", item_len
- 4));
1573 ND_PRINT((ndo
," type=%s", STR_OR_ID((cert
.encode
), certstr
)));
1574 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1575 ND_PRINT((ndo
," "));
1576 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), item_len
- 4))
1579 return (u_char
*)ext
+ item_len
;
1581 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_CERT
)));
1585 static const u_char
*
1586 ikev1_cr_print(netdissect_options
*ndo
, u_char tpay _U_
,
1587 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1588 const u_char
*ep _U_
, u_int32_t phase _U_
, u_int32_t doi0 _U_
,
1589 u_int32_t proto0 _U_
, int depth _U_
)
1591 const struct ikev1_pl_cert
*p
;
1592 struct ikev1_pl_cert cert
;
1593 static const char *certstr
[] = {
1594 "none", "pkcs7", "pgp", "dns",
1595 "x509sign", "x509ke", "kerberos", "crl",
1596 "arl", "spki", "x509attr",
1599 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_CR
)));
1601 p
= (struct ikev1_pl_cert
*)ext
;
1603 unaligned_memcpy(&cert
, ext
, sizeof(cert
));
1604 ND_PRINT((ndo
," len=%d", item_len
- 4));
1605 ND_PRINT((ndo
," type=%s", STR_OR_ID((cert
.encode
), certstr
)));
1606 if (2 < ndo
->ndo_vflag
&& 4 < item_len
) {
1607 ND_PRINT((ndo
," "));
1608 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), item_len
- 4))
1611 return (u_char
*)ext
+ item_len
;
1613 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_CR
)));
1617 static const u_char
*
1618 ikev1_hash_print(netdissect_options
*ndo
, u_char tpay _U_
,
1619 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1620 const u_char
*ep _U_
, u_int32_t phase _U_
, u_int32_t doi _U_
,
1621 u_int32_t proto _U_
, int depth _U_
)
1623 struct isakmp_gen e
;
1625 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_HASH
)));
1628 unaligned_memcpy(&e
, ext
, sizeof(e
));
1629 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1630 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1631 ND_PRINT((ndo
," "));
1632 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1635 return (u_char
*)ext
+ ntohs(e
.len
);
1637 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_HASH
)));
1641 static const u_char
*
1642 ikev1_sig_print(netdissect_options
*ndo
, u_char tpay _U_
,
1643 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1644 const u_char
*ep _U_
, u_int32_t phase _U_
, u_int32_t doi _U_
,
1645 u_int32_t proto _U_
, int depth _U_
)
1647 struct isakmp_gen e
;
1649 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_SIG
)));
1652 unaligned_memcpy(&e
, ext
, sizeof(e
));
1653 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1654 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1655 ND_PRINT((ndo
," "));
1656 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1659 return (u_char
*)ext
+ ntohs(e
.len
);
1661 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_SIG
)));
1665 static const u_char
*
1666 ikev1_nonce_print(netdissect_options
*ndo
, u_char tpay _U_
,
1667 const struct isakmp_gen
*ext
,
1669 const u_char
*ep _U_
,
1670 u_int32_t phase _U_
, u_int32_t doi _U_
,
1671 u_int32_t proto _U_
, int depth _U_
)
1673 struct isakmp_gen e
;
1675 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_NONCE
)));
1678 unaligned_memcpy(&e
, ext
, sizeof(e
));
1679 ND_PRINT((ndo
," n len=%d", ntohs(e
.len
) - 4));
1680 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1681 ND_PRINT((ndo
," "));
1682 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1684 } else if (1 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1685 ND_PRINT((ndo
," "));
1686 if (!ike_show_somedata(ndo
, (u_char
*)(caddr_t
)(ext
+ 1), ep
))
1689 return (u_char
*)ext
+ ntohs(e
.len
);
1691 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE
)));
1695 static const u_char
*
1696 ikev1_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
1697 const struct isakmp_gen
*ext
, u_int item_len
,
1698 const u_char
*ep
, u_int32_t phase
, u_int32_t doi0 _U_
,
1699 u_int32_t proto0 _U_
, int depth
)
1701 struct ikev1_pl_n
*p
, n
;
1706 static const char *notify_error_str
[] = {
1707 NULL
, "INVALID-PAYLOAD-TYPE",
1708 "DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED",
1709 "INVALID-COOKIE", "INVALID-MAJOR-VERSION",
1710 "INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE",
1711 "INVALID-FLAGS", "INVALID-MESSAGE-ID",
1712 "INVALID-PROTOCOL-ID", "INVALID-SPI",
1713 "INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED",
1714 "NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX",
1715 "PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION",
1716 "INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING",
1717 "INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED",
1718 "INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION",
1719 "AUTHENTICATION-FAILED", "INVALID-SIGNATURE",
1720 "ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME",
1721 "CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE",
1722 "UNEQUAL-PAYLOAD-LENGTHS",
1724 static const char *ipsec_notify_error_str
[] = {
1727 static const char *notify_status_str
[] = {
1730 static const char *ipsec_notify_status_str
[] = {
1731 "RESPONDER-LIFETIME", "REPLAY-STATUS",
1734 /* NOTE: these macro must be called with x in proper range */
1737 #define NOTIFY_ERROR_STR(x) \
1738 STR_OR_ID((x), notify_error_str)
1741 #define IPSEC_NOTIFY_ERROR_STR(x) \
1742 STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
1745 #define NOTIFY_STATUS_STR(x) \
1746 STR_OR_ID((u_int)((x) - 16384), notify_status_str)
1749 #define IPSEC_NOTIFY_STATUS_STR(x) \
1750 STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
1752 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_N
)));
1754 p
= (struct ikev1_pl_n
*)ext
;
1756 unaligned_memcpy(&n
, ext
, sizeof(n
));
1760 ND_PRINT((ndo
," doi=%d", doi
));
1761 ND_PRINT((ndo
," proto=%d", proto
));
1762 if (ntohs(n
.type
) < 8192)
1763 ND_PRINT((ndo
," type=%s", NOTIFY_ERROR_STR(ntohs(n
.type
))));
1764 else if (ntohs(n
.type
) < 16384)
1765 ND_PRINT((ndo
," type=%s", numstr(ntohs(n
.type
))));
1766 else if (ntohs(n
.type
) < 24576)
1767 ND_PRINT((ndo
," type=%s", NOTIFY_STATUS_STR(ntohs(n
.type
))));
1769 ND_PRINT((ndo
," type=%s", numstr(ntohs(n
.type
))));
1771 ND_PRINT((ndo
," spi="));
1772 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), n
.spi_size
))
1775 return (u_char
*)(p
+ 1) + n
.spi_size
;
1778 ND_PRINT((ndo
," doi=ipsec"));
1779 ND_PRINT((ndo
," proto=%s", PROTOIDSTR(proto
)));
1780 if (ntohs(n
.type
) < 8192)
1781 ND_PRINT((ndo
," type=%s", NOTIFY_ERROR_STR(ntohs(n
.type
))));
1782 else if (ntohs(n
.type
) < 16384)
1783 ND_PRINT((ndo
," type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n
.type
))));
1784 else if (ntohs(n
.type
) < 24576)
1785 ND_PRINT((ndo
," type=%s", NOTIFY_STATUS_STR(ntohs(n
.type
))));
1786 else if (ntohs(n
.type
) < 32768)
1787 ND_PRINT((ndo
," type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n
.type
))));
1789 ND_PRINT((ndo
," type=%s", numstr(ntohs(n
.type
))));
1791 ND_PRINT((ndo
," spi="));
1792 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), n
.spi_size
))
1796 cp
= (u_char
*)(p
+ 1) + n
.spi_size
;
1797 ep2
= (u_char
*)p
+ item_len
;
1800 ND_PRINT((ndo
," orig=("));
1801 switch (ntohs(n
.type
)) {
1802 case IPSECDOI_NTYPE_RESPONDER_LIFETIME
:
1804 const struct attrmap
*map
= oakley_t_map
;
1805 size_t nmap
= sizeof(oakley_t_map
)/sizeof(oakley_t_map
[0]);
1806 while (cp
< ep
&& cp
< ep2
) {
1807 cp
= ikev1_attrmap_print(ndo
, cp
,
1808 (ep
< ep2
) ? ep
: ep2
, map
, nmap
);
1812 case IPSECDOI_NTYPE_REPLAY_STATUS
:
1813 ND_PRINT((ndo
,"replay detection %sabled",
1814 (*(u_int32_t
*)cp
) ? "en" : "dis"));
1816 case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN
:
1817 if (ikev1_sub_print(ndo
, ISAKMP_NPTYPE_SA
,
1818 (struct isakmp_gen
*)cp
, ep
, phase
, doi
, proto
,
1824 isakmp_print(ndo
, cp
,
1825 item_len
- sizeof(*p
) - n
.spi_size
,
1828 ND_PRINT((ndo
,")"));
1830 return (u_char
*)ext
+ item_len
;
1832 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_N
)));
1836 static const u_char
*
1837 ikev1_d_print(netdissect_options
*ndo
, u_char tpay _U_
,
1838 const struct isakmp_gen
*ext
, u_int item_len _U_
,
1839 const u_char
*ep _U_
, u_int32_t phase _U_
, u_int32_t doi0 _U_
,
1840 u_int32_t proto0 _U_
, int depth _U_
)
1842 const struct ikev1_pl_d
*p
;
1843 struct ikev1_pl_d d
;
1849 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_D
)));
1851 p
= (struct ikev1_pl_d
*)ext
;
1853 unaligned_memcpy(&d
, ext
, sizeof(d
));
1857 ND_PRINT((ndo
," doi=%u", doi
));
1858 ND_PRINT((ndo
," proto=%u", proto
));
1860 ND_PRINT((ndo
," doi=ipsec"));
1861 ND_PRINT((ndo
," proto=%s", PROTOIDSTR(proto
)));
1863 ND_PRINT((ndo
," spilen=%u", d
.spi_size
));
1864 ND_PRINT((ndo
," nspi=%u", ntohs(d
.num_spi
)));
1865 ND_PRINT((ndo
," spi="));
1866 q
= (u_int8_t
*)(p
+ 1);
1867 for (i
= 0; i
< ntohs(d
.num_spi
); i
++) {
1869 ND_PRINT((ndo
,","));
1870 if (!rawprint(ndo
, (caddr_t
)q
, d
.spi_size
))
1876 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_D
)));
1880 static const u_char
*
1881 ikev1_vid_print(netdissect_options
*ndo
, u_char tpay _U_
,
1882 const struct isakmp_gen
*ext
,
1883 u_int item_len _U_
, const u_char
*ep _U_
,
1884 u_int32_t phase _U_
, u_int32_t doi _U_
,
1885 u_int32_t proto _U_
, int depth _U_
)
1887 struct isakmp_gen e
;
1889 ND_PRINT((ndo
,"%s:", NPSTR(ISAKMP_NPTYPE_VID
)));
1892 unaligned_memcpy(&e
, ext
, sizeof(e
));
1893 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1894 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1895 ND_PRINT((ndo
," "));
1896 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1899 return (u_char
*)ext
+ ntohs(e
.len
);
1901 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_VID
)));
1905 /************************************************************/
1907 /* IKE v2 - rfc4306 - dissector */
1909 /************************************************************/
1912 ikev2_pay_print(netdissect_options
*ndo
, const char *payname
, int critical
)
1914 ND_PRINT((ndo
,"%s%s:", payname
, critical
&0x80 ? "[C]" : ""));
1917 static const u_char
*
1918 ikev2_gen_print(netdissect_options
*ndo
, u_char tpay
,
1919 const struct isakmp_gen
*ext
)
1921 struct isakmp_gen e
;
1924 unaligned_memcpy(&e
, ext
, sizeof(e
));
1925 ikev2_pay_print(ndo
, NPSTR(tpay
), e
.critical
);
1927 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
1928 if (2 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
1929 ND_PRINT((ndo
," "));
1930 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
1933 return (u_char
*)ext
+ ntohs(e
.len
);
1935 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
1939 static const u_char
*
1940 ikev2_t_print(netdissect_options
*ndo
, u_char tpay _U_
, int pcount
,
1941 const struct isakmp_gen
*ext
, u_int item_len
,
1942 const u_char
*ep
, u_int32_t phase _U_
, u_int32_t doi _U_
,
1943 u_int32_t proto _U_
, int depth _U_
)
1945 const struct ikev2_t
*p
;
1950 const struct attrmap
*map
;
1954 p
= (struct ikev2_t
*)ext
;
1956 unaligned_memcpy(&t
, ext
, sizeof(t
));
1957 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_T
), t
.h
.critical
);
1959 t_id
= ntohs(t
.t_id
);
1966 idstr
= STR_OR_ID(t_id
, esp_p_map
);
1968 nmap
= sizeof(encr_t_map
)/sizeof(encr_t_map
[0]);
1972 idstr
= STR_OR_ID(t_id
, prf_p_map
);
1976 idstr
= STR_OR_ID(t_id
, integ_p_map
);
1980 idstr
= STR_OR_ID(t_id
, dh_p_map
);
1984 idstr
= STR_OR_ID(t_id
, esn_p_map
);
1993 ND_PRINT((ndo
," #%u type=%s id=%s ", pcount
,
1994 STR_OR_ID(t
.t_type
, ikev2_t_type_map
),
1997 ND_PRINT((ndo
," #%u type=%s id=%u ", pcount
,
1998 STR_OR_ID(t
.t_type
, ikev2_t_type_map
),
2000 cp
= (u_char
*)(p
+ 1);
2001 ep2
= (u_char
*)p
+ item_len
;
2002 while (cp
< ep
&& cp
< ep2
) {
2004 cp
= ikev1_attrmap_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
,
2007 cp
= ikev1_attr_print(ndo
, cp
, (ep
< ep2
) ? ep
: ep2
);
2010 ND_PRINT((ndo
,"..."));
2013 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_T
)));
2017 static const u_char
*
2018 ikev2_p_print(netdissect_options
*ndo
, u_char tpay _U_
, int pcount _U_
,
2019 const struct isakmp_gen
*ext
, u_int item_len _U_
,
2020 const u_char
*ep
, u_int32_t phase
, u_int32_t doi0
,
2021 u_int32_t proto0 _U_
, int depth
)
2023 const struct ikev2_p
*p
;
2024 struct ikev2_p prop
;
2027 p
= (struct ikev2_p
*)ext
;
2029 unaligned_memcpy(&prop
, ext
, sizeof(prop
));
2030 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_P
), prop
.h
.critical
);
2032 ND_PRINT((ndo
," #%u protoid=%s transform=%d len=%u",
2033 prop
.p_no
, PROTOIDSTR(prop
.prot_id
),
2034 prop
.num_t
, ntohs(prop
.h
.len
)));
2035 if (prop
.spi_size
) {
2036 ND_PRINT((ndo
," spi="));
2037 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), prop
.spi_size
))
2041 ext
= (struct isakmp_gen
*)((u_char
*)(p
+ 1) + prop
.spi_size
);
2044 cp
= ikev2_sub_print(ndo
, NULL
, ISAKMP_NPTYPE_T
, ext
, ep
, phase
, doi0
,
2045 prop
.prot_id
, depth
);
2049 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_P
)));
2053 static const u_char
*
2054 ikev2_sa_print(netdissect_options
*ndo
, u_char tpay
,
2055 const struct isakmp_gen
*ext1
,
2056 u_int item_len _U_
, const u_char
*ep _U_
,
2057 u_int32_t phase _U_
, u_int32_t doi _U_
,
2058 u_int32_t proto _U_
, int depth _U_
)
2060 struct isakmp_gen e
;
2061 int osa_length
, sa_length
;
2064 unaligned_memcpy(&e
, ext1
, sizeof(e
));
2065 ikev2_pay_print(ndo
, "sa", e
.critical
);
2067 osa_length
= ntohs(e
.len
);
2068 sa_length
= osa_length
- 4;
2069 ND_PRINT((ndo
," len=%d", sa_length
));
2071 ikev2_sub_print(ndo
, NULL
, ISAKMP_NPTYPE_P
,
2075 return (u_char
*)ext1
+ osa_length
;
2077 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2081 static const u_char
*
2082 ikev2_ke_print(netdissect_options
*ndo
, u_char tpay
,
2083 const struct isakmp_gen
*ext
,
2084 u_int item_len _U_
, const u_char
*ep _U_
,
2085 u_int32_t phase _U_
, u_int32_t doi _U_
,
2086 u_int32_t proto _U_
, int depth _U_
)
2091 k
= (struct ikev2_ke
*)ext
;
2093 unaligned_memcpy(&ke
, ext
, sizeof(ke
));
2094 ikev2_pay_print(ndo
, NPSTR(tpay
), ke
.h
.critical
);
2096 ND_PRINT((ndo
," len=%u group=%s", ntohs(ke
.h
.len
) - 8,
2097 STR_OR_ID(ntohs(ke
.ke_group
), dh_p_map
)));
2099 if (2 < ndo
->ndo_vflag
&& 8 < ntohs(ke
.h
.len
)) {
2100 ND_PRINT((ndo
," "));
2101 if (!rawprint(ndo
, (caddr_t
)(k
+ 1), ntohs(ke
.h
.len
) - 8))
2104 return (u_char
*)ext
+ ntohs(ke
.h
.len
);
2106 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2110 static const u_char
*
2111 ikev2_ID_print(netdissect_options
*ndo
, u_char tpay
,
2112 const struct isakmp_gen
*ext
,
2113 u_int item_len _U_
, const u_char
*ep _U_
,
2114 u_int32_t phase _U_
, u_int32_t doi _U_
,
2115 u_int32_t proto _U_
, int depth _U_
)
2118 int id_len
, idtype_len
, i
;
2119 unsigned int dumpascii
, dumphex
;
2120 unsigned char *typedata
;
2123 unaligned_memcpy(&id
, ext
, sizeof(id
));
2124 ikev2_pay_print(ndo
, NPSTR(tpay
), id
.h
.critical
);
2126 id_len
= ntohs(id
.h
.len
);
2128 ND_PRINT((ndo
," len=%d", id_len
- 4));
2129 if (2 < ndo
->ndo_vflag
&& 4 < id_len
) {
2130 ND_PRINT((ndo
," "));
2131 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), id_len
- 4))
2135 idtype_len
=id_len
- sizeof(struct ikev2_id
);
2138 typedata
= (unsigned char *)(ext
)+sizeof(struct ikev2_id
);
2142 ND_PRINT((ndo
, " ipv4:"));
2146 ND_PRINT((ndo
, " fqdn:"));
2149 case ID_RFC822_ADDR
:
2150 ND_PRINT((ndo
, " rfc822:"));
2154 ND_PRINT((ndo
, " ipv6:"));
2157 case ID_DER_ASN1_DN
:
2158 ND_PRINT((ndo
, " dn:"));
2161 case ID_DER_ASN1_GN
:
2162 ND_PRINT((ndo
, " gn:"));
2166 ND_PRINT((ndo
, " keyid:"));
2172 ND_TCHECK2(*typedata
, idtype_len
);
2173 for(i
=0; i
<idtype_len
; i
++) {
2174 if(isprint(typedata
[i
])) {
2175 ND_PRINT((ndo
, "%c", typedata
[i
]));
2177 ND_PRINT((ndo
, "."));
2182 if (!rawprint(ndo
, (caddr_t
)typedata
, idtype_len
))
2186 return (u_char
*)ext
+ id_len
;
2188 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2192 static const u_char
*
2193 ikev2_cert_print(netdissect_options
*ndo
, u_char tpay
,
2194 const struct isakmp_gen
*ext
,
2195 u_int item_len _U_
, const u_char
*ep _U_
,
2196 u_int32_t phase _U_
, u_int32_t doi _U_
,
2197 u_int32_t proto _U_
, int depth _U_
)
2199 return ikev2_gen_print(ndo
, tpay
, ext
);
2202 static const u_char
*
2203 ikev2_cr_print(netdissect_options
*ndo
, u_char tpay
,
2204 const struct isakmp_gen
*ext
,
2205 u_int item_len _U_
, const u_char
*ep _U_
,
2206 u_int32_t phase _U_
, u_int32_t doi _U_
,
2207 u_int32_t proto _U_
, int depth _U_
)
2209 return ikev2_gen_print(ndo
, tpay
, ext
);
2212 static const u_char
*
2213 ikev2_auth_print(netdissect_options
*ndo
, u_char tpay
,
2214 const struct isakmp_gen
*ext
,
2215 u_int item_len _U_
, const u_char
*ep _U_
,
2216 u_int32_t phase _U_
, u_int32_t doi _U_
,
2217 u_int32_t proto _U_
, int depth _U_
)
2219 struct ikev2_auth a
;
2220 const char *v2_auth
[]={ "invalid", "rsasig",
2221 "shared-secret", "dsssig" };
2222 u_char
*authdata
= (u_char
*)ext
+ sizeof(a
);
2226 unaligned_memcpy(&a
, ext
, sizeof(a
));
2227 ikev2_pay_print(ndo
, NPSTR(tpay
), a
.h
.critical
);
2228 len
= ntohs(a
.h
.len
);
2230 ND_PRINT((ndo
," len=%d method=%s", len
-4,
2231 STR_OR_ID(a
.auth_method
, v2_auth
)));
2233 if (1 < ndo
->ndo_vflag
&& 4 < len
) {
2234 ND_PRINT((ndo
," authdata=("));
2235 if (!rawprint(ndo
, (caddr_t
)authdata
, len
- sizeof(a
)))
2237 ND_PRINT((ndo
,") "));
2238 } else if(ndo
->ndo_vflag
&& 4 < len
) {
2239 if(!ike_show_somedata(ndo
, authdata
, ep
)) goto trunc
;
2242 return (u_char
*)ext
+ len
;
2244 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2248 static const u_char
*
2249 ikev2_nonce_print(netdissect_options
*ndo
, u_char tpay
,
2250 const struct isakmp_gen
*ext
,
2251 u_int item_len _U_
, const u_char
*ep _U_
,
2252 u_int32_t phase _U_
, u_int32_t doi _U_
,
2253 u_int32_t proto _U_
, int depth _U_
)
2255 struct isakmp_gen e
;
2258 unaligned_memcpy(&e
, ext
, sizeof(e
));
2259 ikev2_pay_print(ndo
, "nonce", e
.critical
);
2261 ND_PRINT((ndo
," len=%d", ntohs(e
.len
) - 4));
2262 if (1 < ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
2263 ND_PRINT((ndo
," nonce=("));
2264 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
2266 ND_PRINT((ndo
,") "));
2267 } else if(ndo
->ndo_vflag
&& 4 < ntohs(e
.len
)) {
2268 if(!ike_show_somedata(ndo
, (const u_char
*)(ext
+1), ep
)) goto trunc
;
2271 return (u_char
*)ext
+ ntohs(e
.len
);
2273 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2277 /* notify payloads */
2278 static const u_char
*
2279 ikev2_n_print(netdissect_options
*ndo
, u_char tpay _U_
,
2280 const struct isakmp_gen
*ext
,
2281 u_int item_len _U_
, const u_char
*ep _U_
,
2282 u_int32_t phase _U_
, u_int32_t doi _U_
,
2283 u_int32_t proto _U_
, int depth _U_
)
2285 struct ikev2_n
*p
, n
;
2287 u_char showspi
, showdata
, showsomedata
;
2288 const char *notify_name
;
2291 p
= (struct ikev2_n
*)ext
;
2293 unaligned_memcpy(&n
, ext
, sizeof(n
));
2294 ikev2_pay_print(ndo
, NPSTR(ISAKMP_NPTYPE_N
), n
.h
.critical
);
2301 ND_PRINT((ndo
," prot_id=%s", PROTOIDSTR(n
.prot_id
)));
2303 type
= ntohs(n
.type
);
2305 /* notify space is annoying sparse */
2307 case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD
:
2308 notify_name
= "unsupported_critical_payload";
2312 case IV2_NOTIFY_INVALID_IKE_SPI
:
2313 notify_name
= "invalid_ike_spi";
2317 case IV2_NOTIFY_INVALID_MAJOR_VERSION
:
2318 notify_name
= "invalid_major_version";
2322 case IV2_NOTIFY_INVALID_SYNTAX
:
2323 notify_name
= "invalid_syntax";
2327 case IV2_NOTIFY_INVALID_MESSAGE_ID
:
2328 notify_name
= "invalid_message_id";
2332 case IV2_NOTIFY_INVALID_SPI
:
2333 notify_name
= "invalid_spi";
2337 case IV2_NOTIFY_NO_PROPOSAL_CHOSEN
:
2338 notify_name
= "no_protocol_chosen";
2342 case IV2_NOTIFY_INVALID_KE_PAYLOAD
:
2343 notify_name
= "invalid_ke_payload";
2347 case IV2_NOTIFY_AUTHENTICATION_FAILED
:
2348 notify_name
= "authentication_failed";
2352 case IV2_NOTIFY_SINGLE_PAIR_REQUIRED
:
2353 notify_name
= "single_pair_required";
2357 case IV2_NOTIFY_NO_ADDITIONAL_SAS
:
2358 notify_name
= "no_additional_sas";
2362 case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE
:
2363 notify_name
= "internal_address_failure";
2367 case IV2_NOTIFY_FAILED_CP_REQUIRED
:
2368 notify_name
= "failed:cp_required";
2372 case IV2_NOTIFY_INVALID_SELECTORS
:
2373 notify_name
= "invalid_selectors";
2377 case IV2_NOTIFY_INITIAL_CONTACT
:
2378 notify_name
= "initial_contact";
2382 case IV2_NOTIFY_SET_WINDOW_SIZE
:
2383 notify_name
= "set_window_size";
2387 case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE
:
2388 notify_name
= "additional_ts_possible";
2392 case IV2_NOTIFY_IPCOMP_SUPPORTED
:
2393 notify_name
= "ipcomp_supported";
2397 case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP
:
2398 notify_name
= "nat_detection_source_ip";
2402 case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP
:
2403 notify_name
= "nat_detection_destination_ip";
2407 case IV2_NOTIFY_COOKIE
:
2408 notify_name
= "cookie";
2414 case IV2_NOTIFY_USE_TRANSPORT_MODE
:
2415 notify_name
= "use_transport_mode";
2419 case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED
:
2420 notify_name
= "http_cert_lookup_supported";
2424 case IV2_NOTIFY_REKEY_SA
:
2425 notify_name
= "rekey_sa";
2429 case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED
:
2430 notify_name
= "tfc_padding_not_supported";
2434 case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO
:
2435 notify_name
= "non_first_fragment_also";
2441 notify_name
="error";
2442 } else if(type
< 16384) {
2443 notify_name
="private-error";
2444 } else if(type
< 40960) {
2445 notify_name
="status";
2447 notify_name
="private-status";
2452 ND_PRINT((ndo
," type=%u(%s)", type
, notify_name
));
2456 if (showspi
&& n
.spi_size
) {
2457 ND_PRINT((ndo
," spi="));
2458 if (!rawprint(ndo
, (caddr_t
)(p
+ 1), n
.spi_size
))
2462 cp
= (u_char
*)(p
+ 1) + n
.spi_size
;
2464 if(3 < ndo
->ndo_vflag
) {
2468 if ((showdata
|| (showsomedata
&& ep
-cp
< 30)) && cp
< ep
) {
2469 ND_PRINT((ndo
," data=("));
2470 if (!rawprint(ndo
, (caddr_t
)(cp
), ep
- cp
))
2473 ND_PRINT((ndo
,")"));
2475 } else if(showsomedata
&& cp
< ep
) {
2476 if(!ike_show_somedata(ndo
, cp
, ep
)) goto trunc
;
2479 return (u_char
*)ext
+ item_len
;
2481 ND_PRINT((ndo
," [|%s]", NPSTR(ISAKMP_NPTYPE_N
)));
2485 static const u_char
*
2486 ikev2_d_print(netdissect_options
*ndo
, u_char tpay
,
2487 const struct isakmp_gen
*ext
,
2488 u_int item_len _U_
, const u_char
*ep _U_
,
2489 u_int32_t phase _U_
, u_int32_t doi _U_
,
2490 u_int32_t proto _U_
, int depth _U_
)
2492 return ikev2_gen_print(ndo
, tpay
, ext
);
2495 static const u_char
*
2496 ikev2_vid_print(netdissect_options
*ndo
, u_char tpay
,
2497 const struct isakmp_gen
*ext
,
2498 u_int item_len _U_
, const u_char
*ep _U_
,
2499 u_int32_t phase _U_
, u_int32_t doi _U_
,
2500 u_int32_t proto _U_
, int depth _U_
)
2502 struct isakmp_gen e
;
2507 unaligned_memcpy(&e
, ext
, sizeof(e
));
2508 ikev2_pay_print(ndo
, NPSTR(tpay
), e
.critical
);
2509 ND_PRINT((ndo
," len=%d vid=", ntohs(e
.len
) - 4));
2511 vid
= (const u_char
*)(ext
+1);
2512 len
= ntohs(e
.len
) - 4;
2513 ND_TCHECK2(*vid
, len
);
2514 for(i
=0; i
<len
; i
++) {
2515 if(isprint(vid
[i
])) ND_PRINT((ndo
, "%c", vid
[i
]));
2516 else ND_PRINT((ndo
, "."));
2518 if (2 < ndo
->ndo_vflag
&& 4 < len
) {
2519 ND_PRINT((ndo
," "));
2520 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), ntohs(e
.len
) - 4))
2523 return (u_char
*)ext
+ ntohs(e
.len
);
2525 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2529 static const u_char
*
2530 ikev2_TS_print(netdissect_options
*ndo
, u_char tpay
,
2531 const struct isakmp_gen
*ext
,
2532 u_int item_len _U_
, const u_char
*ep _U_
,
2533 u_int32_t phase _U_
, u_int32_t doi _U_
,
2534 u_int32_t proto _U_
, int depth _U_
)
2536 return ikev2_gen_print(ndo
, tpay
, ext
);
2539 static const u_char
*
2540 ikev2_e_print(netdissect_options
*ndo
,
2541 #ifndef HAVE_LIBCRYPTO
2544 struct isakmp
*base
,
2546 const struct isakmp_gen
*ext
,
2547 u_int item_len _U_
, const u_char
*ep _U_
,
2548 #ifndef HAVE_LIBCRYPTO
2552 #ifndef HAVE_LIBCRYPTO
2556 #ifndef HAVE_LIBCRYPTO
2560 #ifndef HAVE_LIBCRYPTO
2565 struct isakmp_gen e
;
2570 unaligned_memcpy(&e
, ext
, sizeof(e
));
2571 ikev2_pay_print(ndo
, NPSTR(tpay
), e
.critical
);
2573 dlen
= ntohs(e
.len
)-4;
2575 ND_PRINT((ndo
," len=%d", dlen
));
2576 if (2 < ndo
->ndo_vflag
&& 4 < dlen
) {
2577 ND_PRINT((ndo
," "));
2578 if (!rawprint(ndo
, (caddr_t
)(ext
+ 1), dlen
))
2582 dat
= (u_char
*)(ext
+1);
2583 ND_TCHECK2(*dat
, dlen
);
2585 #ifdef HAVE_LIBCRYPTO
2586 /* try to decypt it! */
2587 if(esp_print_decrypt_buffer_by_ikev2(ndo
,
2588 base
->flags
& ISAKMP_FLAG_I
,
2589 base
->i_ck
, base
->r_ck
,
2592 ext
= (const struct isakmp_gen
*)ndo
->ndo_packetp
;
2594 /* got it decrypted, print stuff inside. */
2595 ikev2_sub_print(ndo
, base
, e
.np
, ext
, ndo
->ndo_snapend
,
2596 phase
, doi
, proto
, depth
+1);
2601 /* always return NULL, because E must be at end, and NP refers
2602 * to what was inside.
2606 ND_PRINT((ndo
," [|%s]", NPSTR(tpay
)));
2610 static const u_char
*
2611 ikev2_cp_print(netdissect_options
*ndo
, u_char tpay
,
2612 const struct isakmp_gen
*ext
,
2613 u_int item_len _U_
, const u_char
*ep _U_
,
2614 u_int32_t phase _U_
, u_int32_t doi _U_
,
2615 u_int32_t proto _U_
, int depth _U_
)
2617 return ikev2_gen_print(ndo
, tpay
, ext
);
2620 static const u_char
*
2621 ikev2_eap_print(netdissect_options
*ndo
, u_char tpay
,
2622 const struct isakmp_gen
*ext
,
2623 u_int item_len _U_
, const u_char
*ep _U_
,
2624 u_int32_t phase _U_
, u_int32_t doi _U_
,
2625 u_int32_t proto _U_
, int depth _U_
)
2627 return ikev2_gen_print(ndo
, tpay
, ext
);
2630 static const u_char
*
2631 ike_sub0_print(netdissect_options
*ndo
,
2632 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2634 u_int32_t phase
, u_int32_t doi
, u_int32_t proto
, int depth
)
2637 struct isakmp_gen e
;
2642 unaligned_memcpy(&e
, ext
, sizeof(e
));
2645 * Since we can't have a payload length of less than 4 bytes,
2646 * we need to bail out here if the generic header is nonsensical
2647 * or truncated, otherwise we could loop forever processing
2648 * zero-length items or otherwise misdissect the packet.
2650 item_len
= ntohs(e
.len
);
2656 * XXX - what if item_len is too short, or too long,
2657 * for this payload type?
2659 cp
= (*npfunc
[np
])(ndo
, np
, ext
, item_len
, ep
, phase
, doi
, proto
, depth
);
2661 ND_PRINT((ndo
,"%s", NPSTR(np
)));
2667 ND_PRINT((ndo
," [|isakmp]"));
2671 static const u_char
*
2672 ikev1_sub_print(netdissect_options
*ndo
,
2673 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2674 u_int32_t phase
, u_int32_t doi
, u_int32_t proto
, int depth
)
2678 struct isakmp_gen e
;
2680 cp
= (const u_char
*)ext
;
2685 unaligned_memcpy(&e
, ext
, sizeof(e
));
2687 ND_TCHECK2(*ext
, ntohs(e
.len
));
2690 ND_PRINT((ndo
,"\n"));
2691 for (i
= 0; i
< depth
; i
++)
2692 ND_PRINT((ndo
," "));
2693 ND_PRINT((ndo
,"("));
2694 cp
= ike_sub0_print(ndo
, np
, ext
, ep
, phase
, doi
, proto
, depth
);
2695 ND_PRINT((ndo
,")"));
2699 /* Zero-length subitem */
2704 ext
= (struct isakmp_gen
*)cp
;
2708 ND_PRINT((ndo
," [|%s]", NPSTR(np
)));
2715 static char buf
[20];
2716 snprintf(buf
, sizeof(buf
), "#%d", x
);
2721 ikev1_print(netdissect_options
*ndo
,
2722 const u_char
*bp
, u_int length
,
2723 const u_char
*bp2
, struct isakmp
*base
)
2725 const struct isakmp
*p
;
2731 p
= (const struct isakmp
*)bp
;
2732 ep
= ndo
->ndo_snapend
;
2734 phase
= (EXTRACT_32BITS(base
->msgid
) == 0) ? 1 : 2;
2736 ND_PRINT((ndo
," phase %d", phase
));
2738 ND_PRINT((ndo
," phase %d/others", phase
));
2740 i
= cookie_find(&base
->i_ck
);
2742 if (iszero((u_char
*)&base
->r_ck
, sizeof(base
->r_ck
))) {
2743 /* the first packet */
2744 ND_PRINT((ndo
," I"));
2746 cookie_record(&base
->i_ck
, bp2
);
2748 ND_PRINT((ndo
," ?"));
2750 if (bp2
&& cookie_isinitiator(i
, bp2
))
2751 ND_PRINT((ndo
," I"));
2752 else if (bp2
&& cookie_isresponder(i
, bp2
))
2753 ND_PRINT((ndo
," R"));
2755 ND_PRINT((ndo
," ?"));
2758 ND_PRINT((ndo
," %s", ETYPESTR(base
->etype
)));
2760 ND_PRINT((ndo
,"[%s%s]", base
->flags
& ISAKMP_FLAG_E
? "E" : "",
2761 base
->flags
& ISAKMP_FLAG_C
? "C" : ""));
2764 if (ndo
->ndo_vflag
) {
2765 const struct isakmp_gen
*ext
;
2767 ND_PRINT((ndo
,":"));
2769 /* regardless of phase... */
2770 if (base
->flags
& ISAKMP_FLAG_E
) {
2772 * encrypted, nothing we can do right now.
2773 * we hope to decrypt the packet in the future...
2775 ND_PRINT((ndo
," [encrypted %s]", NPSTR(base
->np
)));
2779 CHECKLEN(p
+ 1, base
->np
);
2781 ext
= (struct isakmp_gen
*)(p
+ 1);
2782 ikev1_sub_print(ndo
, np
, ext
, ep
, phase
, 0, 0, 0);
2786 if (ndo
->ndo_vflag
) {
2787 if (ntohl(base
->len
) != length
) {
2788 ND_PRINT((ndo
," (len mismatch: isakmp %u/ip %u)",
2789 (u_int32_t
)ntohl(base
->len
), length
));
2794 static const u_char
*
2795 ikev2_sub0_print(netdissect_options
*ndo
, struct isakmp
*base
,
2796 u_char np
, int pcount
,
2797 const struct isakmp_gen
*ext
, const u_char
*ep
,
2798 u_int32_t phase
, u_int32_t doi
, u_int32_t proto
, int depth
)
2801 struct isakmp_gen e
;
2806 unaligned_memcpy(&e
, ext
, sizeof(e
));
2809 * Since we can't have a payload length of less than 4 bytes,
2810 * we need to bail out here if the generic header is nonsensical
2811 * or truncated, otherwise we could loop forever processing
2812 * zero-length items or otherwise misdissect the packet.
2814 item_len
= ntohs(e
.len
);
2818 if(np
== ISAKMP_NPTYPE_P
) {
2819 cp
= ikev2_p_print(ndo
, np
, pcount
, ext
, item_len
,
2820 ep
, phase
, doi
, proto
, depth
);
2821 } else if(np
== ISAKMP_NPTYPE_T
) {
2822 cp
= ikev2_t_print(ndo
, np
, pcount
, ext
, item_len
,
2823 ep
, phase
, doi
, proto
, depth
);
2824 } else if(np
== ISAKMP_NPTYPE_v2E
) {
2825 cp
= ikev2_e_print(ndo
, base
, np
, ext
, item_len
,
2826 ep
, phase
, doi
, proto
, depth
);
2827 } else if (NPFUNC(np
)) {
2829 * XXX - what if item_len is too short, or too long,
2830 * for this payload type?
2832 cp
= (*npfunc
[np
])(ndo
, np
, /*pcount,*/ ext
, item_len
,
2833 ep
, phase
, doi
, proto
, depth
);
2835 ND_PRINT((ndo
,"%s", NPSTR(np
)));
2841 ND_PRINT((ndo
," [|isakmp]"));
2845 static const u_char
*
2846 ikev2_sub_print(netdissect_options
*ndo
,
2847 struct isakmp
*base
,
2848 u_char np
, const struct isakmp_gen
*ext
, const u_char
*ep
,
2849 u_int32_t phase
, u_int32_t doi
, u_int32_t proto
, int depth
)
2854 struct isakmp_gen e
;
2856 cp
= (const u_char
*)ext
;
2862 unaligned_memcpy(&e
, ext
, sizeof(e
));
2864 ND_TCHECK2(*ext
, ntohs(e
.len
));
2867 ND_PRINT((ndo
,"\n"));
2868 for (i
= 0; i
< depth
; i
++)
2869 ND_PRINT((ndo
," "));
2870 ND_PRINT((ndo
,"("));
2871 cp
= ikev2_sub0_print(ndo
, base
, np
, pcount
,
2872 ext
, ep
, phase
, doi
, proto
, depth
);
2873 ND_PRINT((ndo
,")"));
2877 /* Zero-length subitem */
2882 ext
= (struct isakmp_gen
*)cp
;
2886 ND_PRINT((ndo
," [|%s]", NPSTR(np
)));
2891 ikev2_print(netdissect_options
*ndo
,
2892 const u_char
*bp
, u_int length
,
2893 const u_char
*bp2 _U_
, struct isakmp
*base
)
2895 const struct isakmp
*p
;
2900 p
= (const struct isakmp
*)bp
;
2901 ep
= ndo
->ndo_snapend
;
2903 phase
= (EXTRACT_32BITS(base
->msgid
) == 0) ? 1 : 2;
2905 ND_PRINT((ndo
, " parent_sa"));
2907 ND_PRINT((ndo
, " child_sa "));
2909 ND_PRINT((ndo
, " %s", ETYPESTR(base
->etype
)));
2911 ND_PRINT((ndo
, "[%s%s%s]",
2912 base
->flags
& ISAKMP_FLAG_I
? "I" : "",
2913 base
->flags
& ISAKMP_FLAG_V
? "V" : "",
2914 base
->flags
& ISAKMP_FLAG_R
? "R" : ""));
2917 if (ndo
->ndo_vflag
) {
2918 const struct isakmp_gen
*ext
;
2920 ND_PRINT((ndo
, ":"));
2922 /* regardless of phase... */
2923 if (base
->flags
& ISAKMP_FLAG_E
) {
2925 * encrypted, nothing we can do right now.
2926 * we hope to decrypt the packet in the future...
2928 ND_PRINT((ndo
, " [encrypted %s]", NPSTR(base
->np
)));
2932 CHECKLEN(p
+ 1, base
->np
)
2935 ext
= (struct isakmp_gen
*)(p
+ 1);
2936 ikev2_sub_print(ndo
, base
, np
, ext
, ep
, phase
, 0, 0, 0);
2940 if (ndo
->ndo_vflag
) {
2941 if (ntohl(base
->len
) != length
) {
2942 ND_PRINT((ndo
, " (len mismatch: isakmp %u/ip %u)",
2943 (u_int32_t
)ntohl(base
->len
), length
));
2949 isakmp_print(netdissect_options
*ndo
,
2950 const u_char
*bp
, u_int length
,
2953 const struct isakmp
*p
;
2958 #ifdef HAVE_LIBCRYPTO
2959 /* initialize SAs */
2960 if (ndo
->ndo_sa_list_head
== NULL
) {
2961 if (ndo
->ndo_espsecret
)
2962 esp_print_decodesecret(ndo
);
2966 p
= (const struct isakmp
*)bp
;
2967 ep
= ndo
->ndo_snapend
;
2969 if ((struct isakmp
*)ep
< p
+ 1) {
2970 ND_PRINT((ndo
,"[|isakmp]"));
2974 unaligned_memcpy(&base
, p
, sizeof(base
));
2976 ND_PRINT((ndo
,"isakmp"));
2977 major
= (base
.vers
& ISAKMP_VERS_MAJOR
)
2978 >> ISAKMP_VERS_MAJOR_SHIFT
;
2979 minor
= (base
.vers
& ISAKMP_VERS_MINOR
)
2980 >> ISAKMP_VERS_MINOR_SHIFT
;
2982 if (ndo
->ndo_vflag
) {
2983 ND_PRINT((ndo
," %d.%d", major
, minor
));
2986 if (ndo
->ndo_vflag
) {
2987 ND_PRINT((ndo
," msgid "));
2988 hexprint(ndo
, (caddr_t
)&base
.msgid
, sizeof(base
.msgid
));
2991 if (1 < ndo
->ndo_vflag
) {
2992 ND_PRINT((ndo
," cookie "));
2993 hexprint(ndo
, (caddr_t
)&base
.i_ck
, sizeof(base
.i_ck
));
2994 ND_PRINT((ndo
,"->"));
2995 hexprint(ndo
, (caddr_t
)&base
.r_ck
, sizeof(base
.r_ck
));
2997 ND_PRINT((ndo
,":"));
3000 case IKEv1_MAJOR_VERSION
:
3001 ikev1_print(ndo
, bp
, length
, bp2
, &base
);
3004 case IKEv2_MAJOR_VERSION
:
3005 ikev2_print(ndo
, bp
, length
, bp2
, &base
);
3011 isakmp_rfc3948_print(netdissect_options
*ndo
,
3012 const u_char
*bp
, u_int length
,
3016 if(length
== 1 && bp
[0]==0xff) {
3017 ND_PRINT((ndo
, "isakmp-nat-keep-alive"));
3026 * see if this is an IKE packet
3028 if(bp
[0]==0 && bp
[1]==0 && bp
[2]==0 && bp
[3]==0) {
3029 ND_PRINT((ndo
, "NONESP-encap: "));
3030 isakmp_print(ndo
, bp
+4, length
-4, bp2
);
3034 /* must be an ESP packet */
3036 int nh
, enh
, padlen
;
3039 ND_PRINT((ndo
, "UDP-encap: "));
3041 advance
= esp_print(ndo
, bp
, length
, bp2
, &enh
, &padlen
);
3046 length
-= advance
+ padlen
;
3049 ip_print_inner(ndo
, bp
, length
, nh
, bp2
);
3054 ND_PRINT((ndo
,"[|isakmp]"));
3060 * c-style: whitesmith