xref: /dragonfly/contrib/tcpdump/print-isakmp.c (revision 8af44722)
1 /*
2  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
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.
16  *
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
27  * SUCH DAMAGE.
28  *
29  */
30 
31 /* \summary: Internet Security Association and Key Management Protocol (ISAKMP) printer */
32 
33 #ifdef HAVE_CONFIG_H
34 #include "config.h"
35 #endif
36 
37 /* The functions from print-esp.c used in this file are only defined when both
38  * OpenSSL and evp.h are detected. Employ the same preprocessor device here.
39  */
40 #ifndef HAVE_OPENSSL_EVP_H
41 #undef HAVE_LIBCRYPTO
42 #endif
43 
44 #include <netdissect-stdinc.h>
45 
46 #include <string.h>
47 
48 #include "netdissect.h"
49 #include "addrtoname.h"
50 #include "extract.h"
51 
52 #include "ip.h"
53 #include "ip6.h"
54 #include "ipproto.h"
55 
56 /* refer to RFC 2408 */
57 
58 typedef u_char cookie_t[8];
59 typedef u_char msgid_t[4];
60 
61 #define PORT_ISAKMP 500
62 
63 /* 3.1 ISAKMP Header Format (IKEv1 and IKEv2)
64          0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
65         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
66         !                          Initiator                            !
67         !                            Cookie                             !
68         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
69         !                          Responder                            !
70         !                            Cookie                             !
71         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72         !  Next Payload ! MjVer ! MnVer ! Exchange Type !     Flags     !
73         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74         !                          Message ID                           !
75         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
76         !                            Length                             !
77         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
78 */
79 struct isakmp {
80 	cookie_t i_ck;		/* Initiator Cookie */
81 	cookie_t r_ck;		/* Responder Cookie */
82 	uint8_t np;		/* Next Payload Type */
83 	uint8_t vers;
84 #define ISAKMP_VERS_MAJOR	0xf0
85 #define ISAKMP_VERS_MAJOR_SHIFT	4
86 #define ISAKMP_VERS_MINOR	0x0f
87 #define ISAKMP_VERS_MINOR_SHIFT	0
88 	uint8_t etype;		/* Exchange Type */
89 	uint8_t flags;		/* Flags */
90 	msgid_t msgid;
91 	uint32_t len;		/* Length */
92 };
93 
94 /* Next Payload Type */
95 #define ISAKMP_NPTYPE_NONE   0 /* NONE*/
96 #define ISAKMP_NPTYPE_SA     1 /* Security Association */
97 #define ISAKMP_NPTYPE_P      2 /* Proposal */
98 #define ISAKMP_NPTYPE_T      3 /* Transform */
99 #define ISAKMP_NPTYPE_KE     4 /* Key Exchange */
100 #define ISAKMP_NPTYPE_ID     5 /* Identification */
101 #define ISAKMP_NPTYPE_CERT   6 /* Certificate */
102 #define ISAKMP_NPTYPE_CR     7 /* Certificate Request */
103 #define ISAKMP_NPTYPE_HASH   8 /* Hash */
104 #define ISAKMP_NPTYPE_SIG    9 /* Signature */
105 #define ISAKMP_NPTYPE_NONCE 10 /* Nonce */
106 #define ISAKMP_NPTYPE_N     11 /* Notification */
107 #define ISAKMP_NPTYPE_D     12 /* Delete */
108 #define ISAKMP_NPTYPE_VID   13 /* Vendor ID */
109 #define ISAKMP_NPTYPE_v2E   46 /* v2 Encrypted payload */
110 
111 #define IKEv1_MAJOR_VERSION  1
112 #define IKEv1_MINOR_VERSION  0
113 
114 #define IKEv2_MAJOR_VERSION  2
115 #define IKEv2_MINOR_VERSION  0
116 
117 /* Flags */
118 #define ISAKMP_FLAG_E 0x01 /* Encryption Bit */
119 #define ISAKMP_FLAG_C 0x02 /* Commit Bit */
120 #define ISAKMP_FLAG_extra 0x04
121 
122 /* IKEv2 */
123 #define ISAKMP_FLAG_I (1 << 3)  /* (I)nitiator */
124 #define ISAKMP_FLAG_V (1 << 4)  /* (V)ersion   */
125 #define ISAKMP_FLAG_R (1 << 5)  /* (R)esponse  */
126 
127 
128 /* 3.2 Payload Generic Header
129          0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
130         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
131         ! Next Payload  !   RESERVED    !         Payload Length        !
132         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
133 */
134 struct isakmp_gen {
135 	uint8_t  np;       /* Next Payload */
136 	uint8_t  critical; /* bit 7 - critical, rest is RESERVED */
137 	uint16_t len;      /* Payload Length */
138 };
139 
140 /* 3.3 Data Attributes
141          0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
142         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
143         !A!       Attribute Type        !    AF=0  Attribute Length     !
144         !F!                             !    AF=1  Attribute Value      !
145         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
146         .                   AF=0  Attribute Value                       .
147         .                   AF=1  Not Transmitted                       .
148         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
149 */
150 struct isakmp_data {
151 	uint16_t type;     /* defined by DOI-spec, and Attribute Format */
152 	uint16_t lorv;     /* if f equal 1, Attribute Length */
153 	                  /* if f equal 0, Attribute Value */
154 	/* if f equal 1, Attribute Value */
155 };
156 
157 /* 3.4 Security Association Payload */
158 	/* MAY NOT be used, because of being defined in ipsec-doi. */
159 	/*
160 	If the current payload is the last in the message,
161 	then the value of the next payload field will be 0.
162 	This field MUST NOT contain the
163 	values for the Proposal or Transform payloads as they are considered
164 	part of the security association negotiation.  For example, this
165 	field would contain the value "10" (Nonce payload) in the first
166 	message of a Base Exchange (see Section 4.4) and the value "0" in the
167 	first message of an Identity Protect Exchange (see Section 4.5).
168 	*/
169 struct ikev1_pl_sa {
170 	struct isakmp_gen h;
171 	uint32_t doi; /* Domain of Interpretation */
172 	uint32_t sit; /* Situation */
173 };
174 
175 /* 3.5 Proposal Payload */
176 	/*
177 	The value of the next payload field MUST only contain the value "2"
178 	or "0".  If there are additional Proposal payloads in the message,
179 	then this field will be 2.  If the current Proposal payload is the
180 	last within the security association proposal, then this field will
181 	be 0.
182 	*/
183 struct ikev1_pl_p {
184 	struct isakmp_gen h;
185 	uint8_t p_no;      /* Proposal # */
186 	uint8_t prot_id;   /* Protocol */
187 	uint8_t spi_size;  /* SPI Size */
188 	uint8_t num_t;     /* Number of Transforms */
189 	/* SPI */
190 };
191 
192 /* 3.6 Transform Payload */
193 	/*
194 	The value of the next payload field MUST only contain the value "3"
195 	or "0".  If there are additional Transform payloads in the proposal,
196 	then this field will be 3.  If the current Transform payload is the
197 	last within the proposal, then this field will be 0.
198 	*/
199 struct ikev1_pl_t {
200 	struct isakmp_gen h;
201 	uint8_t  t_no;     /* Transform # */
202 	uint8_t  t_id;     /* Transform-Id */
203 	uint16_t reserved; /* RESERVED2 */
204 	/* SA Attributes */
205 };
206 
207 /* 3.7 Key Exchange Payload */
208 struct ikev1_pl_ke {
209 	struct isakmp_gen h;
210 	/* Key Exchange Data */
211 };
212 
213 /* 3.8 Identification Payload */
214 	/* MUST NOT to be used, because of being defined in ipsec-doi. */
215 struct ikev1_pl_id {
216 	struct isakmp_gen h;
217 	union {
218 		uint8_t  id_type;   /* ID Type */
219 		uint32_t doi_data;  /* DOI Specific ID Data */
220 	} d;
221 	/* Identification Data */
222 };
223 
224 /* 3.9 Certificate Payload */
225 struct ikev1_pl_cert {
226 	struct isakmp_gen h;
227 	uint8_t encode; /* Cert Encoding */
228 	char   cert;   /* Certificate Data */
229 		/*
230 		This field indicates the type of
231 		certificate or certificate-related information contained in the
232 		Certificate Data field.
233 		*/
234 };
235 
236 /* 3.10 Certificate Request Payload */
237 struct ikev1_pl_cr {
238 	struct isakmp_gen h;
239 	uint8_t num_cert; /* # Cert. Types */
240 	/*
241 	Certificate Types (variable length)
242 	  -- Contains a list of the types of certificates requested,
243 	  sorted in order of preference.  Each individual certificate
244 	  type is 1 octet.  This field is NOT requiredo
245 	*/
246 	/* # Certificate Authorities (1 octet) */
247 	/* Certificate Authorities (variable length) */
248 };
249 
250 /* 3.11 Hash Payload */
251 	/* may not be used, because of having only data. */
252 struct ikev1_pl_hash {
253 	struct isakmp_gen h;
254 	/* Hash Data */
255 };
256 
257 /* 3.12 Signature Payload */
258 	/* may not be used, because of having only data. */
259 struct ikev1_pl_sig {
260 	struct isakmp_gen h;
261 	/* Signature Data */
262 };
263 
264 /* 3.13 Nonce Payload */
265 	/* may not be used, because of having only data. */
266 struct ikev1_pl_nonce {
267 	struct isakmp_gen h;
268 	/* Nonce Data */
269 };
270 
271 /* 3.14 Notification Payload */
272 struct ikev1_pl_n {
273 	struct isakmp_gen h;
274 	uint32_t doi;      /* Domain of Interpretation */
275 	uint8_t  prot_id;  /* Protocol-ID */
276 	uint8_t  spi_size; /* SPI Size */
277 	uint16_t type;     /* Notify Message Type */
278 	/* SPI */
279 	/* Notification Data */
280 };
281 
282 /* 3.14.1 Notify Message Types */
283 /* NOTIFY MESSAGES - ERROR TYPES */
284 #define ISAKMP_NTYPE_INVALID_PAYLOAD_TYPE           1
285 #define ISAKMP_NTYPE_DOI_NOT_SUPPORTED              2
286 #define ISAKMP_NTYPE_SITUATION_NOT_SUPPORTED        3
287 #define ISAKMP_NTYPE_INVALID_COOKIE                 4
288 #define ISAKMP_NTYPE_INVALID_MAJOR_VERSION          5
289 #define ISAKMP_NTYPE_INVALID_MINOR_VERSION          6
290 #define ISAKMP_NTYPE_INVALID_EXCHANGE_TYPE          7
291 #define ISAKMP_NTYPE_INVALID_FLAGS                  8
292 #define ISAKMP_NTYPE_INVALID_MESSAGE_ID             9
293 #define ISAKMP_NTYPE_INVALID_PROTOCOL_ID            10
294 #define ISAKMP_NTYPE_INVALID_SPI                    11
295 #define ISAKMP_NTYPE_INVALID_TRANSFORM_ID           12
296 #define ISAKMP_NTYPE_ATTRIBUTES_NOT_SUPPORTED       13
297 #define ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN             14
298 #define ISAKMP_NTYPE_BAD_PROPOSAL_SYNTAX            15
299 #define ISAKMP_NTYPE_PAYLOAD_MALFORMED              16
300 #define ISAKMP_NTYPE_INVALID_KEY_INFORMATION        17
301 #define ISAKMP_NTYPE_INVALID_ID_INFORMATION         18
302 #define ISAKMP_NTYPE_INVALID_CERT_ENCODING          19
303 #define ISAKMP_NTYPE_INVALID_CERTIFICATE            20
304 #define ISAKMP_NTYPE_BAD_CERT_REQUEST_SYNTAX        21
305 #define ISAKMP_NTYPE_INVALID_CERT_AUTHORITY         22
306 #define ISAKMP_NTYPE_INVALID_HASH_INFORMATION       23
307 #define ISAKMP_NTYPE_AUTHENTICATION_FAILED          24
308 #define ISAKMP_NTYPE_INVALID_SIGNATURE              25
309 #define ISAKMP_NTYPE_ADDRESS_NOTIFICATION           26
310 
311 /* 3.15 Delete Payload */
312 struct ikev1_pl_d {
313 	struct isakmp_gen h;
314 	uint32_t doi;      /* Domain of Interpretation */
315 	uint8_t  prot_id;  /* Protocol-Id */
316 	uint8_t  spi_size; /* SPI Size */
317 	uint16_t num_spi;  /* # of SPIs */
318 	/* SPI(es) */
319 };
320 
321 struct ikev1_ph1tab {
322 	struct ikev1_ph1 *head;
323 	struct ikev1_ph1 *tail;
324 	int len;
325 };
326 
327 struct isakmp_ph2tab {
328 	struct ikev1_ph2 *head;
329 	struct ikev1_ph2 *tail;
330 	int len;
331 };
332 
333 /* IKEv2 (RFC4306) */
334 
335 /* 3.3  Security Association Payload -- generic header */
336 /* 3.3.1.  Proposal Substructure */
337 struct ikev2_p {
338 	struct isakmp_gen h;
339 	uint8_t p_no;      /* Proposal # */
340 	uint8_t prot_id;   /* Protocol */
341 	uint8_t spi_size;  /* SPI Size */
342 	uint8_t num_t;     /* Number of Transforms */
343 };
344 
345 /* 3.3.2.  Transform Substructure */
346 struct ikev2_t {
347 	struct isakmp_gen h;
348 	uint8_t t_type;    /* Transform Type (ENCR,PRF,INTEG,etc.*/
349 	uint8_t res2;      /* reserved byte */
350 	uint16_t t_id;     /* Transform ID */
351 };
352 
353 enum ikev2_t_type {
354 	IV2_T_ENCR = 1,
355 	IV2_T_PRF  = 2,
356 	IV2_T_INTEG= 3,
357 	IV2_T_DH   = 4,
358 	IV2_T_ESN  = 5
359 };
360 
361 /* 3.4.  Key Exchange Payload */
362 struct ikev2_ke {
363 	struct isakmp_gen h;
364 	uint16_t  ke_group;
365 	uint16_t  ke_res1;
366 	/* KE data */
367 };
368 
369 
370 /* 3.5.  Identification Payloads */
371 enum ikev2_id_type {
372 	ID_IPV4_ADDR=1,
373 	ID_FQDN=2,
374 	ID_RFC822_ADDR=3,
375 	ID_IPV6_ADDR=5,
376 	ID_DER_ASN1_DN=9,
377 	ID_DER_ASN1_GN=10,
378 	ID_KEY_ID=11
379 };
380 struct ikev2_id {
381 	struct isakmp_gen h;
382 	uint8_t  type;        /* ID type */
383 	uint8_t  res1;
384 	uint16_t res2;
385 	/* SPI */
386 	/* Notification Data */
387 };
388 
389 /* 3.10 Notification Payload */
390 struct ikev2_n {
391 	struct isakmp_gen h;
392 	uint8_t  prot_id;  /* Protocol-ID */
393 	uint8_t  spi_size; /* SPI Size */
394 	uint16_t type;     /* Notify Message Type */
395 };
396 
397 enum ikev2_n_type {
398 	IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD            = 1,
399 	IV2_NOTIFY_INVALID_IKE_SPI                         = 4,
400 	IV2_NOTIFY_INVALID_MAJOR_VERSION                   = 5,
401 	IV2_NOTIFY_INVALID_SYNTAX                          = 7,
402 	IV2_NOTIFY_INVALID_MESSAGE_ID                      = 9,
403 	IV2_NOTIFY_INVALID_SPI                             =11,
404 	IV2_NOTIFY_NO_PROPOSAL_CHOSEN                      =14,
405 	IV2_NOTIFY_INVALID_KE_PAYLOAD                      =17,
406 	IV2_NOTIFY_AUTHENTICATION_FAILED                   =24,
407 	IV2_NOTIFY_SINGLE_PAIR_REQUIRED                    =34,
408 	IV2_NOTIFY_NO_ADDITIONAL_SAS                       =35,
409 	IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE                =36,
410 	IV2_NOTIFY_FAILED_CP_REQUIRED                      =37,
411 	IV2_NOTIFY_INVALID_SELECTORS                       =39,
412 	IV2_NOTIFY_INITIAL_CONTACT                         =16384,
413 	IV2_NOTIFY_SET_WINDOW_SIZE                         =16385,
414 	IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE                  =16386,
415 	IV2_NOTIFY_IPCOMP_SUPPORTED                        =16387,
416 	IV2_NOTIFY_NAT_DETECTION_SOURCE_IP                 =16388,
417 	IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP            =16389,
418 	IV2_NOTIFY_COOKIE                                  =16390,
419 	IV2_NOTIFY_USE_TRANSPORT_MODE                      =16391,
420 	IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED              =16392,
421 	IV2_NOTIFY_REKEY_SA                                =16393,
422 	IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED           =16394,
423 	IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO                =16395
424 };
425 
426 struct notify_messages {
427 	uint16_t type;
428 	char     *msg;
429 };
430 
431 /* 3.8 Authentication Payload */
432 struct ikev2_auth {
433 	struct isakmp_gen h;
434 	uint8_t  auth_method;  /* Protocol-ID */
435 	uint8_t  reserved[3];
436 	/* authentication data */
437 };
438 
439 enum ikev2_auth_type {
440 	IV2_RSA_SIG = 1,
441 	IV2_SHARED  = 2,
442 	IV2_DSS_SIG = 3
443 };
444 
445 /* refer to RFC 2409 */
446 
447 #if 0
448 /* isakmp sa structure */
449 struct oakley_sa {
450 	uint8_t  proto_id;            /* OAKLEY */
451 	vchar_t   *spi;                /* spi */
452 	uint8_t  dhgrp;               /* DH; group */
453 	uint8_t  auth_t;              /* method of authentication */
454 	uint8_t  prf_t;               /* type of prf */
455 	uint8_t  hash_t;              /* type of hash */
456 	uint8_t  enc_t;               /* type of cipher */
457 	uint8_t  life_t;              /* type of duration of lifetime */
458 	uint32_t ldur;                /* life duration */
459 };
460 #endif
461 
462 /* refer to RFC 2407 */
463 
464 #define IPSEC_DOI 1
465 
466 /* 4.2 IPSEC Situation Definition */
467 #define IPSECDOI_SIT_IDENTITY_ONLY           0x00000001
468 #define IPSECDOI_SIT_SECRECY                 0x00000002
469 #define IPSECDOI_SIT_INTEGRITY               0x00000004
470 
471 /* 4.4.1 IPSEC Security Protocol Identifiers */
472   /* 4.4.2 IPSEC ISAKMP Transform Values */
473 #define IPSECDOI_PROTO_ISAKMP                        1
474 #define   IPSECDOI_KEY_IKE                             1
475 
476 /* 4.4.1 IPSEC Security Protocol Identifiers */
477 #define IPSECDOI_PROTO_IPSEC_AH                      2
478   /* 4.4.3 IPSEC AH Transform Values */
479 #define   IPSECDOI_AH_MD5                              2
480 #define   IPSECDOI_AH_SHA                              3
481 #define   IPSECDOI_AH_DES                              4
482 #define   IPSECDOI_AH_SHA2_256                         5
483 #define   IPSECDOI_AH_SHA2_384                         6
484 #define   IPSECDOI_AH_SHA2_512                         7
485 
486 /* 4.4.1 IPSEC Security Protocol Identifiers */
487 #define IPSECDOI_PROTO_IPSEC_ESP                     3
488   /* 4.4.4 IPSEC ESP Transform Identifiers */
489 #define   IPSECDOI_ESP_DES_IV64                        1
490 #define   IPSECDOI_ESP_DES                             2
491 #define   IPSECDOI_ESP_3DES                            3
492 #define   IPSECDOI_ESP_RC5                             4
493 #define   IPSECDOI_ESP_IDEA                            5
494 #define   IPSECDOI_ESP_CAST                            6
495 #define   IPSECDOI_ESP_BLOWFISH                        7
496 #define   IPSECDOI_ESP_3IDEA                           8
497 #define   IPSECDOI_ESP_DES_IV32                        9
498 #define   IPSECDOI_ESP_RC4                            10
499 #define   IPSECDOI_ESP_NULL                           11
500 #define   IPSECDOI_ESP_RIJNDAEL				12
501 #define   IPSECDOI_ESP_AES				12
502 
503 /* 4.4.1 IPSEC Security Protocol Identifiers */
504 #define IPSECDOI_PROTO_IPCOMP                        4
505   /* 4.4.5 IPSEC IPCOMP Transform Identifiers */
506 #define   IPSECDOI_IPCOMP_OUI                          1
507 #define   IPSECDOI_IPCOMP_DEFLATE                      2
508 #define   IPSECDOI_IPCOMP_LZS                          3
509 
510 /* 4.5 IPSEC Security Association Attributes */
511 #define IPSECDOI_ATTR_SA_LTYPE                1 /* B */
512 #define   IPSECDOI_ATTR_SA_LTYPE_DEFAULT        1
513 #define   IPSECDOI_ATTR_SA_LTYPE_SEC            1
514 #define   IPSECDOI_ATTR_SA_LTYPE_KB             2
515 #define IPSECDOI_ATTR_SA_LDUR                 2 /* V */
516 #define   IPSECDOI_ATTR_SA_LDUR_DEFAULT         28800 /* 8 hours */
517 #define IPSECDOI_ATTR_GRP_DESC                3 /* B */
518 #define IPSECDOI_ATTR_ENC_MODE                4 /* B */
519 	/* default value: host dependent */
520 #define   IPSECDOI_ATTR_ENC_MODE_TUNNEL         1
521 #define   IPSECDOI_ATTR_ENC_MODE_TRNS           2
522 #define IPSECDOI_ATTR_AUTH                    5 /* B */
523 	/* 0 means not to use authentication. */
524 #define   IPSECDOI_ATTR_AUTH_HMAC_MD5           1
525 #define   IPSECDOI_ATTR_AUTH_HMAC_SHA1          2
526 #define   IPSECDOI_ATTR_AUTH_DES_MAC            3
527 #define   IPSECDOI_ATTR_AUTH_KPDK               4 /*RFC-1826(Key/Pad/Data/Key)*/
528 	/*
529 	 * When negotiating ESP without authentication, the Auth
530 	 * Algorithm attribute MUST NOT be included in the proposal.
531 	 * When negotiating ESP without confidentiality, the Auth
532 	 * Algorithm attribute MUST be included in the proposal and
533 	 * the ESP transform ID must be ESP_NULL.
534 	*/
535 #define IPSECDOI_ATTR_KEY_LENGTH              6 /* B */
536 #define IPSECDOI_ATTR_KEY_ROUNDS              7 /* B */
537 #define IPSECDOI_ATTR_COMP_DICT_SIZE          8 /* B */
538 #define IPSECDOI_ATTR_COMP_PRIVALG            9 /* V */
539 
540 /* 4.6.1 Security Association Payload */
541 struct ipsecdoi_sa {
542 	struct isakmp_gen h;
543 	uint32_t doi; /* Domain of Interpretation */
544 	uint32_t sit; /* Situation */
545 };
546 
547 struct ipsecdoi_secrecy_h {
548 	uint16_t len;
549 	uint16_t reserved;
550 };
551 
552 /* 4.6.2.1 Identification Type Values */
553 struct ipsecdoi_id {
554 	struct isakmp_gen h;
555 	uint8_t  type;		/* ID Type */
556 	uint8_t  proto_id;	/* Protocol ID */
557 	uint16_t port;		/* Port */
558 	/* Identification Data */
559 };
560 
561 #define IPSECDOI_ID_IPV4_ADDR                        1
562 #define IPSECDOI_ID_FQDN                             2
563 #define IPSECDOI_ID_USER_FQDN                        3
564 #define IPSECDOI_ID_IPV4_ADDR_SUBNET                 4
565 #define IPSECDOI_ID_IPV6_ADDR                        5
566 #define IPSECDOI_ID_IPV6_ADDR_SUBNET                 6
567 #define IPSECDOI_ID_IPV4_ADDR_RANGE                  7
568 #define IPSECDOI_ID_IPV6_ADDR_RANGE                  8
569 #define IPSECDOI_ID_DER_ASN1_DN                      9
570 #define IPSECDOI_ID_DER_ASN1_GN                      10
571 #define IPSECDOI_ID_KEY_ID                           11
572 
573 /* 4.6.3 IPSEC DOI Notify Message Types */
574 /* Notify Messages - Status Types */
575 #define IPSECDOI_NTYPE_RESPONDER_LIFETIME                  24576
576 #define IPSECDOI_NTYPE_REPLAY_STATUS                       24577
577 #define IPSECDOI_NTYPE_INITIAL_CONTACT                     24578
578 
579 #define DECLARE_PRINTER(func) static const u_char *ike##func##_print( \
580 		netdissect_options *ndo, u_char tpay,	              \
581 		const struct isakmp_gen *ext,			      \
582 		u_int item_len, \
583 		const u_char *end_pointer, \
584 		uint32_t phase,\
585 		uint32_t doi0, \
586 		uint32_t proto0, int depth)
587 
588 DECLARE_PRINTER(v1_sa);
589 DECLARE_PRINTER(v1_p);
590 DECLARE_PRINTER(v1_t);
591 DECLARE_PRINTER(v1_ke);
592 DECLARE_PRINTER(v1_id);
593 DECLARE_PRINTER(v1_cert);
594 DECLARE_PRINTER(v1_cr);
595 DECLARE_PRINTER(v1_sig);
596 DECLARE_PRINTER(v1_hash);
597 DECLARE_PRINTER(v1_nonce);
598 DECLARE_PRINTER(v1_n);
599 DECLARE_PRINTER(v1_d);
600 DECLARE_PRINTER(v1_vid);
601 
602 DECLARE_PRINTER(v2_sa);
603 DECLARE_PRINTER(v2_ke);
604 DECLARE_PRINTER(v2_ID);
605 DECLARE_PRINTER(v2_cert);
606 DECLARE_PRINTER(v2_cr);
607 DECLARE_PRINTER(v2_auth);
608 DECLARE_PRINTER(v2_nonce);
609 DECLARE_PRINTER(v2_n);
610 DECLARE_PRINTER(v2_d);
611 DECLARE_PRINTER(v2_vid);
612 DECLARE_PRINTER(v2_TS);
613 DECLARE_PRINTER(v2_cp);
614 DECLARE_PRINTER(v2_eap);
615 
616 static const u_char *ikev2_e_print(netdissect_options *ndo,
617 				   struct isakmp *base,
618 				   u_char tpay,
619 				   const struct isakmp_gen *ext,
620 				   u_int item_len,
621 				   const u_char *end_pointer,
622 				   uint32_t phase,
623 				   uint32_t doi0,
624 				   uint32_t proto0, int depth);
625 
626 
627 static const u_char *ike_sub0_print(netdissect_options *ndo,u_char, const struct isakmp_gen *,
628 	const u_char *,	uint32_t, uint32_t, uint32_t, int);
629 static const u_char *ikev1_sub_print(netdissect_options *ndo,u_char, const struct isakmp_gen *,
630 	const u_char *, uint32_t, uint32_t, uint32_t, int);
631 
632 static const u_char *ikev2_sub_print(netdissect_options *ndo,
633 				     struct isakmp *base,
634 				     u_char np, const struct isakmp_gen *ext,
635 				     const u_char *ep, uint32_t phase,
636 				     uint32_t doi, uint32_t proto,
637 				     int depth);
638 
639 
640 static char *numstr(int);
641 
642 static void
643 ikev1_print(netdissect_options *ndo,
644 	    const u_char *bp,  u_int length,
645 	    const u_char *bp2, struct isakmp *base);
646 
647 #define MAXINITIATORS	20
648 static int ninitiator = 0;
649 union inaddr_u {
650 	struct in_addr in4;
651 	struct in6_addr in6;
652 };
653 static struct {
654 	cookie_t initiator;
655 	u_int version;
656 	union inaddr_u iaddr;
657 	union inaddr_u raddr;
658 } cookiecache[MAXINITIATORS];
659 
660 /* protocol id */
661 static const char *protoidstr[] = {
662 	NULL, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
663 };
664 
665 /* isakmp->np */
666 static const char *npstr[] = {
667 	"none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash", /* 0 - 8 */
668 	"sig", "nonce", "n", "d", "vid",      /* 9 - 13 */
669 	"pay14", "pay15", "pay16", "pay17", "pay18", /* 14- 18 */
670 	"pay19", "pay20", "pay21", "pay22", "pay23", /* 19- 23 */
671 	"pay24", "pay25", "pay26", "pay27", "pay28", /* 24- 28 */
672 	"pay29", "pay30", "pay31", "pay32",          /* 29- 32 */
673 	"v2sa",  "v2ke",  "v2IDi", "v2IDr", "v2cert",/* 33- 37 */
674 	"v2cr",  "v2auth","v2nonce", "v2n",   "v2d",   /* 38- 42 */
675 	"v2vid", "v2TSi", "v2TSr", "v2e",   "v2cp",  /* 43- 47 */
676 	"v2eap",                                     /* 48 */
677 
678 };
679 
680 /* isakmp->np */
681 static const u_char *(*npfunc[])(netdissect_options *ndo, u_char tpay,
682 				 const struct isakmp_gen *ext,
683 				 u_int item_len,
684 				 const u_char *end_pointer,
685 				 uint32_t phase,
686 				 uint32_t doi0,
687 				 uint32_t proto0, int depth) = {
688 	NULL,
689 	ikev1_sa_print,
690 	ikev1_p_print,
691 	ikev1_t_print,
692 	ikev1_ke_print,
693 	ikev1_id_print,
694 	ikev1_cert_print,
695 	ikev1_cr_print,
696 	ikev1_hash_print,
697 	ikev1_sig_print,
698 	ikev1_nonce_print,
699 	ikev1_n_print,
700 	ikev1_d_print,
701 	ikev1_vid_print,                  /* 13 */
702 	NULL, NULL, NULL, NULL, NULL,     /* 14- 18 */
703 	NULL, NULL, NULL, NULL, NULL,     /* 19- 23 */
704 	NULL, NULL, NULL, NULL, NULL,     /* 24- 28 */
705 	NULL, NULL, NULL, NULL,           /* 29- 32 */
706 	ikev2_sa_print,                 /* 33 */
707 	ikev2_ke_print,                 /* 34 */
708 	ikev2_ID_print,                 /* 35 */
709 	ikev2_ID_print,                 /* 36 */
710 	ikev2_cert_print,               /* 37 */
711 	ikev2_cr_print,                 /* 38 */
712 	ikev2_auth_print,               /* 39 */
713 	ikev2_nonce_print,              /* 40 */
714 	ikev2_n_print,                  /* 41 */
715 	ikev2_d_print,                  /* 42 */
716 	ikev2_vid_print,                /* 43 */
717 	ikev2_TS_print,                 /* 44 */
718 	ikev2_TS_print,                 /* 45 */
719 	NULL, /* ikev2_e_print,*/       /* 46 - special */
720 	ikev2_cp_print,                 /* 47 */
721 	ikev2_eap_print,                /* 48 */
722 };
723 
724 /* isakmp->etype */
725 static const char *etypestr[] = {
726 /* IKEv1 exchange types */
727 	"none", "base", "ident", "auth", "agg", "inf", NULL, NULL,  /* 0-7 */
728 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  /*  8-15 */
729 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  /* 16-23 */
730 	NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  /* 24-31 */
731 	"oakley-quick", "oakley-newgroup",               /* 32-33 */
732 /* IKEv2 exchange types */
733 	"ikev2_init", "ikev2_auth", "child_sa", "inf2"   /* 34-37 */
734 };
735 
736 #define STR_OR_ID(x, tab) \
737 	(((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)])	? tab[(x)] : numstr(x))
738 #define PROTOIDSTR(x)	STR_OR_ID(x, protoidstr)
739 #define NPSTR(x)	STR_OR_ID(x, npstr)
740 #define ETYPESTR(x)	STR_OR_ID(x, etypestr)
741 
742 #define CHECKLEN(p, np)							\
743 		if (ep < (const u_char *)(p)) {				\
744 			ND_PRINT((ndo," [|%s]", NPSTR(np)));		\
745 			goto done;					\
746 		}
747 
748 
749 #define NPFUNC(x) \
750 	(((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
751 		? npfunc[(x)] : NULL)
752 
753 static int
754 iszero(const u_char *p, size_t l)
755 {
756 	while (l--) {
757 		if (*p++)
758 			return 0;
759 	}
760 	return 1;
761 }
762 
763 /* find cookie from initiator cache */
764 static int
765 cookie_find(cookie_t *in)
766 {
767 	int i;
768 
769 	for (i = 0; i < MAXINITIATORS; i++) {
770 		if (memcmp(in, &cookiecache[i].initiator, sizeof(*in)) == 0)
771 			return i;
772 	}
773 
774 	return -1;
775 }
776 
777 /* record initiator */
778 static void
779 cookie_record(cookie_t *in, const u_char *bp2)
780 {
781 	int i;
782 	const struct ip *ip;
783 	const struct ip6_hdr *ip6;
784 
785 	i = cookie_find(in);
786 	if (0 <= i) {
787 		ninitiator = (i + 1) % MAXINITIATORS;
788 		return;
789 	}
790 
791 	ip = (const struct ip *)bp2;
792 	switch (IP_V(ip)) {
793 	case 4:
794 		cookiecache[ninitiator].version = 4;
795 		UNALIGNED_MEMCPY(&cookiecache[ninitiator].iaddr.in4, &ip->ip_src, sizeof(struct in_addr));
796 		UNALIGNED_MEMCPY(&cookiecache[ninitiator].raddr.in4, &ip->ip_dst, sizeof(struct in_addr));
797 		break;
798 	case 6:
799 		ip6 = (const struct ip6_hdr *)bp2;
800 		cookiecache[ninitiator].version = 6;
801 		UNALIGNED_MEMCPY(&cookiecache[ninitiator].iaddr.in6, &ip6->ip6_src, sizeof(struct in6_addr));
802 		UNALIGNED_MEMCPY(&cookiecache[ninitiator].raddr.in6, &ip6->ip6_dst, sizeof(struct in6_addr));
803 		break;
804 	default:
805 		return;
806 	}
807 	UNALIGNED_MEMCPY(&cookiecache[ninitiator].initiator, in, sizeof(*in));
808 	ninitiator = (ninitiator + 1) % MAXINITIATORS;
809 }
810 
811 #define cookie_isinitiator(x, y)	cookie_sidecheck((x), (y), 1)
812 #define cookie_isresponder(x, y)	cookie_sidecheck((x), (y), 0)
813 static int
814 cookie_sidecheck(int i, const u_char *bp2, int initiator)
815 {
816 	const struct ip *ip;
817 	const struct ip6_hdr *ip6;
818 
819 	ip = (const struct ip *)bp2;
820 	switch (IP_V(ip)) {
821 	case 4:
822 		if (cookiecache[i].version != 4)
823 			return 0;
824 		if (initiator) {
825 			if (UNALIGNED_MEMCMP(&ip->ip_src, &cookiecache[i].iaddr.in4, sizeof(struct in_addr)) == 0)
826 				return 1;
827 		} else {
828 			if (UNALIGNED_MEMCMP(&ip->ip_src, &cookiecache[i].raddr.in4, sizeof(struct in_addr)) == 0)
829 				return 1;
830 		}
831 		break;
832 	case 6:
833 		if (cookiecache[i].version != 6)
834 			return 0;
835 		ip6 = (const struct ip6_hdr *)bp2;
836 		if (initiator) {
837 			if (UNALIGNED_MEMCMP(&ip6->ip6_src, &cookiecache[i].iaddr.in6, sizeof(struct in6_addr)) == 0)
838 				return 1;
839 		} else {
840 			if (UNALIGNED_MEMCMP(&ip6->ip6_src, &cookiecache[i].raddr.in6, sizeof(struct in6_addr)) == 0)
841 				return 1;
842 		}
843 		break;
844 	default:
845 		break;
846 	}
847 
848 	return 0;
849 }
850 
851 static void
852 hexprint(netdissect_options *ndo, const uint8_t *loc, size_t len)
853 {
854 	const uint8_t *p;
855 	size_t i;
856 
857 	p = loc;
858 	for (i = 0; i < len; i++)
859 		ND_PRINT((ndo,"%02x", p[i] & 0xff));
860 }
861 
862 static int
863 rawprint(netdissect_options *ndo, const uint8_t *loc, size_t len)
864 {
865 	ND_TCHECK2(*loc, len);
866 
867 	hexprint(ndo, loc, len);
868 	return 1;
869 trunc:
870 	return 0;
871 }
872 
873 
874 /*
875  * returns false if we run out of data buffer
876  */
877 static int ike_show_somedata(netdissect_options *ndo,
878 			     const u_char *cp, const u_char *ep)
879 {
880 	/* there is too much data, just show some of it */
881 	const u_char *end = ep - 20;
882 	int  elen = 20;
883 	int   len = ep - cp;
884 	if(len > 10) {
885 		len = 10;
886 	}
887 
888 	/* really shouldn't happen because of above */
889 	if(end < cp + len) {
890 		end = cp+len;
891 		elen = ep - end;
892 	}
893 
894 	ND_PRINT((ndo," data=("));
895 	if(!rawprint(ndo, (const uint8_t *)(cp), len)) goto trunc;
896 	ND_PRINT((ndo, "..."));
897 	if(elen) {
898 		if(!rawprint(ndo, (const uint8_t *)(end), elen)) goto trunc;
899 	}
900 	ND_PRINT((ndo,")"));
901 	return 1;
902 
903 trunc:
904 	return 0;
905 }
906 
907 struct attrmap {
908 	const char *type;
909 	u_int nvalue;
910 	const char *value[30];	/*XXX*/
911 };
912 
913 static const u_char *
914 ikev1_attrmap_print(netdissect_options *ndo,
915 		    const u_char *p, const u_char *ep2,
916 		    const struct attrmap *map, size_t nmap)
917 {
918 	int totlen;
919 	uint32_t t, v;
920 
921 	ND_TCHECK(p[0]);
922 	if (p[0] & 0x80)
923 		totlen = 4;
924 	else {
925 		ND_TCHECK_16BITS(&p[2]);
926 		totlen = 4 + EXTRACT_16BITS(&p[2]);
927 	}
928 	if (ep2 < p + totlen) {
929 		ND_PRINT((ndo,"[|attr]"));
930 		return ep2 + 1;
931 	}
932 
933 	ND_TCHECK_16BITS(&p[0]);
934 	ND_PRINT((ndo,"("));
935 	t = EXTRACT_16BITS(&p[0]) & 0x7fff;
936 	if (map && t < nmap && map[t].type)
937 		ND_PRINT((ndo,"type=%s ", map[t].type));
938 	else
939 		ND_PRINT((ndo,"type=#%d ", t));
940 	if (p[0] & 0x80) {
941 		ND_PRINT((ndo,"value="));
942 		ND_TCHECK_16BITS(&p[2]);
943 		v = EXTRACT_16BITS(&p[2]);
944 		if (map && t < nmap && v < map[t].nvalue && map[t].value[v])
945 			ND_PRINT((ndo,"%s", map[t].value[v]));
946 		else {
947 			if (!rawprint(ndo, (const uint8_t *)&p[2], 2)) {
948 				ND_PRINT((ndo,")"));
949 				goto trunc;
950 			}
951 		}
952 	} else {
953 		ND_PRINT((ndo,"len=%d value=", totlen - 4));
954 		if (!rawprint(ndo, (const uint8_t *)&p[4], totlen - 4)) {
955 			ND_PRINT((ndo,")"));
956 			goto trunc;
957 		}
958 	}
959 	ND_PRINT((ndo,")"));
960 	return p + totlen;
961 
962 trunc:
963 	return NULL;
964 }
965 
966 static const u_char *
967 ikev1_attr_print(netdissect_options *ndo, const u_char *p, const u_char *ep2)
968 {
969 	int totlen;
970 	uint32_t t;
971 
972 	ND_TCHECK(p[0]);
973 	if (p[0] & 0x80)
974 		totlen = 4;
975 	else {
976 		ND_TCHECK_16BITS(&p[2]);
977 		totlen = 4 + EXTRACT_16BITS(&p[2]);
978 	}
979 	if (ep2 < p + totlen) {
980 		ND_PRINT((ndo,"[|attr]"));
981 		return ep2 + 1;
982 	}
983 
984 	ND_TCHECK_16BITS(&p[0]);
985 	ND_PRINT((ndo,"("));
986 	t = EXTRACT_16BITS(&p[0]) & 0x7fff;
987 	ND_PRINT((ndo,"type=#%d ", t));
988 	if (p[0] & 0x80) {
989 		ND_PRINT((ndo,"value="));
990 		t = p[2];
991 		if (!rawprint(ndo, (const uint8_t *)&p[2], 2)) {
992 			ND_PRINT((ndo,")"));
993 			goto trunc;
994 		}
995 	} else {
996 		ND_PRINT((ndo,"len=%d value=", totlen - 4));
997 		if (!rawprint(ndo, (const uint8_t *)&p[4], totlen - 4)) {
998 			ND_PRINT((ndo,")"));
999 			goto trunc;
1000 		}
1001 	}
1002 	ND_PRINT((ndo,")"));
1003 	return p + totlen;
1004 
1005 trunc:
1006 	return NULL;
1007 }
1008 
1009 static const u_char *
1010 ikev1_sa_print(netdissect_options *ndo, u_char tpay _U_,
1011 	       const struct isakmp_gen *ext,
1012 		u_int item_len _U_,
1013 		const u_char *ep, uint32_t phase, uint32_t doi0 _U_,
1014 		uint32_t proto0, int depth)
1015 {
1016 	const struct ikev1_pl_sa *p;
1017 	struct ikev1_pl_sa sa;
1018 	uint32_t doi, sit, ident;
1019 	const u_char *cp, *np;
1020 	int t;
1021 
1022 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_SA)));
1023 
1024 	p = (const struct ikev1_pl_sa *)ext;
1025 	ND_TCHECK(*p);
1026 	UNALIGNED_MEMCPY(&sa, ext, sizeof(sa));
1027 	doi = ntohl(sa.doi);
1028 	sit = ntohl(sa.sit);
1029 	if (doi != 1) {
1030 		ND_PRINT((ndo," doi=%d", doi));
1031 		ND_PRINT((ndo," situation=%u", (uint32_t)ntohl(sa.sit)));
1032 		return (const u_char *)(p + 1);
1033 	}
1034 
1035 	ND_PRINT((ndo," doi=ipsec"));
1036 	ND_PRINT((ndo," situation="));
1037 	t = 0;
1038 	if (sit & 0x01) {
1039 		ND_PRINT((ndo,"identity"));
1040 		t++;
1041 	}
1042 	if (sit & 0x02) {
1043 		ND_PRINT((ndo,"%ssecrecy", t ? "+" : ""));
1044 		t++;
1045 	}
1046 	if (sit & 0x04)
1047 		ND_PRINT((ndo,"%sintegrity", t ? "+" : ""));
1048 
1049 	np = (const u_char *)ext + sizeof(sa);
1050 	if (sit != 0x01) {
1051 		ND_TCHECK2(*(ext + 1), sizeof(ident));
1052 		UNALIGNED_MEMCPY(&ident, ext + 1, sizeof(ident));
1053 		ND_PRINT((ndo," ident=%u", (uint32_t)ntohl(ident)));
1054 		np += sizeof(ident);
1055 	}
1056 
1057 	ext = (const struct isakmp_gen *)np;
1058 	ND_TCHECK(*ext);
1059 
1060 	cp = ikev1_sub_print(ndo, ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0,
1061 		depth);
1062 
1063 	return cp;
1064 trunc:
1065 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_SA)));
1066 	return NULL;
1067 }
1068 
1069 static const u_char *
1070 ikev1_p_print(netdissect_options *ndo, u_char tpay _U_,
1071 	      const struct isakmp_gen *ext, u_int item_len _U_,
1072 	       const u_char *ep, uint32_t phase, uint32_t doi0,
1073 	       uint32_t proto0 _U_, int depth)
1074 {
1075 	const struct ikev1_pl_p *p;
1076 	struct ikev1_pl_p prop;
1077 	const u_char *cp;
1078 
1079 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_P)));
1080 
1081 	p = (const struct ikev1_pl_p *)ext;
1082 	ND_TCHECK(*p);
1083 	UNALIGNED_MEMCPY(&prop, ext, sizeof(prop));
1084 	ND_PRINT((ndo," #%d protoid=%s transform=%d",
1085 		  prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t));
1086 	if (prop.spi_size) {
1087 		ND_PRINT((ndo," spi="));
1088 		if (!rawprint(ndo, (const uint8_t *)(p + 1), prop.spi_size))
1089 			goto trunc;
1090 	}
1091 
1092 	ext = (const struct isakmp_gen *)((const u_char *)(p + 1) + prop.spi_size);
1093 	ND_TCHECK(*ext);
1094 
1095 	cp = ikev1_sub_print(ndo, ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
1096 			     prop.prot_id, depth);
1097 
1098 	return cp;
1099 trunc:
1100 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
1101 	return NULL;
1102 }
1103 
1104 static const char *ikev1_p_map[] = {
1105 	NULL, "ike",
1106 };
1107 
1108 static const char *ikev2_t_type_map[]={
1109 	NULL, "encr", "prf", "integ", "dh", "esn"
1110 };
1111 
1112 static const char *ah_p_map[] = {
1113 	NULL, "(reserved)", "md5", "sha", "1des",
1114 	"sha2-256", "sha2-384", "sha2-512",
1115 };
1116 
1117 static const char *prf_p_map[] = {
1118 	NULL, "hmac-md5", "hmac-sha", "hmac-tiger",
1119 	"aes128_xcbc"
1120 };
1121 
1122 static const char *integ_p_map[] = {
1123 	NULL, "hmac-md5", "hmac-sha", "dec-mac",
1124 	"kpdk-md5", "aes-xcbc"
1125 };
1126 
1127 static const char *esn_p_map[] = {
1128 	"no-esn", "esn"
1129 };
1130 
1131 static const char *dh_p_map[] = {
1132 	NULL, "modp768",
1133 	"modp1024",    /* group 2 */
1134 	"EC2N 2^155",  /* group 3 */
1135 	"EC2N 2^185",  /* group 4 */
1136 	"modp1536",    /* group 5 */
1137 	"iana-grp06", "iana-grp07", /* reserved */
1138 	"iana-grp08", "iana-grp09",
1139 	"iana-grp10", "iana-grp11",
1140 	"iana-grp12", "iana-grp13",
1141 	"modp2048",    /* group 14 */
1142 	"modp3072",    /* group 15 */
1143 	"modp4096",    /* group 16 */
1144 	"modp6144",    /* group 17 */
1145 	"modp8192",    /* group 18 */
1146 };
1147 
1148 static const char *esp_p_map[] = {
1149 	NULL, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
1150 	"blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
1151 };
1152 
1153 static const char *ipcomp_p_map[] = {
1154 	NULL, "oui", "deflate", "lzs",
1155 };
1156 
1157 static const struct attrmap ipsec_t_map[] = {
1158 	{ NULL,	0, { NULL } },
1159 	{ "lifetype", 3, { NULL, "sec", "kb", }, },
1160 	{ "life", 0, { NULL } },
1161 	{ "group desc", 18,	{ NULL, "modp768",
1162 				  "modp1024",    /* group 2 */
1163 				  "EC2N 2^155",  /* group 3 */
1164 				  "EC2N 2^185",  /* group 4 */
1165 				  "modp1536",    /* group 5 */
1166 				  "iana-grp06", "iana-grp07", /* reserved */
1167 				  "iana-grp08", "iana-grp09",
1168 				  "iana-grp10", "iana-grp11",
1169 				  "iana-grp12", "iana-grp13",
1170 				  "modp2048",    /* group 14 */
1171 				  "modp3072",    /* group 15 */
1172 				  "modp4096",    /* group 16 */
1173 				  "modp6144",    /* group 17 */
1174 				  "modp8192",    /* group 18 */
1175 		}, },
1176 	{ "enc mode", 3, { NULL, "tunnel", "transport", }, },
1177 	{ "auth", 5, { NULL, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
1178 	{ "keylen", 0, { NULL } },
1179 	{ "rounds", 0, { NULL } },
1180 	{ "dictsize", 0, { NULL } },
1181 	{ "privalg", 0, { NULL } },
1182 };
1183 
1184 static const struct attrmap encr_t_map[] = {
1185 	{ NULL,	0, { NULL } }, 	{ NULL,	0, { NULL } },  /* 0, 1 */
1186 	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 2, 3 */
1187 	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 4, 5 */
1188 	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 6, 7 */
1189 	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 8, 9 */
1190 	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 10,11*/
1191 	{ NULL,	0, { NULL } },	{ NULL,	0, { NULL } },  /* 12,13*/
1192 	{ "keylen", 14, { NULL }},
1193 };
1194 
1195 static const struct attrmap oakley_t_map[] = {
1196 	{ NULL,	0, { NULL } },
1197 	{ "enc", 8,	{ NULL, "1des", "idea", "blowfish", "rc5",
1198 		 	  "3des", "cast", "aes", }, },
1199 	{ "hash", 7,	{ NULL, "md5", "sha1", "tiger",
1200 			  "sha2-256", "sha2-384", "sha2-512", }, },
1201 	{ "auth", 6,	{ NULL, "preshared", "dss", "rsa sig", "rsa enc",
1202 			  "rsa enc revised", }, },
1203 	{ "group desc", 18,	{ NULL, "modp768",
1204 				  "modp1024",    /* group 2 */
1205 				  "EC2N 2^155",  /* group 3 */
1206 				  "EC2N 2^185",  /* group 4 */
1207 				  "modp1536",    /* group 5 */
1208 				  "iana-grp06", "iana-grp07", /* reserved */
1209 				  "iana-grp08", "iana-grp09",
1210 				  "iana-grp10", "iana-grp11",
1211 				  "iana-grp12", "iana-grp13",
1212 				  "modp2048",    /* group 14 */
1213 				  "modp3072",    /* group 15 */
1214 				  "modp4096",    /* group 16 */
1215 				  "modp6144",    /* group 17 */
1216 				  "modp8192",    /* group 18 */
1217 		}, },
1218 	{ "group type", 4,	{ NULL, "MODP", "ECP", "EC2N", }, },
1219 	{ "group prime", 0, { NULL } },
1220 	{ "group gen1", 0, { NULL } },
1221 	{ "group gen2", 0, { NULL } },
1222 	{ "group curve A", 0, { NULL } },
1223 	{ "group curve B", 0, { NULL } },
1224 	{ "lifetype", 3,	{ NULL, "sec", "kb", }, },
1225 	{ "lifeduration", 0, { NULL } },
1226 	{ "prf", 0, { NULL } },
1227 	{ "keylen", 0, { NULL } },
1228 	{ "field", 0, { NULL } },
1229 	{ "order", 0, { NULL } },
1230 };
1231 
1232 static const u_char *
1233 ikev1_t_print(netdissect_options *ndo, u_char tpay _U_,
1234 	      const struct isakmp_gen *ext, u_int item_len,
1235 	      const u_char *ep, uint32_t phase _U_, uint32_t doi _U_,
1236 	      uint32_t proto, int depth _U_)
1237 {
1238 	const struct ikev1_pl_t *p;
1239 	struct ikev1_pl_t t;
1240 	const u_char *cp;
1241 	const char *idstr;
1242 	const struct attrmap *map;
1243 	size_t nmap;
1244 	const u_char *ep2;
1245 
1246 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_T)));
1247 
1248 	p = (const struct ikev1_pl_t *)ext;
1249 	ND_TCHECK(*p);
1250 	UNALIGNED_MEMCPY(&t, ext, sizeof(t));
1251 
1252 	switch (proto) {
1253 	case 1:
1254 		idstr = STR_OR_ID(t.t_id, ikev1_p_map);
1255 		map = oakley_t_map;
1256 		nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
1257 		break;
1258 	case 2:
1259 		idstr = STR_OR_ID(t.t_id, ah_p_map);
1260 		map = ipsec_t_map;
1261 		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
1262 		break;
1263 	case 3:
1264 		idstr = STR_OR_ID(t.t_id, esp_p_map);
1265 		map = ipsec_t_map;
1266 		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
1267 		break;
1268 	case 4:
1269 		idstr = STR_OR_ID(t.t_id, ipcomp_p_map);
1270 		map = ipsec_t_map;
1271 		nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
1272 		break;
1273 	default:
1274 		idstr = NULL;
1275 		map = NULL;
1276 		nmap = 0;
1277 		break;
1278 	}
1279 
1280 	if (idstr)
1281 		ND_PRINT((ndo," #%d id=%s ", t.t_no, idstr));
1282 	else
1283 		ND_PRINT((ndo," #%d id=%d ", t.t_no, t.t_id));
1284 	cp = (const u_char *)(p + 1);
1285 	ep2 = (const u_char *)p + item_len;
1286 	while (cp < ep && cp < ep2) {
1287 		if (map && nmap)
1288 			cp = ikev1_attrmap_print(ndo, cp, ep2, map, nmap);
1289 		else
1290 			cp = ikev1_attr_print(ndo, cp, ep2);
1291 		if (cp == NULL)
1292 			goto trunc;
1293 	}
1294 	if (ep < ep2)
1295 		ND_PRINT((ndo,"..."));
1296 	return cp;
1297 trunc:
1298 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));
1299 	return NULL;
1300 }
1301 
1302 static const u_char *
1303 ikev1_ke_print(netdissect_options *ndo, u_char tpay _U_,
1304 	       const struct isakmp_gen *ext, u_int item_len _U_,
1305 	       const u_char *ep _U_, uint32_t phase _U_, uint32_t doi _U_,
1306 	       uint32_t proto _U_, int depth _U_)
1307 {
1308 	struct isakmp_gen e;
1309 
1310 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_KE)));
1311 
1312 	ND_TCHECK(*ext);
1313 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
1314 	ND_PRINT((ndo," key len=%d", ntohs(e.len) - 4));
1315 	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
1316 		/* Print the entire payload in hex */
1317 		ND_PRINT((ndo," "));
1318 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
1319 			goto trunc;
1320 	}
1321 	return (const u_char *)ext + ntohs(e.len);
1322 trunc:
1323 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_KE)));
1324 	return NULL;
1325 }
1326 
1327 static const u_char *
1328 ikev1_id_print(netdissect_options *ndo, u_char tpay _U_,
1329 	       const struct isakmp_gen *ext, u_int item_len,
1330 	       const u_char *ep _U_, uint32_t phase, uint32_t doi _U_,
1331 	       uint32_t proto _U_, int depth _U_)
1332 {
1333 #define USE_IPSECDOI_IN_PHASE1	1
1334 	const struct ikev1_pl_id *p;
1335 	struct ikev1_pl_id id;
1336 	static const char *idtypestr[] = {
1337 		"IPv4", "IPv4net", "IPv6", "IPv6net",
1338 	};
1339 	static const char *ipsecidtypestr[] = {
1340 		NULL, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
1341 		"IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
1342 		"keyid",
1343 	};
1344 	int len;
1345 	const u_char *data;
1346 
1347 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_ID)));
1348 
1349 	p = (const struct ikev1_pl_id *)ext;
1350 	ND_TCHECK(*p);
1351 	UNALIGNED_MEMCPY(&id, ext, sizeof(id));
1352 	if (sizeof(*p) < item_len) {
1353 		data = (const u_char *)(p + 1);
1354 		len = item_len - sizeof(*p);
1355 	} else {
1356 		data = NULL;
1357 		len = 0;
1358 	}
1359 
1360 #if 0 /*debug*/
1361 	ND_PRINT((ndo," [phase=%d doi=%d proto=%d]", phase, doi, proto));
1362 #endif
1363 	switch (phase) {
1364 #ifndef USE_IPSECDOI_IN_PHASE1
1365 	case 1:
1366 #endif
1367 	default:
1368 		ND_PRINT((ndo," idtype=%s", STR_OR_ID(id.d.id_type, idtypestr)));
1369 		ND_PRINT((ndo," doi_data=%u",
1370 			  (uint32_t)(ntohl(id.d.doi_data) & 0xffffff)));
1371 		break;
1372 
1373 #ifdef USE_IPSECDOI_IN_PHASE1
1374 	case 1:
1375 #endif
1376 	case 2:
1377 	    {
1378 		const struct ipsecdoi_id *doi_p;
1379 		struct ipsecdoi_id doi_id;
1380 		const char *p_name;
1381 
1382 		doi_p = (const struct ipsecdoi_id *)ext;
1383 		ND_TCHECK(*doi_p);
1384 		UNALIGNED_MEMCPY(&doi_id, ext, sizeof(doi_id));
1385 		ND_PRINT((ndo," idtype=%s", STR_OR_ID(doi_id.type, ipsecidtypestr)));
1386 		/* A protocol ID of 0 DOES NOT mean IPPROTO_IP! */
1387 		if (!ndo->ndo_nflag && doi_id.proto_id && (p_name = netdb_protoname(doi_id.proto_id)) != NULL)
1388 			ND_PRINT((ndo," protoid=%s", p_name));
1389 		else
1390 			ND_PRINT((ndo," protoid=%u", doi_id.proto_id));
1391 		ND_PRINT((ndo," port=%d", ntohs(doi_id.port)));
1392 		if (!len)
1393 			break;
1394 		if (data == NULL)
1395 			goto trunc;
1396 		ND_TCHECK2(*data, len);
1397 		switch (doi_id.type) {
1398 		case IPSECDOI_ID_IPV4_ADDR:
1399 			if (len < 4)
1400 				ND_PRINT((ndo," len=%d [bad: < 4]", len));
1401 			else
1402 				ND_PRINT((ndo," len=%d %s", len, ipaddr_string(ndo, data)));
1403 			len = 0;
1404 			break;
1405 		case IPSECDOI_ID_FQDN:
1406 		case IPSECDOI_ID_USER_FQDN:
1407 		    {
1408 			int i;
1409 			ND_PRINT((ndo," len=%d ", len));
1410 			for (i = 0; i < len; i++)
1411 				safeputchar(ndo, data[i]);
1412 			len = 0;
1413 			break;
1414 		    }
1415 		case IPSECDOI_ID_IPV4_ADDR_SUBNET:
1416 		    {
1417 			const u_char *mask;
1418 			if (len < 8)
1419 				ND_PRINT((ndo," len=%d [bad: < 8]", len));
1420 			else {
1421 				mask = data + sizeof(struct in_addr);
1422 				ND_PRINT((ndo," len=%d %s/%u.%u.%u.%u", len,
1423 					  ipaddr_string(ndo, data),
1424 					  mask[0], mask[1], mask[2], mask[3]));
1425 			}
1426 			len = 0;
1427 			break;
1428 		    }
1429 		case IPSECDOI_ID_IPV6_ADDR:
1430 			if (len < 16)
1431 				ND_PRINT((ndo," len=%d [bad: < 16]", len));
1432 			else
1433 				ND_PRINT((ndo," len=%d %s", len, ip6addr_string(ndo, data)));
1434 			len = 0;
1435 			break;
1436 		case IPSECDOI_ID_IPV6_ADDR_SUBNET:
1437 		    {
1438 			const u_char *mask;
1439 			if (len < 32)
1440 				ND_PRINT((ndo," len=%d [bad: < 32]", len));
1441 			else {
1442 				mask = (const u_char *)(data + sizeof(struct in6_addr));
1443 				/*XXX*/
1444 				ND_PRINT((ndo," len=%d %s/0x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", len,
1445 					  ip6addr_string(ndo, data),
1446 					  mask[0], mask[1], mask[2], mask[3],
1447 					  mask[4], mask[5], mask[6], mask[7],
1448 					  mask[8], mask[9], mask[10], mask[11],
1449 					  mask[12], mask[13], mask[14], mask[15]));
1450 			}
1451 			len = 0;
1452 			break;
1453 		    }
1454 		case IPSECDOI_ID_IPV4_ADDR_RANGE:
1455 			if (len < 8)
1456 				ND_PRINT((ndo," len=%d [bad: < 8]", len));
1457 			else {
1458 				ND_PRINT((ndo," len=%d %s-%s", len,
1459 					  ipaddr_string(ndo, data),
1460 					  ipaddr_string(ndo, data + sizeof(struct in_addr))));
1461 			}
1462 			len = 0;
1463 			break;
1464 		case IPSECDOI_ID_IPV6_ADDR_RANGE:
1465 			if (len < 32)
1466 				ND_PRINT((ndo," len=%d [bad: < 32]", len));
1467 			else {
1468 				ND_PRINT((ndo," len=%d %s-%s", len,
1469 					  ip6addr_string(ndo, data),
1470 					  ip6addr_string(ndo, data + sizeof(struct in6_addr))));
1471 			}
1472 			len = 0;
1473 			break;
1474 		case IPSECDOI_ID_DER_ASN1_DN:
1475 		case IPSECDOI_ID_DER_ASN1_GN:
1476 		case IPSECDOI_ID_KEY_ID:
1477 			break;
1478 		}
1479 		break;
1480 	    }
1481 	}
1482 	if (data && len) {
1483 		ND_PRINT((ndo," len=%d", len));
1484 		if (2 < ndo->ndo_vflag) {
1485 			ND_PRINT((ndo," "));
1486 			if (!rawprint(ndo, (const uint8_t *)data, len))
1487 				goto trunc;
1488 		}
1489 	}
1490 	return (const u_char *)ext + item_len;
1491 trunc:
1492 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_ID)));
1493 	return NULL;
1494 }
1495 
1496 static const u_char *
1497 ikev1_cert_print(netdissect_options *ndo, u_char tpay _U_,
1498 		 const struct isakmp_gen *ext, u_int item_len,
1499 		 const u_char *ep _U_, uint32_t phase _U_,
1500 		 uint32_t doi0 _U_,
1501 		 uint32_t proto0 _U_, int depth _U_)
1502 {
1503 	const struct ikev1_pl_cert *p;
1504 	struct ikev1_pl_cert cert;
1505 	static const char *certstr[] = {
1506 		"none",	"pkcs7", "pgp", "dns",
1507 		"x509sign", "x509ke", "kerberos", "crl",
1508 		"arl", "spki", "x509attr",
1509 	};
1510 
1511 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_CERT)));
1512 
1513 	p = (const struct ikev1_pl_cert *)ext;
1514 	ND_TCHECK(*p);
1515 	UNALIGNED_MEMCPY(&cert, ext, sizeof(cert));
1516 	ND_PRINT((ndo," len=%d", item_len - 4));
1517 	ND_PRINT((ndo," type=%s", STR_OR_ID((cert.encode), certstr)));
1518 	if (2 < ndo->ndo_vflag && 4 < item_len) {
1519 		/* Print the entire payload in hex */
1520 		ND_PRINT((ndo," "));
1521 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), item_len - 4))
1522 			goto trunc;
1523 	}
1524 	return (const u_char *)ext + item_len;
1525 trunc:
1526 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_CERT)));
1527 	return NULL;
1528 }
1529 
1530 static const u_char *
1531 ikev1_cr_print(netdissect_options *ndo, u_char tpay _U_,
1532 	       const struct isakmp_gen *ext, u_int item_len,
1533 	       const u_char *ep _U_, uint32_t phase _U_, uint32_t doi0 _U_,
1534 	       uint32_t proto0 _U_, int depth _U_)
1535 {
1536 	const struct ikev1_pl_cert *p;
1537 	struct ikev1_pl_cert cert;
1538 	static const char *certstr[] = {
1539 		"none",	"pkcs7", "pgp", "dns",
1540 		"x509sign", "x509ke", "kerberos", "crl",
1541 		"arl", "spki", "x509attr",
1542 	};
1543 
1544 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_CR)));
1545 
1546 	p = (const struct ikev1_pl_cert *)ext;
1547 	ND_TCHECK(*p);
1548 	UNALIGNED_MEMCPY(&cert, ext, sizeof(cert));
1549 	ND_PRINT((ndo," len=%d", item_len - 4));
1550 	ND_PRINT((ndo," type=%s", STR_OR_ID((cert.encode), certstr)));
1551 	if (2 < ndo->ndo_vflag && 4 < item_len) {
1552 		/* Print the entire payload in hex */
1553 		ND_PRINT((ndo," "));
1554 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), item_len - 4))
1555 			goto trunc;
1556 	}
1557 	return (const u_char *)ext + item_len;
1558 trunc:
1559 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_CR)));
1560 	return NULL;
1561 }
1562 
1563 static const u_char *
1564 ikev1_hash_print(netdissect_options *ndo, u_char tpay _U_,
1565 		 const struct isakmp_gen *ext, u_int item_len _U_,
1566 		 const u_char *ep _U_, uint32_t phase _U_, uint32_t doi _U_,
1567 		 uint32_t proto _U_, int depth _U_)
1568 {
1569 	struct isakmp_gen e;
1570 
1571 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_HASH)));
1572 
1573 	ND_TCHECK(*ext);
1574 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
1575 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
1576 	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
1577 		/* Print the entire payload in hex */
1578 		ND_PRINT((ndo," "));
1579 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
1580 			goto trunc;
1581 	}
1582 	return (const u_char *)ext + ntohs(e.len);
1583 trunc:
1584 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_HASH)));
1585 	return NULL;
1586 }
1587 
1588 static const u_char *
1589 ikev1_sig_print(netdissect_options *ndo, u_char tpay _U_,
1590 		const struct isakmp_gen *ext, u_int item_len _U_,
1591 		const u_char *ep _U_, uint32_t phase _U_, uint32_t doi _U_,
1592 		uint32_t proto _U_, int depth _U_)
1593 {
1594 	struct isakmp_gen e;
1595 
1596 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_SIG)));
1597 
1598 	ND_TCHECK(*ext);
1599 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
1600 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
1601 	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
1602 		/* Print the entire payload in hex */
1603 		ND_PRINT((ndo," "));
1604 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
1605 			goto trunc;
1606 	}
1607 	return (const u_char *)ext + ntohs(e.len);
1608 trunc:
1609 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_SIG)));
1610 	return NULL;
1611 }
1612 
1613 static const u_char *
1614 ikev1_nonce_print(netdissect_options *ndo, u_char tpay _U_,
1615 		  const struct isakmp_gen *ext,
1616 		  u_int item_len _U_,
1617 		  const u_char *ep,
1618 		  uint32_t phase _U_, uint32_t doi _U_,
1619 		  uint32_t proto _U_, int depth _U_)
1620 {
1621 	struct isakmp_gen e;
1622 
1623 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_NONCE)));
1624 
1625 	ND_TCHECK(*ext);
1626 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
1627 	/*
1628 	 * Our caller has ensured that the length is >= 4.
1629 	 */
1630 	ND_PRINT((ndo," n len=%u", ntohs(e.len) - 4));
1631 	if (ntohs(e.len) > 4) {
1632 		if (ndo->ndo_vflag > 2) {
1633 			ND_PRINT((ndo, " "));
1634 			if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
1635 				goto trunc;
1636 		} else if (ndo->ndo_vflag > 1) {
1637 			ND_PRINT((ndo, " "));
1638 			if (!ike_show_somedata(ndo, (const u_char *)(ext + 1), ep))
1639 				goto trunc;
1640 		}
1641 	}
1642 	return (const u_char *)ext + ntohs(e.len);
1643 trunc:
1644 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE)));
1645 	return NULL;
1646 }
1647 
1648 static const u_char *
1649 ikev1_n_print(netdissect_options *ndo, u_char tpay _U_,
1650 	      const struct isakmp_gen *ext, u_int item_len,
1651 	      const u_char *ep, uint32_t phase _U_, uint32_t doi0 _U_,
1652 	      uint32_t proto0 _U_, int depth _U_)
1653 {
1654 	const struct ikev1_pl_n *p;
1655 	struct ikev1_pl_n n;
1656 	const u_char *cp;
1657 	const u_char *ep2;
1658 	uint32_t doi;
1659 	uint32_t proto;
1660 	static const char *notify_error_str[] = {
1661 		NULL,				"INVALID-PAYLOAD-TYPE",
1662 		"DOI-NOT-SUPPORTED",		"SITUATION-NOT-SUPPORTED",
1663 		"INVALID-COOKIE",		"INVALID-MAJOR-VERSION",
1664 		"INVALID-MINOR-VERSION",	"INVALID-EXCHANGE-TYPE",
1665 		"INVALID-FLAGS",		"INVALID-MESSAGE-ID",
1666 		"INVALID-PROTOCOL-ID",		"INVALID-SPI",
1667 		"INVALID-TRANSFORM-ID",		"ATTRIBUTES-NOT-SUPPORTED",
1668 		"NO-PROPOSAL-CHOSEN",		"BAD-PROPOSAL-SYNTAX",
1669 		"PAYLOAD-MALFORMED",		"INVALID-KEY-INFORMATION",
1670 		"INVALID-ID-INFORMATION",	"INVALID-CERT-ENCODING",
1671 		"INVALID-CERTIFICATE",		"CERT-TYPE-UNSUPPORTED",
1672 		"INVALID-CERT-AUTHORITY",	"INVALID-HASH-INFORMATION",
1673 		"AUTHENTICATION-FAILED",	"INVALID-SIGNATURE",
1674 		"ADDRESS-NOTIFICATION",		"NOTIFY-SA-LIFETIME",
1675 		"CERTIFICATE-UNAVAILABLE",	"UNSUPPORTED-EXCHANGE-TYPE",
1676 		"UNEQUAL-PAYLOAD-LENGTHS",
1677 	};
1678 	static const char *ipsec_notify_error_str[] = {
1679 		"RESERVED",
1680 	};
1681 	static const char *notify_status_str[] = {
1682 		"CONNECTED",
1683 	};
1684 	static const char *ipsec_notify_status_str[] = {
1685 		"RESPONDER-LIFETIME",		"REPLAY-STATUS",
1686 		"INITIAL-CONTACT",
1687 	};
1688 /* NOTE: these macro must be called with x in proper range */
1689 
1690 /* 0 - 8191 */
1691 #define NOTIFY_ERROR_STR(x) \
1692 	STR_OR_ID((x), notify_error_str)
1693 
1694 /* 8192 - 16383 */
1695 #define IPSEC_NOTIFY_ERROR_STR(x) \
1696 	STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
1697 
1698 /* 16384 - 24575 */
1699 #define NOTIFY_STATUS_STR(x) \
1700 	STR_OR_ID((u_int)((x) - 16384), notify_status_str)
1701 
1702 /* 24576 - 32767 */
1703 #define IPSEC_NOTIFY_STATUS_STR(x) \
1704 	STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
1705 
1706 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_N)));
1707 
1708 	p = (const struct ikev1_pl_n *)ext;
1709 	ND_TCHECK(*p);
1710 	UNALIGNED_MEMCPY(&n, ext, sizeof(n));
1711 	doi = ntohl(n.doi);
1712 	proto = n.prot_id;
1713 	if (doi != 1) {
1714 		ND_PRINT((ndo," doi=%d", doi));
1715 		ND_PRINT((ndo," proto=%d", proto));
1716 		if (ntohs(n.type) < 8192)
1717 			ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));
1718 		else if (ntohs(n.type) < 16384)
1719 			ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
1720 		else if (ntohs(n.type) < 24576)
1721 			ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));
1722 		else
1723 			ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
1724 		if (n.spi_size) {
1725 			ND_PRINT((ndo," spi="));
1726 			if (!rawprint(ndo, (const uint8_t *)(p + 1), n.spi_size))
1727 				goto trunc;
1728 		}
1729 		return (const u_char *)(p + 1) + n.spi_size;
1730 	}
1731 
1732 	ND_PRINT((ndo," doi=ipsec"));
1733 	ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));
1734 	if (ntohs(n.type) < 8192)
1735 		ND_PRINT((ndo," type=%s", NOTIFY_ERROR_STR(ntohs(n.type))));
1736 	else if (ntohs(n.type) < 16384)
1737 		ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n.type))));
1738 	else if (ntohs(n.type) < 24576)
1739 		ND_PRINT((ndo," type=%s", NOTIFY_STATUS_STR(ntohs(n.type))));
1740 	else if (ntohs(n.type) < 32768)
1741 		ND_PRINT((ndo," type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n.type))));
1742 	else
1743 		ND_PRINT((ndo," type=%s", numstr(ntohs(n.type))));
1744 	if (n.spi_size) {
1745 		ND_PRINT((ndo," spi="));
1746 		if (!rawprint(ndo, (const uint8_t *)(p + 1), n.spi_size))
1747 			goto trunc;
1748 	}
1749 
1750 	cp = (const u_char *)(p + 1) + n.spi_size;
1751 	ep2 = (const u_char *)p + item_len;
1752 
1753 	if (cp < ep) {
1754 		switch (ntohs(n.type)) {
1755 		case IPSECDOI_NTYPE_RESPONDER_LIFETIME:
1756 		    {
1757 			const struct attrmap *map = oakley_t_map;
1758 			size_t nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
1759 			ND_PRINT((ndo," attrs=("));
1760 			while (cp < ep && cp < ep2) {
1761 				cp = ikev1_attrmap_print(ndo, cp, ep2, map, nmap);
1762 				if (cp == NULL) {
1763 					ND_PRINT((ndo,")"));
1764 					goto trunc;
1765 				}
1766 			}
1767 			ND_PRINT((ndo,")"));
1768 			break;
1769 		    }
1770 		case IPSECDOI_NTYPE_REPLAY_STATUS:
1771 			ND_PRINT((ndo," status=("));
1772 			ND_TCHECK_32BITS(cp);
1773 			ND_PRINT((ndo,"replay detection %sabled",
1774 				  EXTRACT_32BITS(cp) ? "en" : "dis"));
1775 			ND_PRINT((ndo,")"));
1776 			break;
1777 		default:
1778 			/*
1779 			 * XXX - fill in more types here; see, for example,
1780 			 * draft-ietf-ipsec-notifymsg-04.
1781 			 */
1782 			if (ndo->ndo_vflag > 3) {
1783 				ND_PRINT((ndo," data=("));
1784 				if (!rawprint(ndo, (const uint8_t *)(cp), ep - cp))
1785 					goto trunc;
1786 				ND_PRINT((ndo,")"));
1787 			} else {
1788 				if (!ike_show_somedata(ndo, cp, ep))
1789 					goto trunc;
1790 			}
1791 			break;
1792 		}
1793 	}
1794 	return (const u_char *)ext + item_len;
1795 trunc:
1796 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
1797 	return NULL;
1798 }
1799 
1800 static const u_char *
1801 ikev1_d_print(netdissect_options *ndo, u_char tpay _U_,
1802 	      const struct isakmp_gen *ext, u_int item_len _U_,
1803 	      const u_char *ep _U_, uint32_t phase _U_, uint32_t doi0 _U_,
1804 	      uint32_t proto0 _U_, int depth _U_)
1805 {
1806 	const struct ikev1_pl_d *p;
1807 	struct ikev1_pl_d d;
1808 	const uint8_t *q;
1809 	uint32_t doi;
1810 	uint32_t proto;
1811 	int i;
1812 
1813 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_D)));
1814 
1815 	p = (const struct ikev1_pl_d *)ext;
1816 	ND_TCHECK(*p);
1817 	UNALIGNED_MEMCPY(&d, ext, sizeof(d));
1818 	doi = ntohl(d.doi);
1819 	proto = d.prot_id;
1820 	if (doi != 1) {
1821 		ND_PRINT((ndo," doi=%u", doi));
1822 		ND_PRINT((ndo," proto=%u", proto));
1823 	} else {
1824 		ND_PRINT((ndo," doi=ipsec"));
1825 		ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));
1826 	}
1827 	ND_PRINT((ndo," spilen=%u", d.spi_size));
1828 	ND_PRINT((ndo," nspi=%u", ntohs(d.num_spi)));
1829 	ND_PRINT((ndo," spi="));
1830 	q = (const uint8_t *)(p + 1);
1831 	for (i = 0; i < ntohs(d.num_spi); i++) {
1832 		if (i != 0)
1833 			ND_PRINT((ndo,","));
1834 		if (!rawprint(ndo, (const uint8_t *)q, d.spi_size))
1835 			goto trunc;
1836 		q += d.spi_size;
1837 	}
1838 	return q;
1839 trunc:
1840 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_D)));
1841 	return NULL;
1842 }
1843 
1844 static const u_char *
1845 ikev1_vid_print(netdissect_options *ndo, u_char tpay _U_,
1846 		const struct isakmp_gen *ext,
1847 		u_int item_len _U_, const u_char *ep _U_,
1848 		uint32_t phase _U_, uint32_t doi _U_,
1849 		uint32_t proto _U_, int depth _U_)
1850 {
1851 	struct isakmp_gen e;
1852 
1853 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_VID)));
1854 
1855 	ND_TCHECK(*ext);
1856 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
1857 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
1858 	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
1859 		/* Print the entire payload in hex */
1860 		ND_PRINT((ndo," "));
1861 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
1862 			goto trunc;
1863 	}
1864 	return (const u_char *)ext + ntohs(e.len);
1865 trunc:
1866 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_VID)));
1867 	return NULL;
1868 }
1869 
1870 /************************************************************/
1871 /*                                                          */
1872 /*              IKE v2 - rfc4306 - dissector                */
1873 /*                                                          */
1874 /************************************************************/
1875 
1876 static void
1877 ikev2_pay_print(netdissect_options *ndo, const char *payname, int critical)
1878 {
1879 	ND_PRINT((ndo,"%s%s:", payname, critical&0x80 ? "[C]" : ""));
1880 }
1881 
1882 static const u_char *
1883 ikev2_gen_print(netdissect_options *ndo, u_char tpay,
1884 		const struct isakmp_gen *ext)
1885 {
1886 	struct isakmp_gen e;
1887 
1888 	ND_TCHECK(*ext);
1889 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
1890 	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
1891 
1892 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
1893 	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
1894 		/* Print the entire payload in hex */
1895 		ND_PRINT((ndo," "));
1896 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
1897 			goto trunc;
1898 	}
1899 	return (const u_char *)ext + ntohs(e.len);
1900 trunc:
1901 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
1902 	return NULL;
1903 }
1904 
1905 static const u_char *
1906 ikev2_t_print(netdissect_options *ndo, int tcount,
1907 	      const struct isakmp_gen *ext, u_int item_len,
1908 	      const u_char *ep)
1909 {
1910 	const struct ikev2_t *p;
1911 	struct ikev2_t t;
1912 	uint16_t  t_id;
1913 	const u_char *cp;
1914 	const char *idstr;
1915 	const struct attrmap *map;
1916 	size_t nmap;
1917 	const u_char *ep2;
1918 
1919 	p = (const struct ikev2_t *)ext;
1920 	ND_TCHECK(*p);
1921 	UNALIGNED_MEMCPY(&t, ext, sizeof(t));
1922 	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_T), t.h.critical);
1923 
1924 	t_id = ntohs(t.t_id);
1925 
1926 	map = NULL;
1927 	nmap = 0;
1928 
1929 	switch (t.t_type) {
1930 	case IV2_T_ENCR:
1931 		idstr = STR_OR_ID(t_id, esp_p_map);
1932 		map = encr_t_map;
1933 		nmap = sizeof(encr_t_map)/sizeof(encr_t_map[0]);
1934 		break;
1935 
1936 	case IV2_T_PRF:
1937 		idstr = STR_OR_ID(t_id, prf_p_map);
1938 		break;
1939 
1940 	case IV2_T_INTEG:
1941 		idstr = STR_OR_ID(t_id, integ_p_map);
1942 		break;
1943 
1944 	case IV2_T_DH:
1945 		idstr = STR_OR_ID(t_id, dh_p_map);
1946 		break;
1947 
1948 	case IV2_T_ESN:
1949 		idstr = STR_OR_ID(t_id, esn_p_map);
1950 		break;
1951 
1952 	default:
1953 		idstr = NULL;
1954 		break;
1955 	}
1956 
1957 	if (idstr)
1958 		ND_PRINT((ndo," #%u type=%s id=%s ", tcount,
1959 			  STR_OR_ID(t.t_type, ikev2_t_type_map),
1960 			  idstr));
1961 	else
1962 		ND_PRINT((ndo," #%u type=%s id=%u ", tcount,
1963 			  STR_OR_ID(t.t_type, ikev2_t_type_map),
1964 			  t.t_id));
1965 	cp = (const u_char *)(p + 1);
1966 	ep2 = (const u_char *)p + item_len;
1967 	while (cp < ep && cp < ep2) {
1968 		if (map && nmap) {
1969 			cp = ikev1_attrmap_print(ndo, cp, ep2, map, nmap);
1970 		} else
1971 			cp = ikev1_attr_print(ndo, cp, ep2);
1972 		if (cp == NULL)
1973 			goto trunc;
1974 	}
1975 	if (ep < ep2)
1976 		ND_PRINT((ndo,"..."));
1977 	return cp;
1978 trunc:
1979 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));
1980 	return NULL;
1981 }
1982 
1983 static const u_char *
1984 ikev2_p_print(netdissect_options *ndo, u_char tpay _U_, int pcount _U_,
1985 	      const struct isakmp_gen *ext, u_int oprop_length,
1986 	      const u_char *ep, int depth)
1987 {
1988 	const struct ikev2_p *p;
1989 	struct ikev2_p prop;
1990 	u_int prop_length;
1991 	const u_char *cp;
1992 	int i;
1993 	int tcount;
1994 	u_char np;
1995 	struct isakmp_gen e;
1996 	u_int item_len;
1997 
1998 	p = (const struct ikev2_p *)ext;
1999 	ND_TCHECK(*p);
2000 	UNALIGNED_MEMCPY(&prop, ext, sizeof(prop));
2001 
2002 	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_P), prop.h.critical);
2003 
2004 	/*
2005 	 * ikev2_sa_print() guarantees that this is >= 4.
2006 	 */
2007 	prop_length = oprop_length - 4;
2008 	ND_PRINT((ndo," #%u protoid=%s transform=%d len=%u",
2009 		  prop.p_no,  PROTOIDSTR(prop.prot_id),
2010 		  prop.num_t, oprop_length));
2011 	cp = (const u_char *)(p + 1);
2012 
2013 	if (prop.spi_size) {
2014 		if (prop_length < prop.spi_size)
2015 			goto toolong;
2016 		ND_PRINT((ndo," spi="));
2017 		if (!rawprint(ndo, (const uint8_t *)cp, prop.spi_size))
2018 			goto trunc;
2019 		cp += prop.spi_size;
2020 		prop_length -= prop.spi_size;
2021 	}
2022 
2023 	/*
2024 	 * Print the transforms.
2025 	 */
2026 	tcount = 0;
2027 	for (np = ISAKMP_NPTYPE_T; np != 0; np = e.np) {
2028 		tcount++;
2029 		ext = (const struct isakmp_gen *)cp;
2030 		if (prop_length < sizeof(*ext))
2031 			goto toolong;
2032 		ND_TCHECK(*ext);
2033 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2034 
2035 		/*
2036 		 * Since we can't have a payload length of less than 4 bytes,
2037 		 * we need to bail out here if the generic header is nonsensical
2038 		 * or truncated, otherwise we could loop forever processing
2039 		 * zero-length items or otherwise misdissect the packet.
2040 		 */
2041 		item_len = ntohs(e.len);
2042 		if (item_len <= 4)
2043 			goto trunc;
2044 
2045 		if (prop_length < item_len)
2046 			goto toolong;
2047 		ND_TCHECK2(*cp, item_len);
2048 
2049 		depth++;
2050 		ND_PRINT((ndo,"\n"));
2051 		for (i = 0; i < depth; i++)
2052 			ND_PRINT((ndo,"    "));
2053 		ND_PRINT((ndo,"("));
2054 		if (np == ISAKMP_NPTYPE_T) {
2055 			cp = ikev2_t_print(ndo, tcount, ext, item_len, ep);
2056 			if (cp == NULL) {
2057 				/* error, already reported */
2058 				return NULL;
2059 			}
2060 		} else {
2061 			ND_PRINT((ndo, "%s", NPSTR(np)));
2062 			cp += item_len;
2063 		}
2064 		ND_PRINT((ndo,")"));
2065 		depth--;
2066 		prop_length -= item_len;
2067 	}
2068 	return cp;
2069 toolong:
2070 	/*
2071 	 * Skip the rest of the proposal.
2072 	 */
2073 	cp += prop_length;
2074 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
2075 	return cp;
2076 trunc:
2077 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
2078 	return NULL;
2079 }
2080 
2081 static const u_char *
2082 ikev2_sa_print(netdissect_options *ndo, u_char tpay,
2083 		const struct isakmp_gen *ext1,
2084 		u_int osa_length, const u_char *ep,
2085 		uint32_t phase _U_, uint32_t doi _U_,
2086 		uint32_t proto _U_, int depth)
2087 {
2088 	const struct isakmp_gen *ext;
2089 	struct isakmp_gen e;
2090 	u_int sa_length;
2091 	const u_char *cp;
2092 	int i;
2093 	int pcount;
2094 	u_char np;
2095 	u_int item_len;
2096 
2097 	ND_TCHECK(*ext1);
2098 	UNALIGNED_MEMCPY(&e, ext1, sizeof(e));
2099 	ikev2_pay_print(ndo, "sa", e.critical);
2100 
2101 	/*
2102 	 * ikev2_sub0_print() guarantees that this is >= 4.
2103 	 */
2104 	osa_length= ntohs(e.len);
2105 	sa_length = osa_length - 4;
2106 	ND_PRINT((ndo," len=%d", sa_length));
2107 
2108 	/*
2109 	 * Print the payloads.
2110 	 */
2111 	cp = (const u_char *)(ext1 + 1);
2112 	pcount = 0;
2113 	for (np = ISAKMP_NPTYPE_P; np != 0; np = e.np) {
2114 		pcount++;
2115 		ext = (const struct isakmp_gen *)cp;
2116 		if (sa_length < sizeof(*ext))
2117 			goto toolong;
2118 		ND_TCHECK(*ext);
2119 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2120 
2121 		/*
2122 		 * Since we can't have a payload length of less than 4 bytes,
2123 		 * we need to bail out here if the generic header is nonsensical
2124 		 * or truncated, otherwise we could loop forever processing
2125 		 * zero-length items or otherwise misdissect the packet.
2126 		 */
2127 		item_len = ntohs(e.len);
2128 		if (item_len <= 4)
2129 			goto trunc;
2130 
2131 		if (sa_length < item_len)
2132 			goto toolong;
2133 		ND_TCHECK2(*cp, item_len);
2134 
2135 		depth++;
2136 		ND_PRINT((ndo,"\n"));
2137 		for (i = 0; i < depth; i++)
2138 			ND_PRINT((ndo,"    "));
2139 		ND_PRINT((ndo,"("));
2140 		if (np == ISAKMP_NPTYPE_P) {
2141 			cp = ikev2_p_print(ndo, np, pcount, ext, item_len,
2142 					   ep, depth);
2143 			if (cp == NULL) {
2144 				/* error, already reported */
2145 				return NULL;
2146 			}
2147 		} else {
2148 			ND_PRINT((ndo, "%s", NPSTR(np)));
2149 			cp += item_len;
2150 		}
2151 		ND_PRINT((ndo,")"));
2152 		depth--;
2153 		sa_length -= item_len;
2154 	}
2155 	return cp;
2156 toolong:
2157 	/*
2158 	 * Skip the rest of the SA.
2159 	 */
2160 	cp += sa_length;
2161 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2162 	return cp;
2163 trunc:
2164 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2165 	return NULL;
2166 }
2167 
2168 static const u_char *
2169 ikev2_ke_print(netdissect_options *ndo, u_char tpay,
2170 		const struct isakmp_gen *ext,
2171 		u_int item_len _U_, const u_char *ep _U_,
2172 		uint32_t phase _U_, uint32_t doi _U_,
2173 		uint32_t proto _U_, int depth _U_)
2174 {
2175 	struct ikev2_ke ke;
2176 	const struct ikev2_ke *k;
2177 
2178 	k = (const struct ikev2_ke *)ext;
2179 	ND_TCHECK(*k);
2180 	UNALIGNED_MEMCPY(&ke, ext, sizeof(ke));
2181 	ikev2_pay_print(ndo, NPSTR(tpay), ke.h.critical);
2182 
2183 	ND_PRINT((ndo," len=%u group=%s", ntohs(ke.h.len) - 8,
2184 		  STR_OR_ID(ntohs(ke.ke_group), dh_p_map)));
2185 
2186 	if (2 < ndo->ndo_vflag && 8 < ntohs(ke.h.len)) {
2187 		ND_PRINT((ndo," "));
2188 		if (!rawprint(ndo, (const uint8_t *)(k + 1), ntohs(ke.h.len) - 8))
2189 			goto trunc;
2190 	}
2191 	return (const u_char *)ext + ntohs(ke.h.len);
2192 trunc:
2193 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2194 	return NULL;
2195 }
2196 
2197 static const u_char *
2198 ikev2_ID_print(netdissect_options *ndo, u_char tpay,
2199 		const struct isakmp_gen *ext,
2200 		u_int item_len _U_, const u_char *ep _U_,
2201 		uint32_t phase _U_, uint32_t doi _U_,
2202 		uint32_t proto _U_, int depth _U_)
2203 {
2204 	const struct ikev2_id *idp;
2205 	struct ikev2_id id;
2206 	int id_len, idtype_len, i;
2207 	unsigned int dumpascii, dumphex;
2208 	const unsigned char *typedata;
2209 
2210 	idp = (const struct ikev2_id *)ext;
2211 	ND_TCHECK(*idp);
2212 	UNALIGNED_MEMCPY(&id, ext, sizeof(id));
2213 	ikev2_pay_print(ndo, NPSTR(tpay), id.h.critical);
2214 
2215 	id_len = ntohs(id.h.len);
2216 
2217 	ND_PRINT((ndo," len=%d", id_len - 4));
2218 	if (2 < ndo->ndo_vflag && 4 < id_len) {
2219 		/* Print the entire payload in hex */
2220 		ND_PRINT((ndo," "));
2221 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), id_len - 4))
2222 			goto trunc;
2223 	}
2224 
2225 	idtype_len =id_len - sizeof(struct ikev2_id);
2226 	dumpascii = 0;
2227 	dumphex   = 0;
2228 	typedata  = (const unsigned char *)(ext)+sizeof(struct ikev2_id);
2229 
2230 	switch(id.type) {
2231 	case ID_IPV4_ADDR:
2232 		ND_PRINT((ndo, " ipv4:"));
2233 		dumphex=1;
2234 		break;
2235 	case ID_FQDN:
2236 		ND_PRINT((ndo, " fqdn:"));
2237 		dumpascii=1;
2238 		break;
2239 	case ID_RFC822_ADDR:
2240 		ND_PRINT((ndo, " rfc822:"));
2241 		dumpascii=1;
2242 		break;
2243 	case ID_IPV6_ADDR:
2244 		ND_PRINT((ndo, " ipv6:"));
2245 		dumphex=1;
2246 		break;
2247 	case ID_DER_ASN1_DN:
2248 		ND_PRINT((ndo, " dn:"));
2249 		dumphex=1;
2250 		break;
2251 	case ID_DER_ASN1_GN:
2252 		ND_PRINT((ndo, " gn:"));
2253 		dumphex=1;
2254 		break;
2255 	case ID_KEY_ID:
2256 		ND_PRINT((ndo, " keyid:"));
2257 		dumphex=1;
2258 		break;
2259 	}
2260 
2261 	if(dumpascii) {
2262 		ND_TCHECK2(*typedata, idtype_len);
2263 		for(i=0; i<idtype_len; i++) {
2264 			if(ND_ISPRINT(typedata[i])) {
2265 				ND_PRINT((ndo, "%c", typedata[i]));
2266 			} else {
2267 				ND_PRINT((ndo, "."));
2268 			}
2269 		}
2270 	}
2271 	if(dumphex) {
2272 		if (!rawprint(ndo, (const uint8_t *)typedata, idtype_len))
2273 			goto trunc;
2274 	}
2275 
2276 	return (const u_char *)ext + id_len;
2277 trunc:
2278 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2279 	return NULL;
2280 }
2281 
2282 static const u_char *
2283 ikev2_cert_print(netdissect_options *ndo, u_char tpay,
2284 		const struct isakmp_gen *ext,
2285 		u_int item_len _U_, const u_char *ep _U_,
2286 		uint32_t phase _U_, uint32_t doi _U_,
2287 		uint32_t proto _U_, int depth _U_)
2288 {
2289 	return ikev2_gen_print(ndo, tpay, ext);
2290 }
2291 
2292 static const u_char *
2293 ikev2_cr_print(netdissect_options *ndo, u_char tpay,
2294 		const struct isakmp_gen *ext,
2295 		u_int item_len _U_, const u_char *ep _U_,
2296 		uint32_t phase _U_, uint32_t doi _U_,
2297 		uint32_t proto _U_, int depth _U_)
2298 {
2299 	return ikev2_gen_print(ndo, tpay, ext);
2300 }
2301 
2302 static const u_char *
2303 ikev2_auth_print(netdissect_options *ndo, u_char tpay,
2304 		const struct isakmp_gen *ext,
2305 		u_int item_len _U_, const u_char *ep,
2306 		uint32_t phase _U_, uint32_t doi _U_,
2307 		uint32_t proto _U_, int depth _U_)
2308 {
2309 	struct ikev2_auth a;
2310 	const char *v2_auth[]={ "invalid", "rsasig",
2311 				"shared-secret", "dsssig" };
2312 	const u_char *authdata = (const u_char*)ext + sizeof(a);
2313 	unsigned int len;
2314 
2315 	ND_TCHECK2(*ext, sizeof(a));
2316 	UNALIGNED_MEMCPY(&a, ext, sizeof(a));
2317 	ikev2_pay_print(ndo, NPSTR(tpay), a.h.critical);
2318 	len = ntohs(a.h.len);
2319 
2320 	/*
2321 	 * Our caller has ensured that the length is >= 4.
2322 	 */
2323 	ND_PRINT((ndo," len=%u method=%s", len-4,
2324 		  STR_OR_ID(a.auth_method, v2_auth)));
2325 	if (len > 4) {
2326 		if (ndo->ndo_vflag > 1) {
2327 			ND_PRINT((ndo, " authdata=("));
2328 			if (!rawprint(ndo, (const uint8_t *)authdata, len - sizeof(a)))
2329 				goto trunc;
2330 			ND_PRINT((ndo, ") "));
2331 		} else if (ndo->ndo_vflag) {
2332 			if (!ike_show_somedata(ndo, authdata, ep))
2333 				goto trunc;
2334 		}
2335 	}
2336 
2337 	return (const u_char *)ext + len;
2338 trunc:
2339 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2340 	return NULL;
2341 }
2342 
2343 static const u_char *
2344 ikev2_nonce_print(netdissect_options *ndo, u_char tpay,
2345 		const struct isakmp_gen *ext,
2346 		u_int item_len _U_, const u_char *ep,
2347 		uint32_t phase _U_, uint32_t doi _U_,
2348 		uint32_t proto _U_, int depth _U_)
2349 {
2350 	struct isakmp_gen e;
2351 
2352 	ND_TCHECK(*ext);
2353 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2354 	ikev2_pay_print(ndo, "nonce", e.critical);
2355 
2356 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
2357 	if (1 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
2358 		ND_PRINT((ndo," nonce=("));
2359 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
2360 			goto trunc;
2361 		ND_PRINT((ndo,") "));
2362 	} else if(ndo->ndo_vflag && 4 < ntohs(e.len)) {
2363 		if(!ike_show_somedata(ndo, (const u_char *)(ext+1), ep)) goto trunc;
2364 	}
2365 
2366 	return (const u_char *)ext + ntohs(e.len);
2367 trunc:
2368 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2369 	return NULL;
2370 }
2371 
2372 /* notify payloads */
2373 static const u_char *
2374 ikev2_n_print(netdissect_options *ndo, u_char tpay _U_,
2375 		const struct isakmp_gen *ext,
2376 		u_int item_len, const u_char *ep,
2377 		uint32_t phase _U_, uint32_t doi _U_,
2378 		uint32_t proto _U_, int depth _U_)
2379 {
2380 	const struct ikev2_n *p;
2381 	struct ikev2_n n;
2382 	const u_char *cp;
2383 	u_char showspi, showsomedata;
2384 	const char *notify_name;
2385 	uint32_t type;
2386 
2387 	p = (const struct ikev2_n *)ext;
2388 	ND_TCHECK(*p);
2389 	UNALIGNED_MEMCPY(&n, ext, sizeof(n));
2390 	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_N), n.h.critical);
2391 
2392 	showspi = 1;
2393 	showsomedata=0;
2394 	notify_name=NULL;
2395 
2396 	ND_PRINT((ndo," prot_id=%s", PROTOIDSTR(n.prot_id)));
2397 
2398 	type = ntohs(n.type);
2399 
2400 	/* notify space is annoying sparse */
2401 	switch(type) {
2402 	case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD:
2403 		notify_name = "unsupported_critical_payload";
2404 		showspi = 0;
2405 		break;
2406 
2407 	case IV2_NOTIFY_INVALID_IKE_SPI:
2408 		notify_name = "invalid_ike_spi";
2409 		showspi = 1;
2410 		break;
2411 
2412 	case IV2_NOTIFY_INVALID_MAJOR_VERSION:
2413 		notify_name = "invalid_major_version";
2414 		showspi = 0;
2415 		break;
2416 
2417 	case IV2_NOTIFY_INVALID_SYNTAX:
2418 		notify_name = "invalid_syntax";
2419 		showspi = 1;
2420 		break;
2421 
2422 	case IV2_NOTIFY_INVALID_MESSAGE_ID:
2423 		notify_name = "invalid_message_id";
2424 		showspi = 1;
2425 		break;
2426 
2427 	case IV2_NOTIFY_INVALID_SPI:
2428 		notify_name = "invalid_spi";
2429 		showspi = 1;
2430 		break;
2431 
2432 	case IV2_NOTIFY_NO_PROPOSAL_CHOSEN:
2433 		notify_name = "no_protocol_chosen";
2434 		showspi = 1;
2435 		break;
2436 
2437 	case IV2_NOTIFY_INVALID_KE_PAYLOAD:
2438 		notify_name = "invalid_ke_payload";
2439 		showspi = 1;
2440 		break;
2441 
2442 	case IV2_NOTIFY_AUTHENTICATION_FAILED:
2443 		notify_name = "authentication_failed";
2444 		showspi = 1;
2445 		break;
2446 
2447 	case IV2_NOTIFY_SINGLE_PAIR_REQUIRED:
2448 		notify_name = "single_pair_required";
2449 		showspi = 1;
2450 		break;
2451 
2452 	case IV2_NOTIFY_NO_ADDITIONAL_SAS:
2453 		notify_name = "no_additional_sas";
2454 		showspi = 0;
2455 		break;
2456 
2457 	case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE:
2458 		notify_name = "internal_address_failure";
2459 		showspi = 0;
2460 		break;
2461 
2462 	case IV2_NOTIFY_FAILED_CP_REQUIRED:
2463 		notify_name = "failed:cp_required";
2464 		showspi = 0;
2465 		break;
2466 
2467 	case IV2_NOTIFY_INVALID_SELECTORS:
2468 		notify_name = "invalid_selectors";
2469 		showspi = 0;
2470 		break;
2471 
2472 	case IV2_NOTIFY_INITIAL_CONTACT:
2473 		notify_name = "initial_contact";
2474 		showspi = 0;
2475 		break;
2476 
2477 	case IV2_NOTIFY_SET_WINDOW_SIZE:
2478 		notify_name = "set_window_size";
2479 		showspi = 0;
2480 		break;
2481 
2482 	case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE:
2483 		notify_name = "additional_ts_possible";
2484 		showspi = 0;
2485 		break;
2486 
2487 	case IV2_NOTIFY_IPCOMP_SUPPORTED:
2488 		notify_name = "ipcomp_supported";
2489 		showspi = 0;
2490 		break;
2491 
2492 	case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP:
2493 		notify_name = "nat_detection_source_ip";
2494 		showspi = 1;
2495 		break;
2496 
2497 	case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP:
2498 		notify_name = "nat_detection_destination_ip";
2499 		showspi = 1;
2500 		break;
2501 
2502 	case IV2_NOTIFY_COOKIE:
2503 		notify_name = "cookie";
2504 		showspi = 1;
2505 		showsomedata= 1;
2506 		break;
2507 
2508 	case IV2_NOTIFY_USE_TRANSPORT_MODE:
2509 		notify_name = "use_transport_mode";
2510 		showspi = 0;
2511 		break;
2512 
2513 	case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED:
2514 		notify_name = "http_cert_lookup_supported";
2515 		showspi = 0;
2516 		break;
2517 
2518 	case IV2_NOTIFY_REKEY_SA:
2519 		notify_name = "rekey_sa";
2520 		showspi = 1;
2521 		break;
2522 
2523 	case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED:
2524 		notify_name = "tfc_padding_not_supported";
2525 		showspi = 0;
2526 		break;
2527 
2528 	case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO:
2529 		notify_name = "non_first_fragment_also";
2530 		showspi = 0;
2531 		break;
2532 
2533 	default:
2534 		if (type < 8192) {
2535 			notify_name="error";
2536 		} else if(type < 16384) {
2537 			notify_name="private-error";
2538 		} else if(type < 40960) {
2539 			notify_name="status";
2540 		} else {
2541 			notify_name="private-status";
2542 		}
2543 	}
2544 
2545 	if(notify_name) {
2546 		ND_PRINT((ndo," type=%u(%s)", type, notify_name));
2547 	}
2548 
2549 
2550 	if (showspi && n.spi_size) {
2551 		ND_PRINT((ndo," spi="));
2552 		if (!rawprint(ndo, (const uint8_t *)(p + 1), n.spi_size))
2553 			goto trunc;
2554 	}
2555 
2556 	cp = (const u_char *)(p + 1) + n.spi_size;
2557 
2558 	if (cp < ep) {
2559 		if (ndo->ndo_vflag > 3 || (showsomedata && ep-cp < 30)) {
2560 			ND_PRINT((ndo," data=("));
2561 			if (!rawprint(ndo, (const uint8_t *)(cp), ep - cp))
2562 				goto trunc;
2563 
2564 			ND_PRINT((ndo,")"));
2565 		} else if (showsomedata) {
2566 			if (!ike_show_somedata(ndo, cp, ep))
2567 				goto trunc;
2568 		}
2569 	}
2570 
2571 	return (const u_char *)ext + item_len;
2572 trunc:
2573 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
2574 	return NULL;
2575 }
2576 
2577 static const u_char *
2578 ikev2_d_print(netdissect_options *ndo, u_char tpay,
2579 		const struct isakmp_gen *ext,
2580 		u_int item_len _U_, const u_char *ep _U_,
2581 		uint32_t phase _U_, uint32_t doi _U_,
2582 		uint32_t proto _U_, int depth _U_)
2583 {
2584 	return ikev2_gen_print(ndo, tpay, ext);
2585 }
2586 
2587 static const u_char *
2588 ikev2_vid_print(netdissect_options *ndo, u_char tpay,
2589 		const struct isakmp_gen *ext,
2590 		u_int item_len _U_, const u_char *ep _U_,
2591 		uint32_t phase _U_, uint32_t doi _U_,
2592 		uint32_t proto _U_, int depth _U_)
2593 {
2594 	struct isakmp_gen e;
2595 	const u_char *vid;
2596 	int i, len;
2597 
2598 	ND_TCHECK(*ext);
2599 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2600 	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
2601 	ND_PRINT((ndo," len=%d vid=", ntohs(e.len) - 4));
2602 
2603 	vid = (const u_char *)(ext+1);
2604 	len = ntohs(e.len) - 4;
2605 	ND_TCHECK2(*vid, len);
2606 	for(i=0; i<len; i++) {
2607 		if(ND_ISPRINT(vid[i])) ND_PRINT((ndo, "%c", vid[i]));
2608 		else ND_PRINT((ndo, "."));
2609 	}
2610 	if (2 < ndo->ndo_vflag && 4 < len) {
2611 		/* Print the entire payload in hex */
2612 		ND_PRINT((ndo," "));
2613 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
2614 			goto trunc;
2615 	}
2616 	return (const u_char *)ext + ntohs(e.len);
2617 trunc:
2618 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2619 	return NULL;
2620 }
2621 
2622 static const u_char *
2623 ikev2_TS_print(netdissect_options *ndo, u_char tpay,
2624 		const struct isakmp_gen *ext,
2625 		u_int item_len _U_, const u_char *ep _U_,
2626 		uint32_t phase _U_, uint32_t doi _U_,
2627 		uint32_t proto _U_, int depth _U_)
2628 {
2629 	return ikev2_gen_print(ndo, tpay, ext);
2630 }
2631 
2632 static const u_char *
2633 ikev2_e_print(netdissect_options *ndo,
2634 #ifndef HAVE_LIBCRYPTO
2635 	      _U_
2636 #endif
2637 	      struct isakmp *base,
2638 	      u_char tpay,
2639 	      const struct isakmp_gen *ext,
2640 	      u_int item_len _U_, const u_char *ep _U_,
2641 #ifndef HAVE_LIBCRYPTO
2642 	      _U_
2643 #endif
2644 	      uint32_t phase,
2645 #ifndef HAVE_LIBCRYPTO
2646 	      _U_
2647 #endif
2648 	      uint32_t doi,
2649 #ifndef HAVE_LIBCRYPTO
2650 	      _U_
2651 #endif
2652 	      uint32_t proto,
2653 #ifndef HAVE_LIBCRYPTO
2654 	      _U_
2655 #endif
2656 	      int depth)
2657 {
2658 	struct isakmp_gen e;
2659 	const u_char *dat;
2660 	volatile int dlen;
2661 
2662 	ND_TCHECK(*ext);
2663 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2664 	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
2665 
2666 	dlen = ntohs(e.len)-4;
2667 
2668 	ND_PRINT((ndo," len=%d", dlen));
2669 	if (2 < ndo->ndo_vflag && 4 < dlen) {
2670 		ND_PRINT((ndo," "));
2671 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), dlen))
2672 			goto trunc;
2673 	}
2674 
2675 	dat = (const u_char *)(ext+1);
2676 	ND_TCHECK2(*dat, dlen);
2677 
2678 #ifdef HAVE_LIBCRYPTO
2679 	/* try to decypt it! */
2680 	if(esp_print_decrypt_buffer_by_ikev2(ndo,
2681 					     base->flags & ISAKMP_FLAG_I,
2682 					     base->i_ck, base->r_ck,
2683 					     dat, dat+dlen)) {
2684 
2685 		ext = (const struct isakmp_gen *)ndo->ndo_packetp;
2686 
2687 		/* got it decrypted, print stuff inside. */
2688 		ikev2_sub_print(ndo, base, e.np, ext, ndo->ndo_snapend,
2689 				phase, doi, proto, depth+1);
2690 	}
2691 #endif
2692 
2693 
2694 	/* always return NULL, because E must be at end, and NP refers
2695 	 * to what was inside.
2696 	 */
2697 	return NULL;
2698 trunc:
2699 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
2700 	return NULL;
2701 }
2702 
2703 static const u_char *
2704 ikev2_cp_print(netdissect_options *ndo, u_char tpay,
2705 		const struct isakmp_gen *ext,
2706 		u_int item_len _U_, const u_char *ep _U_,
2707 		uint32_t phase _U_, uint32_t doi _U_,
2708 		uint32_t proto _U_, int depth _U_)
2709 {
2710 	return ikev2_gen_print(ndo, tpay, ext);
2711 }
2712 
2713 static const u_char *
2714 ikev2_eap_print(netdissect_options *ndo, u_char tpay,
2715 		const struct isakmp_gen *ext,
2716 		u_int item_len _U_, const u_char *ep _U_,
2717 		uint32_t phase _U_, uint32_t doi _U_,
2718 		uint32_t proto _U_, int depth _U_)
2719 {
2720 	return ikev2_gen_print(ndo, tpay, ext);
2721 }
2722 
2723 static const u_char *
2724 ike_sub0_print(netdissect_options *ndo,
2725 		 u_char np, const struct isakmp_gen *ext, const u_char *ep,
2726 
2727 	       uint32_t phase, uint32_t doi, uint32_t proto, int depth)
2728 {
2729 	const u_char *cp;
2730 	struct isakmp_gen e;
2731 	u_int item_len;
2732 
2733 	cp = (const u_char *)ext;
2734 	ND_TCHECK(*ext);
2735 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2736 
2737 	/*
2738 	 * Since we can't have a payload length of less than 4 bytes,
2739 	 * we need to bail out here if the generic header is nonsensical
2740 	 * or truncated, otherwise we could loop forever processing
2741 	 * zero-length items or otherwise misdissect the packet.
2742 	 */
2743 	item_len = ntohs(e.len);
2744 	if (item_len <= 4)
2745 		return NULL;
2746 
2747 	if (NPFUNC(np)) {
2748 		/*
2749 		 * XXX - what if item_len is too short, or too long,
2750 		 * for this payload type?
2751 		 */
2752 		cp = (*npfunc[np])(ndo, np, ext, item_len, ep, phase, doi, proto, depth);
2753 	} else {
2754 		ND_PRINT((ndo,"%s", NPSTR(np)));
2755 		cp += item_len;
2756 	}
2757 
2758 	return cp;
2759 trunc:
2760 	ND_PRINT((ndo," [|isakmp]"));
2761 	return NULL;
2762 }
2763 
2764 static const u_char *
2765 ikev1_sub_print(netdissect_options *ndo,
2766 		u_char np, const struct isakmp_gen *ext, const u_char *ep,
2767 		uint32_t phase, uint32_t doi, uint32_t proto, int depth)
2768 {
2769 	const u_char *cp;
2770 	int i;
2771 	struct isakmp_gen e;
2772 
2773 	cp = (const u_char *)ext;
2774 
2775 	while (np) {
2776 		ND_TCHECK(*ext);
2777 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2778 
2779 		ND_TCHECK2(*ext, ntohs(e.len));
2780 
2781 		depth++;
2782 		ND_PRINT((ndo,"\n"));
2783 		for (i = 0; i < depth; i++)
2784 			ND_PRINT((ndo,"    "));
2785 		ND_PRINT((ndo,"("));
2786 		cp = ike_sub0_print(ndo, np, ext, ep, phase, doi, proto, depth);
2787 		ND_PRINT((ndo,")"));
2788 		depth--;
2789 
2790 		if (cp == NULL) {
2791 			/* Zero-length subitem */
2792 			return NULL;
2793 		}
2794 
2795 		np = e.np;
2796 		ext = (const struct isakmp_gen *)cp;
2797 	}
2798 	return cp;
2799 trunc:
2800 	ND_PRINT((ndo," [|%s]", NPSTR(np)));
2801 	return NULL;
2802 }
2803 
2804 static char *
2805 numstr(int x)
2806 {
2807 	static char buf[20];
2808 	snprintf(buf, sizeof(buf), "#%d", x);
2809 	return buf;
2810 }
2811 
2812 static void
2813 ikev1_print(netdissect_options *ndo,
2814 	    const u_char *bp,  u_int length,
2815 	    const u_char *bp2, struct isakmp *base)
2816 {
2817 	const struct isakmp *p;
2818 	const u_char *ep;
2819 	u_char np;
2820 	int i;
2821 	int phase;
2822 
2823 	p = (const struct isakmp *)bp;
2824 	ep = ndo->ndo_snapend;
2825 
2826 	phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
2827 	if (phase == 1)
2828 		ND_PRINT((ndo," phase %d", phase));
2829 	else
2830 		ND_PRINT((ndo," phase %d/others", phase));
2831 
2832 	i = cookie_find(&base->i_ck);
2833 	if (i < 0) {
2834 		if (iszero((const u_char *)&base->r_ck, sizeof(base->r_ck))) {
2835 			/* the first packet */
2836 			ND_PRINT((ndo," I"));
2837 			if (bp2)
2838 				cookie_record(&base->i_ck, bp2);
2839 		} else
2840 			ND_PRINT((ndo," ?"));
2841 	} else {
2842 		if (bp2 && cookie_isinitiator(i, bp2))
2843 			ND_PRINT((ndo," I"));
2844 		else if (bp2 && cookie_isresponder(i, bp2))
2845 			ND_PRINT((ndo," R"));
2846 		else
2847 			ND_PRINT((ndo," ?"));
2848 	}
2849 
2850 	ND_PRINT((ndo," %s", ETYPESTR(base->etype)));
2851 	if (base->flags) {
2852 		ND_PRINT((ndo,"[%s%s]", base->flags & ISAKMP_FLAG_E ? "E" : "",
2853 			  base->flags & ISAKMP_FLAG_C ? "C" : ""));
2854 	}
2855 
2856 	if (ndo->ndo_vflag) {
2857 		const struct isakmp_gen *ext;
2858 
2859 		ND_PRINT((ndo,":"));
2860 
2861 		/* regardless of phase... */
2862 		if (base->flags & ISAKMP_FLAG_E) {
2863 			/*
2864 			 * encrypted, nothing we can do right now.
2865 			 * we hope to decrypt the packet in the future...
2866 			 */
2867 			ND_PRINT((ndo," [encrypted %s]", NPSTR(base->np)));
2868 			goto done;
2869 		}
2870 
2871 		CHECKLEN(p + 1, base->np);
2872 		np = base->np;
2873 		ext = (const struct isakmp_gen *)(p + 1);
2874 		ikev1_sub_print(ndo, np, ext, ep, phase, 0, 0, 0);
2875 	}
2876 
2877 done:
2878 	if (ndo->ndo_vflag) {
2879 		if (ntohl(base->len) != length) {
2880 			ND_PRINT((ndo," (len mismatch: isakmp %u/ip %u)",
2881 				  (uint32_t)ntohl(base->len), length));
2882 		}
2883 	}
2884 }
2885 
2886 static const u_char *
2887 ikev2_sub0_print(netdissect_options *ndo, struct isakmp *base,
2888 		 u_char np,
2889 		 const struct isakmp_gen *ext, const u_char *ep,
2890 		 uint32_t phase, uint32_t doi, uint32_t proto, int depth)
2891 {
2892 	const u_char *cp;
2893 	struct isakmp_gen e;
2894 	u_int item_len;
2895 
2896 	cp = (const u_char *)ext;
2897 	ND_TCHECK(*ext);
2898 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2899 
2900 	/*
2901 	 * Since we can't have a payload length of less than 4 bytes,
2902 	 * we need to bail out here if the generic header is nonsensical
2903 	 * or truncated, otherwise we could loop forever processing
2904 	 * zero-length items or otherwise misdissect the packet.
2905 	 */
2906 	item_len = ntohs(e.len);
2907 	if (item_len <= 4)
2908 		return NULL;
2909 
2910 	if (np == ISAKMP_NPTYPE_v2E) {
2911 		cp = ikev2_e_print(ndo, base, np, ext, item_len,
2912 				   ep, phase, doi, proto, depth);
2913 	} else if (NPFUNC(np)) {
2914 		/*
2915 		 * XXX - what if item_len is too short, or too long,
2916 		 * for this payload type?
2917 		 */
2918 		cp = (*npfunc[np])(ndo, np, ext, item_len,
2919 				   ep, phase, doi, proto, depth);
2920 	} else {
2921 		ND_PRINT((ndo,"%s", NPSTR(np)));
2922 		cp += item_len;
2923 	}
2924 
2925 	return cp;
2926 trunc:
2927 	ND_PRINT((ndo," [|isakmp]"));
2928 	return NULL;
2929 }
2930 
2931 static const u_char *
2932 ikev2_sub_print(netdissect_options *ndo,
2933 		struct isakmp *base,
2934 		u_char np, const struct isakmp_gen *ext, const u_char *ep,
2935 		uint32_t phase, uint32_t doi, uint32_t proto, int depth)
2936 {
2937 	const u_char *cp;
2938 	int i;
2939 	struct isakmp_gen e;
2940 
2941 	cp = (const u_char *)ext;
2942 	while (np) {
2943 		ND_TCHECK(*ext);
2944 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
2945 
2946 		ND_TCHECK2(*ext, ntohs(e.len));
2947 
2948 		depth++;
2949 		ND_PRINT((ndo,"\n"));
2950 		for (i = 0; i < depth; i++)
2951 			ND_PRINT((ndo,"    "));
2952 		ND_PRINT((ndo,"("));
2953 		cp = ikev2_sub0_print(ndo, base, np,
2954 				      ext, ep, phase, doi, proto, depth);
2955 		ND_PRINT((ndo,")"));
2956 		depth--;
2957 
2958 		if (cp == NULL) {
2959 			/* Zero-length subitem */
2960 			return NULL;
2961 		}
2962 
2963 		np = e.np;
2964 		ext = (const struct isakmp_gen *)cp;
2965 	}
2966 	return cp;
2967 trunc:
2968 	ND_PRINT((ndo," [|%s]", NPSTR(np)));
2969 	return NULL;
2970 }
2971 
2972 static void
2973 ikev2_print(netdissect_options *ndo,
2974 	    const u_char *bp,  u_int length,
2975 	    const u_char *bp2 _U_, struct isakmp *base)
2976 {
2977 	const struct isakmp *p;
2978 	const u_char *ep;
2979 	u_char np;
2980 	int phase;
2981 
2982 	p = (const struct isakmp *)bp;
2983 	ep = ndo->ndo_snapend;
2984 
2985 	phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
2986 	if (phase == 1)
2987 		ND_PRINT((ndo, " parent_sa"));
2988 	else
2989 		ND_PRINT((ndo, " child_sa "));
2990 
2991 	ND_PRINT((ndo, " %s", ETYPESTR(base->etype)));
2992 	if (base->flags) {
2993 		ND_PRINT((ndo, "[%s%s%s]",
2994 			  base->flags & ISAKMP_FLAG_I ? "I" : "",
2995 			  base->flags & ISAKMP_FLAG_V ? "V" : "",
2996 			  base->flags & ISAKMP_FLAG_R ? "R" : ""));
2997 	}
2998 
2999 	if (ndo->ndo_vflag) {
3000 		const struct isakmp_gen *ext;
3001 
3002 		ND_PRINT((ndo, ":"));
3003 
3004 		/* regardless of phase... */
3005 		if (base->flags & ISAKMP_FLAG_E) {
3006 			/*
3007 			 * encrypted, nothing we can do right now.
3008 			 * we hope to decrypt the packet in the future...
3009 			 */
3010 			ND_PRINT((ndo, " [encrypted %s]", NPSTR(base->np)));
3011 			goto done;
3012 		}
3013 
3014 		CHECKLEN(p + 1, base->np)
3015 
3016 		np = base->np;
3017 		ext = (const struct isakmp_gen *)(p + 1);
3018 		ikev2_sub_print(ndo, base, np, ext, ep, phase, 0, 0, 0);
3019 	}
3020 
3021 done:
3022 	if (ndo->ndo_vflag) {
3023 		if (ntohl(base->len) != length) {
3024 			ND_PRINT((ndo, " (len mismatch: isakmp %u/ip %u)",
3025 				  (uint32_t)ntohl(base->len), length));
3026 		}
3027 	}
3028 }
3029 
3030 void
3031 isakmp_print(netdissect_options *ndo,
3032 	     const u_char *bp, u_int length,
3033 	     const u_char *bp2)
3034 {
3035 	const struct isakmp *p;
3036 	struct isakmp base;
3037 	const u_char *ep;
3038 	int major, minor;
3039 
3040 #ifdef HAVE_LIBCRYPTO
3041 	/* initialize SAs */
3042 	if (ndo->ndo_sa_list_head == NULL) {
3043 		if (ndo->ndo_espsecret)
3044 			esp_print_decodesecret(ndo);
3045 	}
3046 #endif
3047 
3048 	p = (const struct isakmp *)bp;
3049 	ep = ndo->ndo_snapend;
3050 
3051 	if ((const struct isakmp *)ep < p + 1) {
3052 		ND_PRINT((ndo,"[|isakmp]"));
3053 		return;
3054 	}
3055 
3056 	UNALIGNED_MEMCPY(&base, p, sizeof(base));
3057 
3058 	ND_PRINT((ndo,"isakmp"));
3059 	major = (base.vers & ISAKMP_VERS_MAJOR)
3060 		>> ISAKMP_VERS_MAJOR_SHIFT;
3061 	minor = (base.vers & ISAKMP_VERS_MINOR)
3062 		>> ISAKMP_VERS_MINOR_SHIFT;
3063 
3064 	if (ndo->ndo_vflag) {
3065 		ND_PRINT((ndo," %d.%d", major, minor));
3066 	}
3067 
3068 	if (ndo->ndo_vflag) {
3069 		ND_PRINT((ndo," msgid "));
3070 		hexprint(ndo, (const uint8_t *)&base.msgid, sizeof(base.msgid));
3071 	}
3072 
3073 	if (1 < ndo->ndo_vflag) {
3074 		ND_PRINT((ndo," cookie "));
3075 		hexprint(ndo, (const uint8_t *)&base.i_ck, sizeof(base.i_ck));
3076 		ND_PRINT((ndo,"->"));
3077 		hexprint(ndo, (const uint8_t *)&base.r_ck, sizeof(base.r_ck));
3078 	}
3079 	ND_PRINT((ndo,":"));
3080 
3081 	switch(major) {
3082 	case IKEv1_MAJOR_VERSION:
3083 		ikev1_print(ndo, bp, length, bp2, &base);
3084 		break;
3085 
3086 	case IKEv2_MAJOR_VERSION:
3087 		ikev2_print(ndo, bp, length, bp2, &base);
3088 		break;
3089 	}
3090 }
3091 
3092 void
3093 isakmp_rfc3948_print(netdissect_options *ndo,
3094 		     const u_char *bp, u_int length,
3095 		     const u_char *bp2)
3096 {
3097 	ND_TCHECK(bp[0]);
3098 	if(length == 1 && bp[0]==0xff) {
3099 		ND_PRINT((ndo, "isakmp-nat-keep-alive"));
3100 		return;
3101 	}
3102 
3103 	if(length < 4) {
3104 		goto trunc;
3105 	}
3106 	ND_TCHECK(bp[3]);
3107 
3108 	/*
3109 	 * see if this is an IKE packet
3110 	 */
3111 	if(bp[0]==0 && bp[1]==0 && bp[2]==0 && bp[3]==0) {
3112 		ND_PRINT((ndo, "NONESP-encap: "));
3113 		isakmp_print(ndo, bp+4, length-4, bp2);
3114 		return;
3115 	}
3116 
3117 	/* must be an ESP packet */
3118 	{
3119 		int nh, enh, padlen;
3120 		int advance;
3121 
3122 		ND_PRINT((ndo, "UDP-encap: "));
3123 
3124 		advance = esp_print(ndo, bp, length, bp2, &enh, &padlen);
3125 		if(advance <= 0)
3126 			return;
3127 
3128 		bp += advance;
3129 		length -= advance + padlen;
3130 		nh = enh & 0xff;
3131 
3132 		ip_print_inner(ndo, bp, length, nh, bp2);
3133 		return;
3134 	}
3135 
3136 trunc:
3137 	ND_PRINT((ndo,"[|isakmp]"));
3138 	return;
3139 }
3140 
3141 /*
3142  * Local Variables:
3143  * c-style: whitesmith
3144  * c-basic-offset: 8
3145  * End:
3146  */
3147