Use EVP for all openssl checksums.
[rsync-patches.git] / sha1.diff
1 This patch adds sha1 to the checksum code when the openssl library is available.
2 It also enables SHA1 checksum hashing in the daemon auth code.
3
4 To use this patch, run these commands for a successful build:
5
6     patch -p1 <patches/fix-checksums.diff
7     patch -p1 <patches/sha1.diff
8     ./configure                               (optional if already run)
9     make
10
11 based-on: patch/master/fix-checksums
12 diff --git a/checksum.c b/checksum.c
13 --- a/checksum.c
14 +++ b/checksum.c
15 @@ -58,6 +58,15 @@ struct name_num_obj valid_checksums = {
16  #endif
17                 { CSUM_MD5, NNI_BUILTIN|NNI_EVP, "md5", NULL },
18                 { CSUM_MD4, NNI_BUILTIN|NNI_EVP, "md4", NULL },
19 +#ifdef SHA_DIGEST_LENGTH
20 +               { CSUM_SHA1, NNI_EVP, "sha1", NULL },
21 +#endif
22 +#ifdef SHA256_DIGEST_LENGTH
23 +               { CSUM_SHA256, NNI_EVP, "sha256", NULL },
24 +#endif
25 +#ifdef SHA512_DIGEST_LENGTH
26 +               { CSUM_SHA512, NNI_EVP, "sha512", NULL },
27 +#endif
28                 { CSUM_NONE, 0, "none", NULL },
29                 { 0, 0, NULL, NULL }
30         }
31 @@ -65,8 +74,15 @@ struct name_num_obj valid_checksums = {
32  
33  struct name_num_obj valid_auth_checksums = {
34         "daemon auth checksum", NULL, 0, 0, {
35 -               { CSUM_MD5, NNI_BUILTIN|NNI_EVP, "md5", NULL },
36 -               { CSUM_MD4, NNI_BUILTIN|NNI_EVP, "md4", NULL },
37 +#ifdef SHA512_DIGEST_LENGTH
38 +               { CSUM_SHA512, NNI_EVP, "sha512", NULL },
39 +#endif
40 +#ifdef SHA256_DIGEST_LENGTH
41 +               { CSUM_SHA256, NNI_EVP, "sha256", NULL },
42 +#endif
43 +#ifdef SHA_DIGEST_LENGTH
44 +               { CSUM_SHA1, NNI_EVP, "sha1", NULL },
45 +#endif
46                 { 0, 0, NULL, NULL }
47         }
48  };
49 @@ -207,6 +223,18 @@ int csum_len_for_type(int cst, BOOL flist_csum)
50                 return MD4_DIGEST_LEN;
51           case CSUM_MD5:
52                 return MD5_DIGEST_LEN;
53 +#ifdef SHA_DIGEST_LENGTH
54 +         case CSUM_SHA1:
55 +               return SHA_DIGEST_LENGTH;
56 +#endif
57 +#ifdef SHA256_DIGEST_LENGTH
58 +         case CSUM_SHA256:
59 +               return SHA256_DIGEST_LENGTH;
60 +#endif
61 +#ifdef SHA512_DIGEST_LENGTH
62 +         case CSUM_SHA512:
63 +               return SHA512_DIGEST_LENGTH;
64 +#endif
65           case CSUM_XXH64:
66           case CSUM_XXH3_64:
67                 return 64/8;
68 @@ -232,6 +260,9 @@ int canonical_checksum(int csum_type)
69                 break;
70           case CSUM_MD4:
71           case CSUM_MD5:
72 +         case CSUM_SHA1:
73 +         case CSUM_SHA256:
74 +         case CSUM_SHA512:
75                 return -1;
76           case CSUM_XXH64:
77           case CSUM_XXH3_64:
78 diff --git a/lib/md-defines.h b/lib/md-defines.h
79 --- a/lib/md-defines.h
80 +++ b/lib/md-defines.h
81 @@ -1,8 +1,19 @@
82  /* Keep this simple so both C and ASM can use it */
83  
84 +/*#undef SHA512_DIGEST_LENGTH*/
85 +/*#undef SHA256_DIGEST_LENGTH*/
86 +
87  #define MD4_DIGEST_LEN 16
88  #define MD5_DIGEST_LEN 16
89 +#if defined SHA512_DIGEST_LENGTH
90 +#define MAX_DIGEST_LEN SHA512_DIGEST_LENGTH
91 +#elif defined SHA256_DIGEST_LENGTH
92 +#define MAX_DIGEST_LEN SHA256_DIGEST_LENGTH
93 +#elif defined SHA_DIGEST_LENGTH
94 +#define MAX_DIGEST_LEN SHA_DIGEST_LENGTH
95 +#else
96  #define MAX_DIGEST_LEN MD5_DIGEST_LEN
97 +#endif
98  
99  #define CSUM_CHUNK 64
100  
101 @@ -16,3 +27,6 @@
102  #define CSUM_XXH64 6
103  #define CSUM_XXH3_64 7
104  #define CSUM_XXH3_128 8
105 +#define CSUM_SHA1 9
106 +#define CSUM_SHA256 10
107 +#define CSUM_SHA512 11
108 diff --git a/lib/mdigest.h b/lib/mdigest.h
109 --- a/lib/mdigest.h
110 +++ b/lib/mdigest.h
111 @@ -1,6 +1,7 @@
112  /* The include file for both the MD4 and MD5 routines. */
113  
114  #ifdef USE_OPENSSL
115 +#include <openssl/sha.h>
116  #include <openssl/evp.h>
117  #endif
118  #include "md-defines.h"
119 diff --git a/rsync.h b/rsync.h
120 --- a/rsync.h
121 +++ b/rsync.h
122 @@ -1173,7 +1173,7 @@ struct name_num_obj {
123         struct name_num_item *negotiated_nni;
124         uchar *saw;
125         int saw_len;
126 -       struct name_num_item list[10]; /* we'll get a compile error/warning if this is ever too small */
127 +       struct name_num_item list[12]; /* we'll get a compile error/warning if this is ever too small */
128  };
129  
130  #ifdef EXTERNAL_ZLIB