From Kazushi Sugyo: make "-E alog:0x[0-9a-fA-F]" work.
diff --git a/print-esp.c b/print-esp.c
index 8eebc57..c06df9a 100644
--- a/print-esp.c
+++ b/print-esp.c
@@ -23,7 +23,7 @@
#ifndef lint
static const char rcsid[] =
- "@(#) $Header: /tcpdump/master/tcpdump/print-esp.c,v 1.31 2002-12-11 07:13:59 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-esp.c,v 1.32 2003-02-05 02:38:45 guy Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -62,6 +62,7 @@
static struct esp_algorithm *espsecret_xform=NULL; /* cache of decoded alg. */
static char *espsecret_key=NULL;
+static int espsecret_keylen=0;
enum cipher { NONE,
@@ -177,8 +178,10 @@
colon+=2;
i++;
}
+ espsecret_keylen = len;
} else {
espsecret_key = colon;
+ espsecret_keylen = strlen(colon);
}
}
@@ -298,6 +301,8 @@
}
p = ivoff + ivlen;
+ if (espsecret_keylen != 8)
+ goto fail;
#if OPENSSL_VERSION_NUMBER >= 0x00907000L
DES_set_key_unchecked((DES_cblock *)secret, schedule);
@@ -324,7 +329,9 @@
{
BF_KEY schedule;
- BF_set_key(&schedule, strlen(secret), secret);
+ if (espsecret_keylen < 5 || espsecret_keylen > 56)
+ goto fail;
+ BF_set_key(&schedule, espsecret_keylen, secret);
p = ivoff + ivlen;
BF_cbc_encrypt(p, p, (long)(ep - p), &schedule, ivoff,
@@ -341,7 +348,9 @@
{
RC5_32_KEY schedule;
- RC5_32_set_key(&schedule, strlen(secret), secret,
+ if (espsecret_keylen < 5 || espsecret_keylen > 255)
+ goto fail;
+ RC5_32_set_key(&schedule, espsecret_keylen, secret,
RC5_16_ROUNDS);
p = ivoff + ivlen;
@@ -359,7 +368,9 @@
{
CAST_KEY schedule;
- CAST_set_key(&schedule, strlen(secret), secret);
+ if (espsecret_keylen < 5 || espsecret_keylen > 16)
+ goto fail;
+ CAST_set_key(&schedule, espsecret_keylen, secret);
p = ivoff + ivlen;
CAST_cbc_encrypt(p, p, (long)(ep - p), &schedule, ivoff,
@@ -377,6 +388,8 @@
#if OPENSSL_VERSION_NUMBER >= 0x00907000L
DES_key_schedule s1, s2, s3;
+ if (espsecret_keylen != 24)
+ goto fail;
DES_set_odd_parity((DES_cblock *)secret);
DES_set_odd_parity((DES_cblock *)(secret + 8));
DES_set_odd_parity((DES_cblock *)(secret + 16));
@@ -398,6 +411,8 @@
#else
des_key_schedule s1, s2, s3;
+ if (espsecret_keylen != 24)
+ goto fail;
des_check_key = 1;
des_set_odd_parity((void *)secret);
des_set_odd_parity((void *)(secret + 8));