#ifndef lint
static const char rcsid[] _U_ =
- "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.36.2.9 2004-03-12 01:27:27 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-isakmp.c,v 1.36.2.10 2004-03-12 02:18:30 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
return 0;
}
-static void
+static int
rawprint(caddr_t loc, size_t len)
{
static u_char *p;
p = (u_char *)loc;
for (i = 0; i < len; i++)
printf("%02x", p[i] & 0xff);
+ return 1;
trunc:
- ;
+ return 0;
}
struct attrmap {
printf("%s:", NPSTR(ISAKMP_NPTYPE_SA));
p = (struct isakmp_pl_sa *)ext;
+ TCHECK(*p);
safememcpy(&sa, ext, sizeof(sa));
doi = ntohl(sa.doi);
sit = ntohl(sa.sit);
np = (u_char *)ext + sizeof(sa);
if (sit != 0x01) {
+ TCHECK2(*(ext + 1), sizeof(ident));
safememcpy(&ident, ext + 1, sizeof(ident));
printf(" ident=%u", (u_int32_t)ntohl(ident));
np += sizeof(ident);
}
ext = (struct isakmp_gen *)np;
+ TCHECK(*ext);
cp = isakmp_sub_print(ISAKMP_NPTYPE_P, ext, ep, phase, doi, proto0,
depth);
return cp;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SA));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_P));
p = (struct isakmp_pl_p *)ext;
+ TCHECK(*p);
safememcpy(&prop, ext, sizeof(prop));
printf(" #%d protoid=%s transform=%d",
prop.p_no, PROTOIDSTR(prop.prot_id), prop.num_t);
if (prop.spi_size) {
printf(" spi=");
- rawprint((caddr_t)(p + 1), prop.spi_size);
+ if (!rawprint((caddr_t)(p + 1), prop.spi_size))
+ goto trunc;
}
ext = (struct isakmp_gen *)((u_char *)(p + 1) + prop.spi_size);
+ TCHECK(*ext);
cp = isakmp_sub_print(ISAKMP_NPTYPE_T, ext, ep, phase, doi0,
prop.prot_id, depth);
return cp;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_P));
+ return NULL;
}
static const char *isakmp_p_map[] = {
printf("%s:", NPSTR(ISAKMP_NPTYPE_T));
p = (struct isakmp_pl_t *)ext;
+ TCHECK(*p);
safememcpy(&t, ext, sizeof(t));
switch (proto) {
if (ep < ep2)
printf("...");
return cp;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_T));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_KE));
+ TCHECK(*ext);
safememcpy(&e, ext, sizeof(e));
printf(" key len=%d", ntohs(e.len) - 4);
if (2 < vflag && 4 < ntohs(e.len)) {
printf(" ");
- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
+ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
}
return (u_char *)ext + ntohs(e.len);
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_KE));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_ID));
p = (struct isakmp_pl_id *)ext;
+ TCHECK(*p);
safememcpy(&id, ext, sizeof(id));
if (sizeof(*p) < item_len) {
data = (u_char *)(p + 1);
struct protoent *pe;
p = (struct ipsecdoi_id *)ext;
+ TCHECK(*p);
safememcpy(&id, ext, sizeof(id));
printf(" idtype=%s", STR_OR_ID(id.type, ipsecidtypestr));
if (id.proto_id) {
printf(" port=%d", ntohs(id.port));
if (!len)
break;
+ if (data == NULL)
+ goto trunc;
+ TCHECK2(*data, len);
switch (id.type) {
case IPSECDOI_ID_IPV4_ADDR:
printf(" len=%d %s", len, ipaddr_string(data));
printf(" len=%d", len);
if (2 < vflag) {
printf(" ");
- rawprint((caddr_t)data, len);
+ if (!rawprint((caddr_t)data, len))
+ goto trunc;
}
}
return (u_char *)ext + item_len;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_ID));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_CERT));
p = (struct isakmp_pl_cert *)ext;
+ TCHECK(*p);
safememcpy(&cert, ext, sizeof(cert));
printf(" len=%d", item_len - 4);
printf(" type=%s", STR_OR_ID((cert.encode), certstr));
if (2 < vflag && 4 < item_len) {
printf(" ");
- rawprint((caddr_t)(ext + 1), item_len - 4);
+ if (!rawprint((caddr_t)(ext + 1), item_len - 4))
+ goto trunc;
}
return (u_char *)ext + item_len;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CERT));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_CR));
p = (struct isakmp_pl_cert *)ext;
+ TCHECK(*p);
safememcpy(&cert, ext, sizeof(cert));
printf(" len=%d", item_len - 4);
printf(" type=%s", STR_OR_ID((cert.encode), certstr));
if (2 < vflag && 4 < item_len) {
printf(" ");
- rawprint((caddr_t)(ext + 1), item_len - 4);
+ if (!rawprint((caddr_t)(ext + 1), item_len - 4))
+ goto trunc;
}
return (u_char *)ext + item_len;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_CR));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_HASH));
+ TCHECK(*ext);
safememcpy(&e, ext, sizeof(e));
printf(" len=%d", ntohs(e.len) - 4);
if (2 < vflag && 4 < ntohs(e.len)) {
printf(" ");
- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
+ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
}
return (u_char *)ext + ntohs(e.len);
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_HASH));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_SIG));
+ TCHECK(*ext);
safememcpy(&e, ext, sizeof(e));
printf(" len=%d", ntohs(e.len) - 4);
if (2 < vflag && 4 < ntohs(e.len)) {
printf(" ");
- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
+ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
}
return (u_char *)ext + ntohs(e.len);
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_SIG));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_NONCE));
+ TCHECK(*ext);
safememcpy(&e, ext, sizeof(e));
printf(" n len=%d", ntohs(e.len) - 4);
if (2 < vflag && 4 < ntohs(e.len)) {
printf(" ");
- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
+ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
}
return (u_char *)ext + ntohs(e.len);
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_NONCE));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_N));
p = (struct isakmp_pl_n *)ext;
+ TCHECK(*p);
safememcpy(&n, ext, sizeof(n));
doi = ntohl(n.doi);
proto = n.prot_id;
printf(" type=%s", numstr(ntohs(n.type)));
if (n.spi_size) {
printf(" spi=");
- rawprint((caddr_t)(p + 1), n.spi_size);
+ if (!rawprint((caddr_t)(p + 1), n.spi_size))
+ goto trunc;
}
return (u_char *)(p + 1) + n.spi_size;
}
printf(" type=%s", numstr(ntohs(n.type)));
if (n.spi_size) {
printf(" spi=");
- rawprint((caddr_t)(p + 1), n.spi_size);
+ if (!rawprint((caddr_t)(p + 1), n.spi_size))
+ goto trunc;
}
cp = (u_char *)(p + 1) + n.spi_size;
printf(")");
}
return (u_char *)ext + item_len;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_N));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_D));
p = (struct isakmp_pl_d *)ext;
+ TCHECK(*p);
safememcpy(&d, ext, sizeof(d));
doi = ntohl(d.doi);
proto = d.prot_id;
for (i = 0; i < ntohs(d.num_spi); i++) {
if (i != 0)
printf(",");
- rawprint((caddr_t)q, d.spi_size);
+ if (!rawprint((caddr_t)q, d.spi_size))
+ goto trunc;
q += d.spi_size;
}
return q;
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_D));
+ return NULL;
}
static const u_char *
printf("%s:", NPSTR(ISAKMP_NPTYPE_VID));
+ TCHECK(*ext);
safememcpy(&e, ext, sizeof(e));
printf(" len=%d", ntohs(e.len) - 4);
if (2 < vflag && 4 < ntohs(e.len)) {
printf(" ");
- rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4);
+ if (!rawprint((caddr_t)(ext + 1), ntohs(e.len) - 4))
+ goto trunc;
}
return (u_char *)ext + ntohs(e.len);
+trunc:
+ printf(" [|%s]", NPSTR(ISAKMP_NPTYPE_VID));
+ return NULL;
}
static const u_char *
u_int item_len;
cp = (u_char *)ext;
+ TCHECK(*ext);
safememcpy(&e, ext, sizeof(e));
/*
}
return cp;
+trunc:
+ printf(" [|isakmp]");
+ return NULL;
}
static const u_char *
cp = (const u_char *)ext;
while (np) {
- TCHECK2(*ext, sizeof(e));
+ TCHECK(*ext);
safememcpy(&e, ext, sizeof(e));
- if (ep < (u_char *)ext + ntohs(e.len)) {
- printf(" [|%s]", NPSTR(np));
- cp = ep + 1;
- break;
- }
+ TCHECK2(*ext, ntohs(e.len));
+
depth++;
printf("\n");
for (i = 0; i < depth; i++)
}
return cp;
trunc:
+ printf(" [|%s]", NPSTR(np));
return NULL;
}