Home | History | Annotate | Download | only in tcpdump
      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_PRINT((ndo,"replay detection %sabled",
   1773 				  EXTRACT_32BITS(cp) ? "en" : "dis"));
   1774 			ND_PRINT((ndo,")"));
   1775 			break;
   1776 		default:
   1777 			/*
   1778 			 * XXX - fill in more types here; see, for example,
   1779 			 * draft-ietf-ipsec-notifymsg-04.
   1780 			 */
   1781 			if (ndo->ndo_vflag > 3) {
   1782 				ND_PRINT((ndo," data=("));
   1783 				if (!rawprint(ndo, (const uint8_t *)(cp), ep - cp))
   1784 					goto trunc;
   1785 				ND_PRINT((ndo,")"));
   1786 			} else {
   1787 				if (!ike_show_somedata(ndo, cp, ep))
   1788 					goto trunc;
   1789 			}
   1790 			break;
   1791 		}
   1792 	}
   1793 	return (const u_char *)ext + item_len;
   1794 trunc:
   1795 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
   1796 	return NULL;
   1797 }
   1798 
   1799 static const u_char *
   1800 ikev1_d_print(netdissect_options *ndo, u_char tpay _U_,
   1801 	      const struct isakmp_gen *ext, u_int item_len _U_,
   1802 	      const u_char *ep _U_, uint32_t phase _U_, uint32_t doi0 _U_,
   1803 	      uint32_t proto0 _U_, int depth _U_)
   1804 {
   1805 	const struct ikev1_pl_d *p;
   1806 	struct ikev1_pl_d d;
   1807 	const uint8_t *q;
   1808 	uint32_t doi;
   1809 	uint32_t proto;
   1810 	int i;
   1811 
   1812 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_D)));
   1813 
   1814 	p = (const struct ikev1_pl_d *)ext;
   1815 	ND_TCHECK(*p);
   1816 	UNALIGNED_MEMCPY(&d, ext, sizeof(d));
   1817 	doi = ntohl(d.doi);
   1818 	proto = d.prot_id;
   1819 	if (doi != 1) {
   1820 		ND_PRINT((ndo," doi=%u", doi));
   1821 		ND_PRINT((ndo," proto=%u", proto));
   1822 	} else {
   1823 		ND_PRINT((ndo," doi=ipsec"));
   1824 		ND_PRINT((ndo," proto=%s", PROTOIDSTR(proto)));
   1825 	}
   1826 	ND_PRINT((ndo," spilen=%u", d.spi_size));
   1827 	ND_PRINT((ndo," nspi=%u", ntohs(d.num_spi)));
   1828 	ND_PRINT((ndo," spi="));
   1829 	q = (const uint8_t *)(p + 1);
   1830 	for (i = 0; i < ntohs(d.num_spi); i++) {
   1831 		if (i != 0)
   1832 			ND_PRINT((ndo,","));
   1833 		if (!rawprint(ndo, (const uint8_t *)q, d.spi_size))
   1834 			goto trunc;
   1835 		q += d.spi_size;
   1836 	}
   1837 	return q;
   1838 trunc:
   1839 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_D)));
   1840 	return NULL;
   1841 }
   1842 
   1843 static const u_char *
   1844 ikev1_vid_print(netdissect_options *ndo, u_char tpay _U_,
   1845 		const struct isakmp_gen *ext,
   1846 		u_int item_len _U_, const u_char *ep _U_,
   1847 		uint32_t phase _U_, uint32_t doi _U_,
   1848 		uint32_t proto _U_, int depth _U_)
   1849 {
   1850 	struct isakmp_gen e;
   1851 
   1852 	ND_PRINT((ndo,"%s:", NPSTR(ISAKMP_NPTYPE_VID)));
   1853 
   1854 	ND_TCHECK(*ext);
   1855 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   1856 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
   1857 	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
   1858 		/* Print the entire payload in hex */
   1859 		ND_PRINT((ndo," "));
   1860 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
   1861 			goto trunc;
   1862 	}
   1863 	return (const u_char *)ext + ntohs(e.len);
   1864 trunc:
   1865 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_VID)));
   1866 	return NULL;
   1867 }
   1868 
   1869 /************************************************************/
   1870 /*                                                          */
   1871 /*              IKE v2 - rfc4306 - dissector                */
   1872 /*                                                          */
   1873 /************************************************************/
   1874 
   1875 static void
   1876 ikev2_pay_print(netdissect_options *ndo, const char *payname, int critical)
   1877 {
   1878 	ND_PRINT((ndo,"%s%s:", payname, critical&0x80 ? "[C]" : ""));
   1879 }
   1880 
   1881 static const u_char *
   1882 ikev2_gen_print(netdissect_options *ndo, u_char tpay,
   1883 		const struct isakmp_gen *ext)
   1884 {
   1885 	struct isakmp_gen e;
   1886 
   1887 	ND_TCHECK(*ext);
   1888 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   1889 	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
   1890 
   1891 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
   1892 	if (2 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
   1893 		/* Print the entire payload in hex */
   1894 		ND_PRINT((ndo," "));
   1895 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
   1896 			goto trunc;
   1897 	}
   1898 	return (const u_char *)ext + ntohs(e.len);
   1899 trunc:
   1900 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   1901 	return NULL;
   1902 }
   1903 
   1904 static const u_char *
   1905 ikev2_t_print(netdissect_options *ndo, int tcount,
   1906 	      const struct isakmp_gen *ext, u_int item_len,
   1907 	      const u_char *ep)
   1908 {
   1909 	const struct ikev2_t *p;
   1910 	struct ikev2_t t;
   1911 	uint16_t  t_id;
   1912 	const u_char *cp;
   1913 	const char *idstr;
   1914 	const struct attrmap *map;
   1915 	size_t nmap;
   1916 	const u_char *ep2;
   1917 
   1918 	p = (const struct ikev2_t *)ext;
   1919 	ND_TCHECK(*p);
   1920 	UNALIGNED_MEMCPY(&t, ext, sizeof(t));
   1921 	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_T), t.h.critical);
   1922 
   1923 	t_id = ntohs(t.t_id);
   1924 
   1925 	map = NULL;
   1926 	nmap = 0;
   1927 
   1928 	switch (t.t_type) {
   1929 	case IV2_T_ENCR:
   1930 		idstr = STR_OR_ID(t_id, esp_p_map);
   1931 		map = encr_t_map;
   1932 		nmap = sizeof(encr_t_map)/sizeof(encr_t_map[0]);
   1933 		break;
   1934 
   1935 	case IV2_T_PRF:
   1936 		idstr = STR_OR_ID(t_id, prf_p_map);
   1937 		break;
   1938 
   1939 	case IV2_T_INTEG:
   1940 		idstr = STR_OR_ID(t_id, integ_p_map);
   1941 		break;
   1942 
   1943 	case IV2_T_DH:
   1944 		idstr = STR_OR_ID(t_id, dh_p_map);
   1945 		break;
   1946 
   1947 	case IV2_T_ESN:
   1948 		idstr = STR_OR_ID(t_id, esn_p_map);
   1949 		break;
   1950 
   1951 	default:
   1952 		idstr = NULL;
   1953 		break;
   1954 	}
   1955 
   1956 	if (idstr)
   1957 		ND_PRINT((ndo," #%u type=%s id=%s ", tcount,
   1958 			  STR_OR_ID(t.t_type, ikev2_t_type_map),
   1959 			  idstr));
   1960 	else
   1961 		ND_PRINT((ndo," #%u type=%s id=%u ", tcount,
   1962 			  STR_OR_ID(t.t_type, ikev2_t_type_map),
   1963 			  t.t_id));
   1964 	cp = (const u_char *)(p + 1);
   1965 	ep2 = (const u_char *)p + item_len;
   1966 	while (cp < ep && cp < ep2) {
   1967 		if (map && nmap) {
   1968 			cp = ikev1_attrmap_print(ndo, cp, ep2, map, nmap);
   1969 		} else
   1970 			cp = ikev1_attr_print(ndo, cp, ep2);
   1971 		if (cp == NULL)
   1972 			goto trunc;
   1973 	}
   1974 	if (ep < ep2)
   1975 		ND_PRINT((ndo,"..."));
   1976 	return cp;
   1977 trunc:
   1978 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_T)));
   1979 	return NULL;
   1980 }
   1981 
   1982 static const u_char *
   1983 ikev2_p_print(netdissect_options *ndo, u_char tpay _U_, int pcount _U_,
   1984 	      const struct isakmp_gen *ext, u_int oprop_length,
   1985 	      const u_char *ep, int depth)
   1986 {
   1987 	const struct ikev2_p *p;
   1988 	struct ikev2_p prop;
   1989 	u_int prop_length;
   1990 	const u_char *cp;
   1991 	int i;
   1992 	int tcount;
   1993 	u_char np;
   1994 	struct isakmp_gen e;
   1995 	u_int item_len;
   1996 
   1997 	p = (const struct ikev2_p *)ext;
   1998 	ND_TCHECK(*p);
   1999 	UNALIGNED_MEMCPY(&prop, ext, sizeof(prop));
   2000 
   2001 	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_P), prop.h.critical);
   2002 
   2003 	/*
   2004 	 * ikev2_sa_print() guarantees that this is >= 4.
   2005 	 */
   2006 	prop_length = oprop_length - 4;
   2007 	ND_PRINT((ndo," #%u protoid=%s transform=%d len=%u",
   2008 		  prop.p_no,  PROTOIDSTR(prop.prot_id),
   2009 		  prop.num_t, oprop_length));
   2010 	cp = (const u_char *)(p + 1);
   2011 
   2012 	if (prop.spi_size) {
   2013 		if (prop_length < prop.spi_size)
   2014 			goto toolong;
   2015 		ND_PRINT((ndo," spi="));
   2016 		if (!rawprint(ndo, (const uint8_t *)cp, prop.spi_size))
   2017 			goto trunc;
   2018 		cp += prop.spi_size;
   2019 		prop_length -= prop.spi_size;
   2020 	}
   2021 
   2022 	/*
   2023 	 * Print the transforms.
   2024 	 */
   2025 	tcount = 0;
   2026 	for (np = ISAKMP_NPTYPE_T; np != 0; np = e.np) {
   2027 		tcount++;
   2028 		ext = (const struct isakmp_gen *)cp;
   2029 		if (prop_length < sizeof(*ext))
   2030 			goto toolong;
   2031 		ND_TCHECK(*ext);
   2032 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2033 
   2034 		/*
   2035 		 * Since we can't have a payload length of less than 4 bytes,
   2036 		 * we need to bail out here if the generic header is nonsensical
   2037 		 * or truncated, otherwise we could loop forever processing
   2038 		 * zero-length items or otherwise misdissect the packet.
   2039 		 */
   2040 		item_len = ntohs(e.len);
   2041 		if (item_len <= 4)
   2042 			goto trunc;
   2043 
   2044 		if (prop_length < item_len)
   2045 			goto toolong;
   2046 		ND_TCHECK2(*cp, item_len);
   2047 
   2048 		depth++;
   2049 		ND_PRINT((ndo,"\n"));
   2050 		for (i = 0; i < depth; i++)
   2051 			ND_PRINT((ndo,"    "));
   2052 		ND_PRINT((ndo,"("));
   2053 		if (np == ISAKMP_NPTYPE_T) {
   2054 			cp = ikev2_t_print(ndo, tcount, ext, item_len, ep);
   2055 			if (cp == NULL) {
   2056 				/* error, already reported */
   2057 				return NULL;
   2058 			}
   2059 		} else {
   2060 			ND_PRINT((ndo, "%s", NPSTR(np)));
   2061 			cp += item_len;
   2062 		}
   2063 		ND_PRINT((ndo,")"));
   2064 		depth--;
   2065 		prop_length -= item_len;
   2066 	}
   2067 	return cp;
   2068 toolong:
   2069 	/*
   2070 	 * Skip the rest of the proposal.
   2071 	 */
   2072 	cp += prop_length;
   2073 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
   2074 	return cp;
   2075 trunc:
   2076 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_P)));
   2077 	return NULL;
   2078 }
   2079 
   2080 static const u_char *
   2081 ikev2_sa_print(netdissect_options *ndo, u_char tpay,
   2082 		const struct isakmp_gen *ext1,
   2083 		u_int osa_length, const u_char *ep,
   2084 		uint32_t phase _U_, uint32_t doi _U_,
   2085 		uint32_t proto _U_, int depth)
   2086 {
   2087 	const struct isakmp_gen *ext;
   2088 	struct isakmp_gen e;
   2089 	u_int sa_length;
   2090 	const u_char *cp;
   2091 	int i;
   2092 	int pcount;
   2093 	u_char np;
   2094 	u_int item_len;
   2095 
   2096 	ND_TCHECK(*ext1);
   2097 	UNALIGNED_MEMCPY(&e, ext1, sizeof(e));
   2098 	ikev2_pay_print(ndo, "sa", e.critical);
   2099 
   2100 	/*
   2101 	 * ikev2_sub0_print() guarantees that this is >= 4.
   2102 	 */
   2103 	osa_length= ntohs(e.len);
   2104 	sa_length = osa_length - 4;
   2105 	ND_PRINT((ndo," len=%d", sa_length));
   2106 
   2107 	/*
   2108 	 * Print the payloads.
   2109 	 */
   2110 	cp = (const u_char *)(ext1 + 1);
   2111 	pcount = 0;
   2112 	for (np = ISAKMP_NPTYPE_P; np != 0; np = e.np) {
   2113 		pcount++;
   2114 		ext = (const struct isakmp_gen *)cp;
   2115 		if (sa_length < sizeof(*ext))
   2116 			goto toolong;
   2117 		ND_TCHECK(*ext);
   2118 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2119 
   2120 		/*
   2121 		 * Since we can't have a payload length of less than 4 bytes,
   2122 		 * we need to bail out here if the generic header is nonsensical
   2123 		 * or truncated, otherwise we could loop forever processing
   2124 		 * zero-length items or otherwise misdissect the packet.
   2125 		 */
   2126 		item_len = ntohs(e.len);
   2127 		if (item_len <= 4)
   2128 			goto trunc;
   2129 
   2130 		if (sa_length < item_len)
   2131 			goto toolong;
   2132 		ND_TCHECK2(*cp, item_len);
   2133 
   2134 		depth++;
   2135 		ND_PRINT((ndo,"\n"));
   2136 		for (i = 0; i < depth; i++)
   2137 			ND_PRINT((ndo,"    "));
   2138 		ND_PRINT((ndo,"("));
   2139 		if (np == ISAKMP_NPTYPE_P) {
   2140 			cp = ikev2_p_print(ndo, np, pcount, ext, item_len,
   2141 					   ep, depth);
   2142 			if (cp == NULL) {
   2143 				/* error, already reported */
   2144 				return NULL;
   2145 			}
   2146 		} else {
   2147 			ND_PRINT((ndo, "%s", NPSTR(np)));
   2148 			cp += item_len;
   2149 		}
   2150 		ND_PRINT((ndo,")"));
   2151 		depth--;
   2152 		sa_length -= item_len;
   2153 	}
   2154 	return cp;
   2155 toolong:
   2156 	/*
   2157 	 * Skip the rest of the SA.
   2158 	 */
   2159 	cp += sa_length;
   2160 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2161 	return cp;
   2162 trunc:
   2163 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2164 	return NULL;
   2165 }
   2166 
   2167 static const u_char *
   2168 ikev2_ke_print(netdissect_options *ndo, u_char tpay,
   2169 		const struct isakmp_gen *ext,
   2170 		u_int item_len _U_, const u_char *ep _U_,
   2171 		uint32_t phase _U_, uint32_t doi _U_,
   2172 		uint32_t proto _U_, int depth _U_)
   2173 {
   2174 	struct ikev2_ke ke;
   2175 	const struct ikev2_ke *k;
   2176 
   2177 	k = (const struct ikev2_ke *)ext;
   2178 	ND_TCHECK(*k);
   2179 	UNALIGNED_MEMCPY(&ke, ext, sizeof(ke));
   2180 	ikev2_pay_print(ndo, NPSTR(tpay), ke.h.critical);
   2181 
   2182 	ND_PRINT((ndo," len=%u group=%s", ntohs(ke.h.len) - 8,
   2183 		  STR_OR_ID(ntohs(ke.ke_group), dh_p_map)));
   2184 
   2185 	if (2 < ndo->ndo_vflag && 8 < ntohs(ke.h.len)) {
   2186 		ND_PRINT((ndo," "));
   2187 		if (!rawprint(ndo, (const uint8_t *)(k + 1), ntohs(ke.h.len) - 8))
   2188 			goto trunc;
   2189 	}
   2190 	return (const u_char *)ext + ntohs(ke.h.len);
   2191 trunc:
   2192 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2193 	return NULL;
   2194 }
   2195 
   2196 static const u_char *
   2197 ikev2_ID_print(netdissect_options *ndo, u_char tpay,
   2198 		const struct isakmp_gen *ext,
   2199 		u_int item_len _U_, const u_char *ep _U_,
   2200 		uint32_t phase _U_, uint32_t doi _U_,
   2201 		uint32_t proto _U_, int depth _U_)
   2202 {
   2203 	const struct ikev2_id *idp;
   2204 	struct ikev2_id id;
   2205 	int id_len, idtype_len, i;
   2206 	unsigned int dumpascii, dumphex;
   2207 	const unsigned char *typedata;
   2208 
   2209 	idp = (const struct ikev2_id *)ext;
   2210 	ND_TCHECK(*idp);
   2211 	UNALIGNED_MEMCPY(&id, ext, sizeof(id));
   2212 	ikev2_pay_print(ndo, NPSTR(tpay), id.h.critical);
   2213 
   2214 	id_len = ntohs(id.h.len);
   2215 
   2216 	ND_PRINT((ndo," len=%d", id_len - 4));
   2217 	if (2 < ndo->ndo_vflag && 4 < id_len) {
   2218 		/* Print the entire payload in hex */
   2219 		ND_PRINT((ndo," "));
   2220 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), id_len - 4))
   2221 			goto trunc;
   2222 	}
   2223 
   2224 	idtype_len =id_len - sizeof(struct ikev2_id);
   2225 	dumpascii = 0;
   2226 	dumphex   = 0;
   2227 	typedata  = (const unsigned char *)(ext)+sizeof(struct ikev2_id);
   2228 
   2229 	switch(id.type) {
   2230 	case ID_IPV4_ADDR:
   2231 		ND_PRINT((ndo, " ipv4:"));
   2232 		dumphex=1;
   2233 		break;
   2234 	case ID_FQDN:
   2235 		ND_PRINT((ndo, " fqdn:"));
   2236 		dumpascii=1;
   2237 		break;
   2238 	case ID_RFC822_ADDR:
   2239 		ND_PRINT((ndo, " rfc822:"));
   2240 		dumpascii=1;
   2241 		break;
   2242 	case ID_IPV6_ADDR:
   2243 		ND_PRINT((ndo, " ipv6:"));
   2244 		dumphex=1;
   2245 		break;
   2246 	case ID_DER_ASN1_DN:
   2247 		ND_PRINT((ndo, " dn:"));
   2248 		dumphex=1;
   2249 		break;
   2250 	case ID_DER_ASN1_GN:
   2251 		ND_PRINT((ndo, " gn:"));
   2252 		dumphex=1;
   2253 		break;
   2254 	case ID_KEY_ID:
   2255 		ND_PRINT((ndo, " keyid:"));
   2256 		dumphex=1;
   2257 		break;
   2258 	}
   2259 
   2260 	if(dumpascii) {
   2261 		ND_TCHECK2(*typedata, idtype_len);
   2262 		for(i=0; i<idtype_len; i++) {
   2263 			if(ND_ISPRINT(typedata[i])) {
   2264 				ND_PRINT((ndo, "%c", typedata[i]));
   2265 			} else {
   2266 				ND_PRINT((ndo, "."));
   2267 			}
   2268 		}
   2269 	}
   2270 	if(dumphex) {
   2271 		if (!rawprint(ndo, (const uint8_t *)typedata, idtype_len))
   2272 			goto trunc;
   2273 	}
   2274 
   2275 	return (const u_char *)ext + id_len;
   2276 trunc:
   2277 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2278 	return NULL;
   2279 }
   2280 
   2281 static const u_char *
   2282 ikev2_cert_print(netdissect_options *ndo, u_char tpay,
   2283 		const struct isakmp_gen *ext,
   2284 		u_int item_len _U_, const u_char *ep _U_,
   2285 		uint32_t phase _U_, uint32_t doi _U_,
   2286 		uint32_t proto _U_, int depth _U_)
   2287 {
   2288 	return ikev2_gen_print(ndo, tpay, ext);
   2289 }
   2290 
   2291 static const u_char *
   2292 ikev2_cr_print(netdissect_options *ndo, u_char tpay,
   2293 		const struct isakmp_gen *ext,
   2294 		u_int item_len _U_, const u_char *ep _U_,
   2295 		uint32_t phase _U_, uint32_t doi _U_,
   2296 		uint32_t proto _U_, int depth _U_)
   2297 {
   2298 	return ikev2_gen_print(ndo, tpay, ext);
   2299 }
   2300 
   2301 static const u_char *
   2302 ikev2_auth_print(netdissect_options *ndo, u_char tpay,
   2303 		const struct isakmp_gen *ext,
   2304 		u_int item_len _U_, const u_char *ep,
   2305 		uint32_t phase _U_, uint32_t doi _U_,
   2306 		uint32_t proto _U_, int depth _U_)
   2307 {
   2308 	struct ikev2_auth a;
   2309 	const char *v2_auth[]={ "invalid", "rsasig",
   2310 				"shared-secret", "dsssig" };
   2311 	const u_char *authdata = (const u_char*)ext + sizeof(a);
   2312 	unsigned int len;
   2313 
   2314 	ND_TCHECK2(*ext, sizeof(a));
   2315 	UNALIGNED_MEMCPY(&a, ext, sizeof(a));
   2316 	ikev2_pay_print(ndo, NPSTR(tpay), a.h.critical);
   2317 	len = ntohs(a.h.len);
   2318 
   2319 	/*
   2320 	 * Our caller has ensured that the length is >= 4.
   2321 	 */
   2322 	ND_PRINT((ndo," len=%u method=%s", len-4,
   2323 		  STR_OR_ID(a.auth_method, v2_auth)));
   2324 	if (len > 4) {
   2325 		if (ndo->ndo_vflag > 1) {
   2326 			ND_PRINT((ndo, " authdata=("));
   2327 			if (!rawprint(ndo, (const uint8_t *)authdata, len - sizeof(a)))
   2328 				goto trunc;
   2329 			ND_PRINT((ndo, ") "));
   2330 		} else if (ndo->ndo_vflag) {
   2331 			if (!ike_show_somedata(ndo, authdata, ep))
   2332 				goto trunc;
   2333 		}
   2334 	}
   2335 
   2336 	return (const u_char *)ext + len;
   2337 trunc:
   2338 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2339 	return NULL;
   2340 }
   2341 
   2342 static const u_char *
   2343 ikev2_nonce_print(netdissect_options *ndo, u_char tpay,
   2344 		const struct isakmp_gen *ext,
   2345 		u_int item_len _U_, const u_char *ep,
   2346 		uint32_t phase _U_, uint32_t doi _U_,
   2347 		uint32_t proto _U_, int depth _U_)
   2348 {
   2349 	struct isakmp_gen e;
   2350 
   2351 	ND_TCHECK(*ext);
   2352 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2353 	ikev2_pay_print(ndo, "nonce", e.critical);
   2354 
   2355 	ND_PRINT((ndo," len=%d", ntohs(e.len) - 4));
   2356 	if (1 < ndo->ndo_vflag && 4 < ntohs(e.len)) {
   2357 		ND_PRINT((ndo," nonce=("));
   2358 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
   2359 			goto trunc;
   2360 		ND_PRINT((ndo,") "));
   2361 	} else if(ndo->ndo_vflag && 4 < ntohs(e.len)) {
   2362 		if(!ike_show_somedata(ndo, (const u_char *)(ext+1), ep)) goto trunc;
   2363 	}
   2364 
   2365 	return (const u_char *)ext + ntohs(e.len);
   2366 trunc:
   2367 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2368 	return NULL;
   2369 }
   2370 
   2371 /* notify payloads */
   2372 static const u_char *
   2373 ikev2_n_print(netdissect_options *ndo, u_char tpay _U_,
   2374 		const struct isakmp_gen *ext,
   2375 		u_int item_len, const u_char *ep,
   2376 		uint32_t phase _U_, uint32_t doi _U_,
   2377 		uint32_t proto _U_, int depth _U_)
   2378 {
   2379 	const struct ikev2_n *p;
   2380 	struct ikev2_n n;
   2381 	const u_char *cp;
   2382 	u_char showspi, showsomedata;
   2383 	const char *notify_name;
   2384 	uint32_t type;
   2385 
   2386 	p = (const struct ikev2_n *)ext;
   2387 	ND_TCHECK(*p);
   2388 	UNALIGNED_MEMCPY(&n, ext, sizeof(n));
   2389 	ikev2_pay_print(ndo, NPSTR(ISAKMP_NPTYPE_N), n.h.critical);
   2390 
   2391 	showspi = 1;
   2392 	showsomedata=0;
   2393 	notify_name=NULL;
   2394 
   2395 	ND_PRINT((ndo," prot_id=%s", PROTOIDSTR(n.prot_id)));
   2396 
   2397 	type = ntohs(n.type);
   2398 
   2399 	/* notify space is annoying sparse */
   2400 	switch(type) {
   2401 	case IV2_NOTIFY_UNSUPPORTED_CRITICAL_PAYLOAD:
   2402 		notify_name = "unsupported_critical_payload";
   2403 		showspi = 0;
   2404 		break;
   2405 
   2406 	case IV2_NOTIFY_INVALID_IKE_SPI:
   2407 		notify_name = "invalid_ike_spi";
   2408 		showspi = 1;
   2409 		break;
   2410 
   2411 	case IV2_NOTIFY_INVALID_MAJOR_VERSION:
   2412 		notify_name = "invalid_major_version";
   2413 		showspi = 0;
   2414 		break;
   2415 
   2416 	case IV2_NOTIFY_INVALID_SYNTAX:
   2417 		notify_name = "invalid_syntax";
   2418 		showspi = 1;
   2419 		break;
   2420 
   2421 	case IV2_NOTIFY_INVALID_MESSAGE_ID:
   2422 		notify_name = "invalid_message_id";
   2423 		showspi = 1;
   2424 		break;
   2425 
   2426 	case IV2_NOTIFY_INVALID_SPI:
   2427 		notify_name = "invalid_spi";
   2428 		showspi = 1;
   2429 		break;
   2430 
   2431 	case IV2_NOTIFY_NO_PROPOSAL_CHOSEN:
   2432 		notify_name = "no_protocol_chosen";
   2433 		showspi = 1;
   2434 		break;
   2435 
   2436 	case IV2_NOTIFY_INVALID_KE_PAYLOAD:
   2437 		notify_name = "invalid_ke_payload";
   2438 		showspi = 1;
   2439 		break;
   2440 
   2441 	case IV2_NOTIFY_AUTHENTICATION_FAILED:
   2442 		notify_name = "authentication_failed";
   2443 		showspi = 1;
   2444 		break;
   2445 
   2446 	case IV2_NOTIFY_SINGLE_PAIR_REQUIRED:
   2447 		notify_name = "single_pair_required";
   2448 		showspi = 1;
   2449 		break;
   2450 
   2451 	case IV2_NOTIFY_NO_ADDITIONAL_SAS:
   2452 		notify_name = "no_additional_sas";
   2453 		showspi = 0;
   2454 		break;
   2455 
   2456 	case IV2_NOTIFY_INTERNAL_ADDRESS_FAILURE:
   2457 		notify_name = "internal_address_failure";
   2458 		showspi = 0;
   2459 		break;
   2460 
   2461 	case IV2_NOTIFY_FAILED_CP_REQUIRED:
   2462 		notify_name = "failed:cp_required";
   2463 		showspi = 0;
   2464 		break;
   2465 
   2466 	case IV2_NOTIFY_INVALID_SELECTORS:
   2467 		notify_name = "invalid_selectors";
   2468 		showspi = 0;
   2469 		break;
   2470 
   2471 	case IV2_NOTIFY_INITIAL_CONTACT:
   2472 		notify_name = "initial_contact";
   2473 		showspi = 0;
   2474 		break;
   2475 
   2476 	case IV2_NOTIFY_SET_WINDOW_SIZE:
   2477 		notify_name = "set_window_size";
   2478 		showspi = 0;
   2479 		break;
   2480 
   2481 	case IV2_NOTIFY_ADDITIONAL_TS_POSSIBLE:
   2482 		notify_name = "additional_ts_possible";
   2483 		showspi = 0;
   2484 		break;
   2485 
   2486 	case IV2_NOTIFY_IPCOMP_SUPPORTED:
   2487 		notify_name = "ipcomp_supported";
   2488 		showspi = 0;
   2489 		break;
   2490 
   2491 	case IV2_NOTIFY_NAT_DETECTION_SOURCE_IP:
   2492 		notify_name = "nat_detection_source_ip";
   2493 		showspi = 1;
   2494 		break;
   2495 
   2496 	case IV2_NOTIFY_NAT_DETECTION_DESTINATION_IP:
   2497 		notify_name = "nat_detection_destination_ip";
   2498 		showspi = 1;
   2499 		break;
   2500 
   2501 	case IV2_NOTIFY_COOKIE:
   2502 		notify_name = "cookie";
   2503 		showspi = 1;
   2504 		showsomedata= 1;
   2505 		break;
   2506 
   2507 	case IV2_NOTIFY_USE_TRANSPORT_MODE:
   2508 		notify_name = "use_transport_mode";
   2509 		showspi = 0;
   2510 		break;
   2511 
   2512 	case IV2_NOTIFY_HTTP_CERT_LOOKUP_SUPPORTED:
   2513 		notify_name = "http_cert_lookup_supported";
   2514 		showspi = 0;
   2515 		break;
   2516 
   2517 	case IV2_NOTIFY_REKEY_SA:
   2518 		notify_name = "rekey_sa";
   2519 		showspi = 1;
   2520 		break;
   2521 
   2522 	case IV2_NOTIFY_ESP_TFC_PADDING_NOT_SUPPORTED:
   2523 		notify_name = "tfc_padding_not_supported";
   2524 		showspi = 0;
   2525 		break;
   2526 
   2527 	case IV2_NOTIFY_NON_FIRST_FRAGMENTS_ALSO:
   2528 		notify_name = "non_first_fragment_also";
   2529 		showspi = 0;
   2530 		break;
   2531 
   2532 	default:
   2533 		if (type < 8192) {
   2534 			notify_name="error";
   2535 		} else if(type < 16384) {
   2536 			notify_name="private-error";
   2537 		} else if(type < 40960) {
   2538 			notify_name="status";
   2539 		} else {
   2540 			notify_name="private-status";
   2541 		}
   2542 	}
   2543 
   2544 	if(notify_name) {
   2545 		ND_PRINT((ndo," type=%u(%s)", type, notify_name));
   2546 	}
   2547 
   2548 
   2549 	if (showspi && n.spi_size) {
   2550 		ND_PRINT((ndo," spi="));
   2551 		if (!rawprint(ndo, (const uint8_t *)(p + 1), n.spi_size))
   2552 			goto trunc;
   2553 	}
   2554 
   2555 	cp = (const u_char *)(p + 1) + n.spi_size;
   2556 
   2557 	if (cp < ep) {
   2558 		if (ndo->ndo_vflag > 3 || (showsomedata && ep-cp < 30)) {
   2559 			ND_PRINT((ndo," data=("));
   2560 			if (!rawprint(ndo, (const uint8_t *)(cp), ep - cp))
   2561 				goto trunc;
   2562 
   2563 			ND_PRINT((ndo,")"));
   2564 		} else if (showsomedata) {
   2565 			if (!ike_show_somedata(ndo, cp, ep))
   2566 				goto trunc;
   2567 		}
   2568 	}
   2569 
   2570 	return (const u_char *)ext + item_len;
   2571 trunc:
   2572 	ND_PRINT((ndo," [|%s]", NPSTR(ISAKMP_NPTYPE_N)));
   2573 	return NULL;
   2574 }
   2575 
   2576 static const u_char *
   2577 ikev2_d_print(netdissect_options *ndo, u_char tpay,
   2578 		const struct isakmp_gen *ext,
   2579 		u_int item_len _U_, const u_char *ep _U_,
   2580 		uint32_t phase _U_, uint32_t doi _U_,
   2581 		uint32_t proto _U_, int depth _U_)
   2582 {
   2583 	return ikev2_gen_print(ndo, tpay, ext);
   2584 }
   2585 
   2586 static const u_char *
   2587 ikev2_vid_print(netdissect_options *ndo, u_char tpay,
   2588 		const struct isakmp_gen *ext,
   2589 		u_int item_len _U_, const u_char *ep _U_,
   2590 		uint32_t phase _U_, uint32_t doi _U_,
   2591 		uint32_t proto _U_, int depth _U_)
   2592 {
   2593 	struct isakmp_gen e;
   2594 	const u_char *vid;
   2595 	int i, len;
   2596 
   2597 	ND_TCHECK(*ext);
   2598 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2599 	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
   2600 	ND_PRINT((ndo," len=%d vid=", ntohs(e.len) - 4));
   2601 
   2602 	vid = (const u_char *)(ext+1);
   2603 	len = ntohs(e.len) - 4;
   2604 	ND_TCHECK2(*vid, len);
   2605 	for(i=0; i<len; i++) {
   2606 		if(ND_ISPRINT(vid[i])) ND_PRINT((ndo, "%c", vid[i]));
   2607 		else ND_PRINT((ndo, "."));
   2608 	}
   2609 	if (2 < ndo->ndo_vflag && 4 < len) {
   2610 		/* Print the entire payload in hex */
   2611 		ND_PRINT((ndo," "));
   2612 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), ntohs(e.len) - 4))
   2613 			goto trunc;
   2614 	}
   2615 	return (const u_char *)ext + ntohs(e.len);
   2616 trunc:
   2617 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2618 	return NULL;
   2619 }
   2620 
   2621 static const u_char *
   2622 ikev2_TS_print(netdissect_options *ndo, u_char tpay,
   2623 		const struct isakmp_gen *ext,
   2624 		u_int item_len _U_, const u_char *ep _U_,
   2625 		uint32_t phase _U_, uint32_t doi _U_,
   2626 		uint32_t proto _U_, int depth _U_)
   2627 {
   2628 	return ikev2_gen_print(ndo, tpay, ext);
   2629 }
   2630 
   2631 static const u_char *
   2632 ikev2_e_print(netdissect_options *ndo,
   2633 #ifndef HAVE_LIBCRYPTO
   2634 	      _U_
   2635 #endif
   2636 	      struct isakmp *base,
   2637 	      u_char tpay,
   2638 	      const struct isakmp_gen *ext,
   2639 	      u_int item_len _U_, const u_char *ep _U_,
   2640 #ifndef HAVE_LIBCRYPTO
   2641 	      _U_
   2642 #endif
   2643 	      uint32_t phase,
   2644 #ifndef HAVE_LIBCRYPTO
   2645 	      _U_
   2646 #endif
   2647 	      uint32_t doi,
   2648 #ifndef HAVE_LIBCRYPTO
   2649 	      _U_
   2650 #endif
   2651 	      uint32_t proto,
   2652 #ifndef HAVE_LIBCRYPTO
   2653 	      _U_
   2654 #endif
   2655 	      int depth)
   2656 {
   2657 	struct isakmp_gen e;
   2658 	const u_char *dat;
   2659 	volatile int dlen;
   2660 
   2661 	ND_TCHECK(*ext);
   2662 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2663 	ikev2_pay_print(ndo, NPSTR(tpay), e.critical);
   2664 
   2665 	dlen = ntohs(e.len)-4;
   2666 
   2667 	ND_PRINT((ndo," len=%d", dlen));
   2668 	if (2 < ndo->ndo_vflag && 4 < dlen) {
   2669 		ND_PRINT((ndo," "));
   2670 		if (!rawprint(ndo, (const uint8_t *)(ext + 1), dlen))
   2671 			goto trunc;
   2672 	}
   2673 
   2674 	dat = (const u_char *)(ext+1);
   2675 	ND_TCHECK2(*dat, dlen);
   2676 
   2677 #ifdef HAVE_LIBCRYPTO
   2678 	/* try to decypt it! */
   2679 	if(esp_print_decrypt_buffer_by_ikev2(ndo,
   2680 					     base->flags & ISAKMP_FLAG_I,
   2681 					     base->i_ck, base->r_ck,
   2682 					     dat, dat+dlen)) {
   2683 
   2684 		ext = (const struct isakmp_gen *)ndo->ndo_packetp;
   2685 
   2686 		/* got it decrypted, print stuff inside. */
   2687 		ikev2_sub_print(ndo, base, e.np, ext, ndo->ndo_snapend,
   2688 				phase, doi, proto, depth+1);
   2689 	}
   2690 #endif
   2691 
   2692 
   2693 	/* always return NULL, because E must be at end, and NP refers
   2694 	 * to what was inside.
   2695 	 */
   2696 	return NULL;
   2697 trunc:
   2698 	ND_PRINT((ndo," [|%s]", NPSTR(tpay)));
   2699 	return NULL;
   2700 }
   2701 
   2702 static const u_char *
   2703 ikev2_cp_print(netdissect_options *ndo, u_char tpay,
   2704 		const struct isakmp_gen *ext,
   2705 		u_int item_len _U_, const u_char *ep _U_,
   2706 		uint32_t phase _U_, uint32_t doi _U_,
   2707 		uint32_t proto _U_, int depth _U_)
   2708 {
   2709 	return ikev2_gen_print(ndo, tpay, ext);
   2710 }
   2711 
   2712 static const u_char *
   2713 ikev2_eap_print(netdissect_options *ndo, u_char tpay,
   2714 		const struct isakmp_gen *ext,
   2715 		u_int item_len _U_, const u_char *ep _U_,
   2716 		uint32_t phase _U_, uint32_t doi _U_,
   2717 		uint32_t proto _U_, int depth _U_)
   2718 {
   2719 	return ikev2_gen_print(ndo, tpay, ext);
   2720 }
   2721 
   2722 static const u_char *
   2723 ike_sub0_print(netdissect_options *ndo,
   2724 		 u_char np, const struct isakmp_gen *ext, const u_char *ep,
   2725 
   2726 	       uint32_t phase, uint32_t doi, uint32_t proto, int depth)
   2727 {
   2728 	const u_char *cp;
   2729 	struct isakmp_gen e;
   2730 	u_int item_len;
   2731 
   2732 	cp = (const u_char *)ext;
   2733 	ND_TCHECK(*ext);
   2734 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2735 
   2736 	/*
   2737 	 * Since we can't have a payload length of less than 4 bytes,
   2738 	 * we need to bail out here if the generic header is nonsensical
   2739 	 * or truncated, otherwise we could loop forever processing
   2740 	 * zero-length items or otherwise misdissect the packet.
   2741 	 */
   2742 	item_len = ntohs(e.len);
   2743 	if (item_len <= 4)
   2744 		return NULL;
   2745 
   2746 	if (NPFUNC(np)) {
   2747 		/*
   2748 		 * XXX - what if item_len is too short, or too long,
   2749 		 * for this payload type?
   2750 		 */
   2751 		cp = (*npfunc[np])(ndo, np, ext, item_len, ep, phase, doi, proto, depth);
   2752 	} else {
   2753 		ND_PRINT((ndo,"%s", NPSTR(np)));
   2754 		cp += item_len;
   2755 	}
   2756 
   2757 	return cp;
   2758 trunc:
   2759 	ND_PRINT((ndo," [|isakmp]"));
   2760 	return NULL;
   2761 }
   2762 
   2763 static const u_char *
   2764 ikev1_sub_print(netdissect_options *ndo,
   2765 		u_char np, const struct isakmp_gen *ext, const u_char *ep,
   2766 		uint32_t phase, uint32_t doi, uint32_t proto, int depth)
   2767 {
   2768 	const u_char *cp;
   2769 	int i;
   2770 	struct isakmp_gen e;
   2771 
   2772 	cp = (const u_char *)ext;
   2773 
   2774 	while (np) {
   2775 		ND_TCHECK(*ext);
   2776 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2777 
   2778 		ND_TCHECK2(*ext, ntohs(e.len));
   2779 
   2780 		depth++;
   2781 		ND_PRINT((ndo,"\n"));
   2782 		for (i = 0; i < depth; i++)
   2783 			ND_PRINT((ndo,"    "));
   2784 		ND_PRINT((ndo,"("));
   2785 		cp = ike_sub0_print(ndo, np, ext, ep, phase, doi, proto, depth);
   2786 		ND_PRINT((ndo,")"));
   2787 		depth--;
   2788 
   2789 		if (cp == NULL) {
   2790 			/* Zero-length subitem */
   2791 			return NULL;
   2792 		}
   2793 
   2794 		np = e.np;
   2795 		ext = (const struct isakmp_gen *)cp;
   2796 	}
   2797 	return cp;
   2798 trunc:
   2799 	ND_PRINT((ndo," [|%s]", NPSTR(np)));
   2800 	return NULL;
   2801 }
   2802 
   2803 static char *
   2804 numstr(int x)
   2805 {
   2806 	static char buf[20];
   2807 	snprintf(buf, sizeof(buf), "#%d", x);
   2808 	return buf;
   2809 }
   2810 
   2811 static void
   2812 ikev1_print(netdissect_options *ndo,
   2813 	    const u_char *bp,  u_int length,
   2814 	    const u_char *bp2, struct isakmp *base)
   2815 {
   2816 	const struct isakmp *p;
   2817 	const u_char *ep;
   2818 	u_char np;
   2819 	int i;
   2820 	int phase;
   2821 
   2822 	p = (const struct isakmp *)bp;
   2823 	ep = ndo->ndo_snapend;
   2824 
   2825 	phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
   2826 	if (phase == 1)
   2827 		ND_PRINT((ndo," phase %d", phase));
   2828 	else
   2829 		ND_PRINT((ndo," phase %d/others", phase));
   2830 
   2831 	i = cookie_find(&base->i_ck);
   2832 	if (i < 0) {
   2833 		if (iszero((const u_char *)&base->r_ck, sizeof(base->r_ck))) {
   2834 			/* the first packet */
   2835 			ND_PRINT((ndo," I"));
   2836 			if (bp2)
   2837 				cookie_record(&base->i_ck, bp2);
   2838 		} else
   2839 			ND_PRINT((ndo," ?"));
   2840 	} else {
   2841 		if (bp2 && cookie_isinitiator(i, bp2))
   2842 			ND_PRINT((ndo," I"));
   2843 		else if (bp2 && cookie_isresponder(i, bp2))
   2844 			ND_PRINT((ndo," R"));
   2845 		else
   2846 			ND_PRINT((ndo," ?"));
   2847 	}
   2848 
   2849 	ND_PRINT((ndo," %s", ETYPESTR(base->etype)));
   2850 	if (base->flags) {
   2851 		ND_PRINT((ndo,"[%s%s]", base->flags & ISAKMP_FLAG_E ? "E" : "",
   2852 			  base->flags & ISAKMP_FLAG_C ? "C" : ""));
   2853 	}
   2854 
   2855 	if (ndo->ndo_vflag) {
   2856 		const struct isakmp_gen *ext;
   2857 
   2858 		ND_PRINT((ndo,":"));
   2859 
   2860 		/* regardless of phase... */
   2861 		if (base->flags & ISAKMP_FLAG_E) {
   2862 			/*
   2863 			 * encrypted, nothing we can do right now.
   2864 			 * we hope to decrypt the packet in the future...
   2865 			 */
   2866 			ND_PRINT((ndo," [encrypted %s]", NPSTR(base->np)));
   2867 			goto done;
   2868 		}
   2869 
   2870 		CHECKLEN(p + 1, base->np);
   2871 		np = base->np;
   2872 		ext = (const struct isakmp_gen *)(p + 1);
   2873 		ikev1_sub_print(ndo, np, ext, ep, phase, 0, 0, 0);
   2874 	}
   2875 
   2876 done:
   2877 	if (ndo->ndo_vflag) {
   2878 		if (ntohl(base->len) != length) {
   2879 			ND_PRINT((ndo," (len mismatch: isakmp %u/ip %u)",
   2880 				  (uint32_t)ntohl(base->len), length));
   2881 		}
   2882 	}
   2883 }
   2884 
   2885 static const u_char *
   2886 ikev2_sub0_print(netdissect_options *ndo, struct isakmp *base,
   2887 		 u_char np,
   2888 		 const struct isakmp_gen *ext, const u_char *ep,
   2889 		 uint32_t phase, uint32_t doi, uint32_t proto, int depth)
   2890 {
   2891 	const u_char *cp;
   2892 	struct isakmp_gen e;
   2893 	u_int item_len;
   2894 
   2895 	cp = (const u_char *)ext;
   2896 	ND_TCHECK(*ext);
   2897 	UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2898 
   2899 	/*
   2900 	 * Since we can't have a payload length of less than 4 bytes,
   2901 	 * we need to bail out here if the generic header is nonsensical
   2902 	 * or truncated, otherwise we could loop forever processing
   2903 	 * zero-length items or otherwise misdissect the packet.
   2904 	 */
   2905 	item_len = ntohs(e.len);
   2906 	if (item_len <= 4)
   2907 		return NULL;
   2908 
   2909 	if (np == ISAKMP_NPTYPE_v2E) {
   2910 		cp = ikev2_e_print(ndo, base, np, ext, item_len,
   2911 				   ep, phase, doi, proto, depth);
   2912 	} else if (NPFUNC(np)) {
   2913 		/*
   2914 		 * XXX - what if item_len is too short, or too long,
   2915 		 * for this payload type?
   2916 		 */
   2917 		cp = (*npfunc[np])(ndo, np, ext, item_len,
   2918 				   ep, phase, doi, proto, depth);
   2919 	} else {
   2920 		ND_PRINT((ndo,"%s", NPSTR(np)));
   2921 		cp += item_len;
   2922 	}
   2923 
   2924 	return cp;
   2925 trunc:
   2926 	ND_PRINT((ndo," [|isakmp]"));
   2927 	return NULL;
   2928 }
   2929 
   2930 static const u_char *
   2931 ikev2_sub_print(netdissect_options *ndo,
   2932 		struct isakmp *base,
   2933 		u_char np, const struct isakmp_gen *ext, const u_char *ep,
   2934 		uint32_t phase, uint32_t doi, uint32_t proto, int depth)
   2935 {
   2936 	const u_char *cp;
   2937 	int i;
   2938 	struct isakmp_gen e;
   2939 
   2940 	cp = (const u_char *)ext;
   2941 	while (np) {
   2942 		ND_TCHECK(*ext);
   2943 		UNALIGNED_MEMCPY(&e, ext, sizeof(e));
   2944 
   2945 		ND_TCHECK2(*ext, ntohs(e.len));
   2946 
   2947 		depth++;
   2948 		ND_PRINT((ndo,"\n"));
   2949 		for (i = 0; i < depth; i++)
   2950 			ND_PRINT((ndo,"    "));
   2951 		ND_PRINT((ndo,"("));
   2952 		cp = ikev2_sub0_print(ndo, base, np,
   2953 				      ext, ep, phase, doi, proto, depth);
   2954 		ND_PRINT((ndo,")"));
   2955 		depth--;
   2956 
   2957 		if (cp == NULL) {
   2958 			/* Zero-length subitem */
   2959 			return NULL;
   2960 		}
   2961 
   2962 		np = e.np;
   2963 		ext = (const struct isakmp_gen *)cp;
   2964 	}
   2965 	return cp;
   2966 trunc:
   2967 	ND_PRINT((ndo," [|%s]", NPSTR(np)));
   2968 	return NULL;
   2969 }
   2970 
   2971 static void
   2972 ikev2_print(netdissect_options *ndo,
   2973 	    const u_char *bp,  u_int length,
   2974 	    const u_char *bp2 _U_, struct isakmp *base)
   2975 {
   2976 	const struct isakmp *p;
   2977 	const u_char *ep;
   2978 	u_char np;
   2979 	int phase;
   2980 
   2981 	p = (const struct isakmp *)bp;
   2982 	ep = ndo->ndo_snapend;
   2983 
   2984 	phase = (EXTRACT_32BITS(base->msgid) == 0) ? 1 : 2;
   2985 	if (phase == 1)
   2986 		ND_PRINT((ndo, " parent_sa"));
   2987 	else
   2988 		ND_PRINT((ndo, " child_sa "));
   2989 
   2990 	ND_PRINT((ndo, " %s", ETYPESTR(base->etype)));
   2991 	if (base->flags) {
   2992 		ND_PRINT((ndo, "[%s%s%s]",
   2993 			  base->flags & ISAKMP_FLAG_I ? "I" : "",
   2994 			  base->flags & ISAKMP_FLAG_V ? "V" : "",
   2995 			  base->flags & ISAKMP_FLAG_R ? "R" : ""));
   2996 	}
   2997 
   2998 	if (ndo->ndo_vflag) {
   2999 		const struct isakmp_gen *ext;
   3000 
   3001 		ND_PRINT((ndo, ":"));
   3002 
   3003 		/* regardless of phase... */
   3004 		if (base->flags & ISAKMP_FLAG_E) {
   3005 			/*
   3006 			 * encrypted, nothing we can do right now.
   3007 			 * we hope to decrypt the packet in the future...
   3008 			 */
   3009 			ND_PRINT((ndo, " [encrypted %s]", NPSTR(base->np)));
   3010 			goto done;
   3011 		}
   3012 
   3013 		CHECKLEN(p + 1, base->np)
   3014 
   3015 		np = base->np;
   3016 		ext = (const struct isakmp_gen *)(p + 1);
   3017 		ikev2_sub_print(ndo, base, np, ext, ep, phase, 0, 0, 0);
   3018 	}
   3019 
   3020 done:
   3021 	if (ndo->ndo_vflag) {
   3022 		if (ntohl(base->len) != length) {
   3023 			ND_PRINT((ndo, " (len mismatch: isakmp %u/ip %u)",
   3024 				  (uint32_t)ntohl(base->len), length));
   3025 		}
   3026 	}
   3027 }
   3028 
   3029 void
   3030 isakmp_print(netdissect_options *ndo,
   3031 	     const u_char *bp, u_int length,
   3032 	     const u_char *bp2)
   3033 {
   3034 	const struct isakmp *p;
   3035 	struct isakmp base;
   3036 	const u_char *ep;
   3037 	int major, minor;
   3038 
   3039 #ifdef HAVE_LIBCRYPTO
   3040 	/* initialize SAs */
   3041 	if (ndo->ndo_sa_list_head == NULL) {
   3042 		if (ndo->ndo_espsecret)
   3043 			esp_print_decodesecret(ndo);
   3044 	}
   3045 #endif
   3046 
   3047 	p = (const struct isakmp *)bp;
   3048 	ep = ndo->ndo_snapend;
   3049 
   3050 	if ((const struct isakmp *)ep < p + 1) {
   3051 		ND_PRINT((ndo,"[|isakmp]"));
   3052 		return;
   3053 	}
   3054 
   3055 	UNALIGNED_MEMCPY(&base, p, sizeof(base));
   3056 
   3057 	ND_PRINT((ndo,"isakmp"));
   3058 	major = (base.vers & ISAKMP_VERS_MAJOR)
   3059 		>> ISAKMP_VERS_MAJOR_SHIFT;
   3060 	minor = (base.vers & ISAKMP_VERS_MINOR)
   3061 		>> ISAKMP_VERS_MINOR_SHIFT;
   3062 
   3063 	if (ndo->ndo_vflag) {
   3064 		ND_PRINT((ndo," %d.%d", major, minor));
   3065 	}
   3066 
   3067 	if (ndo->ndo_vflag) {
   3068 		ND_PRINT((ndo," msgid "));
   3069 		hexprint(ndo, (const uint8_t *)&base.msgid, sizeof(base.msgid));
   3070 	}
   3071 
   3072 	if (1 < ndo->ndo_vflag) {
   3073 		ND_PRINT((ndo," cookie "));
   3074 		hexprint(ndo, (const uint8_t *)&base.i_ck, sizeof(base.i_ck));
   3075 		ND_PRINT((ndo,"->"));
   3076 		hexprint(ndo, (const uint8_t *)&base.r_ck, sizeof(base.r_ck));
   3077 	}
   3078 	ND_PRINT((ndo,":"));
   3079 
   3080 	switch(major) {
   3081 	case IKEv1_MAJOR_VERSION:
   3082 		ikev1_print(ndo, bp, length, bp2, &base);
   3083 		break;
   3084 
   3085 	case IKEv2_MAJOR_VERSION:
   3086 		ikev2_print(ndo, bp, length, bp2, &base);
   3087 		break;
   3088 	}
   3089 }
   3090 
   3091 void
   3092 isakmp_rfc3948_print(netdissect_options *ndo,
   3093 		     const u_char *bp, u_int length,
   3094 		     const u_char *bp2)
   3095 {
   3096 	ND_TCHECK(bp[0]);
   3097 	if(length == 1 && bp[0]==0xff) {
   3098 		ND_PRINT((ndo, "isakmp-nat-keep-alive"));
   3099 		return;
   3100 	}
   3101 
   3102 	if(length < 4) {
   3103 		goto trunc;
   3104 	}
   3105 	ND_TCHECK(bp[3]);
   3106 
   3107 	/*
   3108 	 * see if this is an IKE packet
   3109 	 */
   3110 	if(bp[0]==0 && bp[1]==0 && bp[2]==0 && bp[3]==0) {
   3111 		ND_PRINT((ndo, "NONESP-encap: "));
   3112 		isakmp_print(ndo, bp+4, length-4, bp2);
   3113 		return;
   3114 	}
   3115 
   3116 	/* must be an ESP packet */
   3117 	{
   3118 		int nh, enh, padlen;
   3119 		int advance;
   3120 
   3121 		ND_PRINT((ndo, "UDP-encap: "));
   3122 
   3123 		advance = esp_print(ndo, bp, length, bp2, &enh, &padlen);
   3124 		if(advance <= 0)
   3125 			return;
   3126 
   3127 		bp += advance;
   3128 		length -= advance + padlen;
   3129 		nh = enh & 0xff;
   3130 
   3131 		ip_print_inner(ndo, bp, length, nh, bp2);
   3132 		return;
   3133 	}
   3134 
   3135 trunc:
   3136 	ND_PRINT((ndo,"[|isakmp]"));
   3137 	return;
   3138 }
   3139 
   3140 /*
   3141  * Local Variables:
   3142  * c-style: whitesmith
   3143  * c-basic-offset: 8
   3144  * End:
   3145  */
   3146