summaryrefslogtreecommitdiff
path: root/print-esp.c
diff options
context:
space:
mode:
authorfenner <fenner>2002-07-28 04:23:00 +0000
committerfenner <fenner>2002-07-28 04:23:00 +0000
commitb6757002611a2fdb34e7095445ac2c0e0cdc5e98 (patch)
treef9f60739a47a70662282c7bb1b55fa03c8e01ce5 /print-esp.c
parenta71d112b5c898951be91480f193dce7101727d2d (diff)
downloadtcpdump-b6757002611a2fdb34e7095445ac2c0e0cdc5e98.tar.gz
Initial support for OpenSSL version 0.9.7 and higher.
configure doesn't know how to handle this yet.
Diffstat (limited to 'print-esp.c')
-rw-r--r--print-esp.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/print-esp.c b/print-esp.c
index 27624de8..7c5894b6 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.26 2002-07-27 19:30:36 guy Exp $ (LBL)";
+ "@(#) $Header: /tcpdump/master/tcpdump/print-esp.c,v 1.27 2002-07-28 04:23:00 fenner Exp $ (LBL)";
#endif
#ifdef HAVE_CONFIG_H
@@ -272,7 +272,11 @@ esp_print(register const u_char *bp, register const u_char *bp2,
#ifdef HAVE_LIBCRYPTO
{
u_char iv[8];
+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
+ DES_key_schedule schedule;
+#else
des_key_schedule schedule;
+#endif
switch (ivlen) {
case 4:
@@ -290,14 +294,22 @@ esp_print(register const u_char *bp, register const u_char *bp2,
default:
goto fail;
}
+ p = ivoff + ivlen;
+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
+ DES_set_key_unchecked((DES_cblock *)secret, schedule);
+
+ DES_cbc_encrypt((const unsigned char *)p, p,
+ (long)(ep - p), schedule, (DES_cblock *)iv,
+ DES_DECRYPT);
+#else
des_check_key = 0;
des_set_key((void *)secret, schedule);
- p = ivoff + ivlen;
des_cbc_encrypt((void *)p, (void *)p,
(long)(ep - p), schedule, (void *)iv,
DES_DECRYPT);
+#endif
advance = ivoff - (u_char *)esp + ivlen;
break;
}
@@ -360,6 +372,28 @@ esp_print(register const u_char *bp, register const u_char *bp2,
case DES3CBC:
#if defined(HAVE_LIBCRYPTO)
{
+#if OPENSSL_VERSION_NUMBER >= 0x00907000L
+ DES_key_schedule s1, s2, s3;
+
+ DES_set_odd_parity((DES_cblock *)secret);
+ DES_set_odd_parity((DES_cblock *)(secret + 8));
+ DES_set_odd_parity((DES_cblock *)(secret + 16));
+ if(DES_set_key_checked((DES_cblock *)secret, s1) != 0) {
+ printf("failed to schedule key 1\n");
+ }
+ if(DES_set_key_checked((DES_cblock *)(secret + 8), s2)!=0) {
+ printf("failed to schedule key 2\n");
+ }
+ if(DES_set_key_checked((DES_cblock *)(secret + 16), s3)!=0) {
+ printf("failed to schedule key 3\n");
+ }
+
+ p = ivoff + ivlen;
+ DES_ede3_cbc_encrypt((const unsigned char *)p, p,
+ (long)(ep - p),
+ &s1, &s2, &s3,
+ (DES_cblock *)ivoff, DES_DECRYPT);
+#else
des_key_schedule s1, s2, s3;
des_check_key = 1;
@@ -381,6 +415,7 @@ esp_print(register const u_char *bp, register const u_char *bp2,
(long)(ep - p),
s1, s2, s3,
(void *)ivoff, DES_DECRYPT);
+#endif
advance = ivoff - (u_char *)esp + ivlen;
break;
}