[SCM] The rsync repository. - branch master updated
Rsync CVS commit messages
rsync-cvs at lists.samba.org
Sat May 23 17:08:33 UTC 2020
The branch, master has been updated
via 15c1162b Add optional use of the openssl crypto lib for MD5.
from a7175ee0 Mention a few more news items.
https://git.samba.org/?p=rsync.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 15c1162b24f51b29cbd534b2e8f732e06995ef89
Author: Wayne Davison <wayne at opencoder.net>
Date: Sat May 23 09:23:01 2020 -0700
Add optional use of the openssl crypto lib for MD5.
-----------------------------------------------------------------------
Summary of changes:
NEWS | 9 +++++----
checksum.c | 46 +++++++++++++++++++++++++++++++++-------------
configure.ac | 28 +++++++++++++++++++++-------
lib/md5.c | 6 ++++--
lib/mdfour.c | 3 ++-
lib/mdigest.h | 6 ++----
6 files changed, 67 insertions(+), 31 deletions(-)
Changeset truncated at 500 lines:
diff --git a/NEWS b/NEWS
index edf59452..59999509 100644
--- a/NEWS
+++ b/NEWS
@@ -38,10 +38,11 @@ Changes since 3.1.3:
ENHANCEMENTS:
- - Various checksum enhancements, including x86_64 optimizations for the
- rolling checksum, optimizations for the MD5 checksums, the addition of
- xxhash checksums, and a simple checksum negotation heuristic that will
- ensure that it is easier to add improved checksum algorithms in the
+ - 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
--enable-simd flag to configure, but they will probably be enabled by
default in the near future.
diff --git a/checksum.c b/checksum.c
index a21222d4..7c4c855c 100644
--- a/checksum.c
+++ b/checksum.c
@@ -10,6 +10,13 @@
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
+ * In addition, as a special exception, the copyright holders give
+ * permission to dynamically link rsync with the OpenSSL and xxhash
+ * libraries when those libraries are being distributed in compliance
+ * with their license terms, and to distribute a dynamically linked
+ * combination of rsync and these libraries. This is also considered
+ * to be covered under the GPL's System Libraries exception.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
@@ -23,6 +30,9 @@
#ifdef SUPPORT_XXHASH
#include "xxhash.h"
#endif
+#ifdef USE_OPENSSL
+#include "openssl/md5.h"
+#endif
extern int am_server;
extern int local_server;
@@ -58,6 +68,13 @@ struct csum_struct {
#define MAX_CHECKSUM_LIST 1024
+#ifndef USE_OPENSSL
+#define MD5_CTX md_context
+#define MD5_Init md5_begin
+#define MD5_Update md5_update
+#define MD5_Final(digest, cptr) md5_result(cptr, digest)
+#endif
+
int xfersum_type = 0; /* used for the file transfer checksums */
int checksum_type = 0; /* used for the pre-transfer (--checksum) checksums */
const char *negotiated_csum_name = NULL;
@@ -298,25 +315,26 @@ uint32 get_checksum1(char *buf1, int32 len)
void get_checksum2(char *buf, int32 len, char *sum)
{
md_context m;
+ MD5_CTX m5;
switch (xfersum_type) {
case CSUM_MD5: {
uchar seedbuf[4];
- md5_begin(&m);
+ MD5_Init(&m5);
if (proper_seed_order) {
if (checksum_seed) {
SIVALu(seedbuf, 0, checksum_seed);
- md5_update(&m, seedbuf, 4);
+ MD5_Update(&m5, seedbuf, 4);
}
- md5_update(&m, (uchar *)buf, len);
+ MD5_Update(&m5, (uchar *)buf, len);
} else {
- md5_update(&m, (uchar *)buf, len);
+ MD5_Update(&m5, (uchar *)buf, len);
if (checksum_seed) {
SIVALu(seedbuf, 0, checksum_seed);
- md5_update(&m, seedbuf, 4);
+ MD5_Update(&m5, seedbuf, 4);
}
}
- md5_result(&m, (uchar *)sum);
+ MD5_Final((uchar *)sum, &m5);
break;
}
case CSUM_MD4:
@@ -374,6 +392,7 @@ 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;
+ MD5_CTX m5;
int32 remainder;
int fd;
@@ -387,18 +406,18 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
switch (checksum_type) {
case CSUM_MD5:
- md5_begin(&m);
+ MD5_Init(&m5);
for (i = 0; i + CSUM_CHUNK <= len; i += CSUM_CHUNK) {
- md5_update(&m, (uchar *)map_ptr(buf, i, CSUM_CHUNK),
+ MD5_Update(&m5, (uchar *)map_ptr(buf, i, CSUM_CHUNK),
CSUM_CHUNK);
}
remainder = (int32)(len - i);
if (remainder > 0)
- md5_update(&m, (uchar *)map_ptr(buf, i, remainder), remainder);
+ MD5_Update(&m5, (uchar *)map_ptr(buf, i, remainder), remainder);
- md5_result(&m, (uchar *)sum);
+ MD5_Final((uchar *)sum, &m5);
break;
case CSUM_MD4:
case CSUM_MD4_OLD:
@@ -459,6 +478,7 @@ void file_checksum(const char *fname, const STRUCT_STAT *st_p, char *sum)
static int32 sumresidue;
static md_context md;
+static MD5_CTX m5;
static int cursum_type;
#ifdef SUPPORT_XXHASH
XXH64_state_t* xxh64_state = NULL;
@@ -474,7 +494,7 @@ void sum_init(int csum_type, int seed)
switch (csum_type) {
case CSUM_MD5:
- md5_begin(&md);
+ MD5_Init(&m5);
break;
case CSUM_MD4:
mdfour_begin(&md);
@@ -520,7 +540,7 @@ void sum_update(const char *p, int32 len)
{
switch (cursum_type) {
case CSUM_MD5:
- md5_update(&md, (uchar *)p, len);
+ MD5_Update(&m5, (uchar *)p, len);
break;
case CSUM_MD4:
case CSUM_MD4_OLD:
@@ -573,7 +593,7 @@ int sum_end(char *sum)
{
switch (cursum_type) {
case CSUM_MD5:
- md5_result(&md, (uchar *)sum);
+ MD5_Final((uchar *)sum, &m5);
break;
case CSUM_MD4:
case CSUM_MD4_OLD:
diff --git a/configure.ac b/configure.ac
index 394f5b52..77b18278 100644
--- a/configure.ac
+++ b/configure.ac
@@ -381,19 +381,33 @@ 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)
+ zlib.h xxhash.h openssl/md5.h)
AC_HEADER_MAJOR_FIXED
-dnl Do you want to disable use of xxhash checksums
+AC_MSG_CHECKING([whether to enable use of openssl crypto library])
+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
+ AC_MSG_RESULT(yes)
+ AC_SEARCH_LIBS(MD5_Init, crypto)
+ AC_DEFINE(USE_OPENSSL)
+else
+ AC_MSG_RESULT(no)
+fi
+
+AC_MSG_CHECKING([whether to enable the xxhash support])
AC_ARG_ENABLE([xxhash],
AS_HELP_STRING([--disable-xxhash],[disable xxhash checksums]))
AH_TEMPLATE([SUPPORT_XXHASH],
[Undefine if you do not want xxhash checksums. By default this is defined.])
-if test x"$enable_xxhash" != x"no"; then
- if test x"$ac_cv_header_xxhash_h" = x"yes"; then
- AC_SEARCH_LIBS(XXH64_createState, xxhash)
- AC_DEFINE(SUPPORT_XXHASH)
- fi
+if test x"$enable_xxhash" != x"no" && test x"$ac_cv_header_xxhash_h" = x"yes"; then
+ AC_MSG_RESULT(yes)
+ AC_SEARCH_LIBS(XXH64_createState, xxhash)
+ AC_DEFINE(SUPPORT_XXHASH)
+else
+ AC_MSG_RESULT(no)
fi
AC_CACHE_CHECK([if makedev takes 3 args],rsync_cv_MAKEDEV_TAKES_3_ARGS,[
diff --git a/lib/md5.c b/lib/md5.c
index d697b9b3..a2eebdb0 100644
--- a/lib/md5.c
+++ b/lib/md5.c
@@ -20,6 +20,7 @@
#include "rsync.h"
+#ifndef USE_OPENSSL
void md5_begin(md_context *ctx)
{
ctx->A = 0x67452301;
@@ -220,6 +221,9 @@ void md5_result(md_context *ctx, uchar digest[MD5_DIGEST_LEN])
SIVALu(digest, 8, ctx->C);
SIVALu(digest, 12, ctx->D);
}
+#endif
+
+#ifdef TEST_MD5
void get_md5(uchar *out, const uchar *input, int n)
{
@@ -229,8 +233,6 @@ void get_md5(uchar *out, const uchar *input, int n)
md5_result(&ctx, out);
}
-#ifdef TEST_MD5
-
#include <stdlib.h>
#include <stdio.h>
diff --git a/lib/mdfour.c b/lib/mdfour.c
index 399da83e..70a8ba34 100644
--- a/lib/mdfour.c
+++ b/lib/mdfour.c
@@ -193,6 +193,8 @@ void mdfour_result(md_context *md, uchar digest[MD4_DIGEST_LEN])
copy4(digest+12, m->D);
}
+#ifdef TEST_MDFOUR
+
void mdfour(uchar digest[MD4_DIGEST_LEN], uchar *in, int length)
{
md_context md;
@@ -201,7 +203,6 @@ void mdfour(uchar digest[MD4_DIGEST_LEN], uchar *in, int length)
mdfour_result(&md, digest);
}
-#ifdef TEST_MDFOUR
int protocol_version = 28;
static void file_checksum1(char *fname)
diff --git a/lib/mdigest.h b/lib/mdigest.h
index e0e33ed3..86c1140f 100644
--- a/lib/mdigest.h
+++ b/lib/mdigest.h
@@ -17,10 +17,8 @@ void mdfour_begin(md_context *md);
void mdfour_update(md_context *md, const uchar *in, uint32 length);
void mdfour_result(md_context *md, uchar digest[MD4_DIGEST_LEN]);
-void get_mdfour(uchar digest[MD4_DIGEST_LEN], const uchar *in, int length);
-
+#ifndef USE_OPENSSL
void md5_begin(md_context *ctx);
void md5_update(md_context *ctx, const uchar *input, uint32 length);
void md5_result(md_context *ctx, uchar digest[MD5_DIGEST_LEN]);
-
-void get_md5(uchar digest[MD5_DIGEST_LEN], const uchar *input, int n);
+#endif
--
The rsync repository.
More information about the rsync-cvs
mailing list