1231200Smm/*-
2231200Smm* Copyright (c) 2003-2007 Tim Kientzle
3231200Smm* Copyright (c) 2011 Andres Mejia
4231200Smm* Copyright (c) 2011 Michihiro NAKAJIMA
5231200Smm* All rights reserved.
6231200Smm*
7231200Smm* Redistribution and use in source and binary forms, with or without
8231200Smm* modification, are permitted provided that the following conditions
9231200Smm* are met:
10231200Smm* 1. Redistributions of source code must retain the above copyright
11231200Smm*    notice, this list of conditions and the following disclaimer.
12231200Smm* 2. Redistributions in binary form must reproduce the above copyright
13231200Smm*    notice, this list of conditions and the following disclaimer in the
14231200Smm*    documentation and/or other materials provided with the distribution.
15231200Smm*
16231200Smm* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17231200Smm* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18231200Smm* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19231200Smm* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20231200Smm* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21231200Smm* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22231200Smm* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23231200Smm* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24231200Smm* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25231200Smm* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26231200Smm*/
27231200Smm
28231200Smm#include "archive_platform.h"
29231200Smm
30231200Smm#include "archive.h"
31231200Smm#include "archive_crypto_private.h"
32231200Smm
33231200Smm/* In particular, force the configure probe to break if it tries
34231200Smm * to test a combination of OpenSSL and libmd. */
35231200Smm#if defined(ARCHIVE_CRYPTO_OPENSSL) && defined(ARCHIVE_CRYPTO_LIBMD)
36231200Smm#error Cannot use both OpenSSL and libmd.
37231200Smm#endif
38231200Smm
39231200Smm/*
40231200Smm * Message digest functions for Windows platform.
41231200Smm */
42231200Smm#if defined(ARCHIVE_CRYPTO_MD5_WIN)    ||\
43231200Smm	defined(ARCHIVE_CRYPTO_SHA1_WIN)   ||\
44231200Smm	defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
45231200Smm	defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
46231200Smm	defined(ARCHIVE_CRYPTO_SHA512_WIN)
47231200Smm
48231200Smm/*
49231200Smm * Initialize a Message digest.
50231200Smm */
51231200Smmstatic int
52231200Smmwin_crypto_init(Digest_CTX *ctx, ALG_ID algId)
53231200Smm{
54231200Smm
55231200Smm	ctx->valid = 0;
56231200Smm	if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,
57231200Smm	    PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
58231200Smm		if (GetLastError() != (DWORD)NTE_BAD_KEYSET)
59231200Smm			return (ARCHIVE_FAILED);
60231200Smm		if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,
61231200Smm		    PROV_RSA_FULL, CRYPT_NEWKEYSET))
62231200Smm			return (ARCHIVE_FAILED);
63231200Smm	}
64231200Smm
65231200Smm	if (!CryptCreateHash(ctx->cryptProv, algId, 0, 0, &ctx->hash)) {
66231200Smm		CryptReleaseContext(ctx->cryptProv, 0);
67231200Smm		return (ARCHIVE_FAILED);
68231200Smm	}
69231200Smm
70231200Smm	ctx->valid = 1;
71231200Smm	return (ARCHIVE_OK);
72231200Smm}
73231200Smm
74231200Smm/*
75231200Smm * Update a Message digest.
76231200Smm */
77231200Smmstatic int
78231200Smmwin_crypto_Update(Digest_CTX *ctx, const unsigned char *buf, size_t len)
79231200Smm{
80231200Smm
81231200Smm	if (!ctx->valid)
82231200Smm		return (ARCHIVE_FAILED);
83231200Smm
84231200Smm	CryptHashData(ctx->hash,
85231200Smm		      (unsigned char *)(uintptr_t)buf,
86231200Smm		      (DWORD)len, 0);
87231200Smm	return (ARCHIVE_OK);
88231200Smm}
89231200Smm
90231200Smmstatic int
91231200Smmwin_crypto_Final(unsigned char *buf, size_t bufsize, Digest_CTX *ctx)
92231200Smm{
93248616Smm	DWORD siglen = (DWORD)bufsize;
94231200Smm
95231200Smm	if (!ctx->valid)
96231200Smm		return (ARCHIVE_FAILED);
97231200Smm
98231200Smm	CryptGetHashParam(ctx->hash, HP_HASHVAL, buf, &siglen, 0);
99231200Smm	CryptDestroyHash(ctx->hash);
100231200Smm	CryptReleaseContext(ctx->cryptProv, 0);
101231200Smm	ctx->valid = 0;
102231200Smm	return (ARCHIVE_OK);
103231200Smm}
104231200Smm
105231200Smm#endif /* defined(ARCHIVE_CRYPTO_*_WIN) */
106231200Smm
107231200Smm
108231200Smm/* MD5 implementations */
109231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
110231200Smm
111231200Smmstatic int
112231200Smm__archive_libc_md5init(archive_md5_ctx *ctx)
113231200Smm{
114231200Smm  MD5Init(ctx);
115231200Smm  return (ARCHIVE_OK);
116231200Smm}
117231200Smm
118231200Smmstatic int
119231200Smm__archive_libc_md5update(archive_md5_ctx *ctx, const void *indata,
120231200Smm    size_t insize)
121231200Smm{
122231200Smm  MD5Update(ctx, indata, insize);
123231200Smm  return (ARCHIVE_OK);
124231200Smm}
125231200Smm
126231200Smmstatic int
127231200Smm__archive_libc_md5final(archive_md5_ctx *ctx, void *md)
128231200Smm{
129231200Smm  MD5Final(md, ctx);
130231200Smm  return (ARCHIVE_OK);
131231200Smm}
132231200Smm
133231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
134231200Smm
135231200Smmstatic int
136231200Smm__archive_libmd_md5init(archive_md5_ctx *ctx)
137231200Smm{
138231200Smm  MD5Init(ctx);
139231200Smm  return (ARCHIVE_OK);
140231200Smm}
141231200Smm
142231200Smmstatic int
143231200Smm__archive_libmd_md5update(archive_md5_ctx *ctx, const void *indata,
144231200Smm    size_t insize)
145231200Smm{
146231200Smm  MD5Update(ctx, indata, insize);
147231200Smm  return (ARCHIVE_OK);
148231200Smm}
149231200Smm
150231200Smmstatic int
151231200Smm__archive_libmd_md5final(archive_md5_ctx *ctx, void *md)
152231200Smm{
153231200Smm  MD5Final(md, ctx);
154231200Smm  return (ARCHIVE_OK);
155231200Smm}
156231200Smm
157231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
158231200Smm
159231200Smmstatic int
160231200Smm__archive_libsystem_md5init(archive_md5_ctx *ctx)
161231200Smm{
162231200Smm  CC_MD5_Init(ctx);
163231200Smm  return (ARCHIVE_OK);
164231200Smm}
165231200Smm
166231200Smmstatic int
167231200Smm__archive_libsystem_md5update(archive_md5_ctx *ctx, const void *indata,
168231200Smm    size_t insize)
169231200Smm{
170231200Smm  CC_MD5_Update(ctx, indata, insize);
171231200Smm  return (ARCHIVE_OK);
172231200Smm}
173231200Smm
174231200Smmstatic int
175231200Smm__archive_libsystem_md5final(archive_md5_ctx *ctx, void *md)
176231200Smm{
177231200Smm  CC_MD5_Final(md, ctx);
178231200Smm  return (ARCHIVE_OK);
179231200Smm}
180231200Smm
181231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
182231200Smm
183231200Smmstatic int
184231200Smm__archive_nettle_md5init(archive_md5_ctx *ctx)
185231200Smm{
186231200Smm  md5_init(ctx);
187231200Smm  return (ARCHIVE_OK);
188231200Smm}
189231200Smm
190231200Smmstatic int
191231200Smm__archive_nettle_md5update(archive_md5_ctx *ctx, const void *indata,
192231200Smm    size_t insize)
193231200Smm{
194231200Smm  md5_update(ctx, insize, indata);
195231200Smm  return (ARCHIVE_OK);
196231200Smm}
197231200Smm
198231200Smmstatic int
199231200Smm__archive_nettle_md5final(archive_md5_ctx *ctx, void *md)
200231200Smm{
201231200Smm  md5_digest(ctx, MD5_DIGEST_SIZE, md);
202231200Smm  return (ARCHIVE_OK);
203231200Smm}
204231200Smm
205231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
206231200Smm
207231200Smmstatic int
208231200Smm__archive_openssl_md5init(archive_md5_ctx *ctx)
209231200Smm{
210231200Smm  EVP_DigestInit(ctx, EVP_md5());
211231200Smm  return (ARCHIVE_OK);
212231200Smm}
213231200Smm
214231200Smmstatic int
215231200Smm__archive_openssl_md5update(archive_md5_ctx *ctx, const void *indata,
216231200Smm    size_t insize)
217231200Smm{
218231200Smm  EVP_DigestUpdate(ctx, indata, insize);
219231200Smm  return (ARCHIVE_OK);
220231200Smm}
221231200Smm
222231200Smmstatic int
223231200Smm__archive_openssl_md5final(archive_md5_ctx *ctx, void *md)
224231200Smm{
225231200Smm  /* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so
226231200Smm   * this is meant to cope with that. Real fix is probably to fix
227231200Smm   * archive_write_set_format_xar.c
228231200Smm   */
229231200Smm  if (ctx->digest)
230231200Smm    EVP_DigestFinal(ctx, md, NULL);
231231200Smm  return (ARCHIVE_OK);
232231200Smm}
233231200Smm
234231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
235231200Smm
236231200Smmstatic int
237231200Smm__archive_windowsapi_md5init(archive_md5_ctx *ctx)
238231200Smm{
239231200Smm  return (win_crypto_init(ctx, CALG_MD5));
240231200Smm}
241231200Smm
242231200Smmstatic int
243231200Smm__archive_windowsapi_md5update(archive_md5_ctx *ctx, const void *indata,
244231200Smm    size_t insize)
245231200Smm{
246231200Smm  return (win_crypto_Update(ctx, indata, insize));
247231200Smm}
248231200Smm
249231200Smmstatic int
250231200Smm__archive_windowsapi_md5final(archive_md5_ctx *ctx, void *md)
251231200Smm{
252231200Smm  return (win_crypto_Final(md, 16, ctx));
253231200Smm}
254231200Smm
255231200Smm#else
256231200Smm
257231200Smmstatic int
258231200Smm__archive_stub_md5init(archive_md5_ctx *ctx)
259231200Smm{
260231200Smm	(void)ctx; /* UNUSED */
261231200Smm	return (ARCHIVE_FAILED);
262231200Smm}
263231200Smm
264231200Smmstatic int
265231200Smm__archive_stub_md5update(archive_md5_ctx *ctx, const void *indata,
266231200Smm    size_t insize)
267231200Smm{
268231200Smm	(void)ctx; /* UNUSED */
269231200Smm	(void)indata; /* UNUSED */
270231200Smm	(void)insize; /* UNUSED */
271231200Smm	return (ARCHIVE_FAILED);
272231200Smm}
273231200Smm
274231200Smmstatic int
275231200Smm__archive_stub_md5final(archive_md5_ctx *ctx, void *md)
276231200Smm{
277231200Smm	(void)ctx; /* UNUSED */
278231200Smm	(void)md; /* UNUSED */
279231200Smm	return (ARCHIVE_FAILED);
280231200Smm}
281231200Smm
282231200Smm#endif
283231200Smm
284231200Smm/* RIPEMD160 implementations */
285231200Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
286231200Smm
287231200Smmstatic int
288231200Smm__archive_libc_ripemd160init(archive_rmd160_ctx *ctx)
289231200Smm{
290231200Smm  RMD160Init(ctx);
291231200Smm  return (ARCHIVE_OK);
292231200Smm}
293231200Smm
294231200Smmstatic int
295231200Smm__archive_libc_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
296231200Smm    size_t insize)
297231200Smm{
298231200Smm  RMD160Update(ctx, indata, insize);
299231200Smm  return (ARCHIVE_OK);
300231200Smm}
301231200Smm
302231200Smmstatic int
303231200Smm__archive_libc_ripemd160final(archive_rmd160_ctx *ctx, void *md)
304231200Smm{
305231200Smm  RMD160Final(md, ctx);
306231200Smm  return (ARCHIVE_OK);
307231200Smm}
308231200Smm
309231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
310231200Smm
311231200Smmstatic int
312231200Smm__archive_libmd_ripemd160init(archive_rmd160_ctx *ctx)
313231200Smm{
314231200Smm  RIPEMD160_Init(ctx);
315231200Smm  return (ARCHIVE_OK);
316231200Smm}
317231200Smm
318231200Smmstatic int
319231200Smm__archive_libmd_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
320231200Smm    size_t insize)
321231200Smm{
322231200Smm  RIPEMD160_Update(ctx, indata, insize);
323231200Smm  return (ARCHIVE_OK);
324231200Smm}
325231200Smm
326231200Smmstatic int
327231200Smm__archive_libmd_ripemd160final(archive_rmd160_ctx *ctx, void *md)
328231200Smm{
329231200Smm  RIPEMD160_Final(md, ctx);
330231200Smm  return (ARCHIVE_OK);
331231200Smm}
332231200Smm
333231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
334231200Smm
335231200Smmstatic int
336231200Smm__archive_nettle_ripemd160init(archive_rmd160_ctx *ctx)
337231200Smm{
338231200Smm  ripemd160_init(ctx);
339231200Smm  return (ARCHIVE_OK);
340231200Smm}
341231200Smm
342231200Smmstatic int
343231200Smm__archive_nettle_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
344231200Smm    size_t insize)
345231200Smm{
346231200Smm  ripemd160_update(ctx, insize, indata);
347231200Smm  return (ARCHIVE_OK);
348231200Smm}
349231200Smm
350231200Smmstatic int
351231200Smm__archive_nettle_ripemd160final(archive_rmd160_ctx *ctx, void *md)
352231200Smm{
353231200Smm  ripemd160_digest(ctx, RIPEMD160_DIGEST_SIZE, md);
354231200Smm  return (ARCHIVE_OK);
355231200Smm}
356231200Smm
357231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
358231200Smm
359231200Smmstatic int
360231200Smm__archive_openssl_ripemd160init(archive_rmd160_ctx *ctx)
361231200Smm{
362231200Smm  EVP_DigestInit(ctx, EVP_ripemd160());
363231200Smm  return (ARCHIVE_OK);
364231200Smm}
365231200Smm
366231200Smmstatic int
367231200Smm__archive_openssl_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
368231200Smm    size_t insize)
369231200Smm{
370231200Smm  EVP_DigestUpdate(ctx, indata, insize);
371231200Smm  return (ARCHIVE_OK);
372231200Smm}
373231200Smm
374231200Smmstatic int
375231200Smm__archive_openssl_ripemd160final(archive_rmd160_ctx *ctx, void *md)
376231200Smm{
377231200Smm  EVP_DigestFinal(ctx, md, NULL);
378231200Smm  return (ARCHIVE_OK);
379231200Smm}
380231200Smm
381231200Smm#else
382231200Smm
383231200Smmstatic int
384231200Smm__archive_stub_ripemd160init(archive_rmd160_ctx *ctx)
385231200Smm{
386231200Smm	(void)ctx; /* UNUSED */
387231200Smm	return (ARCHIVE_FAILED);
388231200Smm}
389231200Smm
390231200Smmstatic int
391231200Smm__archive_stub_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
392231200Smm    size_t insize)
393231200Smm{
394231200Smm	(void)ctx; /* UNUSED */
395231200Smm	(void)indata; /* UNUSED */
396231200Smm	(void)insize; /* UNUSED */
397231200Smm	return (ARCHIVE_FAILED);
398231200Smm}
399231200Smm
400231200Smmstatic int
401231200Smm__archive_stub_ripemd160final(archive_rmd160_ctx *ctx, void *md)
402231200Smm{
403231200Smm	(void)ctx; /* UNUSED */
404231200Smm	(void)md; /* UNUSED */
405231200Smm	return (ARCHIVE_FAILED);
406231200Smm}
407231200Smm
408231200Smm#endif
409231200Smm
410231200Smm/* SHA1 implementations */
411231200Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
412231200Smm
413231200Smmstatic int
414231200Smm__archive_libc_sha1init(archive_sha1_ctx *ctx)
415231200Smm{
416231200Smm  SHA1Init(ctx);
417231200Smm  return (ARCHIVE_OK);
418231200Smm}
419231200Smm
420231200Smmstatic int
421231200Smm__archive_libc_sha1update(archive_sha1_ctx *ctx, const void *indata,
422231200Smm    size_t insize)
423231200Smm{
424231200Smm  SHA1Update(ctx, indata, insize);
425231200Smm  return (ARCHIVE_OK);
426231200Smm}
427231200Smm
428231200Smmstatic int
429231200Smm__archive_libc_sha1final(archive_sha1_ctx *ctx, void *md)
430231200Smm{
431231200Smm  SHA1Final(md, ctx);
432231200Smm  return (ARCHIVE_OK);
433231200Smm}
434231200Smm
435231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
436231200Smm
437231200Smmstatic int
438231200Smm__archive_libmd_sha1init(archive_sha1_ctx *ctx)
439231200Smm{
440231200Smm  SHA1_Init(ctx);
441231200Smm  return (ARCHIVE_OK);
442231200Smm}
443231200Smm
444231200Smmstatic int
445231200Smm__archive_libmd_sha1update(archive_sha1_ctx *ctx, const void *indata,
446231200Smm    size_t insize)
447231200Smm{
448231200Smm  SHA1_Update(ctx, indata, insize);
449231200Smm  return (ARCHIVE_OK);
450231200Smm}
451231200Smm
452231200Smmstatic int
453231200Smm__archive_libmd_sha1final(archive_sha1_ctx *ctx, void *md)
454231200Smm{
455231200Smm  SHA1_Final(md, ctx);
456231200Smm  return (ARCHIVE_OK);
457231200Smm}
458231200Smm
459231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
460231200Smm
461231200Smmstatic int
462231200Smm__archive_libsystem_sha1init(archive_sha1_ctx *ctx)
463231200Smm{
464231200Smm  CC_SHA1_Init(ctx);
465231200Smm  return (ARCHIVE_OK);
466231200Smm}
467231200Smm
468231200Smmstatic int
469231200Smm__archive_libsystem_sha1update(archive_sha1_ctx *ctx, const void *indata,
470231200Smm    size_t insize)
471231200Smm{
472231200Smm  CC_SHA1_Update(ctx, indata, insize);
473231200Smm  return (ARCHIVE_OK);
474231200Smm}
475231200Smm
476231200Smmstatic int
477231200Smm__archive_libsystem_sha1final(archive_sha1_ctx *ctx, void *md)
478231200Smm{
479231200Smm  CC_SHA1_Final(md, ctx);
480231200Smm  return (ARCHIVE_OK);
481231200Smm}
482231200Smm
483231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
484231200Smm
485231200Smmstatic int
486231200Smm__archive_nettle_sha1init(archive_sha1_ctx *ctx)
487231200Smm{
488231200Smm  sha1_init(ctx);
489231200Smm  return (ARCHIVE_OK);
490231200Smm}
491231200Smm
492231200Smmstatic int
493231200Smm__archive_nettle_sha1update(archive_sha1_ctx *ctx, const void *indata,
494231200Smm    size_t insize)
495231200Smm{
496231200Smm  sha1_update(ctx, insize, indata);
497231200Smm  return (ARCHIVE_OK);
498231200Smm}
499231200Smm
500231200Smmstatic int
501231200Smm__archive_nettle_sha1final(archive_sha1_ctx *ctx, void *md)
502231200Smm{
503231200Smm  sha1_digest(ctx, SHA1_DIGEST_SIZE, md);
504231200Smm  return (ARCHIVE_OK);
505231200Smm}
506231200Smm
507231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
508231200Smm
509231200Smmstatic int
510231200Smm__archive_openssl_sha1init(archive_sha1_ctx *ctx)
511231200Smm{
512231200Smm  EVP_DigestInit(ctx, EVP_sha1());
513231200Smm  return (ARCHIVE_OK);
514231200Smm}
515231200Smm
516231200Smmstatic int
517231200Smm__archive_openssl_sha1update(archive_sha1_ctx *ctx, const void *indata,
518231200Smm    size_t insize)
519231200Smm{
520231200Smm  EVP_DigestUpdate(ctx, indata, insize);
521231200Smm  return (ARCHIVE_OK);
522231200Smm}
523231200Smm
524231200Smmstatic int
525231200Smm__archive_openssl_sha1final(archive_sha1_ctx *ctx, void *md)
526231200Smm{
527231200Smm  /* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so
528231200Smm   * this is meant to cope with that. Real fix is probably to fix
529231200Smm   * archive_write_set_format_xar.c
530231200Smm   */
531231200Smm  if (ctx->digest)
532231200Smm    EVP_DigestFinal(ctx, md, NULL);
533231200Smm  return (ARCHIVE_OK);
534231200Smm}
535231200Smm
536231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
537231200Smm
538231200Smmstatic int
539231200Smm__archive_windowsapi_sha1init(archive_sha1_ctx *ctx)
540231200Smm{
541231200Smm  return (win_crypto_init(ctx, CALG_SHA1));
542231200Smm}
543231200Smm
544231200Smmstatic int
545231200Smm__archive_windowsapi_sha1update(archive_sha1_ctx *ctx, const void *indata,
546231200Smm    size_t insize)
547231200Smm{
548231200Smm  return (win_crypto_Update(ctx, indata, insize));
549231200Smm}
550231200Smm
551231200Smmstatic int
552231200Smm__archive_windowsapi_sha1final(archive_sha1_ctx *ctx, void *md)
553231200Smm{
554231200Smm  return (win_crypto_Final(md, 20, ctx));
555231200Smm}
556231200Smm
557231200Smm#else
558231200Smm
559231200Smmstatic int
560231200Smm__archive_stub_sha1init(archive_sha1_ctx *ctx)
561231200Smm{
562231200Smm	(void)ctx; /* UNUSED */
563231200Smm	return (ARCHIVE_FAILED);
564231200Smm}
565231200Smm
566231200Smmstatic int
567231200Smm__archive_stub_sha1update(archive_sha1_ctx *ctx, const void *indata,
568231200Smm    size_t insize)
569231200Smm{
570231200Smm	(void)ctx; /* UNUSED */
571231200Smm	(void)indata; /* UNUSED */
572231200Smm	(void)insize; /* UNUSED */
573231200Smm	return (ARCHIVE_FAILED);
574231200Smm}
575231200Smm
576231200Smmstatic int
577231200Smm__archive_stub_sha1final(archive_sha1_ctx *ctx, void *md)
578231200Smm{
579231200Smm	(void)ctx; /* UNUSED */
580231200Smm	(void)md; /* UNUSED */
581231200Smm	return (ARCHIVE_FAILED);
582231200Smm}
583231200Smm
584231200Smm#endif
585231200Smm
586231200Smm/* SHA256 implementations */
587231200Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
588231200Smm
589231200Smmstatic int
590231200Smm__archive_libc_sha256init(archive_sha256_ctx *ctx)
591231200Smm{
592231200Smm  SHA256_Init(ctx);
593231200Smm  return (ARCHIVE_OK);
594231200Smm}
595231200Smm
596231200Smmstatic int
597231200Smm__archive_libc_sha256update(archive_sha256_ctx *ctx, const void *indata,
598231200Smm    size_t insize)
599231200Smm{
600231200Smm  SHA256_Update(ctx, indata, insize);
601231200Smm  return (ARCHIVE_OK);
602231200Smm}
603231200Smm
604231200Smmstatic int
605231200Smm__archive_libc_sha256final(archive_sha256_ctx *ctx, void *md)
606231200Smm{
607231200Smm  SHA256_Final(md, ctx);
608231200Smm  return (ARCHIVE_OK);
609231200Smm}
610231200Smm
611231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
612231200Smm
613231200Smmstatic int
614231200Smm__archive_libc2_sha256init(archive_sha256_ctx *ctx)
615231200Smm{
616231200Smm  SHA256Init(ctx);
617231200Smm  return (ARCHIVE_OK);
618231200Smm}
619231200Smm
620231200Smmstatic int
621231200Smm__archive_libc2_sha256update(archive_sha256_ctx *ctx, const void *indata,
622231200Smm    size_t insize)
623231200Smm{
624231200Smm  SHA256Update(ctx, indata, insize);
625231200Smm  return (ARCHIVE_OK);
626231200Smm}
627231200Smm
628231200Smmstatic int
629231200Smm__archive_libc2_sha256final(archive_sha256_ctx *ctx, void *md)
630231200Smm{
631231200Smm  SHA256Final(md, ctx);
632231200Smm  return (ARCHIVE_OK);
633231200Smm}
634231200Smm
635231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
636231200Smm
637231200Smmstatic int
638231200Smm__archive_libc3_sha256init(archive_sha256_ctx *ctx)
639231200Smm{
640231200Smm  SHA256Init(ctx);
641231200Smm  return (ARCHIVE_OK);
642231200Smm}
643231200Smm
644231200Smmstatic int
645231200Smm__archive_libc3_sha256update(archive_sha256_ctx *ctx, const void *indata,
646231200Smm    size_t insize)
647231200Smm{
648231200Smm  SHA256Update(ctx, indata, insize);
649231200Smm  return (ARCHIVE_OK);
650231200Smm}
651231200Smm
652231200Smmstatic int
653231200Smm__archive_libc3_sha256final(archive_sha256_ctx *ctx, void *md)
654231200Smm{
655231200Smm  SHA256Final(md, ctx);
656231200Smm  return (ARCHIVE_OK);
657231200Smm}
658231200Smm
659231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
660231200Smm
661231200Smmstatic int
662231200Smm__archive_libmd_sha256init(archive_sha256_ctx *ctx)
663231200Smm{
664231200Smm  SHA256_Init(ctx);
665231200Smm  return (ARCHIVE_OK);
666231200Smm}
667231200Smm
668231200Smmstatic int
669231200Smm__archive_libmd_sha256update(archive_sha256_ctx *ctx, const void *indata,
670231200Smm    size_t insize)
671231200Smm{
672231200Smm  SHA256_Update(ctx, indata, insize);
673231200Smm  return (ARCHIVE_OK);
674231200Smm}
675231200Smm
676231200Smmstatic int
677231200Smm__archive_libmd_sha256final(archive_sha256_ctx *ctx, void *md)
678231200Smm{
679231200Smm  SHA256_Final(md, ctx);
680231200Smm  return (ARCHIVE_OK);
681231200Smm}
682231200Smm
683231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
684231200Smm
685231200Smmstatic int
686231200Smm__archive_libsystem_sha256init(archive_sha256_ctx *ctx)
687231200Smm{
688231200Smm  CC_SHA256_Init(ctx);
689231200Smm  return (ARCHIVE_OK);
690231200Smm}
691231200Smm
692231200Smmstatic int
693231200Smm__archive_libsystem_sha256update(archive_sha256_ctx *ctx, const void *indata,
694231200Smm    size_t insize)
695231200Smm{
696231200Smm  CC_SHA256_Update(ctx, indata, insize);
697231200Smm  return (ARCHIVE_OK);
698231200Smm}
699231200Smm
700231200Smmstatic int
701231200Smm__archive_libsystem_sha256final(archive_sha256_ctx *ctx, void *md)
702231200Smm{
703231200Smm  CC_SHA256_Final(md, ctx);
704231200Smm  return (ARCHIVE_OK);
705231200Smm}
706231200Smm
707231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
708231200Smm
709231200Smmstatic int
710231200Smm__archive_nettle_sha256init(archive_sha256_ctx *ctx)
711231200Smm{
712231200Smm  sha256_init(ctx);
713231200Smm  return (ARCHIVE_OK);
714231200Smm}
715231200Smm
716231200Smmstatic int
717231200Smm__archive_nettle_sha256update(archive_sha256_ctx *ctx, const void *indata,
718231200Smm    size_t insize)
719231200Smm{
720231200Smm  sha256_update(ctx, insize, indata);
721231200Smm  return (ARCHIVE_OK);
722231200Smm}
723231200Smm
724231200Smmstatic int
725231200Smm__archive_nettle_sha256final(archive_sha256_ctx *ctx, void *md)
726231200Smm{
727231200Smm  sha256_digest(ctx, SHA256_DIGEST_SIZE, md);
728231200Smm  return (ARCHIVE_OK);
729231200Smm}
730231200Smm
731231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
732231200Smm
733231200Smmstatic int
734231200Smm__archive_openssl_sha256init(archive_sha256_ctx *ctx)
735231200Smm{
736231200Smm  EVP_DigestInit(ctx, EVP_sha256());
737231200Smm  return (ARCHIVE_OK);
738231200Smm}
739231200Smm
740231200Smmstatic int
741231200Smm__archive_openssl_sha256update(archive_sha256_ctx *ctx, const void *indata,
742231200Smm    size_t insize)
743231200Smm{
744231200Smm  EVP_DigestUpdate(ctx, indata, insize);
745231200Smm  return (ARCHIVE_OK);
746231200Smm}
747231200Smm
748231200Smmstatic int
749231200Smm__archive_openssl_sha256final(archive_sha256_ctx *ctx, void *md)
750231200Smm{
751231200Smm  EVP_DigestFinal(ctx, md, NULL);
752231200Smm  return (ARCHIVE_OK);
753231200Smm}
754231200Smm
755231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
756231200Smm
757231200Smmstatic int
758231200Smm__archive_windowsapi_sha256init(archive_sha256_ctx *ctx)
759231200Smm{
760231200Smm  return (win_crypto_init(ctx, CALG_SHA_256));
761231200Smm}
762231200Smm
763231200Smmstatic int
764231200Smm__archive_windowsapi_sha256update(archive_sha256_ctx *ctx, const void *indata,
765231200Smm    size_t insize)
766231200Smm{
767231200Smm  return (win_crypto_Update(ctx, indata, insize));
768231200Smm}
769231200Smm
770231200Smmstatic int
771231200Smm__archive_windowsapi_sha256final(archive_sha256_ctx *ctx, void *md)
772231200Smm{
773231200Smm  return (win_crypto_Final(md, 32, ctx));
774231200Smm}
775231200Smm
776231200Smm#else
777231200Smm
778231200Smmstatic int
779231200Smm__archive_stub_sha256init(archive_sha256_ctx *ctx)
780231200Smm{
781231200Smm	(void)ctx; /* UNUSED */
782231200Smm	return (ARCHIVE_FAILED);
783231200Smm}
784231200Smm
785231200Smmstatic int
786231200Smm__archive_stub_sha256update(archive_sha256_ctx *ctx, const void *indata,
787231200Smm    size_t insize)
788231200Smm{
789231200Smm	(void)ctx; /* UNUSED */
790231200Smm	(void)indata; /* UNUSED */
791231200Smm	(void)insize; /* UNUSED */
792231200Smm	return (ARCHIVE_FAILED);
793231200Smm}
794231200Smm
795231200Smmstatic int
796231200Smm__archive_stub_sha256final(archive_sha256_ctx *ctx, void *md)
797231200Smm{
798231200Smm	(void)ctx; /* UNUSED */
799231200Smm	(void)md; /* UNUSED */
800231200Smm	return (ARCHIVE_FAILED);
801231200Smm}
802231200Smm
803231200Smm#endif
804231200Smm
805231200Smm/* SHA384 implementations */
806231200Smm#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
807231200Smm
808231200Smmstatic int
809231200Smm__archive_libc_sha384init(archive_sha384_ctx *ctx)
810231200Smm{
811231200Smm  SHA384_Init(ctx);
812231200Smm  return (ARCHIVE_OK);
813231200Smm}
814231200Smm
815231200Smmstatic int
816231200Smm__archive_libc_sha384update(archive_sha384_ctx *ctx, const void *indata,
817231200Smm    size_t insize)
818231200Smm{
819231200Smm  SHA384_Update(ctx, indata, insize);
820231200Smm  return (ARCHIVE_OK);
821231200Smm}
822231200Smm
823231200Smmstatic int
824231200Smm__archive_libc_sha384final(archive_sha384_ctx *ctx, void *md)
825231200Smm{
826231200Smm  SHA384_Final(md, ctx);
827231200Smm  return (ARCHIVE_OK);
828231200Smm}
829231200Smm
830231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
831231200Smm
832231200Smmstatic int
833231200Smm__archive_libc2_sha384init(archive_sha384_ctx *ctx)
834231200Smm{
835231200Smm  SHA384Init(ctx);
836231200Smm  return (ARCHIVE_OK);
837231200Smm}
838231200Smm
839231200Smmstatic int
840231200Smm__archive_libc2_sha384update(archive_sha384_ctx *ctx, const void *indata,
841231200Smm    size_t insize)
842231200Smm{
843231200Smm  SHA384Update(ctx, indata, insize);
844231200Smm  return (ARCHIVE_OK);
845231200Smm}
846231200Smm
847231200Smmstatic int
848231200Smm__archive_libc2_sha384final(archive_sha384_ctx *ctx, void *md)
849231200Smm{
850231200Smm  SHA384Final(md, ctx);
851231200Smm  return (ARCHIVE_OK);
852231200Smm}
853231200Smm
854231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
855231200Smm
856231200Smmstatic int
857231200Smm__archive_libc3_sha384init(archive_sha384_ctx *ctx)
858231200Smm{
859231200Smm  SHA384Init(ctx);
860231200Smm  return (ARCHIVE_OK);
861231200Smm}
862231200Smm
863231200Smmstatic int
864231200Smm__archive_libc3_sha384update(archive_sha384_ctx *ctx, const void *indata,
865231200Smm    size_t insize)
866231200Smm{
867231200Smm  SHA384Update(ctx, indata, insize);
868231200Smm  return (ARCHIVE_OK);
869231200Smm}
870231200Smm
871231200Smmstatic int
872231200Smm__archive_libc3_sha384final(archive_sha384_ctx *ctx, void *md)
873231200Smm{
874231200Smm  SHA384Final(md, ctx);
875231200Smm  return (ARCHIVE_OK);
876231200Smm}
877231200Smm
878231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
879231200Smm
880231200Smmstatic int
881231200Smm__archive_libsystem_sha384init(archive_sha384_ctx *ctx)
882231200Smm{
883231200Smm  CC_SHA384_Init(ctx);
884231200Smm  return (ARCHIVE_OK);
885231200Smm}
886231200Smm
887231200Smmstatic int
888231200Smm__archive_libsystem_sha384update(archive_sha384_ctx *ctx, const void *indata,
889231200Smm    size_t insize)
890231200Smm{
891231200Smm  CC_SHA384_Update(ctx, indata, insize);
892231200Smm  return (ARCHIVE_OK);
893231200Smm}
894231200Smm
895231200Smmstatic int
896231200Smm__archive_libsystem_sha384final(archive_sha384_ctx *ctx, void *md)
897231200Smm{
898231200Smm  CC_SHA384_Final(md, ctx);
899231200Smm  return (ARCHIVE_OK);
900231200Smm}
901231200Smm
902231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
903231200Smm
904231200Smmstatic int
905231200Smm__archive_nettle_sha384init(archive_sha384_ctx *ctx)
906231200Smm{
907231200Smm  sha384_init(ctx);
908231200Smm  return (ARCHIVE_OK);
909231200Smm}
910231200Smm
911231200Smmstatic int
912231200Smm__archive_nettle_sha384update(archive_sha384_ctx *ctx, const void *indata,
913231200Smm    size_t insize)
914231200Smm{
915231200Smm  sha384_update(ctx, insize, indata);
916231200Smm  return (ARCHIVE_OK);
917231200Smm}
918231200Smm
919231200Smmstatic int
920231200Smm__archive_nettle_sha384final(archive_sha384_ctx *ctx, void *md)
921231200Smm{
922231200Smm  sha384_digest(ctx, SHA384_DIGEST_SIZE, md);
923231200Smm  return (ARCHIVE_OK);
924231200Smm}
925231200Smm
926231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
927231200Smm
928231200Smmstatic int
929231200Smm__archive_openssl_sha384init(archive_sha384_ctx *ctx)
930231200Smm{
931231200Smm  EVP_DigestInit(ctx, EVP_sha384());
932231200Smm  return (ARCHIVE_OK);
933231200Smm}
934231200Smm
935231200Smmstatic int
936231200Smm__archive_openssl_sha384update(archive_sha384_ctx *ctx, const void *indata,
937231200Smm    size_t insize)
938231200Smm{
939231200Smm  EVP_DigestUpdate(ctx, indata, insize);
940231200Smm  return (ARCHIVE_OK);
941231200Smm}
942231200Smm
943231200Smmstatic int
944231200Smm__archive_openssl_sha384final(archive_sha384_ctx *ctx, void *md)
945231200Smm{
946231200Smm  EVP_DigestFinal(ctx, md, NULL);
947231200Smm  return (ARCHIVE_OK);
948231200Smm}
949231200Smm
950231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
951231200Smm
952231200Smmstatic int
953231200Smm__archive_windowsapi_sha384init(archive_sha384_ctx *ctx)
954231200Smm{
955231200Smm  return (win_crypto_init(ctx, CALG_SHA_384));
956231200Smm}
957231200Smm
958231200Smmstatic int
959231200Smm__archive_windowsapi_sha384update(archive_sha384_ctx *ctx, const void *indata,
960231200Smm    size_t insize)
961231200Smm{
962231200Smm  return (win_crypto_Update(ctx, indata, insize));
963231200Smm}
964231200Smm
965231200Smmstatic int
966231200Smm__archive_windowsapi_sha384final(archive_sha384_ctx *ctx, void *md)
967231200Smm{
968231200Smm  return (win_crypto_Final(md, 48, ctx));
969231200Smm}
970231200Smm
971231200Smm#else
972231200Smm
973231200Smmstatic int
974231200Smm__archive_stub_sha384init(archive_sha384_ctx *ctx)
975231200Smm{
976231200Smm	(void)ctx; /* UNUSED */
977231200Smm	return (ARCHIVE_FAILED);
978231200Smm}
979231200Smm
980231200Smmstatic int
981231200Smm__archive_stub_sha384update(archive_sha384_ctx *ctx, const void *indata,
982231200Smm    size_t insize)
983231200Smm{
984231200Smm	(void)ctx; /* UNUSED */
985231200Smm	(void)indata; /* UNUSED */
986231200Smm	(void)insize; /* UNUSED */
987231200Smm	return (ARCHIVE_FAILED);
988231200Smm}
989231200Smm
990231200Smmstatic int
991231200Smm__archive_stub_sha384final(archive_sha384_ctx *ctx, void *md)
992231200Smm{
993231200Smm	(void)ctx; /* UNUSED */
994231200Smm	(void)md; /* UNUSED */
995231200Smm	return (ARCHIVE_FAILED);
996231200Smm}
997231200Smm
998231200Smm#endif
999231200Smm
1000231200Smm/* SHA512 implementations */
1001231200Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
1002231200Smm
1003231200Smmstatic int
1004231200Smm__archive_libc_sha512init(archive_sha512_ctx *ctx)
1005231200Smm{
1006231200Smm  SHA512_Init(ctx);
1007231200Smm  return (ARCHIVE_OK);
1008231200Smm}
1009231200Smm
1010231200Smmstatic int
1011231200Smm__archive_libc_sha512update(archive_sha512_ctx *ctx, const void *indata,
1012231200Smm    size_t insize)
1013231200Smm{
1014231200Smm  SHA512_Update(ctx, indata, insize);
1015231200Smm  return (ARCHIVE_OK);
1016231200Smm}
1017231200Smm
1018231200Smmstatic int
1019231200Smm__archive_libc_sha512final(archive_sha512_ctx *ctx, void *md)
1020231200Smm{
1021231200Smm  SHA512_Final(md, ctx);
1022231200Smm  return (ARCHIVE_OK);
1023231200Smm}
1024231200Smm
1025231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
1026231200Smm
1027231200Smmstatic int
1028231200Smm__archive_libc2_sha512init(archive_sha512_ctx *ctx)
1029231200Smm{
1030231200Smm  SHA512Init(ctx);
1031231200Smm  return (ARCHIVE_OK);
1032231200Smm}
1033231200Smm
1034231200Smmstatic int
1035231200Smm__archive_libc2_sha512update(archive_sha512_ctx *ctx, const void *indata,
1036231200Smm    size_t insize)
1037231200Smm{
1038231200Smm  SHA512Update(ctx, indata, insize);
1039231200Smm  return (ARCHIVE_OK);
1040231200Smm}
1041231200Smm
1042231200Smmstatic int
1043231200Smm__archive_libc2_sha512final(archive_sha512_ctx *ctx, void *md)
1044231200Smm{
1045231200Smm  SHA512Final(md, ctx);
1046231200Smm  return (ARCHIVE_OK);
1047231200Smm}
1048231200Smm
1049231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
1050231200Smm
1051231200Smmstatic int
1052231200Smm__archive_libc3_sha512init(archive_sha512_ctx *ctx)
1053231200Smm{
1054231200Smm  SHA512Init(ctx);
1055231200Smm  return (ARCHIVE_OK);
1056231200Smm}
1057231200Smm
1058231200Smmstatic int
1059231200Smm__archive_libc3_sha512update(archive_sha512_ctx *ctx, const void *indata,
1060231200Smm    size_t insize)
1061231200Smm{
1062231200Smm  SHA512Update(ctx, indata, insize);
1063231200Smm  return (ARCHIVE_OK);
1064231200Smm}
1065231200Smm
1066231200Smmstatic int
1067231200Smm__archive_libc3_sha512final(archive_sha512_ctx *ctx, void *md)
1068231200Smm{
1069231200Smm  SHA512Final(md, ctx);
1070231200Smm  return (ARCHIVE_OK);
1071231200Smm}
1072231200Smm
1073231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
1074231200Smm
1075231200Smmstatic int
1076231200Smm__archive_libmd_sha512init(archive_sha512_ctx *ctx)
1077231200Smm{
1078231200Smm  SHA512_Init(ctx);
1079231200Smm  return (ARCHIVE_OK);
1080231200Smm}
1081231200Smm
1082231200Smmstatic int
1083231200Smm__archive_libmd_sha512update(archive_sha512_ctx *ctx, const void *indata,
1084231200Smm    size_t insize)
1085231200Smm{
1086231200Smm  SHA512_Update(ctx, indata, insize);
1087231200Smm  return (ARCHIVE_OK);
1088231200Smm}
1089231200Smm
1090231200Smmstatic int
1091231200Smm__archive_libmd_sha512final(archive_sha512_ctx *ctx, void *md)
1092231200Smm{
1093231200Smm  SHA512_Final(md, ctx);
1094231200Smm  return (ARCHIVE_OK);
1095231200Smm}
1096231200Smm
1097231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
1098231200Smm
1099231200Smmstatic int
1100231200Smm__archive_libsystem_sha512init(archive_sha512_ctx *ctx)
1101231200Smm{
1102231200Smm  CC_SHA512_Init(ctx);
1103231200Smm  return (ARCHIVE_OK);
1104231200Smm}
1105231200Smm
1106231200Smmstatic int
1107231200Smm__archive_libsystem_sha512update(archive_sha512_ctx *ctx, const void *indata,
1108231200Smm    size_t insize)
1109231200Smm{
1110231200Smm  CC_SHA512_Update(ctx, indata, insize);
1111231200Smm  return (ARCHIVE_OK);
1112231200Smm}
1113231200Smm
1114231200Smmstatic int
1115231200Smm__archive_libsystem_sha512final(archive_sha512_ctx *ctx, void *md)
1116231200Smm{
1117231200Smm  CC_SHA512_Final(md, ctx);
1118231200Smm  return (ARCHIVE_OK);
1119231200Smm}
1120231200Smm
1121231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
1122231200Smm
1123231200Smmstatic int
1124231200Smm__archive_nettle_sha512init(archive_sha512_ctx *ctx)
1125231200Smm{
1126231200Smm  sha512_init(ctx);
1127231200Smm  return (ARCHIVE_OK);
1128231200Smm}
1129231200Smm
1130231200Smmstatic int
1131231200Smm__archive_nettle_sha512update(archive_sha512_ctx *ctx, const void *indata,
1132231200Smm    size_t insize)
1133231200Smm{
1134231200Smm  sha512_update(ctx, insize, indata);
1135231200Smm  return (ARCHIVE_OK);
1136231200Smm}
1137231200Smm
1138231200Smmstatic int
1139231200Smm__archive_nettle_sha512final(archive_sha512_ctx *ctx, void *md)
1140231200Smm{
1141231200Smm  sha512_digest(ctx, SHA512_DIGEST_SIZE, md);
1142231200Smm  return (ARCHIVE_OK);
1143231200Smm}
1144231200Smm
1145231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
1146231200Smm
1147231200Smmstatic int
1148231200Smm__archive_openssl_sha512init(archive_sha512_ctx *ctx)
1149231200Smm{
1150231200Smm  EVP_DigestInit(ctx, EVP_sha512());
1151231200Smm  return (ARCHIVE_OK);
1152231200Smm}
1153231200Smm
1154231200Smmstatic int
1155231200Smm__archive_openssl_sha512update(archive_sha512_ctx *ctx, const void *indata,
1156231200Smm    size_t insize)
1157231200Smm{
1158231200Smm  EVP_DigestUpdate(ctx, indata, insize);
1159231200Smm  return (ARCHIVE_OK);
1160231200Smm}
1161231200Smm
1162231200Smmstatic int
1163231200Smm__archive_openssl_sha512final(archive_sha512_ctx *ctx, void *md)
1164231200Smm{
1165231200Smm  EVP_DigestFinal(ctx, md, NULL);
1166231200Smm  return (ARCHIVE_OK);
1167231200Smm}
1168231200Smm
1169231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
1170231200Smm
1171231200Smmstatic int
1172231200Smm__archive_windowsapi_sha512init(archive_sha512_ctx *ctx)
1173231200Smm{
1174231200Smm  return (win_crypto_init(ctx, CALG_SHA_512));
1175231200Smm}
1176231200Smm
1177231200Smmstatic int
1178231200Smm__archive_windowsapi_sha512update(archive_sha512_ctx *ctx, const void *indata,
1179231200Smm    size_t insize)
1180231200Smm{
1181231200Smm  return (win_crypto_Update(ctx, indata, insize));
1182231200Smm}
1183231200Smm
1184231200Smmstatic int
1185231200Smm__archive_windowsapi_sha512final(archive_sha512_ctx *ctx, void *md)
1186231200Smm{
1187231200Smm  return (win_crypto_Final(md, 64, ctx));
1188231200Smm}
1189231200Smm
1190231200Smm#else
1191231200Smm
1192231200Smmstatic int
1193231200Smm__archive_stub_sha512init(archive_sha512_ctx *ctx)
1194231200Smm{
1195231200Smm	(void)ctx; /* UNUSED */
1196231200Smm	return (ARCHIVE_FAILED);
1197231200Smm}
1198231200Smm
1199231200Smmstatic int
1200231200Smm__archive_stub_sha512update(archive_sha512_ctx *ctx, const void *indata,
1201231200Smm    size_t insize)
1202231200Smm{
1203231200Smm	(void)ctx; /* UNUSED */
1204231200Smm	(void)indata; /* UNUSED */
1205231200Smm	(void)insize; /* UNUSED */
1206231200Smm	return (ARCHIVE_FAILED);
1207231200Smm}
1208231200Smm
1209231200Smmstatic int
1210231200Smm__archive_stub_sha512final(archive_sha512_ctx *ctx, void *md)
1211231200Smm{
1212231200Smm	(void)ctx; /* UNUSED */
1213231200Smm	(void)md; /* UNUSED */
1214231200Smm	return (ARCHIVE_FAILED);
1215231200Smm}
1216231200Smm
1217231200Smm#endif
1218231200Smm
1219231200Smm/* NOTE: Crypto functions are set based on availability and by the following
1220231200Smm * order of preference.
1221231200Smm * 1. libc
1222231200Smm * 2. libc2
1223231200Smm * 3. libc3
1224231200Smm * 4. libSystem
1225248616Smm * 5. Nettle
1226248616Smm * 6. OpenSSL
1227248616Smm * 7. libmd
1228248616Smm * 8. Windows API
1229231200Smm */
1230231200Smmconst struct archive_crypto __archive_crypto =
1231231200Smm{
1232231200Smm/* MD5 */
1233231200Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
1234231200Smm  &__archive_libc_md5init,
1235231200Smm  &__archive_libc_md5update,
1236231200Smm  &__archive_libc_md5final,
1237231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
1238231200Smm  &__archive_libmd_md5init,
1239231200Smm  &__archive_libmd_md5update,
1240231200Smm  &__archive_libmd_md5final,
1241231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
1242231200Smm  &__archive_libsystem_md5init,
1243231200Smm  &__archive_libsystem_md5update,
1244231200Smm  &__archive_libsystem_md5final,
1245231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
1246231200Smm  &__archive_nettle_md5init,
1247231200Smm  &__archive_nettle_md5update,
1248231200Smm  &__archive_nettle_md5final,
1249231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
1250231200Smm  &__archive_openssl_md5init,
1251231200Smm  &__archive_openssl_md5update,
1252231200Smm  &__archive_openssl_md5final,
1253231200Smm#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
1254231200Smm  &__archive_windowsapi_md5init,
1255231200Smm  &__archive_windowsapi_md5update,
1256231200Smm  &__archive_windowsapi_md5final,
1257231200Smm#elif !defined(ARCHIVE_MD5_COMPILE_TEST)
1258231200Smm  &__archive_stub_md5init,
1259231200Smm  &__archive_stub_md5update,
1260231200Smm  &__archive_stub_md5final,
1261231200Smm#endif
1262231200Smm
1263231200Smm/* RIPEMD160 */
1264231200Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
1265231200Smm  &__archive_libc_ripemd160init,
1266231200Smm  &__archive_libc_ripemd160update,
1267231200Smm  &__archive_libc_ripemd160final,
1268231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
1269231200Smm  &__archive_libmd_ripemd160init,
1270231200Smm  &__archive_libmd_ripemd160update,
1271231200Smm  &__archive_libmd_ripemd160final,
1272231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
1273231200Smm  &__archive_nettle_ripemd160init,
1274231200Smm  &__archive_nettle_ripemd160update,
1275231200Smm  &__archive_nettle_ripemd160final,
1276231200Smm#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
1277231200Smm  &__archive_openssl_ripemd160init,
1278231200Smm  &__archive_openssl_ripemd160update,
1279231200Smm  &__archive_openssl_ripemd160final,
1280231200Smm#elif !defined(ARCHIVE_RMD160_COMPILE_TEST)
1281231200Smm  &__archive_stub_ripemd160init,
1282231200Smm  &__archive_stub_ripemd160update,
1283231200Smm  &__archive_stub_ripemd160final,
1284231200Smm#endif
1285231200Smm
1286231200Smm/* SHA1 */
1287231200Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
1288231200Smm  &__archive_libc_sha1init,
1289231200Smm  &__archive_libc_sha1update,
1290231200Smm  &__archive_libc_sha1final,
1291231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
1292231200Smm  &__archive_libmd_sha1init,
1293231200Smm  &__archive_libmd_sha1update,
1294231200Smm  &__archive_libmd_sha1final,
1295231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
1296231200Smm  &__archive_libsystem_sha1init,
1297231200Smm  &__archive_libsystem_sha1update,
1298231200Smm  &__archive_libsystem_sha1final,
1299231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
1300231200Smm  &__archive_nettle_sha1init,
1301231200Smm  &__archive_nettle_sha1update,
1302231200Smm  &__archive_nettle_sha1final,
1303231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
1304231200Smm  &__archive_openssl_sha1init,
1305231200Smm  &__archive_openssl_sha1update,
1306231200Smm  &__archive_openssl_sha1final,
1307231200Smm#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
1308231200Smm  &__archive_windowsapi_sha1init,
1309231200Smm  &__archive_windowsapi_sha1update,
1310231200Smm  &__archive_windowsapi_sha1final,
1311231200Smm#elif !defined(ARCHIVE_SHA1_COMPILE_TEST)
1312231200Smm  &__archive_stub_sha1init,
1313231200Smm  &__archive_stub_sha1update,
1314231200Smm  &__archive_stub_sha1final,
1315231200Smm#endif
1316231200Smm
1317231200Smm/* SHA256 */
1318231200Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
1319231200Smm  &__archive_libc_sha256init,
1320231200Smm  &__archive_libc_sha256update,
1321231200Smm  &__archive_libc_sha256final,
1322231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
1323231200Smm  &__archive_libc2_sha256init,
1324231200Smm  &__archive_libc2_sha256update,
1325231200Smm  &__archive_libc2_sha256final,
1326231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
1327231200Smm  &__archive_libc3_sha256init,
1328231200Smm  &__archive_libc3_sha256update,
1329231200Smm  &__archive_libc3_sha256final,
1330231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
1331231200Smm  &__archive_libmd_sha256init,
1332231200Smm  &__archive_libmd_sha256update,
1333231200Smm  &__archive_libmd_sha256final,
1334231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
1335231200Smm  &__archive_libsystem_sha256init,
1336231200Smm  &__archive_libsystem_sha256update,
1337231200Smm  &__archive_libsystem_sha256final,
1338231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
1339231200Smm  &__archive_nettle_sha256init,
1340231200Smm  &__archive_nettle_sha256update,
1341231200Smm  &__archive_nettle_sha256final,
1342231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
1343231200Smm  &__archive_openssl_sha256init,
1344231200Smm  &__archive_openssl_sha256update,
1345231200Smm  &__archive_openssl_sha256final,
1346231200Smm#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
1347231200Smm  &__archive_windowsapi_sha256init,
1348231200Smm  &__archive_windowsapi_sha256update,
1349231200Smm  &__archive_windowsapi_sha256final,
1350231200Smm#elif !defined(ARCHIVE_SHA256_COMPILE_TEST)
1351231200Smm  &__archive_stub_sha256init,
1352231200Smm  &__archive_stub_sha256update,
1353231200Smm  &__archive_stub_sha256final,
1354231200Smm#endif
1355231200Smm
1356231200Smm/* SHA384 */
1357231200Smm#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
1358231200Smm  &__archive_libc_sha384init,
1359231200Smm  &__archive_libc_sha384update,
1360231200Smm  &__archive_libc_sha384final,
1361231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
1362231200Smm  &__archive_libc2_sha384init,
1363231200Smm  &__archive_libc2_sha384update,
1364231200Smm  &__archive_libc2_sha384final,
1365231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
1366231200Smm  &__archive_libc3_sha384init,
1367231200Smm  &__archive_libc3_sha384update,
1368231200Smm  &__archive_libc3_sha384final,
1369231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
1370231200Smm  &__archive_libsystem_sha384init,
1371231200Smm  &__archive_libsystem_sha384update,
1372231200Smm  &__archive_libsystem_sha384final,
1373231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
1374231200Smm  &__archive_nettle_sha384init,
1375231200Smm  &__archive_nettle_sha384update,
1376231200Smm  &__archive_nettle_sha384final,
1377231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
1378231200Smm  &__archive_openssl_sha384init,
1379231200Smm  &__archive_openssl_sha384update,
1380231200Smm  &__archive_openssl_sha384final,
1381231200Smm#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
1382231200Smm  &__archive_windowsapi_sha384init,
1383231200Smm  &__archive_windowsapi_sha384update,
1384231200Smm  &__archive_windowsapi_sha384final,
1385231200Smm#elif !defined(ARCHIVE_SHA384_COMPILE_TEST)
1386231200Smm  &__archive_stub_sha384init,
1387231200Smm  &__archive_stub_sha384update,
1388231200Smm  &__archive_stub_sha384final,
1389231200Smm#endif
1390231200Smm
1391231200Smm/* SHA512 */
1392231200Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
1393231200Smm  &__archive_libc_sha512init,
1394231200Smm  &__archive_libc_sha512update,
1395231200Smm  &__archive_libc_sha512final
1396231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
1397231200Smm  &__archive_libc2_sha512init,
1398231200Smm  &__archive_libc2_sha512update,
1399231200Smm  &__archive_libc2_sha512final
1400231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
1401231200Smm  &__archive_libc3_sha512init,
1402231200Smm  &__archive_libc3_sha512update,
1403231200Smm  &__archive_libc3_sha512final
1404231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
1405231200Smm  &__archive_libmd_sha512init,
1406231200Smm  &__archive_libmd_sha512update,
1407231200Smm  &__archive_libmd_sha512final
1408231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
1409231200Smm  &__archive_libsystem_sha512init,
1410231200Smm  &__archive_libsystem_sha512update,
1411231200Smm  &__archive_libsystem_sha512final
1412231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
1413231200Smm  &__archive_nettle_sha512init,
1414231200Smm  &__archive_nettle_sha512update,
1415231200Smm  &__archive_nettle_sha512final,
1416231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
1417231200Smm  &__archive_openssl_sha512init,
1418231200Smm  &__archive_openssl_sha512update,
1419231200Smm  &__archive_openssl_sha512final
1420231200Smm#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
1421231200Smm  &__archive_windowsapi_sha512init,
1422231200Smm  &__archive_windowsapi_sha512update,
1423231200Smm  &__archive_windowsapi_sha512final
1424231200Smm#elif !defined(ARCHIVE_SHA512_COMPILE_TEST)
1425231200Smm  &__archive_stub_sha512init,
1426231200Smm  &__archive_stub_sha512update,
1427231200Smm  &__archive_stub_sha512final
1428231200Smm#endif
1429231200Smm};
1430