From 8dd2bbfc17d4ea0f253a431e982bd711ff350952 Mon Sep 17 00:00:00 2001 From: stan Date: Wed, 4 Jul 2012 09:00:20 +0000 Subject: [PATCH] Support gnutls md5 generation git-svn-id: http://svn.zoneminder.com/svn/zm/trunk@3660 e3e1d417-86f3-4887-817a-d78f3d33393f --- configure.ac | 15 +++++++++++++-- src/zm_user.cpp | 12 +++++++++--- src/zm_user.h | 9 ++++++--- 3 files changed, 28 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index 53b0e7ae4..46030e99c 100644 --- a/configure.ac +++ b/configure.ac @@ -264,11 +264,17 @@ AC_CHECK_LIB(jpeg,jpeg_start_compress,,AC_MSG_ERROR(zm requires libjpeg.a)) AC_CHECK_LIB(pthread,pthread_create,,AC_MSG_ERROR(zm requires libpthread.a)) AC_CHECK_LIB(dl,dlsym,,AC_MSG_ERROR(zm requires libdl.a)) if test "$ZM_SSL_LIB" == "openssl"; then +AC_CHECK_HEADERS(openssl/md5.h,,AC_MSG_WARN(zm requires openssl/md5.h header to be installed for openssl),) AC_CHECK_LIB(crypto,MD5,,AC_MSG_WARN([libcrypto.a is required for authenticated streaming - use ZM_SSL_LIB option to select gnutls instead])) else -AC_CHECK_HEADERS(gcrypt.h,,AC_MSG_WARN(zm requires libgcrypt headers to be installed for gnutls),) +AC_CHECK_HEADERS(gnutls/openssl.h,AC_SUBST(ZM_HAS_GNUTLS_OPENSSL,1),AC_SUBST(ZM_HAS_GNUTLS_OPENSSL,0),) +AC_CHECK_HEADERS(gnutls/gnutls.h,AC_SUBST(ZM_HAS_GNUTLS,1),AC_SUBST(ZM_HAS_GNUTLS,0),) +if test "$ZM_HAS_GNUTLS_OPENSSL" == "0" && test "$ZM_HAS_GNUTLS" == "0"; then +AC_MSG_WARN(gnutls is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead) +fi +AC_CHECK_HEADERS(gcrypt.h,,AC_MSG_WARN(zm requires libgcrypt header to be installed for gnutls),) AC_CHECK_LIB(gcrypt,gcry_check_version,,AC_MSG_WARN([libgcrypt.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) -AC_CHECK_LIB(gnutls-openssl,MD5,,AC_MSG_WARN([gnutls-openssl.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) +AC_CHECK_LIB(gnutls,gnutls_fingerprint,,AC_MSG_WARN([libgnutls.a is required for authenticated streaming - use ZM_SSL_LIB option to select openssl instead])) fi AC_CHECK_LIB(pcre,pcre_compile,,AC_MSG_WARN(libpcre.a may be required for remote/network camera support)) AC_CHECK_LIB(z,zlibVersion) @@ -321,8 +327,13 @@ if test "$ZM_SSL_LIB" == "openssl"; then AC_CHECK_DECLS(MD5,,AC_MSG_ERROR([zm requires openssl/md5.h - use ZM_SSL_LIB option to select gnutls instead]),[#include #include ]) else +if test "$ZM_HAS_GNUTLS_OPENSSL" == "1"; then AC_CHECK_DECLS(MD5,,AC_MSG_ERROR([zm requires gnutls/openssl.h - use ZM_SSL_LIB option to select openssl instead]),[#include #include ]) +else +AC_CHECK_DECLS(gnutls_fingerprint,,AC_MSG_ERROR([zm requires gnutls/gnutls.h - use ZM_SSL_LIB option to select openssl instead]),[#include +#include ]) +fi fi AC_CHECK_DECLS(backtrace,,,[#include ]) diff --git a/src/zm_user.cpp b/src/zm_user.cpp index 8dbebaaa3..efa9ce1e3 100644 --- a/src/zm_user.cpp +++ b/src/zm_user.cpp @@ -143,7 +143,7 @@ User *zmLoadUser( const char *username, const char *password ) // Function to validate an authentication string User *zmLoadAuthUser( const char *auth, bool use_remote_addr ) { -#if HAVE_DECL_MD5 +#if HAVE_DECL_MD5 || HAVE_DECL_GNUTLS_FINGERPRINT #ifdef HAVE_GCRYPT_H // Special initialisation for libgcrypt if ( !gcry_check_version( GCRYPT_VERSION ) ) @@ -196,7 +196,8 @@ User *zmLoadAuthUser( const char *auth, bool use_remote_addr ) char auth_key[512] = ""; char auth_md5[32+1] = ""; - unsigned char md5sum[MD5_DIGEST_LENGTH]; + size_t md5len = 32; + unsigned char md5sum[md5len]; time_t now = time( 0 ); int max_tries = 2; @@ -216,9 +217,14 @@ User *zmLoadAuthUser( const char *auth, bool use_remote_addr ) now_tm->tm_year ); +#if HAVE_DECL_MD5 MD5( (unsigned char *)auth_key, strlen(auth_key), md5sum ); +#elif HAVE_DECL_GNUTLS_FINGERPRINT + gnutls_datum_t md5data = { (unsigned char *)auth_key, strlen(auth_key) }; + gnutls_fingerprint( GNUTLS_DIG_MD5, &md5data, md5sum, &md5len ); +#endif auth_md5[0] = '\0'; - for ( int j = 0; j < MD5_DIGEST_LENGTH; j++ ) + for ( int j = 0; j < md5len; j++ ) { sprintf( &auth_md5[2*j], "%02x", md5sum[j] ); } diff --git a/src/zm_user.h b/src/zm_user.h index 9a7f552a4..2061121db 100644 --- a/src/zm_user.h +++ b/src/zm_user.h @@ -23,14 +23,17 @@ #ifndef ZM_USER_H #define ZM_USER_H -#if HAVE_LIBGNUTLS_OPENSSL +#if HAVE_GNUTLS_OPENSSL_H #include +#endif +#if HAVE_GNUTLS_GNUTLS_H +#include +#endif #if HAVE_GCRYPT_H #include -#endif // HAVE_GCRYPT_H #elif HAVE_LIBCRYPTO #include -#endif // HAVE_LIBGNUTLS_OPENSSL || HAVE_LIBCRYPTO +#endif // HAVE_L || HAVE_LIBCRYPTO class User {