Optional openssl support for MD4 pre-transfer checksums (but, sadly, not transfer checksums).

This commit is contained in:
Wayne Davison committed 2020-05-23 12:30:58 -07:00
1 parent 15c1162b24
commit 1cb1edeb68
3 files changed
+59 -14

No files matched your search

+5 -5
View File
@@ -39,11 +39,11 @@ Changes since 3.1.3:
ENHANCEMENTS:
- Various checksum enhancements, including the optional use of openssl's
MD5 checksum algorithms, x86_64 optimizations for the rolling checksum,
x86_64 optimizations for the (non-openssl) MD5 checksum, the addition of
xxhash checksum support, and a simple checksum negotation heuristic that
will ensure that it is easier to add new checksum algorithms in the
future. Currently the x86_64 optimizations require the use of the
MD4 & MD5 checksum algorithms, some x86_64 optimizations for the rolling
checksum, some x86_64 optimizations for the (non-openssl) MD5 checksum,
the addition of xxhash checksum support, and a simple checksum negotation
heuristic that ensures that it is easier to add new checksum algorithms
in the future. Currently the x86_64 optimizations require the use of the
--enable-simd flag to configure, but they will probably be enabled by
default in the near future.
+52 -7
View File
@@ -31,6 +31,7 @@
#include "xxhash.h"
#endif
#ifdef USE_OPENSSL
#include "openssl/md4.h"
#include "openssl/md5.h"
#endif
@@ -121,7 +122,7 @@ static const char *checksum_name(int num)
if (num < CSUM_MD4)
return "MD4";
return "UNKNOWN";
return "UNKNOWN"; /* IMPOSSIBLE */
}
void parse_checksum_choice(int final_call)
@@ -315,6 +316,9 @@ uint32 get_checksum1(char *buf1, int32 len)
void get_checksum2(char *buf, int32 len, char *sum)
{
md_context m;
#if 0 /* #ifdef USE_OPENSSL */
MD4_CTX m4;
#endif
MD5_CTX m5;
switch (xfersum_type) {
@@ -338,6 +342,19 @@ void get_checksum2(char *buf, int32 len, char *sum)
break;
}
case CSUM_MD4:
#if 0 /* #ifdef USE_OPENSSL -- this doesn't match the old checksums. */
{
MD4_Init(&m4);
if (checksum_seed) {
uchar seedbuf[4];
SIVALu(seedbuf, 0, checksum_seed);
MD4_Update(&m4, seedbuf, 4);
}
MD4_Update(&m4, (uchar *)buf, len);
MD4_Final((uchar *)sum, &m4);
break;
}
#endif
case CSUM_MD4_OLD:
case CSUM_MD4_BUSTED:
case CSUM_MD4_ARCHAIC: {
@@ -392,6 +409,9 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
struct map_struct *buf;
OFF_T i, len = st_p->st_size;
md_context m;
#ifdef USE_OPENSSL
MD4_CTX m4;
#endif
MD5_CTX m5;
int32 remainder;
int fd;
@@ -408,10 +428,8 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
case CSUM_MD5:
MD5_Init(&m5);
for (i = 0; i + CSUM_CHUNK <= len; i += CSUM_CHUNK) {
MD5_Update(&m5, (uchar *)map_ptr(buf, i, CSUM_CHUNK),
CSUM_CHUNK);
}
for (i = 0; i + CSUM_CHUNK <= len; i += CSUM_CHUNK)
MD5_Update(&m5, (uchar *)map_ptr(buf, i, CSUM_CHUNK), CSUM_CHUNK);
remainder = (int32)(len - i);
if (remainder > 0)
@@ -420,14 +438,26 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
MD5_Final((uchar *)sum, &m5);
break;
case CSUM_MD4:
#ifdef USE_OPENSSL
MD4_Init(&m4);
for (i = 0; i + CSUM_CHUNK <= len; i += CSUM_CHUNK)
MD4_Update(&m4, (uchar *)map_ptr(buf, i, CSUM_CHUNK), CSUM_CHUNK);
remainder = (int32)(len - i);
if (remainder > 0)
MD4_Update(&m4, (uchar *)map_ptr(buf, i, remainder), remainder);
MD4_Final((uchar *)sum, &m4);
break;
#endif
case CSUM_MD4_OLD:
case CSUM_MD4_BUSTED:
case CSUM_MD4_ARCHAIC:
mdfour_begin(&m);
for (i = 0; i + CSUM_CHUNK <= len; i += CSUM_CHUNK) {
for (i = 0; i + CSUM_CHUNK <= len; i += CSUM_CHUNK)
mdfour_update(&m, (uchar *)map_ptr(buf, i, CSUM_CHUNK), CSUM_CHUNK);
}
/* Prior to version 27 an incorrect MD4 checksum was computed
* by failing to call mdfour_tail() for block sizes that
@@ -478,6 +508,9 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
static int32 sumresidue;
static md_context md;
#ifdef USE_OPENSSL
static MD4_CTX m4;
#endif
static MD5_CTX m5;
static int cursum_type;
#ifdef SUPPORT_XXHASH
@@ -497,8 +530,12 @@ void sum_init(int csum_type, int seed)
MD5_Init(&m5);
break;
case CSUM_MD4:
#ifdef USE_OPENSSL
MD4_Init(&m4);
#else
mdfour_begin(&md);
sumresidue = 0;
#endif
break;
case CSUM_MD4_OLD:
case CSUM_MD4_BUSTED:
@@ -543,6 +580,10 @@ void sum_update(const char *p, int32 len)
MD5_Update(&m5, (uchar *)p, len);
break;
case CSUM_MD4:
#ifdef USE_OPENSSL
MD4_Update(&m4, (uchar *)p, len);
break;
#endif
case CSUM_MD4_OLD:
case CSUM_MD4_BUSTED:
case CSUM_MD4_ARCHAIC:
@@ -596,6 +637,10 @@ int sum_end(char *sum)
MD5_Final((uchar *)sum, &m5);
break;
case CSUM_MD4:
#ifdef USE_OPENSSL
MD4_Final((uchar *)sum, &m4);
break;
#endif
case CSUM_MD4_OLD:
mdfour_update(&md, (uchar *)md.buffer, sumresidue);
mdfour_result(&md, (uchar *)sum);
+2 -2
View File
@@ -381,7 +381,7 @@ AC_CHECK_HEADERS(sys/fcntl.h sys/select.h fcntl.h sys/time.h sys/unistd.h \
netdb.h malloc.h float.h limits.h iconv.h libcharset.h langinfo.h \
sys/acl.h acl/libacl.h attr/xattr.h sys/xattr.h sys/extattr.h \
popt.h popt/popt.h linux/falloc.h netinet/in_systm.h netinet/ip.h \
zlib.h xxhash.h openssl/md5.h)
zlib.h xxhash.h openssl/md4.h openssl/md5.h)
AC_HEADER_MAJOR_FIXED
AC_MSG_CHECKING([whether to enable use of openssl crypto library])
@@ -389,7 +389,7 @@ AC_ARG_ENABLE([openssl],
AS_HELP_STRING([--disable-openssl],[disable openssl crypto library]))
AH_TEMPLATE([USE_OPENSSL],
[Undefine if you do not want to use openssl crypto library. By default this is defined.])
if test x"$enable_openssl" != x"no" && test x"$ac_cv_header_openssl_md5_h" = x"yes"; then
if test x"$enable_openssl" != x"no" && test x"$ac_cv_header_openssl_md4_h" = x"yes" && test x"$ac_cv_header_openssl_md5_h" = x"yes"; then
AC_MSG_RESULT(yes)
AC_SEARCH_LIBS(MD5_Init, crypto)
AC_DEFINE(USE_OPENSSL)