]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/tcpdump/print-esp.c
zfs: merge openzfs/zfs@f795e90a1
[FreeBSD/FreeBSD.git] / contrib / tcpdump / print-esp.c
1 /*      $NetBSD: print-ah.c,v 1.4 1996/05/20 00:41:16 fvdl Exp $        */
2
3 /*
4  * Copyright (c) 1988, 1989, 1990, 1991, 1992, 1993, 1994
5  *      The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that: (1) source code distributions
9  * retain the above copyright notice and this paragraph in its entirety, (2)
10  * distributions including binary code include the above copyright notice and
11  * this paragraph in its entirety in the documentation or other materials
12  * provided with the distribution, and (3) all advertising materials mentioning
13  * features or use of this software display the following acknowledgement:
14  * ``This product includes software developed by the University of California,
15  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
16  * the University nor the names of its contributors may be used to endorse
17  * or promote products derived from this software without specific prior
18  * written permission.
19  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
20  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
21  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
22  */
23
24 /* \summary: IPSEC Encapsulating Security Payload (ESP) printer */
25
26 #ifdef HAVE_CONFIG_H
27 #include <config.h>
28 #endif
29
30 #include "netdissect-stdinc.h"
31
32 #include <string.h>
33 #include <stdlib.h>
34
35 /* Any code in this file that depends on HAVE_LIBCRYPTO depends on
36  * HAVE_OPENSSL_EVP_H too. Undefining the former when the latter isn't defined
37  * is the simplest way of handling the dependency.
38  */
39 #ifdef HAVE_LIBCRYPTO
40 #ifdef HAVE_OPENSSL_EVP_H
41 #include <openssl/evp.h>
42 #else
43 #undef HAVE_LIBCRYPTO
44 #endif
45 #endif
46
47 #include "netdissect.h"
48 #include "extract.h"
49
50 #include "diag-control.h"
51
52 #ifdef HAVE_LIBCRYPTO
53 #include "strtoaddr.h"
54 #include "ascii_strcasecmp.h"
55 #endif
56
57 #include "ip.h"
58 #include "ip6.h"
59
60 /*
61  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
62  * All rights reserved.
63  *
64  * Redistribution and use in source and binary forms, with or without
65  * modification, are permitted provided that the following conditions
66  * are met:
67  * 1. Redistributions of source code must retain the above copyright
68  *    notice, this list of conditions and the following disclaimer.
69  * 2. Redistributions in binary form must reproduce the above copyright
70  *    notice, this list of conditions and the following disclaimer in the
71  *    documentation and/or other materials provided with the distribution.
72  * 3. Neither the name of the project nor the names of its contributors
73  *    may be used to endorse or promote products derived from this software
74  *    without specific prior written permission.
75  *
76  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
77  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
78  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
79  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
80  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
81  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
82  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
83  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
84  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
85  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
86  * SUCH DAMAGE.
87  */
88
89 /*
90  * RFC1827/2406 Encapsulated Security Payload.
91  */
92
93 struct newesp {
94         nd_uint32_t     esp_spi;        /* ESP */
95         nd_uint32_t     esp_seq;        /* Sequence number */
96         /*variable size*/               /* (IV and) Payload data */
97         /*variable size*/               /* padding */
98         /*8bit*/                        /* pad size */
99         /*8bit*/                        /* next header */
100         /*8bit*/                        /* next header */
101         /*variable size, 32bit bound*/  /* Authentication data */
102 };
103
104 #ifdef HAVE_LIBCRYPTO
105 union inaddr_u {
106         nd_ipv4 in4;
107         nd_ipv6 in6;
108 };
109 struct sa_list {
110         struct sa_list  *next;
111         u_int           daddr_version;
112         union inaddr_u  daddr;
113         uint32_t        spi;          /* if == 0, then IKEv2 */
114         int             initiator;
115         u_char          spii[8];      /* for IKEv2 */
116         u_char          spir[8];
117         const EVP_CIPHER *evp;
118         u_int           ivlen;
119         int             authlen;
120         u_char          authsecret[256];
121         int             authsecret_len;
122         u_char          secret[256];  /* is that big enough for all secrets? */
123         int             secretlen;
124 };
125
126 #ifndef HAVE_EVP_CIPHER_CTX_NEW
127 /*
128  * Allocate an EVP_CIPHER_CTX.
129  * Used if we have an older version of OpenSSL that doesn't provide
130  * routines to allocate and free them.
131  */
132 static EVP_CIPHER_CTX *
133 EVP_CIPHER_CTX_new(void)
134 {
135         EVP_CIPHER_CTX *ctx;
136
137         ctx = malloc(sizeof(*ctx));
138         if (ctx == NULL)
139                 return (NULL);
140         memset(ctx, 0, sizeof(*ctx));
141         return (ctx);
142 }
143
144 static void
145 EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
146 {
147         EVP_CIPHER_CTX_cleanup(ctx);
148         free(ctx);
149 }
150 #endif
151
152 #ifdef HAVE_EVP_DECRYPTINIT_EX
153 /*
154  * Initialize the cipher by calling EVP_DecryptInit_ex(), because
155  * calling EVP_DecryptInit() will reset the cipher context, clearing
156  * the cipher, so calling it twice, with the second call having a
157  * null cipher, will clear the already-set cipher.  EVP_DecryptInit_ex(),
158  * however, won't reset the cipher context, so you can use it to specify
159  * the IV in a second call after a first call to EVP_DecryptInit_ex()
160  * to set the cipher and the key.
161  *
162  * XXX - is there some reason why we need to make two calls?
163  */
164 static int
165 set_cipher_parameters(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
166                       const unsigned char *key,
167                       const unsigned char *iv)
168 {
169         return EVP_DecryptInit_ex(ctx, cipher, NULL, key, iv);
170 }
171 #else
172 /*
173  * Initialize the cipher by calling EVP_DecryptInit(), because we don't
174  * have EVP_DecryptInit_ex(); we rely on it not trashing the context.
175  */
176 static int
177 set_cipher_parameters(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
178                       const unsigned char *key,
179                       const unsigned char *iv)
180 {
181         return EVP_DecryptInit(ctx, cipher, key, iv);
182 }
183 #endif
184
185 static u_char *
186 do_decrypt(netdissect_options *ndo, const char *caller, struct sa_list *sa,
187     const u_char *iv, const u_char *ct, unsigned int ctlen)
188 {
189         EVP_CIPHER_CTX *ctx;
190         unsigned int block_size;
191         unsigned int ptlen;
192         u_char *pt;
193         int len;
194
195         ctx = EVP_CIPHER_CTX_new();
196         if (ctx == NULL) {
197                 /*
198                  * Failed to initialize the cipher context.
199                  * From a look at the OpenSSL code, this appears to
200                  * mean "couldn't allocate memory for the cipher context";
201                  * note that we're not passing any parameters, so there's
202                  * not much else it can mean.
203                  */
204                 (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
205                     "%s: can't allocate memory for cipher context", caller);
206                 return NULL;
207         }
208
209         if (set_cipher_parameters(ctx, sa->evp, sa->secret, NULL) < 0) {
210                 EVP_CIPHER_CTX_free(ctx);
211                 (*ndo->ndo_warning)(ndo, "%s: espkey init failed", caller);
212                 return NULL;
213         }
214         if (set_cipher_parameters(ctx, NULL, NULL, iv) < 0) {
215                 EVP_CIPHER_CTX_free(ctx);
216                 (*ndo->ndo_warning)(ndo, "%s: IV init failed", caller);
217                 return NULL;
218         }
219
220         /*
221          * At least as I read RFC 5996 section 3.14 and RFC 4303 section 2.4,
222          * if the cipher has a block size of which the ciphertext's size must
223          * be a multiple, the payload must be padded to make that happen, so
224          * the ciphertext length must be a multiple of the block size.  Fail
225          * if that's not the case.
226          */
227         block_size = (unsigned int)EVP_CIPHER_CTX_block_size(ctx);
228         if ((ctlen % block_size) != 0) {
229                 EVP_CIPHER_CTX_free(ctx);
230                 (*ndo->ndo_warning)(ndo,
231                     "%s: ciphertext size %u is not a multiple of the cipher block size %u",
232                     caller, ctlen, block_size);
233                 return NULL;
234         }
235
236         /*
237          * Attempt to allocate a buffer for the decrypted data, because
238          * we can't decrypt on top of the input buffer.
239          */
240         ptlen = ctlen;
241         pt = (u_char *)calloc(1, ptlen);
242         if (pt == NULL) {
243                 EVP_CIPHER_CTX_free(ctx);
244                 (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
245                     "%s: can't allocate memory for decryption buffer", caller);
246                 return NULL;
247         }
248
249         /*
250          * The size of the ciphertext handed to us is a multiple of the
251          * cipher block size, so we don't need to worry about padding.
252          */
253         if (!EVP_CIPHER_CTX_set_padding(ctx, 0)) {
254                 free(pt);
255                 EVP_CIPHER_CTX_free(ctx);
256                 (*ndo->ndo_warning)(ndo,
257                     "%s: EVP_CIPHER_CTX_set_padding failed", caller);
258                 return NULL;
259         }
260         if (!EVP_DecryptUpdate(ctx, pt, &len, ct, ctlen)) {
261                 free(pt);
262                 EVP_CIPHER_CTX_free(ctx);
263                 (*ndo->ndo_warning)(ndo, "%s: EVP_DecryptUpdate failed",
264                     caller);
265                 return NULL;
266         }
267         EVP_CIPHER_CTX_free(ctx);
268         return pt;
269 }
270
271 /*
272  * This will allocate a new buffer containing the decrypted data.
273  * It returns 1 on success and 0 on failure.
274  *
275  * It will push the new buffer and the values of ndo->ndo_packetp and
276  * ndo->ndo_snapend onto the buffer stack, and change ndo->ndo_packetp
277  * and ndo->ndo_snapend to refer to the new buffer.
278  *
279  * Our caller must pop the buffer off the stack when it's finished
280  * dissecting anything in it and before it does any dissection of
281  * anything in the old buffer.  That will free the new buffer.
282  */
283 DIAG_OFF_DEPRECATION
284 int esp_decrypt_buffer_by_ikev2_print(netdissect_options *ndo,
285                                       int initiator,
286                                       const u_char spii[8],
287                                       const u_char spir[8],
288                                       const u_char *buf, const u_char *end)
289 {
290         struct sa_list *sa;
291         const u_char *iv;
292         const u_char *ct;
293         unsigned int ctlen;
294         u_char *pt;
295
296         /* initiator arg is any non-zero value */
297         if(initiator) initiator=1;
298
299         /* see if we can find the SA, and if so, decode it */
300         for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {
301                 if (sa->spi == 0
302                     && initiator == sa->initiator
303                     && memcmp(spii, sa->spii, 8) == 0
304                     && memcmp(spir, sa->spir, 8) == 0)
305                         break;
306         }
307
308         if(sa == NULL) return 0;
309         if(sa->evp == NULL) return 0;
310
311         /*
312          * remove authenticator, and see if we still have something to
313          * work with
314          */
315         end = end - sa->authlen;
316         iv  = buf;
317         ct = iv + sa->ivlen;
318         ctlen = end-ct;
319
320         if(end <= ct) return 0;
321
322         pt = do_decrypt(ndo, __func__, sa, iv,
323             ct, ctlen);
324         if (pt == NULL)
325                 return 0;
326
327         /*
328          * Switch to the output buffer for dissection, and save it
329          * on the buffer stack so it can be freed; our caller must
330          * pop it when done.
331          */
332         if (!nd_push_buffer(ndo, pt, pt, ctlen)) {
333                 free(pt);
334                 (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
335                         "%s: can't push buffer on buffer stack", __func__);
336         }
337
338         return 1;
339 }
340 DIAG_ON_DEPRECATION
341
342 static void esp_print_addsa(netdissect_options *ndo,
343                             const struct sa_list *sa, int sa_def)
344 {
345         /* copy the "sa" */
346
347         struct sa_list *nsa;
348
349         /* malloc() return used in a 'struct sa_list': do not free() */
350         nsa = (struct sa_list *)malloc(sizeof(struct sa_list));
351         if (nsa == NULL)
352                 (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
353                                   "%s: malloc", __func__);
354
355         *nsa = *sa;
356
357         if (sa_def)
358                 ndo->ndo_sa_default = nsa;
359
360         nsa->next = ndo->ndo_sa_list_head;
361         ndo->ndo_sa_list_head = nsa;
362 }
363
364
365 static u_int hexdigit(netdissect_options *ndo, char hex)
366 {
367         if (hex >= '0' && hex <= '9')
368                 return (hex - '0');
369         else if (hex >= 'A' && hex <= 'F')
370                 return (hex - 'A' + 10);
371         else if (hex >= 'a' && hex <= 'f')
372                 return (hex - 'a' + 10);
373         else {
374                 (*ndo->ndo_error)(ndo, S_ERR_ND_ESP_SECRET,
375                                   "invalid hex digit %c in espsecret\n", hex);
376         }
377 }
378
379 static u_int hex2byte(netdissect_options *ndo, char *hexstring)
380 {
381         u_int byte;
382
383         byte = (hexdigit(ndo, hexstring[0]) << 4) + hexdigit(ndo, hexstring[1]);
384         return byte;
385 }
386
387 /*
388  * returns size of binary, 0 on failure.
389  */
390 static int
391 espprint_decode_hex(netdissect_options *ndo,
392                     u_char *binbuf, unsigned int binbuf_len, char *hex)
393 {
394         unsigned int len;
395         int i;
396
397         len = strlen(hex) / 2;
398
399         if (len > binbuf_len) {
400                 (*ndo->ndo_warning)(ndo, "secret is too big: %u\n", len);
401                 return 0;
402         }
403
404         i = 0;
405         while (hex[0] != '\0' && hex[1]!='\0') {
406                 binbuf[i] = hex2byte(ndo, hex);
407                 hex += 2;
408                 i++;
409         }
410
411         return i;
412 }
413
414 /*
415  * decode the form:    SPINUM@IP <tab> ALGONAME:0xsecret
416  */
417
418 DIAG_OFF_DEPRECATION
419 static int
420 espprint_decode_encalgo(netdissect_options *ndo,
421                         char *decode, struct sa_list *sa)
422 {
423         size_t i;
424         const EVP_CIPHER *evp;
425         int authlen = 0;
426         char *colon, *p;
427
428         colon = strchr(decode, ':');
429         if (colon == NULL) {
430                 (*ndo->ndo_warning)(ndo, "failed to decode espsecret: %s\n", decode);
431                 return 0;
432         }
433         *colon = '\0';
434
435         if (strlen(decode) > strlen("-hmac96") &&
436             !strcmp(decode + strlen(decode) - strlen("-hmac96"),
437                     "-hmac96")) {
438                 p = strstr(decode, "-hmac96");
439                 *p = '\0';
440                 authlen = 12;
441         }
442         if (strlen(decode) > strlen("-cbc") &&
443             !strcmp(decode + strlen(decode) - strlen("-cbc"), "-cbc")) {
444                 p = strstr(decode, "-cbc");
445                 *p = '\0';
446         }
447         evp = EVP_get_cipherbyname(decode);
448
449         if (!evp) {
450                 (*ndo->ndo_warning)(ndo, "failed to find cipher algo %s\n", decode);
451                 sa->evp = NULL;
452                 sa->authlen = 0;
453                 sa->ivlen = 0;
454                 return 0;
455         }
456
457         sa->evp = evp;
458         sa->authlen = authlen;
459         /* This returns an int, but it should never be negative */
460         sa->ivlen = EVP_CIPHER_iv_length(evp);
461
462         colon++;
463         if (colon[0] == '0' && colon[1] == 'x') {
464                 /* decode some hex! */
465
466                 colon += 2;
467                 sa->secretlen = espprint_decode_hex(ndo, sa->secret, sizeof(sa->secret), colon);
468                 if(sa->secretlen == 0) return 0;
469         } else {
470                 i = strlen(colon);
471
472                 if (i < sizeof(sa->secret)) {
473                         memcpy(sa->secret, colon, i);
474                         sa->secretlen = i;
475                 } else {
476                         memcpy(sa->secret, colon, sizeof(sa->secret));
477                         sa->secretlen = sizeof(sa->secret);
478                 }
479         }
480
481         return 1;
482 }
483 DIAG_ON_DEPRECATION
484
485 /*
486  * for the moment, ignore the auth algorithm, just hard code the authenticator
487  * length. Need to research how openssl looks up HMAC stuff.
488  */
489 static int
490 espprint_decode_authalgo(netdissect_options *ndo,
491                          char *decode, struct sa_list *sa)
492 {
493         char *colon;
494
495         colon = strchr(decode, ':');
496         if (colon == NULL) {
497                 (*ndo->ndo_warning)(ndo, "failed to decode espsecret: %s\n", decode);
498                 return 0;
499         }
500         *colon = '\0';
501
502         if(ascii_strcasecmp(decode,"sha1") == 0 ||
503            ascii_strcasecmp(decode,"md5") == 0) {
504                 sa->authlen = 12;
505         }
506         return 1;
507 }
508
509 static void esp_print_decode_ikeline(netdissect_options *ndo, char *line,
510                                      const char *file, int lineno)
511 {
512         /* it's an IKEv2 secret, store it instead */
513         struct sa_list sa1;
514
515         char *init;
516         char *icookie, *rcookie;
517         int   ilen, rlen;
518         char *authkey;
519         char *enckey;
520
521         init = strsep(&line, " \t");
522         icookie = strsep(&line, " \t");
523         rcookie = strsep(&line, " \t");
524         authkey = strsep(&line, " \t");
525         enckey  = strsep(&line, " \t");
526
527         /* if any fields are missing */
528         if(!init || !icookie || !rcookie || !authkey || !enckey) {
529                 (*ndo->ndo_warning)(ndo, "print_esp: failed to find all fields for ikev2 at %s:%u",
530                                     file, lineno);
531
532                 return;
533         }
534
535         ilen = strlen(icookie);
536         rlen = strlen(rcookie);
537
538         if((init[0]!='I' && init[0]!='R')
539            || icookie[0]!='0' || icookie[1]!='x'
540            || rcookie[0]!='0' || rcookie[1]!='x'
541            || ilen!=18
542            || rlen!=18) {
543                 (*ndo->ndo_warning)(ndo, "print_esp: line %s:%u improperly formatted.",
544                                     file, lineno);
545
546                 (*ndo->ndo_warning)(ndo, "init=%s icookie=%s(%u) rcookie=%s(%u)",
547                                     init, icookie, ilen, rcookie, rlen);
548
549                 return;
550         }
551
552         sa1.spi = 0;
553         sa1.initiator = (init[0] == 'I');
554         if(espprint_decode_hex(ndo, sa1.spii, sizeof(sa1.spii), icookie+2)!=8)
555                 return;
556
557         if(espprint_decode_hex(ndo, sa1.spir, sizeof(sa1.spir), rcookie+2)!=8)
558                 return;
559
560         if(!espprint_decode_encalgo(ndo, enckey, &sa1)) return;
561
562         if(!espprint_decode_authalgo(ndo, authkey, &sa1)) return;
563
564         esp_print_addsa(ndo, &sa1, FALSE);
565 }
566
567 /*
568  *
569  * special form: file /name
570  * causes us to go read from this file instead.
571  *
572  */
573 static void esp_print_decode_onesecret(netdissect_options *ndo, char *line,
574                                        const char *file, int lineno)
575 {
576         struct sa_list sa1;
577         int sa_def;
578
579         char *spikey;
580         char *decode;
581
582         spikey = strsep(&line, " \t");
583         sa_def = 0;
584         memset(&sa1, 0, sizeof(struct sa_list));
585
586         /* if there is only one token, then it is an algo:key token */
587         if (line == NULL) {
588                 decode = spikey;
589                 spikey = NULL;
590                 /* sa1.daddr.version = 0; */
591                 /* memset(&sa1.daddr, 0, sizeof(sa1.daddr)); */
592                 /* sa1.spi = 0; */
593                 sa_def    = 1;
594         } else
595                 decode = line;
596
597         if (spikey && ascii_strcasecmp(spikey, "file") == 0) {
598                 /* open file and read it */
599                 FILE *secretfile;
600                 char  fileline[1024];
601                 int   subfile_lineno=0;
602                 char  *nl;
603                 char *filename = line;
604
605                 secretfile = fopen(filename, FOPEN_READ_TXT);
606                 if (secretfile == NULL) {
607                         (*ndo->ndo_error)(ndo, S_ERR_ND_OPEN_FILE,
608                                           "%s: can't open %s: %s\n",
609                                           __func__, filename, strerror(errno));
610                 }
611
612                 while (fgets(fileline, sizeof(fileline)-1, secretfile) != NULL) {
613                         subfile_lineno++;
614                         /* remove newline from the line */
615                         nl = strchr(fileline, '\n');
616                         if (nl)
617                                 *nl = '\0';
618                         if (fileline[0] == '#') continue;
619                         if (fileline[0] == '\0') continue;
620
621                         esp_print_decode_onesecret(ndo, fileline, filename, subfile_lineno);
622                 }
623                 fclose(secretfile);
624
625                 return;
626         }
627
628         if (spikey && ascii_strcasecmp(spikey, "ikev2") == 0) {
629                 esp_print_decode_ikeline(ndo, line, file, lineno);
630                 return;
631         }
632
633         if (spikey) {
634
635                 char *spistr, *foo;
636                 uint32_t spino;
637
638                 spistr = strsep(&spikey, "@");
639                 if (spistr == NULL) {
640                         (*ndo->ndo_warning)(ndo, "print_esp: failed to find the @ token");
641                         return;
642                 }
643
644                 spino = strtoul(spistr, &foo, 0);
645                 if (spistr == foo || !spikey) {
646                         (*ndo->ndo_warning)(ndo, "print_esp: failed to decode spi# %s\n", foo);
647                         return;
648                 }
649
650                 sa1.spi = spino;
651
652                 if (strtoaddr6(spikey, &sa1.daddr.in6) == 1) {
653                         sa1.daddr_version = 6;
654                 } else if (strtoaddr(spikey, &sa1.daddr.in4) == 1) {
655                         sa1.daddr_version = 4;
656                 } else {
657                         (*ndo->ndo_warning)(ndo, "print_esp: can not decode IP# %s\n", spikey);
658                         return;
659                 }
660         }
661
662         if (decode) {
663                 /* skip any blank spaces */
664                 while (*decode == ' ' || *decode == '\t' || *decode == '\r' || *decode == '\n')
665                         decode++;
666
667                 if(!espprint_decode_encalgo(ndo, decode, &sa1)) {
668                         return;
669                 }
670         }
671
672         esp_print_addsa(ndo, &sa1, sa_def);
673 }
674
675 DIAG_OFF_DEPRECATION
676 static void esp_init(netdissect_options *ndo _U_)
677 {
678         /*
679          * 0.9.6 doesn't appear to define OPENSSL_API_COMPAT, so
680          * we check whether it's undefined or it's less than the
681          * value for 1.1.0.
682          */
683 #if !defined(OPENSSL_API_COMPAT) || OPENSSL_API_COMPAT < 0x10100000L
684         OpenSSL_add_all_algorithms();
685 #endif
686         EVP_add_cipher_alias(SN_des_ede3_cbc, "3des");
687 }
688 DIAG_ON_DEPRECATION
689
690 void esp_decodesecret_print(netdissect_options *ndo)
691 {
692         char *line;
693         char *p;
694         static int initialized = 0;
695
696         if (!initialized) {
697                 esp_init(ndo);
698                 initialized = 1;
699         }
700
701         p = ndo->ndo_espsecret;
702
703         while (p && p[0] != '\0') {
704                 /* pick out the first line or first thing until a comma */
705                 if ((line = strsep(&p, "\n,")) == NULL) {
706                         line = p;
707                         p = NULL;
708                 }
709
710                 esp_print_decode_onesecret(ndo, line, "cmdline", 0);
711         }
712
713         ndo->ndo_espsecret = NULL;
714 }
715
716 #endif
717
718 #ifdef HAVE_LIBCRYPTO
719 #define USED_IF_LIBCRYPTO
720 #else
721 #define USED_IF_LIBCRYPTO _U_
722 #endif
723
724 #ifdef HAVE_LIBCRYPTO
725 DIAG_OFF_DEPRECATION
726 #endif
727 void
728 esp_print(netdissect_options *ndo,
729           const u_char *bp, u_int length,
730           const u_char *bp2 USED_IF_LIBCRYPTO,
731           u_int ver USED_IF_LIBCRYPTO,
732           int fragmented USED_IF_LIBCRYPTO,
733           u_int ttl_hl USED_IF_LIBCRYPTO)
734 {
735         const struct newesp *esp;
736         const u_char *ep;
737 #ifdef HAVE_LIBCRYPTO
738         const struct ip *ip;
739         struct sa_list *sa = NULL;
740         const struct ip6_hdr *ip6 = NULL;
741         const u_char *iv;
742         u_int ivlen;
743         u_int payloadlen;
744         const u_char *ct;
745         u_char *pt;
746         u_int padlen;
747         u_int nh;
748 #endif
749
750         ndo->ndo_protocol = "esp";
751         esp = (const struct newesp *)bp;
752
753         /* 'ep' points to the end of available data. */
754         ep = ndo->ndo_snapend;
755
756         if ((const u_char *)(esp + 1) >= ep) {
757                 nd_print_trunc(ndo);
758                 return;
759         }
760         ND_PRINT("ESP(spi=0x%08x", GET_BE_U_4(esp->esp_spi));
761         ND_PRINT(",seq=0x%x)", GET_BE_U_4(esp->esp_seq));
762         ND_PRINT(", length %u", length);
763
764 #ifdef HAVE_LIBCRYPTO
765         /* initialize SAs */
766         if (ndo->ndo_sa_list_head == NULL) {
767                 if (!ndo->ndo_espsecret)
768                         return;
769
770                 esp_decodesecret_print(ndo);
771         }
772
773         if (ndo->ndo_sa_list_head == NULL)
774                 return;
775
776         ip = (const struct ip *)bp2;
777         switch (ver) {
778         case 6:
779                 ip6 = (const struct ip6_hdr *)bp2;
780                 /* we do not attempt to decrypt jumbograms */
781                 if (!GET_BE_U_2(ip6->ip6_plen))
782                         return;
783                 /* XXX - check whether it's fragmented? */
784                 /* if we can't get nexthdr, we do not need to decrypt it */
785
786                 /* see if we can find the SA, and if so, decode it */
787                 for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {
788                         if (sa->spi == GET_BE_U_4(esp->esp_spi) &&
789                             sa->daddr_version == 6 &&
790                             UNALIGNED_MEMCMP(&sa->daddr.in6, &ip6->ip6_dst,
791                                    sizeof(nd_ipv6)) == 0) {
792                                 break;
793                         }
794                 }
795                 break;
796         case 4:
797                 /* nexthdr & padding are in the last fragment */
798                 if (fragmented)
799                         return;
800
801                 /* see if we can find the SA, and if so, decode it */
802                 for (sa = ndo->ndo_sa_list_head; sa != NULL; sa = sa->next) {
803                         if (sa->spi == GET_BE_U_4(esp->esp_spi) &&
804                             sa->daddr_version == 4 &&
805                             UNALIGNED_MEMCMP(&sa->daddr.in4, &ip->ip_dst,
806                                    sizeof(nd_ipv4)) == 0) {
807                                 break;
808                         }
809                 }
810                 break;
811         default:
812                 return;
813         }
814
815         /* if we didn't find the specific one, then look for
816          * an unspecified one.
817          */
818         if (sa == NULL)
819                 sa = ndo->ndo_sa_default;
820
821         /* if not found fail */
822         if (sa == NULL)
823                 return;
824
825         /* pointer to the IV, if there is one */
826         iv = (const u_char *)(esp + 1) + 0;
827         /* length of the IV, if there is one; 0, if there isn't */
828         ivlen = sa->ivlen;
829
830         /*
831          * Get a pointer to the ciphertext.
832          *
833          * p points to the beginning of the payload, i.e. to the
834          * initialization vector, so if we skip past the initialization
835          * vector, it points to the beginning of the ciphertext.
836          */
837         ct = iv + ivlen;
838
839         /*
840          * Make sure the authentication data/integrity check value length
841          * isn't bigger than the total amount of data available after
842          * the ESP header and initialization vector is removed and,
843          * if not, slice the authentication data/ICV off.
844          */
845         if (ep - ct < sa->authlen) {
846                 nd_print_trunc(ndo);
847                 return;
848         }
849         ep = ep - sa->authlen;
850
851         /*
852          * Calculate the length of the ciphertext.  ep points to
853          * the beginning of the authentication data/integrity check
854          * value, i.e. right past the end of the ciphertext;
855          */
856         payloadlen = ep - ct;
857
858         if (sa->evp == NULL)
859                 return;
860
861         /*
862          * If the next header value is past the end of the available
863          * data, we won't be able to fetch it once we've decrypted
864          * the ciphertext, so there's no point in decrypting the data.
865          *
866          * Report it as truncation.
867          */
868         if (!ND_TTEST_1(ep - 1)) {
869                 nd_print_trunc(ndo);
870                 return;
871         }
872
873         pt = do_decrypt(ndo, __func__, sa, iv, ct, payloadlen);
874         if (pt == NULL)
875                 return;
876
877         /*
878          * Switch to the output buffer for dissection, and
879          * save it on the buffer stack so it can be freed.
880          */
881         if (!nd_push_buffer(ndo, pt, pt, payloadlen)) {
882                 free(pt);
883                 (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
884                         "%s: can't push buffer on buffer stack", __func__);
885         }
886
887         /*
888          * Sanity check for pad length; if it, plus 2 for the pad
889          * length and next header fields, is bigger than the ciphertext
890          * length (which is also the plaintext length), it's too big.
891          *
892          * XXX - the check can fail if the packet is corrupt *or* if
893          * it was not decrypted with the correct key, so that the
894          * "plaintext" is not what was being sent.
895          */
896         padlen = GET_U_1(pt + payloadlen - 2);
897         if (padlen + 2 > payloadlen) {
898                 nd_print_trunc(ndo);
899                 return;
900         }
901
902         /* Get the next header */
903         nh = GET_U_1(pt + payloadlen - 1);
904
905         ND_PRINT(": ");
906
907         /*
908          * Don't put padding + padding length(1 byte) + next header(1 byte)
909          * in the buffer because they are not part of the plaintext to decode.
910          */
911         if (!nd_push_snaplen(ndo, pt, payloadlen - (padlen + 2))) {
912                 (*ndo->ndo_error)(ndo, S_ERR_ND_MEM_ALLOC,
913                         "%s: can't push snaplen on buffer stack", __func__);
914         }
915
916         /* Now dissect the plaintext. */
917         ip_demux_print(ndo, pt, payloadlen - (padlen + 2), ver, fragmented,
918                        ttl_hl, nh, bp2);
919
920         /* Pop the buffer, freeing it. */
921         nd_pop_packet_info(ndo);
922         /* Pop the nd_push_snaplen */
923         nd_pop_packet_info(ndo);
924 #endif
925 }
926 #ifdef HAVE_LIBCRYPTO
927 DIAG_ON_DEPRECATION
928 #endif