1299425Smm/*-
2299425Smm* Copyright (c) 2003-2007 Tim Kientzle
3299425Smm* Copyright (c) 2011 Andres Mejia
4299425Smm* All rights reserved.
5299425Smm*
6299425Smm* Redistribution and use in source and binary forms, with or without
7299425Smm* modification, are permitted provided that the following conditions
8299425Smm* are met:
9299425Smm* 1. Redistributions of source code must retain the above copyright
10299425Smm*    notice, this list of conditions and the following disclaimer.
11299425Smm* 2. Redistributions in binary form must reproduce the above copyright
12299425Smm*    notice, this list of conditions and the following disclaimer in the
13299425Smm*    documentation and/or other materials provided with the distribution.
14299425Smm*
15299425Smm* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16299425Smm* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17299425Smm* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18299425Smm* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19299425Smm* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20299425Smm* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21299425Smm* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22299425Smm* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23299425Smm* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24299425Smm* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25299425Smm*/
26299425Smm
27358090Smm#ifndef ARCHIVE_DIGEST_PRIVATE_H_INCLUDED
28358090Smm#define ARCHIVE_DIGEST_PRIVATE_H_INCLUDED
29358090Smm
30299425Smm#ifndef __LIBARCHIVE_BUILD
31299425Smm#error This header is only to be used internally to libarchive.
32299425Smm#endif
33368708Smm#ifndef __LIBARCHIVE_CONFIG_H_INCLUDED
34368708Smm#error "Should have include config.h first!"
35368708Smm#endif
36368708Smm
37299425Smm/*
38299425Smm * Crypto support in various Operating Systems:
39299425Smm *
40299425Smm * NetBSD:
41299425Smm * - MD5 and SHA1 in libc: without _ after algorithm name
42299425Smm * - SHA2 in libc: with _ after algorithm name
43299425Smm *
44299425Smm * OpenBSD:
45299425Smm * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name
46299425Smm * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name
47299425Smm *
48299425Smm * DragonFly and FreeBSD:
49299425Smm * - MD5 libmd: without _ after algorithm name
50299425Smm * - SHA1, SHA256 and SHA512 in libmd: with _ after algorithm name
51299425Smm *
52299425Smm * Mac OS X (10.4 and later):
53299425Smm * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
54299425Smm *
55299425Smm * OpenSSL:
56299425Smm * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
57299425Smm *
58299425Smm * Windows:
59299425Smm * - MD5, SHA1 and SHA2 in archive_crypto.c using Windows crypto API
60299425Smm */
61299425Smm
62299425Smm/* libc crypto headers */
63299425Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
64299425Smm#include <md5.h>
65299425Smm#endif
66299425Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
67299425Smm#include <rmd160.h>
68299425Smm#endif
69299425Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
70299425Smm#include <sha1.h>
71299425Smm#endif
72299425Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
73299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
74299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
75299425Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
76299425Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
77299425Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
78299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
79299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
80299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
81299425Smm#include <sha2.h>
82299425Smm#endif
83299425Smm
84299425Smm/* libmd crypto headers */
85299425Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||\
86299425Smm  defined(ARCHIVE_CRYPTO_RMD160_LIBMD) ||\
87299425Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||\
88299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
89299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
90299425Smm#define	ARCHIVE_CRYPTO_LIBMD 1
91299425Smm#endif
92299425Smm
93299425Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBMD)
94299425Smm#include <md5.h>
95299425Smm#endif
96299425Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
97299425Smm#include <ripemd.h>
98299425Smm#endif
99299425Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
100299425Smm#include <sha.h>
101299425Smm#endif
102299425Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
103299425Smm#include <sha256.h>
104299425Smm#endif
105299425Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
106299425Smm#include <sha512.h>
107299425Smm#endif
108299425Smm
109299425Smm/* libSystem crypto headers */
110299425Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
111299425Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
112299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
113299425Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
114299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
115299425Smm#include <CommonCrypto/CommonDigest.h>
116299425Smm#endif
117299425Smm
118358090Smm/* mbed TLS crypto headers */
119358090Smm#if defined(ARCHIVE_CRYPTO_MD5_MBEDTLS)
120358090Smm#include <mbedtls/md5.h>
121358090Smm#endif
122358090Smm#if defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS)
123358090Smm#include <mbedtls/ripemd160.h>
124358090Smm#endif
125358090Smm#if defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS)
126358090Smm#include <mbedtls/sha1.h>
127358090Smm#endif
128358090Smm#if defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS)
129358090Smm#include <mbedtls/sha256.h>
130358090Smm#endif
131358090Smm#if defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS) ||\
132358090Smm  defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS)
133358090Smm#include <mbedtls/sha512.h>
134358090Smm#endif
135358090Smm
136299425Smm/* Nettle crypto headers */
137299425Smm#if defined(ARCHIVE_CRYPTO_MD5_NETTLE)
138299425Smm#include <nettle/md5.h>
139299425Smm#endif
140299425Smm#if defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
141299425Smm#include <nettle/ripemd160.h>
142299425Smm#endif
143299425Smm#if defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
144299425Smm  defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
145299425Smm  defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
146299425Smm  defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
147299425Smm#include <nettle/sha.h>
148299425Smm#endif
149299425Smm
150299425Smm/* OpenSSL crypto headers */
151299425Smm#if defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
152299425Smm  defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) ||\
153299425Smm  defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
154299425Smm  defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
155299425Smm  defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
156299425Smm  defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
157299425Smm#define	ARCHIVE_CRYPTO_OPENSSL 1
158311042Smm#include "archive_openssl_evp_private.h"
159299425Smm#endif
160299425Smm
161299425Smm/* Windows crypto headers */
162299425Smm#if defined(ARCHIVE_CRYPTO_MD5_WIN)    ||\
163299425Smm  defined(ARCHIVE_CRYPTO_SHA1_WIN)   ||\
164299425Smm  defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
165299425Smm  defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
166299425Smm  defined(ARCHIVE_CRYPTO_SHA512_WIN)
167315433Smm#include <windows.h>
168299425Smm#include <wincrypt.h>
169299425Smmtypedef struct {
170299425Smm  int   valid;
171299425Smm  HCRYPTPROV  cryptProv;
172299425Smm  HCRYPTHASH  hash;
173299425Smm} Digest_CTX;
174299425Smm#endif
175299425Smm
176299425Smm/* typedefs */
177299425Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
178299425Smmtypedef MD5_CTX archive_md5_ctx;
179299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
180299425Smmtypedef MD5_CTX archive_md5_ctx;
181299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
182299425Smmtypedef CC_MD5_CTX archive_md5_ctx;
183358090Smm#elif defined(ARCHIVE_CRYPTO_MD5_MBEDTLS)
184358090Smmtypedef mbedtls_md5_context archive_md5_ctx;
185299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
186299425Smmtypedef struct md5_ctx archive_md5_ctx;
187299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
188311042Smmtypedef EVP_MD_CTX *archive_md5_ctx;
189299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
190299425Smmtypedef Digest_CTX archive_md5_ctx;
191299425Smm#else
192299425Smmtypedef unsigned char archive_md5_ctx;
193299425Smm#endif
194299425Smm
195299425Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
196299425Smmtypedef RMD160_CTX archive_rmd160_ctx;
197299425Smm#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
198299425Smmtypedef RIPEMD160_CTX archive_rmd160_ctx;
199358090Smm#elif defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS)
200358090Smmtypedef mbedtls_ripemd160_context archive_rmd160_ctx;
201299425Smm#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
202299425Smmtypedef struct ripemd160_ctx archive_rmd160_ctx;
203299425Smm#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
204311042Smmtypedef EVP_MD_CTX *archive_rmd160_ctx;
205299425Smm#else
206299425Smmtypedef unsigned char archive_rmd160_ctx;
207299425Smm#endif
208299425Smm
209299425Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
210299425Smmtypedef SHA1_CTX archive_sha1_ctx;
211299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
212299425Smmtypedef SHA1_CTX archive_sha1_ctx;
213299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
214299425Smmtypedef CC_SHA1_CTX archive_sha1_ctx;
215358090Smm#elif defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS)
216358090Smmtypedef mbedtls_sha1_context archive_sha1_ctx;
217299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
218299425Smmtypedef struct sha1_ctx archive_sha1_ctx;
219299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
220311042Smmtypedef EVP_MD_CTX *archive_sha1_ctx;
221299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
222299425Smmtypedef Digest_CTX archive_sha1_ctx;
223299425Smm#else
224299425Smmtypedef unsigned char archive_sha1_ctx;
225299425Smm#endif
226299425Smm
227299425Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
228299425Smmtypedef SHA256_CTX archive_sha256_ctx;
229299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
230299425Smmtypedef SHA256_CTX archive_sha256_ctx;
231299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
232299425Smmtypedef SHA2_CTX archive_sha256_ctx;
233299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
234299425Smmtypedef SHA256_CTX archive_sha256_ctx;
235299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
236299425Smmtypedef CC_SHA256_CTX archive_sha256_ctx;
237358090Smm#elif defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS)
238358090Smmtypedef mbedtls_sha256_context archive_sha256_ctx;
239299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
240299425Smmtypedef struct sha256_ctx archive_sha256_ctx;
241299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
242311042Smmtypedef EVP_MD_CTX *archive_sha256_ctx;
243299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
244299425Smmtypedef Digest_CTX archive_sha256_ctx;
245299425Smm#else
246299425Smmtypedef unsigned char archive_sha256_ctx;
247299425Smm#endif
248299425Smm
249299425Smm#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
250299425Smmtypedef SHA384_CTX archive_sha384_ctx;
251299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
252299425Smmtypedef SHA384_CTX archive_sha384_ctx;
253299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
254299425Smmtypedef SHA2_CTX archive_sha384_ctx;
255299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
256299425Smmtypedef CC_SHA512_CTX archive_sha384_ctx;
257358090Smm#elif defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS)
258358090Smmtypedef mbedtls_sha512_context archive_sha384_ctx;
259299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
260299425Smmtypedef struct sha384_ctx archive_sha384_ctx;
261299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
262311042Smmtypedef EVP_MD_CTX *archive_sha384_ctx;
263299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
264299425Smmtypedef Digest_CTX archive_sha384_ctx;
265299425Smm#else
266299425Smmtypedef unsigned char archive_sha384_ctx;
267299425Smm#endif
268299425Smm
269299425Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
270299425Smmtypedef SHA512_CTX archive_sha512_ctx;
271299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
272299425Smmtypedef SHA512_CTX archive_sha512_ctx;
273299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
274299425Smmtypedef SHA2_CTX archive_sha512_ctx;
275299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
276299425Smmtypedef SHA512_CTX archive_sha512_ctx;
277299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
278299425Smmtypedef CC_SHA512_CTX archive_sha512_ctx;
279358090Smm#elif defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS)
280358090Smmtypedef mbedtls_sha512_context archive_sha512_ctx;
281299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
282299425Smmtypedef struct sha512_ctx archive_sha512_ctx;
283299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
284311042Smmtypedef EVP_MD_CTX *archive_sha512_ctx;
285299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
286299425Smmtypedef Digest_CTX archive_sha512_ctx;
287299425Smm#else
288299425Smmtypedef unsigned char archive_sha512_ctx;
289299425Smm#endif
290299425Smm
291299425Smm/* defines */
292299425Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC) ||\
293299425Smm  defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||	\
294299425Smm  defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
295358090Smm  defined(ARCHIVE_CRYPTO_MD5_MBEDTLS) ||\
296299425Smm  defined(ARCHIVE_CRYPTO_MD5_NETTLE) ||\
297299425Smm  defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
298299425Smm  defined(ARCHIVE_CRYPTO_MD5_WIN)
299299425Smm#define ARCHIVE_HAS_MD5
300299425Smm#endif
301299425Smm#define archive_md5_init(ctx)\
302299425Smm  __archive_digest.md5init(ctx)
303299425Smm#define archive_md5_final(ctx, md)\
304299425Smm  __archive_digest.md5final(ctx, md)
305299425Smm#define archive_md5_update(ctx, buf, n)\
306299425Smm  __archive_digest.md5update(ctx, buf, n)
307299425Smm
308299425Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC) ||\
309358090Smm  defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS) ||\
310299425Smm  defined(ARCHIVE_CRYPTO_RMD160_NETTLE) ||\
311299425Smm  defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
312299425Smm#define ARCHIVE_HAS_RMD160
313299425Smm#endif
314299425Smm#define archive_rmd160_init(ctx)\
315299425Smm  __archive_digest.rmd160init(ctx)
316299425Smm#define archive_rmd160_final(ctx, md)\
317299425Smm  __archive_digest.rmd160final(ctx, md)
318299425Smm#define archive_rmd160_update(ctx, buf, n)\
319299425Smm  __archive_digest.rmd160update(ctx, buf, n)
320299425Smm
321299425Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC) ||\
322299425Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||	\
323299425Smm  defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
324358090Smm  defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS) ||\
325299425Smm  defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
326299425Smm  defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
327299425Smm  defined(ARCHIVE_CRYPTO_SHA1_WIN)
328299425Smm#define ARCHIVE_HAS_SHA1
329299425Smm#endif
330299425Smm#define archive_sha1_init(ctx)\
331299425Smm  __archive_digest.sha1init(ctx)
332299425Smm#define archive_sha1_final(ctx, md)\
333299425Smm  __archive_digest.sha1final(ctx, md)
334299425Smm#define archive_sha1_update(ctx, buf, n)\
335299425Smm  __archive_digest.sha1update(ctx, buf, n)
336299425Smm
337299425Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
338299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
339299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
340299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
341299425Smm  defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
342358090Smm  defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS) ||\
343299425Smm  defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
344299425Smm  defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
345299425Smm  defined(ARCHIVE_CRYPTO_SHA256_WIN)
346299425Smm#define ARCHIVE_HAS_SHA256
347299425Smm#endif
348299425Smm#define archive_sha256_init(ctx)\
349299425Smm  __archive_digest.sha256init(ctx)
350299425Smm#define archive_sha256_final(ctx, md)\
351299425Smm  __archive_digest.sha256final(ctx, md)
352299425Smm#define archive_sha256_update(ctx, buf, n)\
353299425Smm  __archive_digest.sha256update(ctx, buf, n)
354299425Smm
355299425Smm#if defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
356299425Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
357299425Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
358299425Smm  defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
359358090Smm  defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS) ||\
360299425Smm  defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
361299425Smm  defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
362299425Smm  defined(ARCHIVE_CRYPTO_SHA384_WIN)
363299425Smm#define ARCHIVE_HAS_SHA384
364299425Smm#endif
365299425Smm#define archive_sha384_init(ctx)\
366299425Smm  __archive_digest.sha384init(ctx)
367299425Smm#define archive_sha384_final(ctx, md)\
368299425Smm  __archive_digest.sha384final(ctx, md)
369299425Smm#define archive_sha384_update(ctx, buf, n)\
370299425Smm  __archive_digest.sha384update(ctx, buf, n)
371299425Smm
372299425Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
373299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
374299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBC3) ||\
375299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBMD) ||\
376299425Smm  defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) ||\
377358090Smm  defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS) ||\
378299425Smm  defined(ARCHIVE_CRYPTO_SHA512_NETTLE) ||\
379299425Smm  defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) ||\
380299425Smm  defined(ARCHIVE_CRYPTO_SHA512_WIN)
381299425Smm#define ARCHIVE_HAS_SHA512
382299425Smm#endif
383299425Smm#define archive_sha512_init(ctx)\
384299425Smm  __archive_digest.sha512init(ctx)
385299425Smm#define archive_sha512_final(ctx, md)\
386299425Smm  __archive_digest.sha512final(ctx, md)
387299425Smm#define archive_sha512_update(ctx, buf, n)\
388299425Smm  __archive_digest.sha512update(ctx, buf, n)
389299425Smm
390299425Smm/* Minimal interface to digest functionality for internal use in libarchive */
391299425Smmstruct archive_digest
392299425Smm{
393299425Smm  /* Message Digest */
394299425Smm  int (*md5init)(archive_md5_ctx *ctx);
395299425Smm  int (*md5update)(archive_md5_ctx *, const void *, size_t);
396299425Smm  int (*md5final)(archive_md5_ctx *, void *);
397299425Smm  int (*rmd160init)(archive_rmd160_ctx *);
398299425Smm  int (*rmd160update)(archive_rmd160_ctx *, const void *, size_t);
399299425Smm  int (*rmd160final)(archive_rmd160_ctx *, void *);
400299425Smm  int (*sha1init)(archive_sha1_ctx *);
401299425Smm  int (*sha1update)(archive_sha1_ctx *, const void *, size_t);
402299425Smm  int (*sha1final)(archive_sha1_ctx *, void *);
403299425Smm  int (*sha256init)(archive_sha256_ctx *);
404299425Smm  int (*sha256update)(archive_sha256_ctx *, const void *, size_t);
405299425Smm  int (*sha256final)(archive_sha256_ctx *, void *);
406299425Smm  int (*sha384init)(archive_sha384_ctx *);
407299425Smm  int (*sha384update)(archive_sha384_ctx *, const void *, size_t);
408299425Smm  int (*sha384final)(archive_sha384_ctx *, void *);
409299425Smm  int (*sha512init)(archive_sha512_ctx *);
410299425Smm  int (*sha512update)(archive_sha512_ctx *, const void *, size_t);
411299425Smm  int (*sha512final)(archive_sha512_ctx *, void *);
412299425Smm};
413299425Smm
414299425Smmextern const struct archive_digest __archive_digest;
415299425Smm
416299425Smm#endif
417