2 * Routines to support checksumming of bytes.
4 * Copyright (C) 1996 Andrew Tridgell
5 * Copyright (C) 1996 Paul Mackerras
6 * Copyright (C) 2004-2023 Wayne Davison
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
13 * In addition, as a special exception, the copyright holders give
14 * permission to dynamically link rsync with the OpenSSL and xxhash
15 * libraries when those libraries are being distributed in compliance
16 * with their license terms, and to distribute a dynamically linked
17 * combination of rsync and these libraries. This is also considered
18 * to be covered under the GPL's System Libraries exception.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License along
26 * with this program; if not, visit the http://fsf.org website.
33 # if XXH_VERSION_NUMBER >= 800
34 # define SUPPORT_XXH3 1
39 extern int whole_file
;
40 extern int checksum_seed
;
41 extern int protocol_version
;
42 extern int proper_seed_order
;
43 extern const char *checksum_choice
;
45 #define NNI_BUILTIN (1<<0)
46 #define NNI_EVP (1<<1)
47 #define NNI_EVP_OK (1<<2)
49 struct name_num_item valid_checksums_items
[] = {
51 { CSUM_XXH3_128
, 0, "xxh128", NULL
},
52 { CSUM_XXH3_64
, 0, "xxh3", NULL
},
55 { CSUM_XXH64
, 0, "xxh64", NULL
},
56 { CSUM_XXH64
, 0, "xxhash", NULL
},
58 { CSUM_MD5
, NNI_BUILTIN
|NNI_EVP
, "md5", NULL
},
59 { CSUM_MD4
, NNI_BUILTIN
|NNI_EVP
, "md4", NULL
},
60 #ifdef SHA_DIGEST_LENGTH
61 { CSUM_SHA1
, NNI_EVP
, "sha1", NULL
},
63 { CSUM_NONE
, 0, "none", NULL
},
67 struct name_num_obj valid_checksums
= {
68 "checksum", NULL
, 0, 0, valid_checksums_items
71 struct name_num_item valid_auth_checksums_items
[] = {
72 #ifdef SHA512_DIGEST_LENGTH
73 { CSUM_SHA512
, NNI_EVP
, "sha512", NULL
},
75 #ifdef SHA256_DIGEST_LENGTH
76 { CSUM_SHA256
, NNI_EVP
, "sha256", NULL
},
78 #ifdef SHA_DIGEST_LENGTH
79 { CSUM_SHA1
, NNI_EVP
, "sha1", NULL
},
81 { CSUM_MD5
, NNI_BUILTIN
|NNI_EVP
, "md5", NULL
},
82 { CSUM_MD4
, NNI_BUILTIN
|NNI_EVP
, "md4", NULL
},
86 struct name_num_obj valid_auth_checksums
= {
87 "daemon auth checksum", NULL
, 0, 0, valid_auth_checksums_items
90 /* These cannot make use of openssl, so they're marked just as built-in */
91 struct name_num_item implied_checksum_md4
=
92 { CSUM_MD4
, NNI_BUILTIN
, "md4", NULL
};
93 struct name_num_item implied_checksum_md5
=
94 { CSUM_MD5
, NNI_BUILTIN
, "md5", NULL
};
96 struct name_num_item
*xfer_sum_nni
; /* used for the transfer checksum2 computations */
98 struct name_num_item
*file_sum_nni
; /* used for the pre-transfer --checksum computations */
99 int file_sum_len
, file_sum_extra_cnt
;
102 const EVP_MD
*xfer_sum_evp_md
;
103 const EVP_MD
*file_sum_evp_md
;
104 EVP_MD_CTX
*ctx_evp
= NULL
;
107 static int initialized_choices
= 0;
109 struct name_num_item
*parse_csum_name(const char *name
, int len
)
111 struct name_num_item
*nni
;
116 init_checksum_choices();
118 if (!name
|| (len
== 4 && strncasecmp(name
, "auto", 4) == 0)) {
119 if (protocol_version
>= 30) {
120 if (!proper_seed_order
)
121 return &implied_checksum_md5
;
125 if (protocol_version
>= 27)
126 implied_checksum_md4
.num
= CSUM_MD4_OLD
;
127 else if (protocol_version
>= 21)
128 implied_checksum_md4
.num
= CSUM_MD4_BUSTED
;
130 implied_checksum_md4
.num
= CSUM_MD4_ARCHAIC
;
131 return &implied_checksum_md4
;
135 nni
= get_nni_by_name(&valid_checksums
, name
, len
);
138 rprintf(FERROR
, "unknown checksum name: %s\n", name
);
139 exit_cleanup(RERR_UNSUPPORTED
);
146 static const EVP_MD
*csum_evp_md(struct name_num_item
*nni
)
149 if (!(nni
->flags
& NNI_EVP
))
153 if (nni
->num
== CSUM_MD5
)
157 emd
= EVP_get_digestbyname(nni
->name
);
158 if (emd
&& !(nni
->flags
& NNI_EVP_OK
)) { /* Make sure it works before we advertise it */
159 if (!ctx_evp
&& !(ctx_evp
= EVP_MD_CTX_create()))
160 out_of_memory("csum_evp_md");
161 /* Some routines are marked as legacy and are not enabled in the openssl.cnf file.
162 * If we can't init the emd, we'll fall back to our built-in code. */
163 if (EVP_DigestInit_ex(ctx_evp
, emd
, NULL
) == 0)
166 nni
->flags
= (nni
->flags
& ~NNI_BUILTIN
) | NNI_EVP_OK
;
169 nni
->flags
&= ~NNI_EVP
;
174 void parse_checksum_choice(int final_call
)
176 if (valid_checksums
.negotiated_nni
)
177 xfer_sum_nni
= file_sum_nni
= valid_checksums
.negotiated_nni
;
179 char *cp
= checksum_choice
? strchr(checksum_choice
, ',') : NULL
;
181 xfer_sum_nni
= parse_csum_name(checksum_choice
, cp
- checksum_choice
);
182 file_sum_nni
= parse_csum_name(cp
+1, -1);
184 xfer_sum_nni
= file_sum_nni
= parse_csum_name(checksum_choice
, -1);
185 if (am_server
&& checksum_choice
)
186 validate_choice_vs_env(NSTR_CHECKSUM
, xfer_sum_nni
->num
, file_sum_nni
->num
);
188 xfer_sum_len
= csum_len_for_type(xfer_sum_nni
->num
, 0);
189 file_sum_len
= csum_len_for_type(file_sum_nni
->num
, 0);
191 xfer_sum_evp_md
= csum_evp_md(xfer_sum_nni
);
192 file_sum_evp_md
= csum_evp_md(file_sum_nni
);
195 file_sum_extra_cnt
= (file_sum_len
+ EXTRA_LEN
- 1) / EXTRA_LEN
;
197 if (xfer_sum_nni
->num
== CSUM_NONE
)
200 /* Snag the checksum name for both write_batch's option output & the following debug output. */
201 if (valid_checksums
.negotiated_nni
)
202 checksum_choice
= valid_checksums
.negotiated_nni
->name
;
203 else if (checksum_choice
== NULL
)
204 checksum_choice
= xfer_sum_nni
->name
;
206 if (final_call
&& DEBUG_GTE(NSTR
, am_server
? 3 : 1)) {
207 rprintf(FINFO
, "%s%s checksum: %s\n",
208 am_server
? "Server" : "Client",
209 valid_checksums
.negotiated_nni
? " negotiated" : "",
214 int csum_len_for_type(int cst
, BOOL flist_csum
)
219 case CSUM_MD4_ARCHAIC
:
220 /* The oldest checksum code is rather weird: the file-list code only sent
221 * 2-byte checksums, but all other checksums were full MD4 length. */
222 return flist_csum
? 2 : MD4_DIGEST_LEN
;
225 case CSUM_MD4_BUSTED
:
226 return MD4_DIGEST_LEN
;
228 return MD5_DIGEST_LEN
;
229 #ifdef SHA_DIGEST_LENGTH
231 return SHA_DIGEST_LENGTH
;
233 #ifdef SHA256_DIGEST_LENGTH
235 return SHA256_DIGEST_LENGTH
;
237 #ifdef SHA512_DIGEST_LENGTH
239 return SHA512_DIGEST_LENGTH
;
246 default: /* paranoia to prevent missing case values */
247 exit_cleanup(RERR_UNSUPPORTED
);
252 /* Returns 0 if the checksum is not canonical (i.e. it includes a seed value).
253 * Returns 1 if the public sum order matches our internal sum order.
254 * Returns -1 if the public sum order is the reverse of our internal sum order.
256 int canonical_checksum(int csum_type
)
260 case CSUM_MD4_ARCHAIC
:
262 case CSUM_MD4_BUSTED
:
274 default: /* paranoia to prevent missing case values */
275 exit_cleanup(RERR_UNSUPPORTED
);
280 #ifndef USE_ROLL_SIMD /* See simd-checksum-*.cpp. */
282 a simple 32 bit checksum that can be updated from either end
283 (inspired by Mark Adler's Adler-32 checksum)
285 uint32
get_checksum1(char *buf1
, int32 len
)
289 schar
*buf
= (schar
*)buf1
;
292 for (i
= 0; i
< (len
-4); i
+=4) {
293 s2
+= 4*(s1
+ buf
[i
]) + 3*buf
[i
+1] + 2*buf
[i
+2] + buf
[i
+3] + 10*CHAR_OFFSET
;
294 s1
+= (buf
[i
+0] + buf
[i
+1] + buf
[i
+2] + buf
[i
+3] + 4*CHAR_OFFSET
);
296 for (; i
< len
; i
++) {
297 s1
+= (buf
[i
]+CHAR_OFFSET
); s2
+= s1
;
299 return (s1
& 0xffff) + (s2
<< 16);
303 /* The "sum" buffer must be at least MAX_DIGEST_LEN bytes! */
304 void get_checksum2(char *buf
, int32 len
, char *sum
)
307 if (xfer_sum_evp_md
) {
308 static EVP_MD_CTX
*evp
= NULL
;
310 if (!evp
&& !(evp
= EVP_MD_CTX_create()))
311 out_of_memory("get_checksum2");
312 EVP_DigestInit_ex(evp
, xfer_sum_evp_md
, NULL
);
314 SIVALu(seedbuf
, 0, checksum_seed
);
315 EVP_DigestUpdate(evp
, seedbuf
, 4);
317 EVP_DigestUpdate(evp
, (uchar
*)buf
, len
);
318 EVP_DigestFinal_ex(evp
, (uchar
*)sum
, NULL
);
321 switch (xfer_sum_nni
->num
) {
322 #ifdef SUPPORT_XXHASH
324 SIVAL64(sum
, 0, XXH64(buf
, len
, checksum_seed
));
329 SIVAL64(sum
, 0, XXH3_64bits_withSeed(buf
, len
, checksum_seed
));
331 case CSUM_XXH3_128
: {
332 XXH128_hash_t digest
= XXH3_128bits_withSeed(buf
, len
, checksum_seed
);
333 SIVAL64(sum
, 0, digest
.low64
);
334 SIVAL64(sum
, 8, digest
.high64
);
342 if (proper_seed_order
) {
344 SIVALu(seedbuf
, 0, checksum_seed
);
345 md5_update(&m5
, seedbuf
, 4);
347 md5_update(&m5
, (uchar
*)buf
, len
);
349 md5_update(&m5
, (uchar
*)buf
, len
);
351 SIVALu(seedbuf
, 0, checksum_seed
);
352 md5_update(&m5
, seedbuf
, 4);
355 md5_result(&m5
, (uchar
*)sum
);
360 case CSUM_MD4_BUSTED
:
361 case CSUM_MD4_ARCHAIC
: {
372 buf1
= new_array(char, len
+4);
376 memcpy(buf1
, buf
, len
);
378 SIVAL(buf1
,len
,checksum_seed
);
382 for (i
= 0; i
+ CSUM_CHUNK
<= len
; i
+= CSUM_CHUNK
)
383 mdfour_update(&m
, (uchar
*)(buf1
+i
), CSUM_CHUNK
);
386 * Prior to version 27 an incorrect MD4 checksum was computed
387 * by failing to call mdfour_tail() for block sizes that
388 * are multiples of 64. This is fixed by calling mdfour_update()
389 * even when there are no more bytes.
391 if (len
- i
> 0 || xfer_sum_nni
->num
> CSUM_MD4_BUSTED
)
392 mdfour_update(&m
, (uchar
*)(buf1
+i
), len
-i
);
394 mdfour_result(&m
, (uchar
*)sum
);
397 default: /* paranoia to prevent missing case values */
398 exit_cleanup(RERR_UNSUPPORTED
);
402 void file_checksum(const char *fname
, const STRUCT_STAT
*st_p
, char *sum
)
404 struct map_struct
*buf
;
405 OFF_T i
, len
= st_p
->st_size
;
409 fd
= do_open(fname
, O_RDONLY
, 0);
411 memset(sum
, 0, file_sum_len
);
415 buf
= map_file(fd
, len
, MAX_MAP_SIZE
, CHUNK_SIZE
);
418 if (file_sum_evp_md
) {
419 static EVP_MD_CTX
*evp
= NULL
;
420 if (!evp
&& !(evp
= EVP_MD_CTX_create()))
421 out_of_memory("file_checksum");
423 EVP_DigestInit_ex(evp
, file_sum_evp_md
, NULL
);
425 for (i
= 0; i
+ CHUNK_SIZE
<= len
; i
+= CHUNK_SIZE
)
426 EVP_DigestUpdate(evp
, (uchar
*)map_ptr(buf
, i
, CHUNK_SIZE
), CHUNK_SIZE
);
428 remainder
= (int32
)(len
- i
);
430 EVP_DigestUpdate(evp
, (uchar
*)map_ptr(buf
, i
, remainder
), remainder
);
432 EVP_DigestFinal_ex(evp
, (uchar
*)sum
, NULL
);
435 switch (file_sum_nni
->num
) {
436 #ifdef SUPPORT_XXHASH
438 static XXH64_state_t
* state
= NULL
;
439 if (!state
&& !(state
= XXH64_createState()))
440 out_of_memory("file_checksum");
442 XXH64_reset(state
, 0);
444 for (i
= 0; i
+ CHUNK_SIZE
<= len
; i
+= CHUNK_SIZE
)
445 XXH64_update(state
, (uchar
*)map_ptr(buf
, i
, CHUNK_SIZE
), CHUNK_SIZE
);
447 remainder
= (int32
)(len
- i
);
449 XXH64_update(state
, (uchar
*)map_ptr(buf
, i
, remainder
), remainder
);
451 SIVAL64(sum
, 0, XXH64_digest(state
));
457 static XXH3_state_t
* state
= NULL
;
458 if (!state
&& !(state
= XXH3_createState()))
459 out_of_memory("file_checksum");
461 XXH3_64bits_reset(state
);
463 for (i
= 0; i
+ CHUNK_SIZE
<= len
; i
+= CHUNK_SIZE
)
464 XXH3_64bits_update(state
, (uchar
*)map_ptr(buf
, i
, CHUNK_SIZE
), CHUNK_SIZE
);
466 remainder
= (int32
)(len
- i
);
468 XXH3_64bits_update(state
, (uchar
*)map_ptr(buf
, i
, remainder
), remainder
);
470 SIVAL64(sum
, 0, XXH3_64bits_digest(state
));
473 case CSUM_XXH3_128
: {
474 XXH128_hash_t digest
;
475 static XXH3_state_t
* state
= NULL
;
476 if (!state
&& !(state
= XXH3_createState()))
477 out_of_memory("file_checksum");
479 XXH3_128bits_reset(state
);
481 for (i
= 0; i
+ CHUNK_SIZE
<= len
; i
+= CHUNK_SIZE
)
482 XXH3_128bits_update(state
, (uchar
*)map_ptr(buf
, i
, CHUNK_SIZE
), CHUNK_SIZE
);
484 remainder
= (int32
)(len
- i
);
486 XXH3_128bits_update(state
, (uchar
*)map_ptr(buf
, i
, remainder
), remainder
);
488 digest
= XXH3_128bits_digest(state
);
489 SIVAL64(sum
, 0, digest
.low64
);
490 SIVAL64(sum
, 8, digest
.high64
);
499 for (i
= 0; i
+ CHUNK_SIZE
<= len
; i
+= CHUNK_SIZE
)
500 md5_update(&m5
, (uchar
*)map_ptr(buf
, i
, CHUNK_SIZE
), CHUNK_SIZE
);
502 remainder
= (int32
)(len
- i
);
504 md5_update(&m5
, (uchar
*)map_ptr(buf
, i
, remainder
), remainder
);
506 md5_result(&m5
, (uchar
*)sum
);
511 case CSUM_MD4_BUSTED
:
512 case CSUM_MD4_ARCHAIC
: {
517 for (i
= 0; i
+ CSUM_CHUNK
<= len
; i
+= CSUM_CHUNK
)
518 mdfour_update(&m
, (uchar
*)map_ptr(buf
, i
, CSUM_CHUNK
), CSUM_CHUNK
);
520 /* Prior to version 27 an incorrect MD4 checksum was computed
521 * by failing to call mdfour_tail() for block sizes that
522 * are multiples of 64. This is fixed by calling mdfour_update()
523 * even when there are no more bytes. */
524 remainder
= (int32
)(len
- i
);
525 if (remainder
> 0 || file_sum_nni
->num
> CSUM_MD4_BUSTED
)
526 mdfour_update(&m
, (uchar
*)map_ptr(buf
, i
, remainder
), remainder
);
528 mdfour_result(&m
, (uchar
*)sum
);
532 rprintf(FERROR
, "Invalid checksum-choice for --checksum: %s (%d)\n",
533 file_sum_nni
->name
, file_sum_nni
->num
);
534 exit_cleanup(RERR_UNSUPPORTED
);
541 static int32 sumresidue
;
542 static md_context ctx_md
;
543 #ifdef SUPPORT_XXHASH
544 static XXH64_state_t
* xxh64_state
;
547 static XXH3_state_t
* xxh3_state
;
549 static struct name_num_item
*cur_sum_nni
;
553 static const EVP_MD
*cur_sum_evp_md
;
556 /* Initialize a hash digest accumulator. Data is supplied via
557 * sum_update() and the resulting binary digest is retrieved via
558 * sum_end(). This only supports one active sum at a time. */
559 int sum_init(struct name_num_item
*nni
, int seed
)
564 nni
= parse_csum_name(NULL
, 0);
566 cur_sum_len
= csum_len_for_type(nni
->num
, 0);
568 cur_sum_evp_md
= csum_evp_md(nni
);
572 if (cur_sum_evp_md
) {
573 if (!ctx_evp
&& !(ctx_evp
= EVP_MD_CTX_create()))
574 out_of_memory("file_checksum");
575 EVP_DigestInit_ex(ctx_evp
, cur_sum_evp_md
, NULL
);
578 switch (cur_sum_nni
->num
) {
579 #ifdef SUPPORT_XXHASH
581 if (!xxh64_state
&& !(xxh64_state
= XXH64_createState()))
582 out_of_memory("sum_init");
583 XXH64_reset(xxh64_state
, 0);
588 if (!xxh3_state
&& !(xxh3_state
= XXH3_createState()))
589 out_of_memory("sum_init");
590 XXH3_64bits_reset(xxh3_state
);
593 if (!xxh3_state
&& !(xxh3_state
= XXH3_createState()))
594 out_of_memory("sum_init");
595 XXH3_128bits_reset(xxh3_state
);
602 mdfour_begin(&ctx_md
);
606 case CSUM_MD4_BUSTED
:
607 case CSUM_MD4_ARCHAIC
:
608 mdfour_begin(&ctx_md
);
615 default: /* paranoia to prevent missing case values */
616 exit_cleanup(RERR_UNSUPPORTED
);
622 /* Feed data into a hash digest accumulator. */
623 void sum_update(const char *p
, int32 len
)
626 if (cur_sum_evp_md
) {
627 EVP_DigestUpdate(ctx_evp
, (uchar
*)p
, len
);
630 switch (cur_sum_nni
->num
) {
631 #ifdef SUPPORT_XXHASH
633 XXH64_update(xxh64_state
, p
, len
);
638 XXH3_64bits_update(xxh3_state
, p
, len
);
641 XXH3_128bits_update(xxh3_state
, p
, len
);
645 md5_update(&ctx_md
, (uchar
*)p
, len
);
649 case CSUM_MD4_BUSTED
:
650 case CSUM_MD4_ARCHAIC
:
651 if (len
+ sumresidue
< CSUM_CHUNK
) {
652 memcpy(ctx_md
.buffer
+ sumresidue
, p
, len
);
658 int32 i
= CSUM_CHUNK
- sumresidue
;
659 memcpy(ctx_md
.buffer
+ sumresidue
, p
, i
);
660 mdfour_update(&ctx_md
, (uchar
*)ctx_md
.buffer
, CSUM_CHUNK
);
665 while (len
>= CSUM_CHUNK
) {
666 mdfour_update(&ctx_md
, (uchar
*)p
, CSUM_CHUNK
);
673 memcpy(ctx_md
.buffer
, p
, sumresidue
);
677 default: /* paranoia to prevent missing case values */
678 exit_cleanup(RERR_UNSUPPORTED
);
682 /* The sum buffer only needs to be as long as the current checksum's digest
683 * len, not MAX_DIGEST_LEN. Note that for CSUM_MD4_ARCHAIC that is the full
684 * MD4_DIGEST_LEN even if the file-list code is going to ignore all but the
685 * first 2 bytes of it. */
686 void sum_end(char *sum
)
689 if (cur_sum_evp_md
) {
690 EVP_DigestFinal_ex(ctx_evp
, (uchar
*)sum
, NULL
);
693 switch (cur_sum_nni
->num
) {
694 #ifdef SUPPORT_XXHASH
696 SIVAL64(sum
, 0, XXH64_digest(xxh64_state
));
701 SIVAL64(sum
, 0, XXH3_64bits_digest(xxh3_state
));
703 case CSUM_XXH3_128
: {
704 XXH128_hash_t digest
= XXH3_128bits_digest(xxh3_state
);
705 SIVAL64(sum
, 0, digest
.low64
);
706 SIVAL64(sum
, 8, digest
.high64
);
711 md5_result(&ctx_md
, (uchar
*)sum
);
715 mdfour_update(&ctx_md
, (uchar
*)ctx_md
.buffer
, sumresidue
);
716 mdfour_result(&ctx_md
, (uchar
*)sum
);
718 case CSUM_MD4_BUSTED
:
719 case CSUM_MD4_ARCHAIC
:
721 mdfour_update(&ctx_md
, (uchar
*)ctx_md
.buffer
, sumresidue
);
722 mdfour_result(&ctx_md
, (uchar
*)sum
);
727 default: /* paranoia to prevent missing case values */
728 exit_cleanup(RERR_UNSUPPORTED
);
732 #if defined SUPPORT_XXH3 || defined USE_OPENSSL
733 static void verify_digest(struct name_num_item
*nni
, BOOL check_auth_list
)
736 static int xxh3_result
= 0;
739 static int prior_num
= 0, prior_flags
= 0, prior_result
= 0;
743 if (nni
->num
== CSUM_XXH3_64
|| nni
->num
== CSUM_XXH3_128
) {
747 for (j
= 0; j
< (int)sizeof buf
; j
++)
748 buf
[j
] = ' ' + (j
% 96);
750 sum_update(buf
, 32816);
751 sum_update(buf
, 31152);
752 sum_update(buf
, 32474);
753 sum_update(buf
, 9322);
754 xxh3_result
= XXH3_64bits_digest(xxh3_state
) != 0xadbcf16d4678d1de ? -1 : 1;
757 nni
->num
= CSUM_gone
;
763 if (BITS_SETnUNSET(nni
->flags
, NNI_EVP
, NNI_BUILTIN
|NNI_EVP_OK
)) {
764 if (nni
->num
== prior_num
&& nni
->flags
== prior_flags
) {
765 nni
->flags
= prior_result
;
766 if (!(nni
->flags
& NNI_EVP
))
767 nni
->num
= CSUM_gone
;
769 prior_num
= nni
->num
;
770 prior_flags
= nni
->flags
;
771 if (!csum_evp_md(nni
))
772 nni
->num
= CSUM_gone
;
773 prior_result
= nni
->flags
;
774 if (check_auth_list
&& (nni
= get_nni_by_num(&valid_auth_checksums
, prior_num
)) != NULL
)
775 verify_digest(nni
, False
);
782 void init_checksum_choices()
784 #if defined SUPPORT_XXH3 || defined USE_OPENSSL
785 struct name_num_item
*nni
;
788 if (initialized_choices
)
791 #if defined USE_OPENSSL && OPENSSL_VERSION_NUMBER < 0x10100000L
792 OpenSSL_add_all_algorithms();
795 #if defined SUPPORT_XXH3 || defined USE_OPENSSL
796 for (nni
= valid_checksums
.list
; nni
->name
; nni
++)
797 verify_digest(nni
, True
);
799 for (nni
= valid_auth_checksums
.list
; nni
->name
; nni
++)
800 verify_digest(nni
, False
);
803 initialized_choices
= 1;