An issue with how Net-SNMP currently interfaces with OpenSSL, especially on
Windows, is that replacing the OpenSSL binaries may cause Net-SNMP to crash.
That is because in at least one place the EVP_MD_CTX structure is allocated
on the stack and the size of this structure differs between OpenSSL versions.
One possible solution is to let the OpenSSL library allocate the EVP_MD_CTX
data structure instead of Net-SNMP. However, doing that is only possible
with OpenSSL 0.9.7 (released on December 31, 2002). That shouldn't be an
issue though - older distros like e.g. RHEL 4 include OpenSSL version 0.9.7.

diff --git a/snmplib/keytools.c b/snmplib/keytools.c
index 810a063..72f39b9 100644
--- a/snmplib/keytools.c
+++ b/snmplib/keytools.c
@@ -118,7 +118,7 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
     u_char          buf[USM_LENGTH_KU_HASHBLOCK], *bufp;

 #ifdef NETSNMP_USE_OPENSSL
-    EVP_MD_CTX     *ctx = (EVP_MD_CTX *)malloc(sizeof(EVP_MD_CTX));
+    EVP_MD_CTX     *ctx = EVP_MD_CTX_create();
     unsigned int    tmp_len;
 #elif NETSNMP_USE_INTERNAL_CRYPTO
     SHA_CTX csha1;
@@ -158,10 +158,8 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
 #endif
         if (ISTRANSFORM(hashtype, HMACSHA1Auth))
         EVP_DigestInit(ctx, EVP_sha1());
-    else {
-        free(ctx);
-        return (SNMPERR_GENERR);
-    }
+    else
+        QUITFUN(SNMPERR_GENERR, generate_Ku_quit);
 #elif NETSNMP_USE_INTERNAL_CRYPTO
 #ifndef NETSNMP_DISABLE_MD5
     if (ISTRANSFORM(hashtype, HMACMD5Auth)) {
@@ -248,7 +246,7 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
   generate_Ku_quit:
     memset(buf, 0, sizeof(buf));
 #ifdef NETSNMP_USE_OPENSSL
-    free(ctx);
+    EVP_MD_CTX_destroy(ctx);
 #endif
     return rval;

diff --git a/snmplib/scapi.c b/snmplib/scapi.c
index a397344..2b2eeb1 100644
--- a/snmplib/scapi.c
+++ b/snmplib/scapi.c
@@ -454,7 +454,7 @@ sc_hash(const oid * hashtype, size_t hashtypelen,
const u_char * buf,

 #ifdef NETSNMP_USE_OPENSSL
     const EVP_MD   *hashfn;
-    EVP_MD_CTX     ctx, *cptr;
+    EVP_MD_CTX     *cptr;
 #endif
 #ifdef NETSNMP_USE_INTERNAL_CRYPTO
     MD5_CTX        cmd5;
@@ -485,42 +485,16 @@ sc_hash(const oid * hashtype, size_t
hashtypelen, const u_char * buf,
     }

 /** initialize the pointer */
-    memset(&ctx, 0, sizeof(ctx));
-    cptr = &ctx;
-#if defined(OLD_DES)
+    cptr = EVP_MD_CTX_create();
     EVP_DigestInit(cptr, hashfn);
-#else /* !OLD_DES */
-    /* this is needed if the runtime library is different than the compiled
-       library since the openssl versions are very different. */
-    if (SSLeay() < 0x907000) {
-        /* the old version of the struct was bigger and thus more
-           memory is needed. should be 152, but we use 256 for safety. */
-        cptr = (EVP_MD_CTX *)malloc(256);
-        EVP_DigestInit(cptr, hashfn);
-    } else {
-        EVP_MD_CTX_init(cptr);
-        EVP_DigestInit(cptr, hashfn);
-    }
-#endif

 /** pass the data */
     EVP_DigestUpdate(cptr, buf, buf_len);

 /** do the final pass */
-#if defined(OLD_DES)
     EVP_DigestFinal(cptr, MAC, &tmp_len);
     *MAC_len = tmp_len;
-#else /* !OLD_DES */
-    if (SSLeay() < 0x907000) {
-        EVP_DigestFinal(cptr, MAC, &tmp_len);
-        *MAC_len = tmp_len;
-        free(cptr);
-    } else {
-        EVP_DigestFinal_ex(cptr, MAC, &tmp_len);
-        *MAC_len = tmp_len;
-        EVP_MD_CTX_cleanup(cptr);
-    }
-#endif                          /* OLD_DES */
+    EVP_MD_CTX_destroy(cptr);
     return (rval);

 #elif NETSNMP_USE_INTERNAL_CRYPTO

------------------------------------------------------------------------------
Special Offer -- Download ArcSight Logger for FREE!
Finally, a world-class log management solution at an even better 
price-free! And you'll get a free "Love Thy Logs" t-shirt when you
download Logger. Secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsisghtdev2dev
_______________________________________________
Net-snmp-coders mailing list
Net-snmp-coders@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to