xref: /freebsd/contrib/libarchive/libarchive/archive_digest_private.h (revision 2e113ef82465598b8c26e0ca415fbe90677fbd47)
1 /*-
2 * Copyright (c) 2003-2007 Tim Kientzle
3 * Copyright (c) 2011 Andres Mejia
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26 
27 #ifndef ARCHIVE_DIGEST_PRIVATE_H_INCLUDED
28 #define ARCHIVE_DIGEST_PRIVATE_H_INCLUDED
29 
30 #ifndef __LIBARCHIVE_BUILD
31 #error This header is only to be used internally to libarchive.
32 #endif
33 #ifndef __LIBARCHIVE_CONFIG_H_INCLUDED
34 #error "Should have include config.h first!"
35 #endif
36 
37 /*
38  * Crypto support in various Operating Systems:
39  *
40  * NetBSD:
41  * - MD5 and SHA1 in libc: without _ after algorithm name
42  * - SHA2 in libc: with _ after algorithm name
43  *
44  * OpenBSD:
45  * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name
46  * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name
47  *
48  * DragonFly and FreeBSD:
49  * - MD5 libmd: without _ after algorithm name
50  * - SHA1, SHA256 and SHA512 in libmd: with _ after algorithm name
51  *
52  * Mac OS X (10.4 and later):
53  * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
54  *
55  * OpenSSL:
56  * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
57  *
58  * Windows:
59  * - MD5, SHA1 and SHA2 in archive_crypto.c using Windows crypto API
60  */
61 
62 /* libc crypto headers */
63 #if defined(ARCHIVE_CRYPTO_MD5_LIBC)
64 #include <md5.h>
65 #endif
66 #if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
67 #include <rmd160.h>
68 #endif
69 #if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
70 #include <sha1.h>
71 #endif
72 #if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
73   defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
74   defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
75   defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
76   defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
77   defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
78   defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
79   defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
80   defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
81 #include <sha2.h>
82 #endif
83 
84 /* libmd crypto headers */
85 #if defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||\
86   defined(ARCHIVE_CRYPTO_RMD160_LIBMD) ||\
87   defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||\
88   defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
89   defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
90 #define	ARCHIVE_CRYPTO_LIBMD 1
91 #endif
92 
93 #if defined(ARCHIVE_CRYPTO_MD5_LIBMD)
94 #include <md5.h>
95 #endif
96 #if defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
97 #include <ripemd.h>
98 #endif
99 #if defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
100 #include <sha.h>
101 #endif
102 #if defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
103 #include <sha256.h>
104 #endif
105 #if defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
106 #include <sha512.h>
107 #endif
108 
109 /* libSystem crypto headers */
110 #if defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
111   defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
112   defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
113   defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
114   defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
115 #include <CommonCrypto/CommonDigest.h>
116 #define	ARCHIVE_CRYPTO_CommonCrypto 1
117 #endif
118 
119 /* mbed TLS crypto headers */
120 #if defined(ARCHIVE_CRYPTO_MD5_MBEDTLS)
121 #include <mbedtls/md5.h>
122 #endif
123 #if defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS)
124 #include <mbedtls/ripemd160.h>
125 #endif
126 #if defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS)
127 #include <mbedtls/sha1.h>
128 #endif
129 #if defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS)
130 #include <mbedtls/sha256.h>
131 #endif
132 #if defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS) ||\
133   defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS)
134 #include <mbedtls/sha512.h>
135 #endif
136 
137 /* Nettle crypto headers */
138 #if defined(ARCHIVE_CRYPTO_MD5_NETTLE)
139 #include <nettle/md5.h>
140 #endif
141 #if defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
142 #include <nettle/ripemd160.h>
143 #endif
144 #if defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
145   defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
146   defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
147   defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
148 #include <nettle/sha.h>
149 #endif
150 
151 /* OpenSSL crypto headers */
152 #if defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
153   defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) ||\
154   defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
155   defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
156   defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
157   defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
158 #define	ARCHIVE_CRYPTO_OPENSSL 1
159 #include "archive_openssl_evp_private.h"
160 #endif
161 
162 /* Windows crypto headers */
163 #if defined(ARCHIVE_CRYPTO_MD5_WIN)    ||\
164   defined(ARCHIVE_CRYPTO_SHA1_WIN)   ||\
165   defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
166   defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
167   defined(ARCHIVE_CRYPTO_SHA512_WIN)
168 #if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA
169 /* don't use bcrypt when XP needs to be supported */
170 #include <bcrypt.h>
171 #define	ARCHIVE_CRYPTO_CNG 1
172 typedef struct {
173   int   valid;
174   BCRYPT_ALG_HANDLE  hAlg;
175   BCRYPT_HASH_HANDLE hHash;
176 } Digest_CTX;
177 #else
178 #include <windows.h>
179 #include <wincrypt.h>
180 #define	ARCHIVE_CRYPTO_WINCRYPT 1
181 typedef struct {
182   int   valid;
183   HCRYPTPROV  cryptProv;
184   HCRYPTHASH  hash;
185 } Digest_CTX;
186 #endif
187 #endif
188 
189 /* typedefs */
190 #if defined(ARCHIVE_CRYPTO_MD5_LIBC)
191 typedef MD5_CTX archive_md5_ctx;
192 #elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
193 typedef MD5_CTX archive_md5_ctx;
194 #elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
195 typedef CC_MD5_CTX archive_md5_ctx;
196 #elif defined(ARCHIVE_CRYPTO_MD5_WIN)
197 typedef Digest_CTX archive_md5_ctx;
198 #elif defined(ARCHIVE_CRYPTO_MD5_MBEDTLS)
199 #define	ARCHIVE_CRYPTO_MBED 1
200 typedef mbedtls_md5_context archive_md5_ctx;
201 #elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
202 #define	ARCHIVE_CRYPTO_NETTLE 1
203 typedef struct md5_ctx archive_md5_ctx;
204 #elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
205 typedef EVP_MD_CTX *archive_md5_ctx;
206 #else
207 typedef unsigned char archive_md5_ctx;
208 #endif
209 
210 #if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
211 typedef RMD160_CTX archive_rmd160_ctx;
212 #elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
213 typedef RIPEMD160_CTX archive_rmd160_ctx;
214 #elif defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS)
215 #define	ARCHIVE_CRYPTO_MBED 1
216 typedef mbedtls_ripemd160_context archive_rmd160_ctx;
217 #elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
218 #define	ARCHIVE_CRYPTO_NETTLE 1
219 typedef struct ripemd160_ctx archive_rmd160_ctx;
220 #elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
221 typedef EVP_MD_CTX *archive_rmd160_ctx;
222 #else
223 typedef unsigned char archive_rmd160_ctx;
224 #endif
225 
226 #if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
227 typedef SHA1_CTX archive_sha1_ctx;
228 #elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
229 typedef SHA1_CTX archive_sha1_ctx;
230 #elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
231 typedef CC_SHA1_CTX archive_sha1_ctx;
232 #elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
233 typedef Digest_CTX archive_sha1_ctx;
234 #elif defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS)
235 #define	ARCHIVE_CRYPTO_MBED 1
236 typedef mbedtls_sha1_context archive_sha1_ctx;
237 #elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
238 #define	ARCHIVE_CRYPTO_NETTLE 1
239 typedef struct sha1_ctx archive_sha1_ctx;
240 #elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
241 typedef EVP_MD_CTX *archive_sha1_ctx;
242 #else
243 typedef unsigned char archive_sha1_ctx;
244 #endif
245 
246 #if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
247 typedef SHA256_CTX archive_sha256_ctx;
248 #elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
249 typedef SHA256_CTX archive_sha256_ctx;
250 #elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
251 typedef SHA2_CTX archive_sha256_ctx;
252 #elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
253 typedef SHA256_CTX archive_sha256_ctx;
254 #elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
255 typedef CC_SHA256_CTX archive_sha256_ctx;
256 #elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
257 typedef Digest_CTX archive_sha256_ctx;
258 #elif defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS)
259 #define	ARCHIVE_CRYPTO_MBED 1
260 typedef mbedtls_sha256_context archive_sha256_ctx;
261 #elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
262 #define	ARCHIVE_CRYPTO_NETTLE 1
263 typedef struct sha256_ctx archive_sha256_ctx;
264 #elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
265 typedef EVP_MD_CTX *archive_sha256_ctx;
266 #else
267 typedef unsigned char archive_sha256_ctx;
268 #endif
269 
270 #if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
271 typedef SHA384_CTX archive_sha384_ctx;
272 #elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
273 typedef SHA384_CTX archive_sha384_ctx;
274 #elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
275 typedef SHA2_CTX archive_sha384_ctx;
276 #elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
277 typedef CC_SHA512_CTX archive_sha384_ctx;
278 #elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
279 typedef Digest_CTX archive_sha384_ctx;
280 #elif defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS)
281 #define	ARCHIVE_CRYPTO_MBED 1
282 typedef mbedtls_sha512_context archive_sha384_ctx;
283 #elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
284 #define	ARCHIVE_CRYPTO_NETTLE 1
285 typedef struct sha384_ctx archive_sha384_ctx;
286 #elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
287 typedef EVP_MD_CTX *archive_sha384_ctx;
288 #else
289 typedef unsigned char archive_sha384_ctx;
290 #endif
291 
292 #if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
293 typedef SHA512_CTX archive_sha512_ctx;
294 #elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
295 typedef SHA512_CTX archive_sha512_ctx;
296 #elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
297 typedef SHA2_CTX archive_sha512_ctx;
298 #elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
299 typedef SHA512_CTX archive_sha512_ctx;
300 #elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
301 typedef CC_SHA512_CTX archive_sha512_ctx;
302 #elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
303 typedef Digest_CTX archive_sha512_ctx;
304 #elif defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS)
305 #define	ARCHIVE_CRYPTO_MBED 1
306 typedef mbedtls_sha512_context archive_sha512_ctx;
307 #elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
308 #define	ARCHIVE_CRYPTO_NETTLE 1
309 typedef struct sha512_ctx archive_sha512_ctx;
310 #elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
311 typedef EVP_MD_CTX *archive_sha512_ctx;
312 #else
313 typedef unsigned char archive_sha512_ctx;
314 #endif
315 
316 /* defines */
317 #if defined(ARCHIVE_CRYPTO_MD5_LIBC) ||\
318   defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||	\
319   defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
320   defined(ARCHIVE_CRYPTO_MD5_MBEDTLS) ||\
321   defined(ARCHIVE_CRYPTO_MD5_NETTLE) ||\
322   defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
323   defined(ARCHIVE_CRYPTO_MD5_WIN)
324 #define ARCHIVE_HAS_MD5
325 #endif
326 #define archive_md5_init(ctx)\
327   __archive_digest.md5init(ctx)
328 #define archive_md5_final(ctx, md)\
329   __archive_digest.md5final(ctx, md)
330 #define archive_md5_update(ctx, buf, n)\
331   __archive_digest.md5update(ctx, buf, n)
332 
333 #if defined(ARCHIVE_CRYPTO_RMD160_LIBC) ||\
334   defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS) ||\
335   defined(ARCHIVE_CRYPTO_RMD160_NETTLE) ||\
336   defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
337 #define ARCHIVE_HAS_RMD160
338 #endif
339 #define archive_rmd160_init(ctx)\
340   __archive_digest.rmd160init(ctx)
341 #define archive_rmd160_final(ctx, md)\
342   __archive_digest.rmd160final(ctx, md)
343 #define archive_rmd160_update(ctx, buf, n)\
344   __archive_digest.rmd160update(ctx, buf, n)
345 
346 #if defined(ARCHIVE_CRYPTO_SHA1_LIBC) ||\
347   defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||	\
348   defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
349   defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS) ||\
350   defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
351   defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
352   defined(ARCHIVE_CRYPTO_SHA1_WIN)
353 #define ARCHIVE_HAS_SHA1
354 #endif
355 #define archive_sha1_init(ctx)\
356   __archive_digest.sha1init(ctx)
357 #define archive_sha1_final(ctx, md)\
358   __archive_digest.sha1final(ctx, md)
359 #define archive_sha1_update(ctx, buf, n)\
360   __archive_digest.sha1update(ctx, buf, n)
361 
362 #if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
363   defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
364   defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
365   defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
366   defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
367   defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS) ||\
368   defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
369   defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
370   defined(ARCHIVE_CRYPTO_SHA256_WIN)
371 #define ARCHIVE_HAS_SHA256
372 #endif
373 #define archive_sha256_init(ctx)\
374   __archive_digest.sha256init(ctx)
375 #define archive_sha256_final(ctx, md)\
376   __archive_digest.sha256final(ctx, md)
377 #define archive_sha256_update(ctx, buf, n)\
378   __archive_digest.sha256update(ctx, buf, n)
379 
380 #if defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
381   defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
382   defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
383   defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
384   defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS) ||\
385   defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
386   defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
387   defined(ARCHIVE_CRYPTO_SHA384_WIN)
388 #define ARCHIVE_HAS_SHA384
389 #endif
390 #define archive_sha384_init(ctx)\
391   __archive_digest.sha384init(ctx)
392 #define archive_sha384_final(ctx, md)\
393   __archive_digest.sha384final(ctx, md)
394 #define archive_sha384_update(ctx, buf, n)\
395   __archive_digest.sha384update(ctx, buf, n)
396 
397 #if defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
398   defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
399   defined(ARCHIVE_CRYPTO_SHA512_LIBC3) ||\
400   defined(ARCHIVE_CRYPTO_SHA512_LIBMD) ||\
401   defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) ||\
402   defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS) ||\
403   defined(ARCHIVE_CRYPTO_SHA512_NETTLE) ||\
404   defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) ||\
405   defined(ARCHIVE_CRYPTO_SHA512_WIN)
406 #define ARCHIVE_HAS_SHA512
407 #endif
408 #define archive_sha512_init(ctx)\
409   __archive_digest.sha512init(ctx)
410 #define archive_sha512_final(ctx, md)\
411   __archive_digest.sha512final(ctx, md)
412 #define archive_sha512_update(ctx, buf, n)\
413   __archive_digest.sha512update(ctx, buf, n)
414 
415 /* Minimal interface to digest functionality for internal use in libarchive */
416 struct archive_digest
417 {
418   /* Message Digest */
419   int (*md5init)(archive_md5_ctx *ctx);
420   int (*md5update)(archive_md5_ctx *, const void *, size_t);
421   int (*md5final)(archive_md5_ctx *, void *);
422   int (*rmd160init)(archive_rmd160_ctx *);
423   int (*rmd160update)(archive_rmd160_ctx *, const void *, size_t);
424   int (*rmd160final)(archive_rmd160_ctx *, void *);
425   int (*sha1init)(archive_sha1_ctx *);
426   int (*sha1update)(archive_sha1_ctx *, const void *, size_t);
427   int (*sha1final)(archive_sha1_ctx *, void *);
428   int (*sha256init)(archive_sha256_ctx *);
429   int (*sha256update)(archive_sha256_ctx *, const void *, size_t);
430   int (*sha256final)(archive_sha256_ctx *, void *);
431   int (*sha384init)(archive_sha384_ctx *);
432   int (*sha384update)(archive_sha384_ctx *, const void *, size_t);
433   int (*sha384final)(archive_sha384_ctx *, void *);
434   int (*sha512init)(archive_sha512_ctx *);
435   int (*sha512update)(archive_sha512_ctx *, const void *, size_t);
436   int (*sha512final)(archive_sha512_ctx *, void *);
437 };
438 
439 extern const struct archive_digest __archive_digest;
440 
441 #endif
442