1999-10-18 05:59:12 +08:00
|
|
|
/*
|
1999-10-30 13:11:06 +08:00
|
|
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
|
|
|
* All rights reserved.
|
2002-06-12 01:08:37 +08:00
|
|
|
*
|
1999-10-18 05:59:12 +08:00
|
|
|
* Redistribution and use in source and binary forms, with or without
|
1999-10-30 13:11:06 +08:00
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. Neither the name of the project nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
2002-06-12 01:08:37 +08:00
|
|
|
*
|
1999-10-30 13:11:06 +08:00
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
1999-10-18 05:59:12 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2003-11-16 17:36:07 +08:00
|
|
|
#ifndef lint
|
|
|
|
static const char rcsid[] _U_ =
|
|
|
|
"@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.38 2003-11-16 09:36:25 guy Exp $ (LBL)";
|
|
|
|
#endif
|
1999-11-21 17:36:43 +08:00
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
1999-10-18 05:59:12 +08:00
|
|
|
#endif
|
|
|
|
|
2002-08-01 16:52:55 +08:00
|
|
|
#include <tcpdump-stdinc.h>
|
1999-10-18 05:59:12 +08:00
|
|
|
|
2002-08-01 16:52:55 +08:00
|
|
|
#include <string.h>
|
1999-10-30 13:11:06 +08:00
|
|
|
|
1999-10-18 05:59:12 +08:00
|
|
|
#include <stdio.h>
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
#include "isakmp.h"
|
|
|
|
#include "ipsec_doi.h"
|
|
|
|
#include "oakley.h"
|
1999-10-18 05:59:12 +08:00
|
|
|
#include "interface.h"
|
|
|
|
#include "addrtoname.h"
|
1999-10-30 13:11:06 +08:00
|
|
|
#include "extract.h" /* must come after interface.h */
|
|
|
|
|
2000-09-23 16:54:24 +08:00
|
|
|
#include "ip.h"
|
2000-10-07 13:53:09 +08:00
|
|
|
#ifdef INET6
|
|
|
|
#include "ip6.h"
|
|
|
|
#endif
|
2000-09-23 16:54:24 +08:00
|
|
|
|
1999-10-30 13:30:20 +08:00
|
|
|
#ifndef HAVE_SOCKADDR_STORAGE
|
|
|
|
#define sockaddr_storage sockaddr
|
|
|
|
#endif
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *isakmp_sa_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_p_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_t_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_ke_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_id_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_cert_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_cr_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_sig_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_hash_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_nonce_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_n_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_d_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_vid_print(const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_sub0_print(u_char, const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
|
|
|
static const u_char *isakmp_sub_print(u_char, const struct isakmp_gen *,
|
|
|
|
const u_char *, u_int32_t, u_int32_t, u_int32_t, int);
|
2000-09-24 15:50:35 +08:00
|
|
|
static char *numstr(int);
|
2002-09-05 08:43:21 +08:00
|
|
|
static void safememcpy(void *, const void *, size_t);
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
#define MAXINITIATORS 20
|
|
|
|
int ninitiator = 0;
|
|
|
|
struct {
|
|
|
|
cookie_t initiator;
|
|
|
|
struct sockaddr_storage iaddr;
|
|
|
|
struct sockaddr_storage raddr;
|
|
|
|
} cookiecache[MAXINITIATORS];
|
|
|
|
|
|
|
|
/* protocol id */
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *protoidstr[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL, "isakmp", "ipsec-ah", "ipsec-esp", "ipcomp",
|
|
|
|
};
|
|
|
|
|
|
|
|
/* isakmp->np */
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *npstr[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
"none", "sa", "p", "t", "ke", "id", "cert", "cr", "hash",
|
|
|
|
"sig", "nonce", "n", "d", "vid"
|
|
|
|
};
|
|
|
|
|
|
|
|
/* isakmp->np */
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *(*npfunc[])(const struct isakmp_gen *, const u_char *,
|
|
|
|
u_int32_t, u_int32_t, u_int32_t, int) = {
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL,
|
|
|
|
isakmp_sa_print,
|
|
|
|
isakmp_p_print,
|
|
|
|
isakmp_t_print,
|
|
|
|
isakmp_ke_print,
|
|
|
|
isakmp_id_print,
|
2000-04-24 20:49:11 +08:00
|
|
|
isakmp_cert_print,
|
2000-09-23 12:43:42 +08:00
|
|
|
isakmp_cr_print,
|
1999-10-30 13:11:06 +08:00
|
|
|
isakmp_hash_print,
|
2000-04-24 20:49:11 +08:00
|
|
|
isakmp_sig_print,
|
1999-10-30 13:11:06 +08:00
|
|
|
isakmp_nonce_print,
|
|
|
|
isakmp_n_print,
|
|
|
|
isakmp_d_print,
|
|
|
|
isakmp_vid_print,
|
|
|
|
};
|
|
|
|
|
|
|
|
/* isakmp->etype */
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *etypestr[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
"none", "base", "ident", "auth", "agg", "inf", NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
|
|
|
"oakley-quick", "oakley-newgroup",
|
|
|
|
};
|
|
|
|
|
|
|
|
#define STR_OR_ID(x, tab) \
|
|
|
|
(((x) < sizeof(tab)/sizeof(tab[0]) && tab[(x)]) ? tab[(x)] : numstr(x))
|
|
|
|
#define PROTOIDSTR(x) STR_OR_ID(x, protoidstr)
|
|
|
|
#define NPSTR(x) STR_OR_ID(x, npstr)
|
|
|
|
#define ETYPESTR(x) STR_OR_ID(x, etypestr)
|
|
|
|
|
|
|
|
#define NPFUNC(x) \
|
|
|
|
(((x) < sizeof(npfunc)/sizeof(npfunc[0]) && npfunc[(x)]) \
|
|
|
|
? npfunc[(x)] : NULL)
|
|
|
|
|
|
|
|
static int
|
|
|
|
iszero(u_char *p, size_t l)
|
|
|
|
{
|
|
|
|
while (l--) {
|
|
|
|
if (*p++)
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* find cookie from initiator cache */
|
|
|
|
static int
|
|
|
|
cookie_find(cookie_t *in)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < MAXINITIATORS; i++) {
|
|
|
|
if (memcmp(in, &cookiecache[i].initiator, sizeof(*in)) == 0)
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* record initiator */
|
|
|
|
static void
|
|
|
|
cookie_record(cookie_t *in, const u_char *bp2)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
struct ip *ip;
|
|
|
|
struct sockaddr_in *sin;
|
|
|
|
#ifdef INET6
|
|
|
|
struct ip6_hdr *ip6;
|
|
|
|
struct sockaddr_in6 *sin6;
|
1999-10-18 05:59:12 +08:00
|
|
|
#endif
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
i = cookie_find(in);
|
|
|
|
if (0 <= i) {
|
|
|
|
ninitiator = (i + 1) % MAXINITIATORS;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
ip = (struct ip *)bp2;
|
2000-10-03 10:54:54 +08:00
|
|
|
switch (IP_V(ip)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
case 4:
|
|
|
|
memset(&cookiecache[ninitiator].iaddr, 0,
|
|
|
|
sizeof(cookiecache[ninitiator].iaddr));
|
|
|
|
memset(&cookiecache[ninitiator].raddr, 0,
|
|
|
|
sizeof(cookiecache[ninitiator].raddr));
|
|
|
|
|
|
|
|
sin = (struct sockaddr_in *)&cookiecache[ninitiator].iaddr;
|
1999-10-30 15:36:34 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
1999-10-30 13:11:06 +08:00
|
|
|
sin->sin_len = sizeof(struct sockaddr_in);
|
1999-10-30 15:36:34 +08:00
|
|
|
#endif
|
1999-10-30 13:11:06 +08:00
|
|
|
sin->sin_family = AF_INET;
|
|
|
|
memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
|
|
|
|
sin = (struct sockaddr_in *)&cookiecache[ninitiator].raddr;
|
1999-10-30 15:36:34 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
1999-10-30 13:11:06 +08:00
|
|
|
sin->sin_len = sizeof(struct sockaddr_in);
|
1999-10-30 15:36:34 +08:00
|
|
|
#endif
|
1999-10-30 13:11:06 +08:00
|
|
|
sin->sin_family = AF_INET;
|
|
|
|
memcpy(&sin->sin_addr, &ip->ip_dst, sizeof(ip->ip_dst));
|
|
|
|
break;
|
|
|
|
#ifdef INET6
|
|
|
|
case 6:
|
|
|
|
memset(&cookiecache[ninitiator].iaddr, 0,
|
|
|
|
sizeof(cookiecache[ninitiator].iaddr));
|
|
|
|
memset(&cookiecache[ninitiator].raddr, 0,
|
|
|
|
sizeof(cookiecache[ninitiator].raddr));
|
|
|
|
|
|
|
|
ip6 = (struct ip6_hdr *)bp2;
|
|
|
|
sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].iaddr;
|
1999-10-30 15:36:34 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
1999-10-30 13:11:06 +08:00
|
|
|
sin6->sin6_len = sizeof(struct sockaddr_in6);
|
1999-10-30 15:36:34 +08:00
|
|
|
#endif
|
1999-10-30 13:11:06 +08:00
|
|
|
sin6->sin6_family = AF_INET6;
|
|
|
|
memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
|
|
|
|
sin6 = (struct sockaddr_in6 *)&cookiecache[ninitiator].raddr;
|
1999-10-30 15:36:34 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
1999-10-30 13:11:06 +08:00
|
|
|
sin6->sin6_len = sizeof(struct sockaddr_in6);
|
1999-10-30 15:36:34 +08:00
|
|
|
#endif
|
1999-10-30 13:11:06 +08:00
|
|
|
sin6->sin6_family = AF_INET6;
|
|
|
|
memcpy(&sin6->sin6_addr, &ip6->ip6_dst, sizeof(ip6->ip6_dst));
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
memcpy(&cookiecache[ninitiator].initiator, in, sizeof(*in));
|
|
|
|
ninitiator = (ninitiator + 1) % MAXINITIATORS;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define cookie_isinitiator(x, y) cookie_sidecheck((x), (y), 1)
|
|
|
|
#define cookie_isresponder(x, y) cookie_sidecheck((x), (y), 0)
|
|
|
|
static int
|
|
|
|
cookie_sidecheck(int i, const u_char *bp2, int initiator)
|
|
|
|
{
|
|
|
|
struct sockaddr_storage ss;
|
1999-10-30 13:30:20 +08:00
|
|
|
struct sockaddr *sa;
|
1999-10-30 13:11:06 +08:00
|
|
|
struct ip *ip;
|
|
|
|
struct sockaddr_in *sin;
|
|
|
|
#ifdef INET6
|
|
|
|
struct ip6_hdr *ip6;
|
|
|
|
struct sockaddr_in6 *sin6;
|
|
|
|
#endif
|
1999-10-30 13:37:35 +08:00
|
|
|
int salen;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
memset(&ss, 0, sizeof(ss));
|
|
|
|
ip = (struct ip *)bp2;
|
2000-10-03 10:54:54 +08:00
|
|
|
switch (IP_V(ip)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
case 4:
|
|
|
|
sin = (struct sockaddr_in *)&ss;
|
1999-10-30 15:36:34 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
1999-10-30 13:11:06 +08:00
|
|
|
sin->sin_len = sizeof(struct sockaddr_in);
|
1999-10-30 15:36:34 +08:00
|
|
|
#endif
|
1999-10-30 13:11:06 +08:00
|
|
|
sin->sin_family = AF_INET;
|
|
|
|
memcpy(&sin->sin_addr, &ip->ip_src, sizeof(ip->ip_src));
|
|
|
|
break;
|
|
|
|
#ifdef INET6
|
|
|
|
case 6:
|
|
|
|
ip6 = (struct ip6_hdr *)bp2;
|
|
|
|
sin6 = (struct sockaddr_in6 *)&ss;
|
1999-10-30 15:36:34 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
1999-10-30 13:11:06 +08:00
|
|
|
sin6->sin6_len = sizeof(struct sockaddr_in6);
|
1999-10-30 15:36:34 +08:00
|
|
|
#endif
|
1999-10-30 13:11:06 +08:00
|
|
|
sin6->sin6_family = AF_INET6;
|
|
|
|
memcpy(&sin6->sin6_addr, &ip6->ip6_src, sizeof(ip6->ip6_src));
|
|
|
|
break;
|
|
|
|
#endif
|
|
|
|
default:
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
1999-10-30 13:30:20 +08:00
|
|
|
sa = (struct sockaddr *)&ss;
|
1999-10-30 13:11:06 +08:00
|
|
|
if (initiator) {
|
1999-10-30 13:30:20 +08:00
|
|
|
if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].iaddr)->sa_family)
|
1999-10-30 13:11:06 +08:00
|
|
|
return 0;
|
1999-10-30 13:37:35 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
|
|
|
salen = sa->sa_len;
|
|
|
|
#else
|
|
|
|
#ifdef INET6
|
|
|
|
if (sa->sa_family == AF_INET6)
|
|
|
|
salen = sizeof(struct sockaddr_in6);
|
|
|
|
else
|
|
|
|
salen = sizeof(struct sockaddr);
|
|
|
|
#else
|
|
|
|
salen = sizeof(struct sockaddr);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
if (memcmp(&ss, &cookiecache[i].iaddr, salen) == 0)
|
1999-10-30 13:11:06 +08:00
|
|
|
return 1;
|
|
|
|
} else {
|
1999-10-30 13:30:20 +08:00
|
|
|
if (sa->sa_family != ((struct sockaddr *)&cookiecache[i].raddr)->sa_family)
|
1999-10-30 13:11:06 +08:00
|
|
|
return 0;
|
1999-10-30 13:37:35 +08:00
|
|
|
#ifdef HAVE_SOCKADDR_SA_LEN
|
|
|
|
salen = sa->sa_len;
|
|
|
|
#else
|
|
|
|
#ifdef INET6
|
|
|
|
if (sa->sa_family == AF_INET6)
|
|
|
|
salen = sizeof(struct sockaddr_in6);
|
|
|
|
else
|
|
|
|
salen = sizeof(struct sockaddr);
|
|
|
|
#else
|
|
|
|
salen = sizeof(struct sockaddr);
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
if (memcmp(&ss, &cookiecache[i].raddr, salen) == 0)
|
1999-10-30 13:11:06 +08:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
rawprint(caddr_t loc, size_t len)
|
|
|
|
{
|
|
|
|
static u_char *p;
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
size_t i;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
p = (u_char *)loc;
|
|
|
|
for (i = 0; i < len; i++)
|
|
|
|
printf("%02x", p[i] & 0xff);
|
|
|
|
}
|
|
|
|
|
|
|
|
struct attrmap {
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
const char *type;
|
|
|
|
u_int nvalue;
|
|
|
|
const char *value[30]; /*XXX*/
|
1999-10-18 05:59:12 +08:00
|
|
|
};
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
|
|
|
isakmp_attrmap_print(const u_char *p, const u_char *ep,
|
|
|
|
const struct attrmap *map, size_t nmap)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2000-04-28 19:14:47 +08:00
|
|
|
u_int16_t *q;
|
1999-10-30 13:11:06 +08:00
|
|
|
int totlen;
|
|
|
|
u_int32_t t, v;
|
|
|
|
|
2000-04-28 19:14:47 +08:00
|
|
|
q = (u_int16_t *)p;
|
1999-10-30 13:11:06 +08:00
|
|
|
if (p[0] & 0x80)
|
|
|
|
totlen = 4;
|
|
|
|
else
|
2002-12-11 15:13:49 +08:00
|
|
|
totlen = 4 + EXTRACT_16BITS(&q[1]);
|
1999-10-30 13:11:06 +08:00
|
|
|
if (ep < p + totlen) {
|
|
|
|
printf("[|attr]");
|
|
|
|
return ep + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("(");
|
2002-12-11 15:13:49 +08:00
|
|
|
t = EXTRACT_16BITS(&q[0]) & 0x7fff;
|
1999-10-30 13:11:06 +08:00
|
|
|
if (map && t < nmap && map[t].type)
|
|
|
|
printf("type=%s ", map[t].type);
|
|
|
|
else
|
|
|
|
printf("type=#%d ", t);
|
|
|
|
if (p[0] & 0x80) {
|
|
|
|
printf("value=");
|
2002-12-11 15:13:49 +08:00
|
|
|
v = EXTRACT_16BITS(&q[1]);
|
1999-10-30 13:11:06 +08:00
|
|
|
if (map && t < nmap && v < map[t].nvalue && map[t].value[v])
|
|
|
|
printf("%s", map[t].value[v]);
|
|
|
|
else
|
|
|
|
rawprint((caddr_t)&q[1], 2);
|
|
|
|
} else {
|
2002-12-11 15:13:49 +08:00
|
|
|
printf("len=%d value=", EXTRACT_16BITS(&q[1]));
|
|
|
|
rawprint((caddr_t)&p[4], EXTRACT_16BITS(&q[1]));
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
printf(")");
|
|
|
|
return p + totlen;
|
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
|
|
|
isakmp_attr_print(const u_char *p, const u_char *ep)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2000-04-28 19:14:47 +08:00
|
|
|
u_int16_t *q;
|
1999-10-30 13:11:06 +08:00
|
|
|
int totlen;
|
|
|
|
u_int32_t t;
|
|
|
|
|
2000-04-28 19:14:47 +08:00
|
|
|
q = (u_int16_t *)p;
|
1999-10-30 13:11:06 +08:00
|
|
|
if (p[0] & 0x80)
|
|
|
|
totlen = 4;
|
|
|
|
else
|
2002-12-11 15:13:49 +08:00
|
|
|
totlen = 4 + EXTRACT_16BITS(&q[1]);
|
1999-10-30 13:11:06 +08:00
|
|
|
if (ep < p + totlen) {
|
|
|
|
printf("[|attr]");
|
|
|
|
return ep + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("(");
|
2002-12-11 15:13:49 +08:00
|
|
|
t = EXTRACT_16BITS(&q[0]) & 0x7fff;
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("type=#%d ", t);
|
|
|
|
if (p[0] & 0x80) {
|
|
|
|
printf("value=");
|
|
|
|
t = q[1];
|
|
|
|
rawprint((caddr_t)&q[1], 2);
|
|
|
|
} else {
|
2002-12-11 15:13:49 +08:00
|
|
|
printf("len=%d value=", EXTRACT_16BITS(&q[1]));
|
|
|
|
rawprint((caddr_t)&p[2], EXTRACT_16BITS(&q[1]));
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
printf(")");
|
|
|
|
return p + totlen;
|
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
|
|
|
isakmp_sa_print(const struct isakmp_gen *ext, const u_char *ep, u_int32_t phase,
|
2002-09-06 05:25:34 +08:00
|
|
|
u_int32_t doi0 _U_, u_int32_t proto0, int depth)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_pl_sa *p;
|
|
|
|
struct isakmp_pl_sa sa;
|
|
|
|
const u_int32_t *q;
|
2000-12-12 17:20:26 +08:00
|
|
|
u_int32_t doi, sit, ident;
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_char *cp, *np;
|
1999-10-30 13:11:06 +08:00
|
|
|
int t;
|
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_SA));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_sa *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&sa, ext, sizeof(sa));
|
|
|
|
doi = ntohl(sa.doi);
|
2000-12-12 17:20:26 +08:00
|
|
|
sit = ntohl(sa.sit);
|
1999-10-30 13:11:06 +08:00
|
|
|
if (doi != 1) {
|
|
|
|
printf(" doi=%d", doi);
|
2000-10-03 13:16:38 +08:00
|
|
|
printf(" situation=%u", (u_int32_t)ntohl(sa.sit));
|
1999-10-30 13:11:06 +08:00
|
|
|
return (u_char *)(p + 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
printf(" doi=ipsec");
|
2000-10-03 13:16:38 +08:00
|
|
|
q = (u_int32_t *)&sa.sit;
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" situation=");
|
|
|
|
t = 0;
|
2000-12-12 17:20:26 +08:00
|
|
|
if (sit & 0x01) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("identity");
|
|
|
|
t++;
|
|
|
|
}
|
2000-12-12 17:20:26 +08:00
|
|
|
if (sit & 0x02) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("%ssecrecy", t ? "+" : "");
|
|
|
|
t++;
|
|
|
|
}
|
2000-12-12 17:20:26 +08:00
|
|
|
if (sit & 0x04)
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("%sintegrity", t ? "+" : "");
|
|
|
|
|
2000-12-12 17:20:26 +08:00
|
|
|
np = (u_char *)ext + sizeof(sa);
|
|
|
|
if (sit != 0x01) {
|
|
|
|
safememcpy(&ident, ext + 1, sizeof(ident));
|
|
|
|
printf(" ident=%u", (u_int32_t)ntohl(ident));
|
|
|
|
np += sizeof(ident);
|
|
|
|
}
|
1999-10-30 13:11:06 +08:00
|
|
|
|
2000-12-12 17:20:26 +08:00
|
|
|
ext = (struct isakmp_gen *)np;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
cp = isakmp_sub_print(ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0,
|
|
|
|
depth);
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
return cp;
|
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
|
|
|
isakmp_p_print(const struct isakmp_gen *ext, const u_char *ep, u_int32_t phase,
|
2002-09-06 05:25:34 +08:00
|
|
|
u_int32_t doi0, u_int32_t proto0 _U_, int depth)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_pl_p *p;
|
|
|
|
struct isakmp_pl_p prop;
|
|
|
|
const u_char *cp;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_P));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_p *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&prop, ext, sizeof(prop));
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" #%d protoid=%s transform=%d",
|
2000-10-03 13:16:38 +08:00
|
|
|
prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t);
|
|
|
|
if (prop.spi_size) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" spi=");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(p + 1), prop.spi_size);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
cp = isakmp_sub_print(ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
|
2002-09-05 08:43:21 +08:00
|
|
|
prop.prot_id, depth);
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
return cp;
|
|
|
|
}
|
|
|
|
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *isakmp_p_map[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL, "ike",
|
|
|
|
};
|
|
|
|
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *ah_p_map[] = {
|
2000-04-24 20:49:11 +08:00
|
|
|
NULL, "(reserved)", "md5", "sha", "1des",
|
2000-10-04 10:54:40 +08:00
|
|
|
"sha2-256", "sha2-384", "sha2-512",
|
1999-10-30 13:11:06 +08:00
|
|
|
};
|
|
|
|
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *esp_p_map[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL, "1des-iv64", "1des", "3des", "rc5", "idea", "cast",
|
2000-10-04 10:54:40 +08:00
|
|
|
"blowfish", "3idea", "1des-iv32", "rc4", "null", "aes"
|
1999-10-30 13:11:06 +08:00
|
|
|
};
|
|
|
|
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *ipcomp_p_map[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL, "oui", "deflate", "lzs",
|
|
|
|
};
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct attrmap ipsec_t_map[] = {
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
{ NULL, 0, { NULL } },
|
1999-10-30 13:11:06 +08:00
|
|
|
{ "lifetype", 3, { NULL, "sec", "kb", }, },
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
{ "life", 0, { NULL } },
|
1999-10-30 13:11:06 +08:00
|
|
|
{ "group desc", 5, { NULL, "modp768", "modp1024", "EC2N 2^155",
|
|
|
|
"EC2N 2^185", }, },
|
|
|
|
{ "enc mode", 3, { NULL, "tunnel", "transport", }, },
|
|
|
|
{ "auth", 5, { NULL, "hmac-md5", "hmac-sha1", "1des-mac", "keyed", }, },
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
{ "keylen", 0, { NULL } },
|
|
|
|
{ "rounds", 0, { NULL } },
|
|
|
|
{ "dictsize", 0, { NULL } },
|
|
|
|
{ "privalg", 0, { NULL } },
|
1999-10-30 13:11:06 +08:00
|
|
|
};
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct attrmap oakley_t_map[] = {
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
{ NULL, 0, { NULL } },
|
2000-10-04 10:54:40 +08:00
|
|
|
{ "enc", 8, { NULL, "1des", "idea", "blowfish", "rc5",
|
|
|
|
"3des", "cast", "aes", }, },
|
|
|
|
{ "hash", 7, { NULL, "md5", "sha1", "tiger",
|
|
|
|
"sha2-256", "sha2-384", "sha2-512", }, },
|
1999-10-30 13:11:06 +08:00
|
|
|
{ "auth", 6, { NULL, "preshared", "dss", "rsa sig", "rsa enc",
|
|
|
|
"rsa enc revised", }, },
|
|
|
|
{ "group desc", 5, { NULL, "modp768", "modp1024", "EC2N 2^155",
|
|
|
|
"EC2N 2^185", }, },
|
|
|
|
{ "group type", 4, { NULL, "MODP", "ECP", "EC2N", }, },
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
{ "group prime", 0, { NULL } },
|
|
|
|
{ "group gen1", 0, { NULL } },
|
|
|
|
{ "group gen2", 0, { NULL } },
|
|
|
|
{ "group curve A", 0, { NULL } },
|
|
|
|
{ "group curve B", 0, { NULL } },
|
1999-10-30 13:11:06 +08:00
|
|
|
{ "lifetype", 3, { NULL, "sec", "kb", }, },
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
{ "lifeduration", 0, { NULL } },
|
|
|
|
{ "prf", 0, { NULL } },
|
|
|
|
{ "keylen", 0, { NULL } },
|
|
|
|
{ "field", 0, { NULL } },
|
|
|
|
{ "order", 0, { NULL } },
|
1999-10-30 13:11:06 +08:00
|
|
|
};
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_t_print(const struct isakmp_gen *ext, const u_char *ep,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto,
|
|
|
|
int depth _U_)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_pl_t *p;
|
|
|
|
struct isakmp_pl_t t;
|
|
|
|
const u_char *cp;
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
const char *idstr;
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct attrmap *map;
|
1999-10-30 13:11:06 +08:00
|
|
|
size_t nmap;
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_char *ep2;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_T));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_t *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&t, ext, sizeof(t));
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
switch (proto) {
|
|
|
|
case 1:
|
2000-10-03 13:16:38 +08:00
|
|
|
idstr = STR_OR_ID(t.t_id, isakmp_p_map);
|
1999-10-30 13:11:06 +08:00
|
|
|
map = oakley_t_map;
|
|
|
|
nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
|
|
|
|
break;
|
|
|
|
case 2:
|
2000-10-03 13:16:38 +08:00
|
|
|
idstr = STR_OR_ID(t.t_id, ah_p_map);
|
1999-10-30 13:11:06 +08:00
|
|
|
map = ipsec_t_map;
|
|
|
|
nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
|
|
|
|
break;
|
|
|
|
case 3:
|
2000-10-03 13:16:38 +08:00
|
|
|
idstr = STR_OR_ID(t.t_id, esp_p_map);
|
1999-10-30 13:11:06 +08:00
|
|
|
map = ipsec_t_map;
|
|
|
|
nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
|
|
|
|
break;
|
|
|
|
case 4:
|
2000-10-03 13:16:38 +08:00
|
|
|
idstr = STR_OR_ID(t.t_id, ipcomp_p_map);
|
1999-10-30 13:11:06 +08:00
|
|
|
map = ipsec_t_map;
|
|
|
|
nmap = sizeof(ipsec_t_map)/sizeof(ipsec_t_map[0]);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
idstr = NULL;
|
|
|
|
map = NULL;
|
|
|
|
nmap = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (idstr)
|
2000-10-03 13:16:38 +08:00
|
|
|
printf(" #%d id=%s ", t.t_no, idstr);
|
1999-10-30 13:11:06 +08:00
|
|
|
else
|
2000-10-03 13:16:38 +08:00
|
|
|
printf(" #%d id=%d ", t.t_no, t.t_id);
|
1999-10-30 13:11:06 +08:00
|
|
|
cp = (u_char *)(p + 1);
|
2000-10-03 13:16:38 +08:00
|
|
|
ep2 = (u_char *)p + ntohs(t.h.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
while (cp < ep && cp < ep2) {
|
|
|
|
if (map && nmap) {
|
|
|
|
cp = isakmp_attrmap_print(cp, (ep < ep2) ? ep : ep2,
|
|
|
|
map, nmap);
|
|
|
|
} else
|
|
|
|
cp = isakmp_attr_print(cp, (ep < ep2) ? ep : ep2);
|
|
|
|
}
|
|
|
|
if (ep < ep2)
|
|
|
|
printf("...");
|
|
|
|
return cp;
|
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_ke_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
|
|
|
|
int depth _U_)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_gen e;
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_KE));
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&e, ext, sizeof(e));
|
|
|
|
printf(" key len=%d", ntohs(e.len) - 4);
|
|
|
|
if (2 < vflag && 4 < ntohs(e.len)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(e.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_id_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase, u_int32_t doi _U_, u_int32_t proto _U_,
|
|
|
|
int depth _U_)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
|
|
|
#define USE_IPSECDOI_IN_PHASE1 1
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_pl_id *p;
|
|
|
|
struct isakmp_pl_id id;
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *idtypestr[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
"IPv4", "IPv4net", "IPv6", "IPv6net",
|
|
|
|
};
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *ipsecidtypestr[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL, "IPv4", "FQDN", "user FQDN", "IPv4net", "IPv6",
|
|
|
|
"IPv6net", "IPv4range", "IPv6range", "ASN1 DN", "ASN1 GN",
|
|
|
|
"keyid",
|
|
|
|
};
|
|
|
|
int len;
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_char *data;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_ID));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_id *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&id, ext, sizeof(id));
|
|
|
|
if (sizeof(*p) < id.h.len)
|
1999-10-30 13:11:06 +08:00
|
|
|
data = (u_char *)(p + 1);
|
|
|
|
else
|
|
|
|
data = NULL;
|
2000-10-03 13:16:38 +08:00
|
|
|
len = ntohs(id.h.len) - sizeof(*p);
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
#if 0 /*debug*/
|
|
|
|
printf(" [phase=%d doi=%d proto=%d]", phase, doi, proto);
|
|
|
|
#endif
|
|
|
|
switch (phase) {
|
|
|
|
#ifndef USE_IPSECDOI_IN_PHASE1
|
|
|
|
case 1:
|
|
|
|
#endif
|
|
|
|
default:
|
2000-10-03 13:16:38 +08:00
|
|
|
printf(" idtype=%s", STR_OR_ID(id.d.id_type, idtypestr));
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" doi_data=%u",
|
2000-10-03 13:16:38 +08:00
|
|
|
(u_int32_t)(ntohl(id.d.doi_data) & 0xffffff));
|
1999-10-30 13:11:06 +08:00
|
|
|
break;
|
|
|
|
|
|
|
|
#ifdef USE_IPSECDOI_IN_PHASE1
|
|
|
|
case 1:
|
|
|
|
#endif
|
|
|
|
case 2:
|
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct ipsecdoi_id *p;
|
|
|
|
struct ipsecdoi_id id;
|
1999-10-30 13:11:06 +08:00
|
|
|
struct protoent *pe;
|
|
|
|
|
|
|
|
p = (struct ipsecdoi_id *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&id, ext, sizeof(id));
|
|
|
|
printf(" idtype=%s", STR_OR_ID(id.type, ipsecidtypestr));
|
|
|
|
if (id.proto_id) {
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifndef WIN32
|
2000-09-23 04:35:34 +08:00
|
|
|
setprotoent(1);
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
2000-10-03 13:16:38 +08:00
|
|
|
pe = getprotobynumber(id.proto_id);
|
2000-09-23 04:35:34 +08:00
|
|
|
if (pe)
|
|
|
|
printf(" protoid=%s", pe->p_name);
|
2002-08-01 16:52:55 +08:00
|
|
|
#ifndef WIN32
|
2000-09-23 04:35:34 +08:00
|
|
|
endprotoent();
|
2002-08-01 16:52:55 +08:00
|
|
|
#endif /* WIN32 */
|
2000-09-23 04:35:34 +08:00
|
|
|
} else {
|
|
|
|
/* it DOES NOT mean IPPROTO_IP! */
|
|
|
|
printf(" protoid=%s", "0");
|
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
printf(" port=%d", ntohs(id.port));
|
1999-10-30 13:11:06 +08:00
|
|
|
if (!len)
|
|
|
|
break;
|
2000-10-03 13:16:38 +08:00
|
|
|
switch (id.type) {
|
1999-10-30 13:11:06 +08:00
|
|
|
case IPSECDOI_ID_IPV4_ADDR:
|
|
|
|
printf(" len=%d %s", len, ipaddr_string(data));
|
|
|
|
len = 0;
|
|
|
|
break;
|
|
|
|
case IPSECDOI_ID_FQDN:
|
|
|
|
case IPSECDOI_ID_USER_FQDN:
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
printf(" len=%d ", len);
|
2001-01-28 16:06:06 +08:00
|
|
|
for (i = 0; i < len; i++)
|
|
|
|
safeputchar(data[i]);
|
1999-10-30 13:11:06 +08:00
|
|
|
len = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IPSECDOI_ID_IPV4_ADDR_SUBNET:
|
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_char *mask;
|
1999-10-30 13:11:06 +08:00
|
|
|
mask = data + sizeof(struct in_addr);
|
|
|
|
printf(" len=%d %s/%u.%u.%u.%u", len,
|
|
|
|
ipaddr_string(data),
|
|
|
|
mask[0], mask[1], mask[2], mask[3]);
|
|
|
|
len = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#ifdef INET6
|
|
|
|
case IPSECDOI_ID_IPV6_ADDR:
|
|
|
|
printf(" len=%d %s", len, ip6addr_string(data));
|
|
|
|
len = 0;
|
|
|
|
break;
|
|
|
|
case IPSECDOI_ID_IPV6_ADDR_SUBNET:
|
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_int32_t *mask;
|
1999-10-30 13:11:06 +08:00
|
|
|
mask = (u_int32_t *)(data + sizeof(struct in6_addr));
|
|
|
|
/*XXX*/
|
|
|
|
printf(" len=%d %s/0x%08x%08x%08x%08x", len,
|
|
|
|
ip6addr_string(data),
|
|
|
|
mask[0], mask[1], mask[2], mask[3]);
|
|
|
|
len = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
#endif /*INET6*/
|
|
|
|
case IPSECDOI_ID_IPV4_ADDR_RANGE:
|
|
|
|
printf(" len=%d %s-%s", len, ipaddr_string(data),
|
|
|
|
ipaddr_string(data + sizeof(struct in_addr)));
|
|
|
|
len = 0;
|
|
|
|
break;
|
|
|
|
#ifdef INET6
|
|
|
|
case IPSECDOI_ID_IPV6_ADDR_RANGE:
|
|
|
|
printf(" len=%d %s-%s", len, ip6addr_string(data),
|
|
|
|
ip6addr_string(data + sizeof(struct in6_addr)));
|
|
|
|
len = 0;
|
|
|
|
break;
|
|
|
|
#endif /*INET6*/
|
|
|
|
case IPSECDOI_ID_DER_ASN1_DN:
|
|
|
|
case IPSECDOI_ID_DER_ASN1_GN:
|
|
|
|
case IPSECDOI_ID_KEY_ID:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (data && len) {
|
|
|
|
printf(" len=%d", len);
|
|
|
|
if (2 < vflag) {
|
|
|
|
printf(" ");
|
|
|
|
rawprint((caddr_t)data, len);
|
|
|
|
}
|
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(id.h.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_cert_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi0 _U_, u_int32_t proto0 _U_,
|
|
|
|
int depth _U_)
|
2000-04-24 20:49:11 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_pl_cert *p;
|
|
|
|
struct isakmp_pl_cert cert;
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *certstr[] = {
|
2000-04-24 20:49:11 +08:00
|
|
|
"none", "pkcs7", "pgp", "dns",
|
|
|
|
"x509sign", "x509ke", "kerberos", "crl",
|
|
|
|
"arl", "spki", "x509attr",
|
|
|
|
};
|
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_CERT));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_cert *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&cert, ext, sizeof(cert));
|
|
|
|
printf(" len=%d", ntohs(cert.h.len) - 4);
|
|
|
|
printf(" type=%s", STR_OR_ID((cert.encode), certstr));
|
|
|
|
if (2 < vflag && 4 < ntohs(cert.h.len)) {
|
2000-04-24 20:49:11 +08:00
|
|
|
printf(" ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(ext + 1), ntohs(cert.h.len) - 4);
|
2000-04-24 20:49:11 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(cert.h.len);
|
2000-04-24 20:49:11 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_cr_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi0 _U_, u_int32_t proto0 _U_,
|
|
|
|
int depth _U_)
|
2000-09-23 12:43:42 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_pl_cert *p;
|
|
|
|
struct isakmp_pl_cert cert;
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *certstr[] = {
|
2000-09-23 12:43:42 +08:00
|
|
|
"none", "pkcs7", "pgp", "dns",
|
|
|
|
"x509sign", "x509ke", "kerberos", "crl",
|
|
|
|
"arl", "spki", "x509attr",
|
|
|
|
};
|
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_CR));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_cert *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&cert, ext, sizeof(cert));
|
|
|
|
printf(" len=%d", ntohs(cert.h.len) - 4);
|
|
|
|
printf(" type=%s", STR_OR_ID((cert.encode), certstr));
|
|
|
|
if (2 < vflag && 4 < ntohs(cert.h.len)) {
|
2000-09-23 12:43:42 +08:00
|
|
|
printf(" ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(ext + 1), ntohs(cert.h.len) - 4);
|
2000-09-23 12:43:42 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(cert.h.len);
|
2000-09-23 12:43:42 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_hash_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
|
|
|
|
int depth _U_)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_gen e;
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_HASH));
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&e, ext, sizeof(e));
|
|
|
|
printf(" len=%d", ntohs(e.len) - 4);
|
|
|
|
if (2 < vflag && 4 < ntohs(e.len)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(e.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_sig_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
|
|
|
|
int depth _U_)
|
2000-04-24 20:49:11 +08:00
|
|
|
{
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_gen e;
|
|
|
|
|
2000-04-24 20:49:11 +08:00
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_SIG));
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&e, ext, sizeof(e));
|
|
|
|
printf(" len=%d", ntohs(e.len) - 4);
|
|
|
|
if (2 < vflag && 4 < ntohs(e.len)) {
|
2000-04-24 20:49:11 +08:00
|
|
|
printf(" ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
|
2000-04-24 20:49:11 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(e.len);
|
2000-04-24 20:49:11 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_nonce_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
|
|
|
|
int depth _U_)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_gen e;
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_NONCE));
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&e, ext, sizeof(e));
|
|
|
|
printf(" n len=%d", ntohs(e.len) - 4);
|
|
|
|
if (2 < vflag && 4 < ntohs(e.len)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(e.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
|
|
|
isakmp_n_print(const struct isakmp_gen *ext, const u_char *ep, u_int32_t phase,
|
2002-09-06 05:25:34 +08:00
|
|
|
u_int32_t doi0 _U_, u_int32_t proto0 _U_, int depth)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_pl_n *p, n;
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_char *cp;
|
1999-10-30 13:11:06 +08:00
|
|
|
u_char *ep2;
|
|
|
|
u_int32_t doi;
|
|
|
|
u_int32_t proto;
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *notify_error_str[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL, "INVALID-PAYLOAD-TYPE",
|
|
|
|
"DOI-NOT-SUPPORTED", "SITUATION-NOT-SUPPORTED",
|
|
|
|
"INVALID-COOKIE", "INVALID-MAJOR-VERSION",
|
|
|
|
"INVALID-MINOR-VERSION", "INVALID-EXCHANGE-TYPE",
|
|
|
|
"INVALID-FLAGS", "INVALID-MESSAGE-ID",
|
|
|
|
"INVALID-PROTOCOL-ID", "INVALID-SPI",
|
|
|
|
"INVALID-TRANSFORM-ID", "ATTRIBUTES-NOT-SUPPORTED",
|
|
|
|
"NO-PROPOSAL-CHOSEN", "BAD-PROPOSAL-SYNTAX",
|
|
|
|
"PAYLOAD-MALFORMED", "INVALID-KEY-INFORMATION",
|
|
|
|
"INVALID-ID-INFORMATION", "INVALID-CERT-ENCODING",
|
|
|
|
"INVALID-CERTIFICATE", "CERT-TYPE-UNSUPPORTED",
|
|
|
|
"INVALID-CERT-AUTHORITY", "INVALID-HASH-INFORMATION",
|
|
|
|
"AUTHENTICATION-FAILED", "INVALID-SIGNATURE",
|
|
|
|
"ADDRESS-NOTIFICATION", "NOTIFY-SA-LIFETIME",
|
|
|
|
"CERTIFICATE-UNAVAILABLE", "UNSUPPORTED-EXCHANGE-TYPE",
|
|
|
|
"UNEQUAL-PAYLOAD-LENGTHS",
|
|
|
|
};
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
static const char *ipsec_notify_error_str[] = {
|
|
|
|
"RESERVED",
|
|
|
|
};
|
|
|
|
static const char *notify_status_str[] = {
|
|
|
|
"CONNECTED",
|
|
|
|
};
|
|
|
|
static const char *ipsec_notify_status_str[] = {
|
1999-10-30 13:11:06 +08:00
|
|
|
"RESPONDER-LIFETIME", "REPLAY-STATUS",
|
|
|
|
"INITIAL-CONTACT",
|
|
|
|
};
|
|
|
|
/* NOTE: these macro must be called with x in proper range */
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
|
|
|
|
/* 0 - 8191 */
|
|
|
|
#define NOTIFY_ERROR_STR(x) \
|
|
|
|
STR_OR_ID((x), notify_error_str)
|
|
|
|
|
|
|
|
/* 8192 - 16383 */
|
|
|
|
#define IPSEC_NOTIFY_ERROR_STR(x) \
|
|
|
|
STR_OR_ID((u_int)((x) - 8192), ipsec_notify_error_str)
|
|
|
|
|
|
|
|
/* 16384 - 24575 */
|
|
|
|
#define NOTIFY_STATUS_STR(x) \
|
|
|
|
STR_OR_ID((u_int)((x) - 16384), notify_status_str)
|
|
|
|
|
|
|
|
/* 24576 - 32767 */
|
|
|
|
#define IPSEC_NOTIFY_STATUS_STR(x) \
|
|
|
|
STR_OR_ID((u_int)((x) - 24576), ipsec_notify_status_str)
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_N));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_n *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&n, ext, sizeof(n));
|
|
|
|
doi = ntohl(n.doi);
|
|
|
|
proto = n.prot_id;
|
1999-10-30 13:11:06 +08:00
|
|
|
if (doi != 1) {
|
|
|
|
printf(" doi=%d", doi);
|
|
|
|
printf(" proto=%d", proto);
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
if (ntohs(n.type) < 8192)
|
|
|
|
printf(" type=%s", NOTIFY_ERROR_STR(ntohs(n.type)));
|
|
|
|
else if (ntohs(n.type) < 16384)
|
|
|
|
printf(" type=%s", numstr(ntohs(n.type)));
|
|
|
|
else if (ntohs(n.type) < 24576)
|
|
|
|
printf(" type=%s", NOTIFY_STATUS_STR(ntohs(n.type)));
|
|
|
|
else
|
|
|
|
printf(" type=%s", numstr(ntohs(n.type)));
|
2000-10-03 13:16:38 +08:00
|
|
|
if (n.spi_size) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" spi=");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(p + 1), n.spi_size);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)(p + 1) + n.spi_size;
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
printf(" doi=ipsec");
|
|
|
|
printf(" proto=%s", PROTOIDSTR(proto));
|
2000-10-03 13:16:38 +08:00
|
|
|
if (ntohs(n.type) < 8192)
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
printf(" type=%s", NOTIFY_ERROR_STR(ntohs(n.type)));
|
2000-10-03 13:16:38 +08:00
|
|
|
else if (ntohs(n.type) < 16384)
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
printf(" type=%s", IPSEC_NOTIFY_ERROR_STR(ntohs(n.type)));
|
2000-10-03 13:16:38 +08:00
|
|
|
else if (ntohs(n.type) < 24576)
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
printf(" type=%s", NOTIFY_STATUS_STR(ntohs(n.type)));
|
|
|
|
else if (ntohs(n.type) < 32768)
|
|
|
|
printf(" type=%s", IPSEC_NOTIFY_STATUS_STR(ntohs(n.type)));
|
1999-10-30 13:11:06 +08:00
|
|
|
else
|
Add a few more GCC warnings on GCC >= 2 for ".devel" builds.
From Neil T. Spring: fixes for many of those warnings:
addrtoname.c, configure.in: Linux needs netinet/ether.h for
ether_ntohost
print-*.c: change char *foo = "bar" to const char *foo = "bar"
to appease -Wwrite-strings; should affect no run-time behavior.
print-*.c: make some variables unsigned.
print-bgp.c: plen ('prefix len') is unsigned, no reason to
validate by comparing to zero.
print-cnfp.c, print-rx.c: use intoa, provided by addrtoname,
instead of inet_ntoa.
print-domain.c: unsigned int l; (l=foo()) < 0 is guaranteed to
be false, so check for (u_int)-1, which represents failure,
explicitly.
print-isakmp.c: complete initialization of attrmap objects.
print-lwres.c: "if(x); print foo;" seemed much more likely to be
intended to be "if(x) { print foo; }".
print-smb.c: complete initialization of some structures.
In addition, add some fixes for the signed vs. unsigned comparison
warnings:
extract.h: cast the result of the byte-extraction-and-combining,
as, at least for the 16-bit version, C's integral promotions
will turn "u_int16_t" into "int" if there are other "int"s
nearby.
print-*.c: make some more variables unsigned, or add casts to an
unsigned type of signed values known not to be negative, or add
casts to "int" of unsigned values known to fit in an "int", and
make other changes needed to handle the aforementioned variables
now being unsigned.
print-isakmp.c: clean up the handling of error/status indicators
in notify messages.
print-ppp.c: get rid of a check that an unsigned quantity is >=
0.
print-radius.c: clean up some of the bounds checking.
print-smb.c: extract the word count into a "u_int" to avoid the
aforementioned problems with C's integral promotions.
print-snmp.c: change a check that an unsigned variable is >= 0
to a check that it's != 0.
Also, fix some formats to use "%u" rather than "%d" for unsigned
quantities.
2002-09-05 08:00:07 +08:00
|
|
|
printf(" type=%s", numstr(ntohs(n.type)));
|
2000-10-03 13:16:38 +08:00
|
|
|
if (n.spi_size) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" spi=");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(p + 1), n.spi_size);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
cp = (u_char *)(p + 1) + n.spi_size;
|
|
|
|
ep2 = (u_char *)p + ntohs(n.h.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
if (cp < ep) {
|
|
|
|
printf(" orig=(");
|
2000-10-03 13:16:38 +08:00
|
|
|
switch (ntohs(n.type)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
case IPSECDOI_NTYPE_RESPONDER_LIFETIME:
|
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct attrmap *map = oakley_t_map;
|
1999-10-30 13:11:06 +08:00
|
|
|
size_t nmap = sizeof(oakley_t_map)/sizeof(oakley_t_map[0]);
|
|
|
|
while (cp < ep && cp < ep2) {
|
|
|
|
cp = isakmp_attrmap_print(cp,
|
|
|
|
(ep < ep2) ? ep : ep2, map, nmap);
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case IPSECDOI_NTYPE_REPLAY_STATUS:
|
|
|
|
printf("replay detection %sabled",
|
|
|
|
(*(u_int32_t *)cp) ? "en" : "dis");
|
|
|
|
break;
|
|
|
|
case ISAKMP_NTYPE_NO_PROPOSAL_CHOSEN:
|
2002-09-05 08:43:21 +08:00
|
|
|
if (isakmp_sub_print(ISAKMP_NPTYPE_SA,
|
|
|
|
(struct isakmp_gen *)cp, ep, phase, doi, proto,
|
|
|
|
depth) == NULL)
|
|
|
|
return NULL;
|
1999-10-30 13:11:06 +08:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
/* NULL is dummy */
|
|
|
|
isakmp_print(cp,
|
2000-10-03 13:16:38 +08:00
|
|
|
ntohs(n.h.len) - sizeof(*p) - n.spi_size,
|
1999-10-30 13:11:06 +08:00
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
printf(")");
|
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(n.h.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_d_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi0 _U_, u_int32_t proto0 _U_,
|
|
|
|
int depth _U_)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_pl_d *p;
|
|
|
|
struct isakmp_pl_d d;
|
|
|
|
const u_int8_t *q;
|
1999-10-30 13:11:06 +08:00
|
|
|
u_int32_t doi;
|
|
|
|
u_int32_t proto;
|
|
|
|
int i;
|
|
|
|
|
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_D));
|
|
|
|
|
|
|
|
p = (struct isakmp_pl_d *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&d, ext, sizeof(d));
|
|
|
|
doi = ntohl(d.doi);
|
|
|
|
proto = d.prot_id;
|
1999-10-30 13:11:06 +08:00
|
|
|
if (doi != 1) {
|
|
|
|
printf(" doi=%u", doi);
|
|
|
|
printf(" proto=%u", proto);
|
|
|
|
} else {
|
|
|
|
printf(" doi=ipsec");
|
|
|
|
printf(" proto=%s", PROTOIDSTR(proto));
|
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
printf(" spilen=%u", d.spi_size);
|
|
|
|
printf(" nspi=%u", ntohs(d.num_spi));
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" spi=");
|
|
|
|
q = (u_int8_t *)(p + 1);
|
2000-10-03 13:16:38 +08:00
|
|
|
for (i = 0; i < ntohs(d.num_spi); i++) {
|
1999-10-30 13:11:06 +08:00
|
|
|
if (i != 0)
|
|
|
|
printf(",");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)q, d.spi_size);
|
|
|
|
q += d.spi_size;
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
return q;
|
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
2002-09-06 05:25:34 +08:00
|
|
|
isakmp_vid_print(const struct isakmp_gen *ext, const u_char *ep _U_,
|
|
|
|
u_int32_t phase _U_, u_int32_t doi _U_, u_int32_t proto _U_,
|
|
|
|
int depth _U_)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_gen e;
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("%s:", NPSTR(ISAKMP_NPTYPE_VID));
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&e, ext, sizeof(e));
|
|
|
|
printf(" len=%d", ntohs(e.len) - 4);
|
|
|
|
if (2 < vflag && 4 < ntohs(e.len)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
2000-10-03 13:16:38 +08:00
|
|
|
return (u_char *)ext + ntohs(e.len);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
|
|
|
isakmp_sub0_print(u_char np, const struct isakmp_gen *ext, const u_char *ep,
|
|
|
|
u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_char *cp;
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_gen e;
|
2002-09-05 08:43:21 +08:00
|
|
|
u_int item_len;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
cp = (u_char *)ext;
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&e, ext, sizeof(e));
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
if (NPFUNC(np))
|
2002-09-05 08:43:21 +08:00
|
|
|
cp = (*NPFUNC(np))(ext, ep, phase, doi, proto, depth);
|
1999-10-30 13:11:06 +08:00
|
|
|
else {
|
|
|
|
printf("%s", NPSTR(np));
|
2002-09-05 08:43:21 +08:00
|
|
|
item_len = ntohs(e.len);
|
|
|
|
if (item_len == 0) {
|
|
|
|
/*
|
|
|
|
* We don't want to loop forever processing this
|
|
|
|
* bogus (zero-length) item; return NULL so that
|
|
|
|
* we stop dissecting.
|
|
|
|
*/
|
|
|
|
cp = NULL;
|
|
|
|
} else
|
|
|
|
cp += item_len;
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
2002-09-05 08:43:21 +08:00
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
return cp;
|
|
|
|
}
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
static const u_char *
|
|
|
|
isakmp_sub_print(u_char np, const struct isakmp_gen *ext, const u_char *ep,
|
|
|
|
u_int32_t phase, u_int32_t doi, u_int32_t proto, int depth)
|
1999-10-30 13:11:06 +08:00
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const u_char *cp;
|
1999-10-30 13:11:06 +08:00
|
|
|
int i;
|
2000-10-03 13:16:38 +08:00
|
|
|
struct isakmp_gen e;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
cp = (const u_char *)ext;
|
1999-10-30 13:11:06 +08:00
|
|
|
|
|
|
|
while (np) {
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&e, ext, sizeof(e));
|
|
|
|
|
|
|
|
if (ep < (u_char *)ext + ntohs(e.len)) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" [|%s]", NPSTR(np));
|
|
|
|
cp = ep + 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
depth++;
|
|
|
|
printf("\n");
|
|
|
|
for (i = 0; i < depth; i++)
|
|
|
|
printf(" ");
|
|
|
|
printf("(");
|
2002-09-05 08:43:21 +08:00
|
|
|
cp = isakmp_sub0_print(np, ext, ep, phase, doi, proto, depth);
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(")");
|
|
|
|
depth--;
|
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
if (cp == NULL) {
|
|
|
|
/* Zero-length subitem */
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
np = e.np;
|
1999-10-30 13:11:06 +08:00
|
|
|
ext = (struct isakmp_gen *)cp;
|
|
|
|
}
|
|
|
|
return cp;
|
|
|
|
}
|
|
|
|
|
|
|
|
static char *
|
|
|
|
numstr(int x)
|
|
|
|
{
|
|
|
|
static char buf[20];
|
2000-01-17 14:24:23 +08:00
|
|
|
snprintf(buf, sizeof(buf), "#%d", x);
|
1999-10-30 13:11:06 +08:00
|
|
|
return buf;
|
|
|
|
}
|
1999-10-18 05:59:12 +08:00
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
/*
|
|
|
|
* some compiler tries to optimize memcpy(), using the alignment constraint
|
|
|
|
* on the argument pointer type. by using this function, we try to avoid the
|
|
|
|
* optimization.
|
|
|
|
*/
|
|
|
|
static void
|
2002-09-05 08:43:21 +08:00
|
|
|
safememcpy(void *p, const void *q, size_t l)
|
2000-10-03 13:16:38 +08:00
|
|
|
{
|
|
|
|
memcpy(p, q, l);
|
|
|
|
}
|
|
|
|
|
1999-10-18 05:59:12 +08:00
|
|
|
void
|
1999-10-30 13:11:06 +08:00
|
|
|
isakmp_print(const u_char *bp, u_int length, const u_char *bp2)
|
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp *p;
|
|
|
|
struct isakmp base;
|
|
|
|
const u_char *ep;
|
1999-10-30 13:11:06 +08:00
|
|
|
u_char np;
|
|
|
|
int i;
|
|
|
|
int phase;
|
2000-01-07 22:09:02 +08:00
|
|
|
int major, minor;
|
1999-10-18 05:59:12 +08:00
|
|
|
|
2002-09-05 08:43:21 +08:00
|
|
|
p = (const struct isakmp *)bp;
|
|
|
|
ep = snapend;
|
1999-10-18 05:59:12 +08:00
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
if ((struct isakmp *)ep < p + 1) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("[|isakmp]");
|
|
|
|
return;
|
|
|
|
}
|
1999-10-18 05:59:12 +08:00
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
safememcpy(&base, p, sizeof(base));
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("isakmp");
|
2000-01-07 22:09:02 +08:00
|
|
|
if (vflag) {
|
2000-10-03 13:16:38 +08:00
|
|
|
major = (base.vers & ISAKMP_VERS_MAJOR)
|
2000-01-07 22:09:02 +08:00
|
|
|
>> ISAKMP_VERS_MAJOR_SHIFT;
|
2000-10-03 13:16:38 +08:00
|
|
|
minor = (base.vers & ISAKMP_VERS_MINOR)
|
2000-01-07 22:09:02 +08:00
|
|
|
>> ISAKMP_VERS_MINOR_SHIFT;
|
|
|
|
printf(" %d.%d", major, minor);
|
|
|
|
}
|
1999-10-18 05:59:12 +08:00
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
if (vflag) {
|
|
|
|
printf(" msgid ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)&base.msgid, sizeof(base.msgid));
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if (1 < vflag) {
|
|
|
|
printf(" cookie ");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)&base.i_ck, sizeof(base.i_ck));
|
1999-10-30 13:11:06 +08:00
|
|
|
printf("->");
|
2000-10-03 13:16:38 +08:00
|
|
|
rawprint((caddr_t)&base.r_ck, sizeof(base.r_ck));
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
printf(":");
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
phase = (*(u_int32_t *)base.msgid == 0) ? 1 : 2;
|
1999-10-30 13:11:06 +08:00
|
|
|
if (phase == 1)
|
|
|
|
printf(" phase %d", phase);
|
|
|
|
else
|
|
|
|
printf(" phase %d/others", phase);
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
i = cookie_find(&base.i_ck);
|
1999-10-30 13:11:06 +08:00
|
|
|
if (i < 0) {
|
2000-10-03 13:16:38 +08:00
|
|
|
if (iszero((u_char *)&base.r_ck, sizeof(base.r_ck))) {
|
1999-10-30 13:11:06 +08:00
|
|
|
/* the first packet */
|
|
|
|
printf(" I");
|
|
|
|
if (bp2)
|
2000-10-03 13:16:38 +08:00
|
|
|
cookie_record(&base.i_ck, bp2);
|
1999-10-30 13:11:06 +08:00
|
|
|
} else
|
|
|
|
printf(" ?");
|
|
|
|
} else {
|
|
|
|
if (bp2 && cookie_isinitiator(i, bp2))
|
|
|
|
printf(" I");
|
|
|
|
else if (bp2 && cookie_isresponder(i, bp2))
|
|
|
|
printf(" R");
|
|
|
|
else
|
|
|
|
printf(" ?");
|
|
|
|
}
|
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
printf(" %s", ETYPESTR(base.etype));
|
|
|
|
if (base.flags) {
|
|
|
|
printf("[%s%s]", base.flags & ISAKMP_FLAG_E ? "E" : "",
|
|
|
|
base.flags & ISAKMP_FLAG_C ? "C" : "");
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
printf(":");
|
1999-10-18 05:59:12 +08:00
|
|
|
|
|
|
|
{
|
2002-09-05 08:43:21 +08:00
|
|
|
const struct isakmp_gen *ext;
|
1999-10-30 13:11:06 +08:00
|
|
|
int nparen;
|
|
|
|
|
|
|
|
#define CHECKLEN(p, np) \
|
|
|
|
if (ep < (u_char *)(p)) { \
|
|
|
|
printf(" [|%s]", NPSTR(np)); \
|
|
|
|
goto done; \
|
|
|
|
}
|
|
|
|
|
|
|
|
/* regardless of phase... */
|
2000-10-03 13:16:38 +08:00
|
|
|
if (base.flags & ISAKMP_FLAG_E) {
|
1999-10-30 13:11:06 +08:00
|
|
|
/*
|
|
|
|
* encrypted, nothing we can do right now.
|
|
|
|
* we hope to decrypt the packet in the future...
|
|
|
|
*/
|
2001-02-21 02:55:14 +08:00
|
|
|
printf(" [encrypted %s]", NPSTR(base.np));
|
1999-10-30 13:11:06 +08:00
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
|
|
|
|
nparen = 0;
|
2000-10-03 13:16:38 +08:00
|
|
|
CHECKLEN(p + 1, base.np)
|
1999-10-30 13:11:06 +08:00
|
|
|
|
2000-10-03 13:16:38 +08:00
|
|
|
np = base.np;
|
|
|
|
ext = (struct isakmp_gen *)(p + 1);
|
2002-09-05 08:43:21 +08:00
|
|
|
isakmp_sub_print(np, ext, ep, phase, 0, 0, 0);
|
1999-10-18 05:59:12 +08:00
|
|
|
}
|
|
|
|
|
1999-10-30 13:11:06 +08:00
|
|
|
done:
|
|
|
|
if (vflag) {
|
2000-10-03 13:16:38 +08:00
|
|
|
if (ntohl(base.len) != length) {
|
1999-10-30 13:11:06 +08:00
|
|
|
printf(" (len mismatch: isakmp %u/ip %d)",
|
2000-10-03 13:16:38 +08:00
|
|
|
(u_int32_t)ntohl(base.len), length);
|
1999-10-30 13:11:06 +08:00
|
|
|
}
|
|
|
|
}
|
1999-10-18 05:59:12 +08:00
|
|
|
}
|