1231200Smm/*-
2231200Smm* Copyright (c) 2003-2007 Tim Kientzle
3231200Smm* Copyright (c) 2011 Andres Mejia
4231200Smm* All rights reserved.
5231200Smm*
6231200Smm* Redistribution and use in source and binary forms, with or without
7231200Smm* modification, are permitted provided that the following conditions
8231200Smm* are met:
9231200Smm* 1. Redistributions of source code must retain the above copyright
10231200Smm*    notice, this list of conditions and the following disclaimer.
11231200Smm* 2. Redistributions in binary form must reproduce the above copyright
12231200Smm*    notice, this list of conditions and the following disclaimer in the
13231200Smm*    documentation and/or other materials provided with the distribution.
14231200Smm*
15231200Smm* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16231200Smm* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17231200Smm* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18231200Smm* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19231200Smm* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20231200Smm* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21231200Smm* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22231200Smm* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23231200Smm* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24231200Smm* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25231200Smm*/
26231200Smm
27231200Smm#ifndef __LIBARCHIVE_BUILD
28231200Smm#error This header is only to be used internally to libarchive.
29231200Smm#endif
30231200Smm
31231200Smm#ifndef ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
32231200Smm#define ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
33231200Smm
34231200Smm/*
35231200Smm * Crypto support in various Operating Systems:
36231200Smm *
37231200Smm * NetBSD:
38231200Smm * - MD5 and SHA1 in libc: without _ after algorithm name
39231200Smm * - SHA2 in libc: with _ after algorithm name
40231200Smm *
41231200Smm * OpenBSD:
42231200Smm * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name
43231200Smm * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name
44231200Smm *
45231200Smm * DragonFly and FreeBSD:
46231200Smm * - MD5 libmd: without _ after algorithm name
47231200Smm * - SHA1, SHA256 and SHA512 in libmd: with _ after algorithm name
48231200Smm *
49231200Smm * Mac OS X (10.4 and later):
50231200Smm * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
51231200Smm *
52231200Smm * OpenSSL:
53231200Smm * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
54231200Smm *
55231200Smm * Windows:
56231200Smm * - MD5, SHA1 and SHA2 in archive_crypto.c using Windows crypto API
57231200Smm */
58231200Smm
59231200Smm/* libc crypto headers */
60231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
61231200Smm#include <md5.h>
62231200Smm#endif
63231200Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
64231200Smm#include <rmd160.h>
65231200Smm#endif
66231200Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
67231200Smm#include <sha1.h>
68231200Smm#endif
69231200Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
70231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
71231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
72231200Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
73231200Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
74231200Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
75231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
76231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
77231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
78231200Smm#include <sha2.h>
79231200Smm#endif
80231200Smm
81231200Smm/* libmd crypto headers */
82231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||\
83231200Smm  defined(ARCHIVE_CRYPTO_RMD160_LIBMD) ||\
84231200Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||\
85231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
86231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
87231200Smm#define	ARCHIVE_CRYPTO_LIBMD 1
88231200Smm#endif
89231200Smm
90231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBMD)
91231200Smm#include <md5.h>
92231200Smm#endif
93231200Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
94231200Smm#include <ripemd.h>
95231200Smm#endif
96231200Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
97231200Smm#include <sha.h>
98231200Smm#endif
99231200Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
100231200Smm#include <sha256.h>
101231200Smm#endif
102231200Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
103231200Smm#include <sha512.h>
104231200Smm#endif
105231200Smm
106231200Smm/* libSystem crypto headers */
107231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
108231200Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
109231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
110231200Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
111231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
112231200Smm#include <CommonCrypto/CommonDigest.h>
113231200Smm#endif
114231200Smm
115231200Smm/* Nettle crypto headers */
116231200Smm#if defined(ARCHIVE_CRYPTO_MD5_NETTLE)
117231200Smm#include <nettle/md5.h>
118231200Smm#endif
119231200Smm#if defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
120231200Smm#include <nettle/ripemd160.h>
121231200Smm#endif
122231200Smm#if defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
123231200Smm  defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
124231200Smm  defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
125231200Smm  defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
126231200Smm#include <nettle/sha.h>
127231200Smm#endif
128231200Smm
129231200Smm/* OpenSSL crypto headers */
130231200Smm#if defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
131231200Smm  defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) ||\
132231200Smm  defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
133231200Smm  defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
134231200Smm  defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
135231200Smm  defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
136231200Smm#define	ARCHIVE_CRYPTO_OPENSSL 1
137231200Smm#include <openssl/evp.h>
138231200Smm#endif
139231200Smm
140231200Smm/* Windows crypto headers */
141231200Smm#if defined(ARCHIVE_CRYPTO_MD5_WIN)    ||\
142231200Smm  defined(ARCHIVE_CRYPTO_SHA1_WIN)   ||\
143231200Smm  defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
144231200Smm  defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
145231200Smm  defined(ARCHIVE_CRYPTO_SHA512_WIN)
146231200Smm#include <wincrypt.h>
147231200Smmtypedef struct {
148231200Smm  int   valid;
149231200Smm  HCRYPTPROV  cryptProv;
150231200Smm  HCRYPTHASH  hash;
151231200Smm} Digest_CTX;
152231200Smm#endif
153231200Smm
154231200Smm/* typedefs */
155231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
156231200Smmtypedef MD5_CTX archive_md5_ctx;
157231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
158231200Smmtypedef MD5_CTX archive_md5_ctx;
159231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
160231200Smmtypedef CC_MD5_CTX archive_md5_ctx;
161231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
162231200Smmtypedef struct md5_ctx archive_md5_ctx;
163231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
164231200Smmtypedef EVP_MD_CTX archive_md5_ctx;
165231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
166231200Smmtypedef Digest_CTX archive_md5_ctx;
167231200Smm#else
168231200Smmtypedef unsigned char archive_md5_ctx;
169231200Smm#endif
170231200Smm
171231200Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
172231200Smmtypedef RMD160_CTX archive_rmd160_ctx;
173231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
174231200Smmtypedef RIPEMD160_CTX archive_rmd160_ctx;
175231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
176231200Smmtypedef struct ripemd160_ctx archive_rmd160_ctx;
177231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
178231200Smmtypedef EVP_MD_CTX archive_rmd160_ctx;
179231200Smm#else
180231200Smmtypedef unsigned char archive_rmd160_ctx;
181231200Smm#endif
182231200Smm
183231200Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
184231200Smmtypedef SHA1_CTX archive_sha1_ctx;
185231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
186231200Smmtypedef SHA1_CTX archive_sha1_ctx;
187231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
188231200Smmtypedef CC_SHA1_CTX archive_sha1_ctx;
189231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
190231200Smmtypedef struct sha1_ctx archive_sha1_ctx;
191231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
192231200Smmtypedef EVP_MD_CTX archive_sha1_ctx;
193231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
194231200Smmtypedef Digest_CTX archive_sha1_ctx;
195231200Smm#else
196231200Smmtypedef unsigned char archive_sha1_ctx;
197231200Smm#endif
198231200Smm
199231200Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
200231200Smmtypedef SHA256_CTX archive_sha256_ctx;
201231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
202231200Smmtypedef SHA256_CTX archive_sha256_ctx;
203231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
204231200Smmtypedef SHA2_CTX archive_sha256_ctx;
205231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
206231200Smmtypedef SHA256_CTX archive_sha256_ctx;
207231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
208231200Smmtypedef CC_SHA256_CTX archive_sha256_ctx;
209231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
210231200Smmtypedef struct sha256_ctx archive_sha256_ctx;
211231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
212231200Smmtypedef EVP_MD_CTX archive_sha256_ctx;
213231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
214231200Smmtypedef Digest_CTX archive_sha256_ctx;
215231200Smm#else
216231200Smmtypedef unsigned char archive_sha256_ctx;
217231200Smm#endif
218231200Smm
219231200Smm#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
220231200Smmtypedef SHA384_CTX archive_sha384_ctx;
221231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
222231200Smmtypedef SHA384_CTX archive_sha384_ctx;
223231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
224231200Smmtypedef SHA2_CTX archive_sha384_ctx;
225231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
226231200Smmtypedef CC_SHA512_CTX archive_sha384_ctx;
227231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
228231200Smmtypedef struct sha384_ctx archive_sha384_ctx;
229231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
230231200Smmtypedef EVP_MD_CTX archive_sha384_ctx;
231231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
232231200Smmtypedef Digest_CTX archive_sha384_ctx;
233231200Smm#else
234231200Smmtypedef unsigned char archive_sha384_ctx;
235231200Smm#endif
236231200Smm
237231200Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
238231200Smmtypedef SHA512_CTX archive_sha512_ctx;
239231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
240231200Smmtypedef SHA512_CTX archive_sha512_ctx;
241231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
242231200Smmtypedef SHA2_CTX archive_sha512_ctx;
243231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
244231200Smmtypedef SHA512_CTX archive_sha512_ctx;
245231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
246231200Smmtypedef CC_SHA512_CTX archive_sha512_ctx;
247231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
248231200Smmtypedef struct sha512_ctx archive_sha512_ctx;
249231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
250231200Smmtypedef EVP_MD_CTX archive_sha512_ctx;
251231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
252231200Smmtypedef Digest_CTX archive_sha512_ctx;
253231200Smm#else
254231200Smmtypedef unsigned char archive_sha512_ctx;
255231200Smm#endif
256231200Smm
257231200Smm/* defines */
258231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC) ||\
259231200Smm  defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||	\
260231200Smm  defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
261231200Smm  defined(ARCHIVE_CRYPTO_MD5_NETTLE) ||\
262231200Smm  defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
263231200Smm  defined(ARCHIVE_CRYPTO_MD5_WIN)
264231200Smm#define ARCHIVE_HAS_MD5
265231200Smm#endif
266231200Smm#define archive_md5_init(ctx)\
267231200Smm  __archive_crypto.md5init(ctx)
268231200Smm#define archive_md5_final(ctx, md)\
269231200Smm  __archive_crypto.md5final(ctx, md)
270231200Smm#define archive_md5_update(ctx, buf, n)\
271231200Smm  __archive_crypto.md5update(ctx, buf, n)
272231200Smm
273231200Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC) ||\
274231200Smm  defined(ARCHIVE_CRYPTO_RMD160_NETTLE) ||\
275231200Smm  defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
276231200Smm#define ARCHIVE_HAS_RMD160
277231200Smm#endif
278231200Smm#define archive_rmd160_init(ctx)\
279231200Smm  __archive_crypto.rmd160init(ctx)
280231200Smm#define archive_rmd160_final(ctx, md)\
281231200Smm  __archive_crypto.rmd160final(ctx, md)
282231200Smm#define archive_rmd160_update(ctx, buf, n)\
283231200Smm  __archive_crypto.rmd160update(ctx, buf, n)
284231200Smm
285231200Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC) ||\
286231200Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||	\
287231200Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
288231200Smm  defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
289231200Smm  defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
290231200Smm  defined(ARCHIVE_CRYPTO_SHA1_WIN)
291231200Smm#define ARCHIVE_HAS_SHA1
292231200Smm#endif
293231200Smm#define archive_sha1_init(ctx)\
294231200Smm  __archive_crypto.sha1init(ctx)
295231200Smm#define archive_sha1_final(ctx, md)\
296231200Smm  __archive_crypto.sha1final(ctx, md)
297231200Smm#define archive_sha1_update(ctx, buf, n)\
298231200Smm  __archive_crypto.sha1update(ctx, buf, n)
299231200Smm
300231200Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
301231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
302231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
303231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
304231200Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
305231200Smm  defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
306231200Smm  defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
307231200Smm  defined(ARCHIVE_CRYPTO_SHA256_WIN)
308231200Smm#define ARCHIVE_HAS_SHA256
309231200Smm#endif
310231200Smm#define archive_sha256_init(ctx)\
311231200Smm  __archive_crypto.sha256init(ctx)
312231200Smm#define archive_sha256_final(ctx, md)\
313231200Smm  __archive_crypto.sha256final(ctx, md)
314231200Smm#define archive_sha256_update(ctx, buf, n)\
315231200Smm  __archive_crypto.sha256update(ctx, buf, n)
316231200Smm
317231200Smm#if defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
318231200Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
319231200Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
320231200Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
321231200Smm  defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
322231200Smm  defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
323231200Smm  defined(ARCHIVE_CRYPTO_SHA384_WIN)
324231200Smm#define ARCHIVE_HAS_SHA384
325231200Smm#endif
326231200Smm#define archive_sha384_init(ctx)\
327231200Smm  __archive_crypto.sha384init(ctx)
328231200Smm#define archive_sha384_final(ctx, md)\
329231200Smm  __archive_crypto.sha384final(ctx, md)
330231200Smm#define archive_sha384_update(ctx, buf, n)\
331231200Smm  __archive_crypto.sha384update(ctx, buf, n)
332231200Smm
333231200Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
334231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
335231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC3) ||\
336231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBMD) ||\
337231200Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) ||\
338231200Smm  defined(ARCHIVE_CRYPTO_SHA512_NETTLE) ||\
339231200Smm  defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) ||\
340231200Smm  defined(ARCHIVE_CRYPTO_SHA512_WIN)
341231200Smm#define ARCHIVE_HAS_SHA512
342231200Smm#endif
343231200Smm#define archive_sha512_init(ctx)\
344231200Smm  __archive_crypto.sha512init(ctx)
345231200Smm#define archive_sha512_final(ctx, md)\
346231200Smm  __archive_crypto.sha512final(ctx, md)
347231200Smm#define archive_sha512_update(ctx, buf, n)\
348231200Smm  __archive_crypto.sha512update(ctx, buf, n)
349231200Smm
350231200Smm/* Minimal interface to crypto functionality for internal use in libarchive */
351231200Smmstruct archive_crypto
352231200Smm{
353231200Smm  /* Message Digest */
354231200Smm  int (*md5init)(archive_md5_ctx *ctx);
355231200Smm  int (*md5update)(archive_md5_ctx *, const void *, size_t);
356231200Smm  int (*md5final)(archive_md5_ctx *, void *);
357231200Smm  int (*rmd160init)(archive_rmd160_ctx *);
358231200Smm  int (*rmd160update)(archive_rmd160_ctx *, const void *, size_t);
359231200Smm  int (*rmd160final)(archive_rmd160_ctx *, void *);
360231200Smm  int (*sha1init)(archive_sha1_ctx *);
361231200Smm  int (*sha1update)(archive_sha1_ctx *, const void *, size_t);
362231200Smm  int (*sha1final)(archive_sha1_ctx *, void *);
363231200Smm  int (*sha256init)(archive_sha256_ctx *);
364231200Smm  int (*sha256update)(archive_sha256_ctx *, const void *, size_t);
365231200Smm  int (*sha256final)(archive_sha256_ctx *, void *);
366231200Smm  int (*sha384init)(archive_sha384_ctx *);
367231200Smm  int (*sha384update)(archive_sha384_ctx *, const void *, size_t);
368231200Smm  int (*sha384final)(archive_sha384_ctx *, void *);
369231200Smm  int (*sha512init)(archive_sha512_ctx *);
370231200Smm  int (*sha512update)(archive_sha512_ctx *, const void *, size_t);
371231200Smm  int (*sha512final)(archive_sha512_ctx *, void *);
372231200Smm};
373231200Smm
374231200Smmextern const struct archive_crypto __archive_crypto;
375231200Smm
376231200Smm#endif
377