1299425Smm/*-
2299425Smm* Copyright (c) 2003-2007 Tim Kientzle
3299425Smm* Copyright (c) 2011 Andres Mejia
4299425Smm* Copyright (c) 2011 Michihiro NAKAJIMA
5299425Smm* All rights reserved.
6299425Smm*
7299425Smm* Redistribution and use in source and binary forms, with or without
8299425Smm* modification, are permitted provided that the following conditions
9299425Smm* are met:
10299425Smm* 1. Redistributions of source code must retain the above copyright
11299425Smm*    notice, this list of conditions and the following disclaimer.
12299425Smm* 2. Redistributions in binary form must reproduce the above copyright
13299425Smm*    notice, this list of conditions and the following disclaimer in the
14299425Smm*    documentation and/or other materials provided with the distribution.
15299425Smm*
16299425Smm* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
17299425Smm* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18299425Smm* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19299425Smm* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
20299425Smm* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21299425Smm* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22299425Smm* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23299425Smm* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24299425Smm* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25299425Smm* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26299425Smm*/
27299425Smm
28299425Smm#include "archive_platform.h"
29299425Smm
30299425Smm#include "archive.h"
31299425Smm#include "archive_digest_private.h"
32299425Smm
33299425Smm/* In particular, force the configure probe to break if it tries
34299425Smm * to test a combination of OpenSSL and libmd. */
35299425Smm#if defined(ARCHIVE_CRYPTO_OPENSSL) && defined(ARCHIVE_CRYPTO_LIBMD)
36299425Smm#error Cannot use both OpenSSL and libmd.
37299425Smm#endif
38299425Smm
39299425Smm/*
40299425Smm * Message digest functions for Windows platform.
41299425Smm */
42299425Smm#if defined(ARCHIVE_CRYPTO_MD5_WIN)    ||\
43299425Smm	defined(ARCHIVE_CRYPTO_SHA1_WIN)   ||\
44299425Smm	defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
45299425Smm	defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
46299425Smm	defined(ARCHIVE_CRYPTO_SHA512_WIN)
47299425Smm
48299425Smm/*
49299425Smm * Initialize a Message digest.
50299425Smm */
51299425Smmstatic int
52299425Smmwin_crypto_init(Digest_CTX *ctx, ALG_ID algId)
53299425Smm{
54299425Smm
55299425Smm	ctx->valid = 0;
56299425Smm	if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,
57299425Smm	    PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
58299425Smm		if (GetLastError() != (DWORD)NTE_BAD_KEYSET)
59299425Smm			return (ARCHIVE_FAILED);
60299425Smm		if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,
61299425Smm		    PROV_RSA_FULL, CRYPT_NEWKEYSET))
62299425Smm			return (ARCHIVE_FAILED);
63299425Smm	}
64299425Smm
65299425Smm	if (!CryptCreateHash(ctx->cryptProv, algId, 0, 0, &ctx->hash)) {
66299425Smm		CryptReleaseContext(ctx->cryptProv, 0);
67299425Smm		return (ARCHIVE_FAILED);
68299425Smm	}
69299425Smm
70299425Smm	ctx->valid = 1;
71299425Smm	return (ARCHIVE_OK);
72299425Smm}
73299425Smm
74299425Smm/*
75299425Smm * Update a Message digest.
76299425Smm */
77299425Smmstatic int
78299425Smmwin_crypto_Update(Digest_CTX *ctx, const unsigned char *buf, size_t len)
79299425Smm{
80299425Smm
81299425Smm	if (!ctx->valid)
82299425Smm		return (ARCHIVE_FAILED);
83299425Smm
84299425Smm	CryptHashData(ctx->hash,
85299425Smm		      (unsigned char *)(uintptr_t)buf,
86299425Smm		      (DWORD)len, 0);
87299425Smm	return (ARCHIVE_OK);
88299425Smm}
89299425Smm
90299425Smmstatic int
91299425Smmwin_crypto_Final(unsigned char *buf, size_t bufsize, Digest_CTX *ctx)
92299425Smm{
93299425Smm	DWORD siglen = (DWORD)bufsize;
94299425Smm
95299425Smm	if (!ctx->valid)
96299425Smm		return (ARCHIVE_FAILED);
97299425Smm
98299425Smm	CryptGetHashParam(ctx->hash, HP_HASHVAL, buf, &siglen, 0);
99299425Smm	CryptDestroyHash(ctx->hash);
100299425Smm	CryptReleaseContext(ctx->cryptProv, 0);
101299425Smm	ctx->valid = 0;
102299425Smm	return (ARCHIVE_OK);
103299425Smm}
104299425Smm
105299425Smm#endif /* defined(ARCHIVE_CRYPTO_*_WIN) */
106299425Smm
107299425Smm
108299425Smm/* MD5 implementations */
109299425Smm#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
110299425Smm
111299425Smmstatic int
112362133Smm__archive_md5init(archive_md5_ctx *ctx)
113299425Smm{
114299425Smm  MD5Init(ctx);
115299425Smm  return (ARCHIVE_OK);
116299425Smm}
117299425Smm
118299425Smmstatic int
119362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
120299425Smm    size_t insize)
121299425Smm{
122299425Smm  MD5Update(ctx, indata, insize);
123299425Smm  return (ARCHIVE_OK);
124299425Smm}
125299425Smm
126299425Smmstatic int
127362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
128299425Smm{
129299425Smm  MD5Final(md, ctx);
130299425Smm  return (ARCHIVE_OK);
131299425Smm}
132299425Smm
133299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
134299425Smm
135299425Smmstatic int
136362133Smm__archive_md5init(archive_md5_ctx *ctx)
137299425Smm{
138299425Smm  MD5Init(ctx);
139299425Smm  return (ARCHIVE_OK);
140299425Smm}
141299425Smm
142299425Smmstatic int
143362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
144299425Smm    size_t insize)
145299425Smm{
146299425Smm  MD5Update(ctx, indata, insize);
147299425Smm  return (ARCHIVE_OK);
148299425Smm}
149299425Smm
150299425Smmstatic int
151362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
152299425Smm{
153299425Smm  MD5Final(md, ctx);
154299425Smm  return (ARCHIVE_OK);
155299425Smm}
156299425Smm
157299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
158299425Smm
159299425Smmstatic int
160362133Smm__archive_md5init(archive_md5_ctx *ctx)
161299425Smm{
162299425Smm  CC_MD5_Init(ctx);
163299425Smm  return (ARCHIVE_OK);
164299425Smm}
165299425Smm
166299425Smmstatic int
167362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
168299425Smm    size_t insize)
169299425Smm{
170299425Smm  CC_MD5_Update(ctx, indata, insize);
171299425Smm  return (ARCHIVE_OK);
172299425Smm}
173299425Smm
174299425Smmstatic int
175362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
176299425Smm{
177299425Smm  CC_MD5_Final(md, ctx);
178299425Smm  return (ARCHIVE_OK);
179299425Smm}
180299425Smm
181358088Smm#elif defined(ARCHIVE_CRYPTO_MD5_MBEDTLS)
182358088Smm
183358088Smmstatic int
184362133Smm__archive_md5init(archive_md5_ctx *ctx)
185358088Smm{
186358088Smm  mbedtls_md5_init(ctx);
187358088Smm  if (mbedtls_md5_starts_ret(ctx) == 0)
188358088Smm    return (ARCHIVE_OK);
189358088Smm  else
190358088Smm    return (ARCHIVE_FATAL);
191358088Smm}
192358088Smm
193358088Smmstatic int
194362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
195358088Smm    size_t insize)
196358088Smm{
197358088Smm  if (mbedtls_md5_update_ret(ctx, indata, insize) == 0)
198358088Smm    return (ARCHIVE_OK);
199358088Smm  else
200358088Smm    return (ARCHIVE_FATAL);
201358088Smm}
202358088Smm
203358088Smmstatic int
204362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
205358088Smm{
206358088Smm  if (mbedtls_md5_finish_ret(ctx, md) == 0) {
207358088Smm    mbedtls_md5_free(ctx);
208358088Smm    return (ARCHIVE_OK);
209358088Smm  } else {
210358088Smm    mbedtls_md5_free(ctx);
211358088Smm    return (ARCHIVE_FATAL);
212358088Smm  }
213358088Smm}
214358088Smm
215299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
216299425Smm
217299425Smmstatic int
218362133Smm__archive_md5init(archive_md5_ctx *ctx)
219299425Smm{
220299425Smm  md5_init(ctx);
221299425Smm  return (ARCHIVE_OK);
222299425Smm}
223299425Smm
224299425Smmstatic int
225362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
226299425Smm    size_t insize)
227299425Smm{
228299425Smm  md5_update(ctx, insize, indata);
229299425Smm  return (ARCHIVE_OK);
230299425Smm}
231299425Smm
232299425Smmstatic int
233362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
234299425Smm{
235299425Smm  md5_digest(ctx, MD5_DIGEST_SIZE, md);
236299425Smm  return (ARCHIVE_OK);
237299425Smm}
238299425Smm
239299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
240299425Smm
241299425Smmstatic int
242362133Smm__archive_md5init(archive_md5_ctx *ctx)
243299425Smm{
244311041Smm  if ((*ctx = EVP_MD_CTX_new()) == NULL)
245311041Smm	return (ARCHIVE_FAILED);
246311041Smm  EVP_DigestInit(*ctx, EVP_md5());
247299425Smm  return (ARCHIVE_OK);
248299425Smm}
249299425Smm
250299425Smmstatic int
251362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
252299425Smm    size_t insize)
253299425Smm{
254311041Smm  EVP_DigestUpdate(*ctx, indata, insize);
255299425Smm  return (ARCHIVE_OK);
256299425Smm}
257299425Smm
258299425Smmstatic int
259362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
260299425Smm{
261299425Smm  /* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so
262299425Smm   * this is meant to cope with that. Real fix is probably to fix
263299425Smm   * archive_write_set_format_xar.c
264299425Smm   */
265311041Smm  if (*ctx) {
266311041Smm    EVP_DigestFinal(*ctx, md, NULL);
267311041Smm    EVP_MD_CTX_free(*ctx);
268311041Smm    *ctx = NULL;
269311041Smm  }
270299425Smm  return (ARCHIVE_OK);
271299425Smm}
272299425Smm
273299425Smm#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
274299425Smm
275299425Smmstatic int
276362133Smm__archive_md5init(archive_md5_ctx *ctx)
277299425Smm{
278299425Smm  return (win_crypto_init(ctx, CALG_MD5));
279299425Smm}
280299425Smm
281299425Smmstatic int
282362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
283299425Smm    size_t insize)
284299425Smm{
285299425Smm  return (win_crypto_Update(ctx, indata, insize));
286299425Smm}
287299425Smm
288299425Smmstatic int
289362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
290299425Smm{
291299425Smm  return (win_crypto_Final(md, 16, ctx));
292299425Smm}
293299425Smm
294299425Smm#else
295299425Smm
296299425Smmstatic int
297362133Smm__archive_md5init(archive_md5_ctx *ctx)
298299425Smm{
299299425Smm	(void)ctx; /* UNUSED */
300299425Smm	return (ARCHIVE_FAILED);
301299425Smm}
302299425Smm
303299425Smmstatic int
304362133Smm__archive_md5update(archive_md5_ctx *ctx, const void *indata,
305299425Smm    size_t insize)
306299425Smm{
307299425Smm	(void)ctx; /* UNUSED */
308299425Smm	(void)indata; /* UNUSED */
309299425Smm	(void)insize; /* UNUSED */
310299425Smm	return (ARCHIVE_FAILED);
311299425Smm}
312299425Smm
313299425Smmstatic int
314362133Smm__archive_md5final(archive_md5_ctx *ctx, void *md)
315299425Smm{
316299425Smm	(void)ctx; /* UNUSED */
317299425Smm	(void)md; /* UNUSED */
318299425Smm	return (ARCHIVE_FAILED);
319299425Smm}
320299425Smm
321299425Smm#endif
322299425Smm
323299425Smm/* RIPEMD160 implementations */
324299425Smm#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
325299425Smm
326299425Smmstatic int
327362133Smm__archive_ripemd160init(archive_rmd160_ctx *ctx)
328299425Smm{
329299425Smm  RMD160Init(ctx);
330299425Smm  return (ARCHIVE_OK);
331299425Smm}
332299425Smm
333299425Smmstatic int
334362133Smm__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
335299425Smm    size_t insize)
336299425Smm{
337299425Smm  RMD160Update(ctx, indata, insize);
338299425Smm  return (ARCHIVE_OK);
339299425Smm}
340299425Smm
341299425Smmstatic int
342362133Smm__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)
343299425Smm{
344299425Smm  RMD160Final(md, ctx);
345299425Smm  return (ARCHIVE_OK);
346299425Smm}
347299425Smm
348299425Smm#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
349299425Smm
350299425Smmstatic int
351362133Smm__archive_ripemd160init(archive_rmd160_ctx *ctx)
352299425Smm{
353299425Smm  RIPEMD160_Init(ctx);
354299425Smm  return (ARCHIVE_OK);
355299425Smm}
356299425Smm
357299425Smmstatic int
358362133Smm__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
359299425Smm    size_t insize)
360299425Smm{
361299425Smm  RIPEMD160_Update(ctx, indata, insize);
362299425Smm  return (ARCHIVE_OK);
363299425Smm}
364299425Smm
365299425Smmstatic int
366362133Smm__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)
367299425Smm{
368299425Smm  RIPEMD160_Final(md, ctx);
369299425Smm  return (ARCHIVE_OK);
370299425Smm}
371299425Smm
372358088Smm#elif defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS)
373358088Smm
374358088Smmstatic int
375362133Smm__archive_ripemd160init(archive_rmd160_ctx *ctx)
376358088Smm{
377358088Smm  mbedtls_ripemd160_init(ctx);
378358088Smm  if (mbedtls_ripemd160_starts_ret(ctx) == 0)
379358088Smm    return (ARCHIVE_OK);
380358088Smm  else
381358088Smm    return (ARCHIVE_FATAL);
382358088Smm}
383358088Smm
384358088Smmstatic int
385362133Smm__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
386358088Smm    size_t insize)
387358088Smm{
388358088Smm  if (mbedtls_ripemd160_update_ret(ctx, indata, insize) == 0)
389358088Smm    return (ARCHIVE_OK);
390358088Smm  else
391358088Smm    return (ARCHIVE_FATAL);
392358088Smm}
393358088Smm
394358088Smmstatic int
395362133Smm__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)
396358088Smm{
397358088Smm  if (mbedtls_ripemd160_finish_ret(ctx, md) == 0) {
398358088Smm    mbedtls_ripemd160_free(ctx);
399358088Smm    return (ARCHIVE_OK);
400358088Smm  } else {
401358088Smm    mbedtls_ripemd160_free(ctx);
402358088Smm    return (ARCHIVE_FATAL);
403358088Smm  }
404358088Smm}
405358088Smm
406299425Smm#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
407299425Smm
408299425Smmstatic int
409362133Smm__archive_ripemd160init(archive_rmd160_ctx *ctx)
410299425Smm{
411299425Smm  ripemd160_init(ctx);
412299425Smm  return (ARCHIVE_OK);
413299425Smm}
414299425Smm
415299425Smmstatic int
416362133Smm__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
417299425Smm    size_t insize)
418299425Smm{
419299425Smm  ripemd160_update(ctx, insize, indata);
420299425Smm  return (ARCHIVE_OK);
421299425Smm}
422299425Smm
423299425Smmstatic int
424362133Smm__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)
425299425Smm{
426299425Smm  ripemd160_digest(ctx, RIPEMD160_DIGEST_SIZE, md);
427299425Smm  return (ARCHIVE_OK);
428299425Smm}
429299425Smm
430299425Smm#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
431299425Smm
432299425Smmstatic int
433362133Smm__archive_ripemd160init(archive_rmd160_ctx *ctx)
434299425Smm{
435311041Smm  if ((*ctx = EVP_MD_CTX_new()) == NULL)
436311041Smm	return (ARCHIVE_FAILED);
437311041Smm  EVP_DigestInit(*ctx, EVP_ripemd160());
438299425Smm  return (ARCHIVE_OK);
439299425Smm}
440299425Smm
441299425Smmstatic int
442362133Smm__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
443299425Smm    size_t insize)
444299425Smm{
445311041Smm  EVP_DigestUpdate(*ctx, indata, insize);
446299425Smm  return (ARCHIVE_OK);
447299425Smm}
448299425Smm
449299425Smmstatic int
450362133Smm__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)
451299425Smm{
452311041Smm  if (*ctx) {
453311041Smm    EVP_DigestFinal(*ctx, md, NULL);
454311041Smm    EVP_MD_CTX_free(*ctx);
455311041Smm    *ctx = NULL;
456311041Smm  }
457299425Smm  return (ARCHIVE_OK);
458299425Smm}
459299425Smm
460299425Smm#else
461299425Smm
462299425Smmstatic int
463362133Smm__archive_ripemd160init(archive_rmd160_ctx *ctx)
464299425Smm{
465299425Smm	(void)ctx; /* UNUSED */
466299425Smm	return (ARCHIVE_FAILED);
467299425Smm}
468299425Smm
469299425Smmstatic int
470362133Smm__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,
471299425Smm    size_t insize)
472299425Smm{
473299425Smm	(void)ctx; /* UNUSED */
474299425Smm	(void)indata; /* UNUSED */
475299425Smm	(void)insize; /* UNUSED */
476299425Smm	return (ARCHIVE_FAILED);
477299425Smm}
478299425Smm
479299425Smmstatic int
480362133Smm__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)
481299425Smm{
482299425Smm	(void)ctx; /* UNUSED */
483299425Smm	(void)md; /* UNUSED */
484299425Smm	return (ARCHIVE_FAILED);
485299425Smm}
486299425Smm
487299425Smm#endif
488299425Smm
489299425Smm/* SHA1 implementations */
490299425Smm#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
491299425Smm
492299425Smmstatic int
493362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
494299425Smm{
495299425Smm  SHA1Init(ctx);
496299425Smm  return (ARCHIVE_OK);
497299425Smm}
498299425Smm
499299425Smmstatic int
500362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
501299425Smm    size_t insize)
502299425Smm{
503299425Smm  SHA1Update(ctx, indata, insize);
504299425Smm  return (ARCHIVE_OK);
505299425Smm}
506299425Smm
507299425Smmstatic int
508362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
509299425Smm{
510299425Smm  SHA1Final(md, ctx);
511299425Smm  return (ARCHIVE_OK);
512299425Smm}
513299425Smm
514299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
515299425Smm
516299425Smmstatic int
517362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
518299425Smm{
519299425Smm  SHA1_Init(ctx);
520299425Smm  return (ARCHIVE_OK);
521299425Smm}
522299425Smm
523299425Smmstatic int
524362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
525299425Smm    size_t insize)
526299425Smm{
527299425Smm  SHA1_Update(ctx, indata, insize);
528299425Smm  return (ARCHIVE_OK);
529299425Smm}
530299425Smm
531299425Smmstatic int
532362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
533299425Smm{
534299425Smm  SHA1_Final(md, ctx);
535299425Smm  return (ARCHIVE_OK);
536299425Smm}
537299425Smm
538299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
539299425Smm
540299425Smmstatic int
541362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
542299425Smm{
543299425Smm  CC_SHA1_Init(ctx);
544299425Smm  return (ARCHIVE_OK);
545299425Smm}
546299425Smm
547299425Smmstatic int
548362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
549299425Smm    size_t insize)
550299425Smm{
551299425Smm  CC_SHA1_Update(ctx, indata, insize);
552299425Smm  return (ARCHIVE_OK);
553299425Smm}
554299425Smm
555299425Smmstatic int
556362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
557299425Smm{
558299425Smm  CC_SHA1_Final(md, ctx);
559299425Smm  return (ARCHIVE_OK);
560299425Smm}
561299425Smm
562358088Smm#elif defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS)
563358088Smm
564358088Smmstatic int
565362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
566358088Smm{
567358088Smm  mbedtls_sha1_init(ctx);
568358088Smm  if (mbedtls_sha1_starts_ret(ctx) == 0)
569358088Smm    return (ARCHIVE_OK);
570358088Smm  else
571358088Smm    return (ARCHIVE_FATAL);
572358088Smm}
573358088Smm
574358088Smmstatic int
575362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
576358088Smm    size_t insize)
577358088Smm{
578358088Smm  if (mbedtls_sha1_update_ret(ctx, indata, insize) == 0)
579358088Smm    return (ARCHIVE_OK);
580358088Smm  else
581358088Smm    return (ARCHIVE_FATAL);
582358088Smm}
583358088Smm
584358088Smmstatic int
585362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
586358088Smm{
587358088Smm  if (mbedtls_sha1_finish_ret(ctx, md) == 0) {
588358088Smm    mbedtls_sha1_free(ctx);
589358088Smm    return (ARCHIVE_OK);
590358088Smm  } else {
591358088Smm    mbedtls_sha1_free(ctx);
592358088Smm    return (ARCHIVE_FATAL);
593358088Smm  }
594358088Smm}
595358088Smm
596299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
597299425Smm
598299425Smmstatic int
599362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
600299425Smm{
601299425Smm  sha1_init(ctx);
602299425Smm  return (ARCHIVE_OK);
603299425Smm}
604299425Smm
605299425Smmstatic int
606362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
607299425Smm    size_t insize)
608299425Smm{
609299425Smm  sha1_update(ctx, insize, indata);
610299425Smm  return (ARCHIVE_OK);
611299425Smm}
612299425Smm
613299425Smmstatic int
614362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
615299425Smm{
616299425Smm  sha1_digest(ctx, SHA1_DIGEST_SIZE, md);
617299425Smm  return (ARCHIVE_OK);
618299425Smm}
619299425Smm
620299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
621299425Smm
622299425Smmstatic int
623362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
624299425Smm{
625311041Smm  if ((*ctx = EVP_MD_CTX_new()) == NULL)
626311041Smm	return (ARCHIVE_FAILED);
627311041Smm  EVP_DigestInit(*ctx, EVP_sha1());
628299425Smm  return (ARCHIVE_OK);
629299425Smm}
630299425Smm
631299425Smmstatic int
632362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
633299425Smm    size_t insize)
634299425Smm{
635311041Smm  EVP_DigestUpdate(*ctx, indata, insize);
636299425Smm  return (ARCHIVE_OK);
637299425Smm}
638299425Smm
639299425Smmstatic int
640362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
641299425Smm{
642299425Smm  /* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so
643299425Smm   * this is meant to cope with that. Real fix is probably to fix
644299425Smm   * archive_write_set_format_xar.c
645299425Smm   */
646311041Smm  if (*ctx) {
647311041Smm    EVP_DigestFinal(*ctx, md, NULL);
648311041Smm    EVP_MD_CTX_free(*ctx);
649311041Smm    *ctx = NULL;
650311041Smm  }
651299425Smm  return (ARCHIVE_OK);
652299425Smm}
653299425Smm
654299425Smm#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
655299425Smm
656299425Smmstatic int
657362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
658299425Smm{
659299425Smm  return (win_crypto_init(ctx, CALG_SHA1));
660299425Smm}
661299425Smm
662299425Smmstatic int
663362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
664299425Smm    size_t insize)
665299425Smm{
666299425Smm  return (win_crypto_Update(ctx, indata, insize));
667299425Smm}
668299425Smm
669299425Smmstatic int
670362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
671299425Smm{
672299425Smm  return (win_crypto_Final(md, 20, ctx));
673299425Smm}
674299425Smm
675299425Smm#else
676299425Smm
677299425Smmstatic int
678362133Smm__archive_sha1init(archive_sha1_ctx *ctx)
679299425Smm{
680299425Smm	(void)ctx; /* UNUSED */
681299425Smm	return (ARCHIVE_FAILED);
682299425Smm}
683299425Smm
684299425Smmstatic int
685362133Smm__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,
686299425Smm    size_t insize)
687299425Smm{
688299425Smm	(void)ctx; /* UNUSED */
689299425Smm	(void)indata; /* UNUSED */
690299425Smm	(void)insize; /* UNUSED */
691299425Smm	return (ARCHIVE_FAILED);
692299425Smm}
693299425Smm
694299425Smmstatic int
695362133Smm__archive_sha1final(archive_sha1_ctx *ctx, void *md)
696299425Smm{
697299425Smm	(void)ctx; /* UNUSED */
698299425Smm	(void)md; /* UNUSED */
699299425Smm	return (ARCHIVE_FAILED);
700299425Smm}
701299425Smm
702299425Smm#endif
703299425Smm
704299425Smm/* SHA256 implementations */
705299425Smm#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
706299425Smm
707299425Smmstatic int
708362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
709299425Smm{
710299425Smm  SHA256_Init(ctx);
711299425Smm  return (ARCHIVE_OK);
712299425Smm}
713299425Smm
714299425Smmstatic int
715362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
716299425Smm    size_t insize)
717299425Smm{
718299425Smm  SHA256_Update(ctx, indata, insize);
719299425Smm  return (ARCHIVE_OK);
720299425Smm}
721299425Smm
722299425Smmstatic int
723362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
724299425Smm{
725299425Smm  SHA256_Final(md, ctx);
726299425Smm  return (ARCHIVE_OK);
727299425Smm}
728299425Smm
729299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
730299425Smm
731299425Smmstatic int
732362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
733299425Smm{
734299425Smm  SHA256Init(ctx);
735299425Smm  return (ARCHIVE_OK);
736299425Smm}
737299425Smm
738299425Smmstatic int
739362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
740299425Smm    size_t insize)
741299425Smm{
742299425Smm  SHA256Update(ctx, indata, insize);
743299425Smm  return (ARCHIVE_OK);
744299425Smm}
745299425Smm
746299425Smmstatic int
747362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
748299425Smm{
749299425Smm  SHA256Final(md, ctx);
750299425Smm  return (ARCHIVE_OK);
751299425Smm}
752299425Smm
753299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
754299425Smm
755299425Smmstatic int
756362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
757299425Smm{
758299425Smm  SHA256Init(ctx);
759299425Smm  return (ARCHIVE_OK);
760299425Smm}
761299425Smm
762299425Smmstatic int
763362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
764299425Smm    size_t insize)
765299425Smm{
766299425Smm  SHA256Update(ctx, indata, insize);
767299425Smm  return (ARCHIVE_OK);
768299425Smm}
769299425Smm
770299425Smmstatic int
771362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
772299425Smm{
773299425Smm  SHA256Final(md, ctx);
774299425Smm  return (ARCHIVE_OK);
775299425Smm}
776299425Smm
777299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
778299425Smm
779299425Smmstatic int
780362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
781299425Smm{
782299425Smm  SHA256_Init(ctx);
783299425Smm  return (ARCHIVE_OK);
784299425Smm}
785299425Smm
786299425Smmstatic int
787362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
788299425Smm    size_t insize)
789299425Smm{
790299425Smm  SHA256_Update(ctx, indata, insize);
791299425Smm  return (ARCHIVE_OK);
792299425Smm}
793299425Smm
794299425Smmstatic int
795362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
796299425Smm{
797299425Smm  SHA256_Final(md, ctx);
798299425Smm  return (ARCHIVE_OK);
799299425Smm}
800299425Smm
801299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
802299425Smm
803299425Smmstatic int
804362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
805299425Smm{
806299425Smm  CC_SHA256_Init(ctx);
807299425Smm  return (ARCHIVE_OK);
808299425Smm}
809299425Smm
810299425Smmstatic int
811362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
812299425Smm    size_t insize)
813299425Smm{
814299425Smm  CC_SHA256_Update(ctx, indata, insize);
815299425Smm  return (ARCHIVE_OK);
816299425Smm}
817299425Smm
818299425Smmstatic int
819362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
820299425Smm{
821299425Smm  CC_SHA256_Final(md, ctx);
822299425Smm  return (ARCHIVE_OK);
823299425Smm}
824299425Smm
825358088Smm#elif defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS)
826358088Smm
827358088Smmstatic int
828362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
829358088Smm{
830358088Smm  mbedtls_sha256_init(ctx);
831358088Smm  if (mbedtls_sha256_starts_ret(ctx, 0) == 0)
832358088Smm    return (ARCHIVE_OK);
833358088Smm  else
834358088Smm    return (ARCHIVE_FATAL);
835358088Smm}
836358088Smm
837358088Smmstatic int
838362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
839358088Smm    size_t insize)
840358088Smm{
841358088Smm  if (mbedtls_sha256_update_ret(ctx, indata, insize) == 0)
842358088Smm    return (ARCHIVE_OK);
843358088Smm  else
844358088Smm    return (ARCHIVE_FATAL);
845358088Smm}
846358088Smm
847358088Smmstatic int
848362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
849358088Smm{
850358088Smm  if (mbedtls_sha256_finish_ret(ctx, md) == 0) {
851358088Smm    mbedtls_sha256_free(ctx);
852358088Smm    return (ARCHIVE_OK);
853358088Smm  } else {
854358088Smm    mbedtls_sha256_free(ctx);
855358088Smm    return (ARCHIVE_FATAL);
856358088Smm  }
857358088Smm}
858358088Smm
859299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
860299425Smm
861299425Smmstatic int
862362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
863299425Smm{
864299425Smm  sha256_init(ctx);
865299425Smm  return (ARCHIVE_OK);
866299425Smm}
867299425Smm
868299425Smmstatic int
869362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
870299425Smm    size_t insize)
871299425Smm{
872299425Smm  sha256_update(ctx, insize, indata);
873299425Smm  return (ARCHIVE_OK);
874299425Smm}
875299425Smm
876299425Smmstatic int
877362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
878299425Smm{
879299425Smm  sha256_digest(ctx, SHA256_DIGEST_SIZE, md);
880299425Smm  return (ARCHIVE_OK);
881299425Smm}
882299425Smm
883299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
884299425Smm
885299425Smmstatic int
886362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
887299425Smm{
888311041Smm  if ((*ctx = EVP_MD_CTX_new()) == NULL)
889311041Smm	return (ARCHIVE_FAILED);
890311041Smm  EVP_DigestInit(*ctx, EVP_sha256());
891299425Smm  return (ARCHIVE_OK);
892299425Smm}
893299425Smm
894299425Smmstatic int
895362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
896299425Smm    size_t insize)
897299425Smm{
898311041Smm  EVP_DigestUpdate(*ctx, indata, insize);
899299425Smm  return (ARCHIVE_OK);
900299425Smm}
901299425Smm
902299425Smmstatic int
903362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
904299425Smm{
905311041Smm  if (*ctx) {
906311041Smm    EVP_DigestFinal(*ctx, md, NULL);
907311041Smm    EVP_MD_CTX_free(*ctx);
908311041Smm    *ctx = NULL;
909311041Smm  }
910299425Smm  return (ARCHIVE_OK);
911299425Smm}
912299425Smm
913299425Smm#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
914299425Smm
915299425Smmstatic int
916362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
917299425Smm{
918299425Smm  return (win_crypto_init(ctx, CALG_SHA_256));
919299425Smm}
920299425Smm
921299425Smmstatic int
922362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
923299425Smm    size_t insize)
924299425Smm{
925299425Smm  return (win_crypto_Update(ctx, indata, insize));
926299425Smm}
927299425Smm
928299425Smmstatic int
929362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
930299425Smm{
931299425Smm  return (win_crypto_Final(md, 32, ctx));
932299425Smm}
933299425Smm
934299425Smm#else
935299425Smm
936299425Smmstatic int
937362133Smm__archive_sha256init(archive_sha256_ctx *ctx)
938299425Smm{
939299425Smm	(void)ctx; /* UNUSED */
940299425Smm	return (ARCHIVE_FAILED);
941299425Smm}
942299425Smm
943299425Smmstatic int
944362133Smm__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,
945299425Smm    size_t insize)
946299425Smm{
947299425Smm	(void)ctx; /* UNUSED */
948299425Smm	(void)indata; /* UNUSED */
949299425Smm	(void)insize; /* UNUSED */
950299425Smm	return (ARCHIVE_FAILED);
951299425Smm}
952299425Smm
953299425Smmstatic int
954362133Smm__archive_sha256final(archive_sha256_ctx *ctx, void *md)
955299425Smm{
956299425Smm	(void)ctx; /* UNUSED */
957299425Smm	(void)md; /* UNUSED */
958299425Smm	return (ARCHIVE_FAILED);
959299425Smm}
960299425Smm
961299425Smm#endif
962299425Smm
963299425Smm/* SHA384 implementations */
964299425Smm#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
965299425Smm
966299425Smmstatic int
967362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
968299425Smm{
969299425Smm  SHA384_Init(ctx);
970299425Smm  return (ARCHIVE_OK);
971299425Smm}
972299425Smm
973299425Smmstatic int
974362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
975299425Smm    size_t insize)
976299425Smm{
977299425Smm  SHA384_Update(ctx, indata, insize);
978299425Smm  return (ARCHIVE_OK);
979299425Smm}
980299425Smm
981299425Smmstatic int
982362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
983299425Smm{
984299425Smm  SHA384_Final(md, ctx);
985299425Smm  return (ARCHIVE_OK);
986299425Smm}
987299425Smm
988299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
989299425Smm
990299425Smmstatic int
991362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
992299425Smm{
993299425Smm  SHA384Init(ctx);
994299425Smm  return (ARCHIVE_OK);
995299425Smm}
996299425Smm
997299425Smmstatic int
998362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
999299425Smm    size_t insize)
1000299425Smm{
1001299425Smm  SHA384Update(ctx, indata, insize);
1002299425Smm  return (ARCHIVE_OK);
1003299425Smm}
1004299425Smm
1005299425Smmstatic int
1006362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1007299425Smm{
1008299425Smm  SHA384Final(md, ctx);
1009299425Smm  return (ARCHIVE_OK);
1010299425Smm}
1011299425Smm
1012299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
1013299425Smm
1014299425Smmstatic int
1015362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
1016299425Smm{
1017299425Smm  SHA384Init(ctx);
1018299425Smm  return (ARCHIVE_OK);
1019299425Smm}
1020299425Smm
1021299425Smmstatic int
1022362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
1023299425Smm    size_t insize)
1024299425Smm{
1025299425Smm  SHA384Update(ctx, indata, insize);
1026299425Smm  return (ARCHIVE_OK);
1027299425Smm}
1028299425Smm
1029299425Smmstatic int
1030362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1031299425Smm{
1032299425Smm  SHA384Final(md, ctx);
1033299425Smm  return (ARCHIVE_OK);
1034299425Smm}
1035299425Smm
1036299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
1037299425Smm
1038299425Smmstatic int
1039362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
1040299425Smm{
1041299425Smm  CC_SHA384_Init(ctx);
1042299425Smm  return (ARCHIVE_OK);
1043299425Smm}
1044299425Smm
1045299425Smmstatic int
1046362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
1047299425Smm    size_t insize)
1048299425Smm{
1049299425Smm  CC_SHA384_Update(ctx, indata, insize);
1050299425Smm  return (ARCHIVE_OK);
1051299425Smm}
1052299425Smm
1053299425Smmstatic int
1054362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1055299425Smm{
1056299425Smm  CC_SHA384_Final(md, ctx);
1057299425Smm  return (ARCHIVE_OK);
1058299425Smm}
1059299425Smm
1060358088Smm#elif defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS)
1061358088Smm
1062358088Smmstatic int
1063362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
1064358088Smm{
1065358088Smm  mbedtls_sha512_init(ctx);
1066358088Smm  if (mbedtls_sha512_starts_ret(ctx, 1) == 0)
1067358088Smm    return (ARCHIVE_OK);
1068358088Smm  else
1069358088Smm    return (ARCHIVE_FATAL);
1070358088Smm}
1071358088Smm
1072358088Smmstatic int
1073362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
1074358088Smm    size_t insize)
1075358088Smm{
1076358088Smm  if (mbedtls_sha512_update_ret(ctx, indata, insize) == 0)
1077358088Smm    return (ARCHIVE_OK);
1078358088Smm  else
1079358088Smm    return (ARCHIVE_FATAL);
1080358088Smm}
1081358088Smm
1082358088Smmstatic int
1083362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1084358088Smm{
1085358088Smm  if (mbedtls_sha512_finish_ret(ctx, md) == 0) {
1086358088Smm    mbedtls_sha512_free(ctx);
1087358088Smm    return (ARCHIVE_OK);
1088358088Smm  } else {
1089358088Smm    mbedtls_sha512_free(ctx);
1090358088Smm    return (ARCHIVE_FATAL);
1091358088Smm  }
1092358088Smm}
1093358088Smm
1094299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
1095299425Smm
1096299425Smmstatic int
1097362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
1098299425Smm{
1099299425Smm  sha384_init(ctx);
1100299425Smm  return (ARCHIVE_OK);
1101299425Smm}
1102299425Smm
1103299425Smmstatic int
1104362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
1105299425Smm    size_t insize)
1106299425Smm{
1107299425Smm  sha384_update(ctx, insize, indata);
1108299425Smm  return (ARCHIVE_OK);
1109299425Smm}
1110299425Smm
1111299425Smmstatic int
1112362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1113299425Smm{
1114299425Smm  sha384_digest(ctx, SHA384_DIGEST_SIZE, md);
1115299425Smm  return (ARCHIVE_OK);
1116299425Smm}
1117299425Smm
1118299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
1119299425Smm
1120299425Smmstatic int
1121362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
1122299425Smm{
1123311041Smm  if ((*ctx = EVP_MD_CTX_new()) == NULL)
1124311041Smm	return (ARCHIVE_FAILED);
1125311041Smm  EVP_DigestInit(*ctx, EVP_sha384());
1126299425Smm  return (ARCHIVE_OK);
1127299425Smm}
1128299425Smm
1129299425Smmstatic int
1130362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
1131299425Smm    size_t insize)
1132299425Smm{
1133311041Smm  EVP_DigestUpdate(*ctx, indata, insize);
1134299425Smm  return (ARCHIVE_OK);
1135299425Smm}
1136299425Smm
1137299425Smmstatic int
1138362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1139299425Smm{
1140311041Smm  if (*ctx) {
1141311041Smm    EVP_DigestFinal(*ctx, md, NULL);
1142311041Smm    EVP_MD_CTX_free(*ctx);
1143311041Smm    *ctx = NULL;
1144311041Smm  }
1145299425Smm  return (ARCHIVE_OK);
1146299425Smm}
1147299425Smm
1148299425Smm#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
1149299425Smm
1150299425Smmstatic int
1151362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
1152299425Smm{
1153299425Smm  return (win_crypto_init(ctx, CALG_SHA_384));
1154299425Smm}
1155299425Smm
1156299425Smmstatic int
1157362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
1158299425Smm    size_t insize)
1159299425Smm{
1160299425Smm  return (win_crypto_Update(ctx, indata, insize));
1161299425Smm}
1162299425Smm
1163299425Smmstatic int
1164362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1165299425Smm{
1166299425Smm  return (win_crypto_Final(md, 48, ctx));
1167299425Smm}
1168299425Smm
1169299425Smm#else
1170299425Smm
1171299425Smmstatic int
1172362133Smm__archive_sha384init(archive_sha384_ctx *ctx)
1173299425Smm{
1174299425Smm	(void)ctx; /* UNUSED */
1175299425Smm	return (ARCHIVE_FAILED);
1176299425Smm}
1177299425Smm
1178299425Smmstatic int
1179362133Smm__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,
1180299425Smm    size_t insize)
1181299425Smm{
1182299425Smm	(void)ctx; /* UNUSED */
1183299425Smm	(void)indata; /* UNUSED */
1184299425Smm	(void)insize; /* UNUSED */
1185299425Smm	return (ARCHIVE_FAILED);
1186299425Smm}
1187299425Smm
1188299425Smmstatic int
1189362133Smm__archive_sha384final(archive_sha384_ctx *ctx, void *md)
1190299425Smm{
1191299425Smm	(void)ctx; /* UNUSED */
1192299425Smm	(void)md; /* UNUSED */
1193299425Smm	return (ARCHIVE_FAILED);
1194299425Smm}
1195299425Smm
1196299425Smm#endif
1197299425Smm
1198299425Smm/* SHA512 implementations */
1199299425Smm#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
1200299425Smm
1201299425Smmstatic int
1202362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1203299425Smm{
1204299425Smm  SHA512_Init(ctx);
1205299425Smm  return (ARCHIVE_OK);
1206299425Smm}
1207299425Smm
1208299425Smmstatic int
1209362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1210299425Smm    size_t insize)
1211299425Smm{
1212299425Smm  SHA512_Update(ctx, indata, insize);
1213299425Smm  return (ARCHIVE_OK);
1214299425Smm}
1215299425Smm
1216299425Smmstatic int
1217362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1218299425Smm{
1219299425Smm  SHA512_Final(md, ctx);
1220299425Smm  return (ARCHIVE_OK);
1221299425Smm}
1222299425Smm
1223299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
1224299425Smm
1225299425Smmstatic int
1226362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1227299425Smm{
1228299425Smm  SHA512Init(ctx);
1229299425Smm  return (ARCHIVE_OK);
1230299425Smm}
1231299425Smm
1232299425Smmstatic int
1233362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1234299425Smm    size_t insize)
1235299425Smm{
1236299425Smm  SHA512Update(ctx, indata, insize);
1237299425Smm  return (ARCHIVE_OK);
1238299425Smm}
1239299425Smm
1240299425Smmstatic int
1241362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1242299425Smm{
1243299425Smm  SHA512Final(md, ctx);
1244299425Smm  return (ARCHIVE_OK);
1245299425Smm}
1246299425Smm
1247299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
1248299425Smm
1249299425Smmstatic int
1250362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1251299425Smm{
1252299425Smm  SHA512Init(ctx);
1253299425Smm  return (ARCHIVE_OK);
1254299425Smm}
1255299425Smm
1256299425Smmstatic int
1257362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1258299425Smm    size_t insize)
1259299425Smm{
1260299425Smm  SHA512Update(ctx, indata, insize);
1261299425Smm  return (ARCHIVE_OK);
1262299425Smm}
1263299425Smm
1264299425Smmstatic int
1265362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1266299425Smm{
1267299425Smm  SHA512Final(md, ctx);
1268299425Smm  return (ARCHIVE_OK);
1269299425Smm}
1270299425Smm
1271299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
1272299425Smm
1273299425Smmstatic int
1274362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1275299425Smm{
1276299425Smm  SHA512_Init(ctx);
1277299425Smm  return (ARCHIVE_OK);
1278299425Smm}
1279299425Smm
1280299425Smmstatic int
1281362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1282299425Smm    size_t insize)
1283299425Smm{
1284299425Smm  SHA512_Update(ctx, indata, insize);
1285299425Smm  return (ARCHIVE_OK);
1286299425Smm}
1287299425Smm
1288299425Smmstatic int
1289362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1290299425Smm{
1291299425Smm  SHA512_Final(md, ctx);
1292299425Smm  return (ARCHIVE_OK);
1293299425Smm}
1294299425Smm
1295299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
1296299425Smm
1297299425Smmstatic int
1298362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1299299425Smm{
1300299425Smm  CC_SHA512_Init(ctx);
1301299425Smm  return (ARCHIVE_OK);
1302299425Smm}
1303299425Smm
1304299425Smmstatic int
1305362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1306299425Smm    size_t insize)
1307299425Smm{
1308299425Smm  CC_SHA512_Update(ctx, indata, insize);
1309299425Smm  return (ARCHIVE_OK);
1310299425Smm}
1311299425Smm
1312299425Smmstatic int
1313362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1314299425Smm{
1315299425Smm  CC_SHA512_Final(md, ctx);
1316299425Smm  return (ARCHIVE_OK);
1317299425Smm}
1318299425Smm
1319358088Smm#elif defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS)
1320358088Smm
1321358088Smmstatic int
1322362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1323358088Smm{
1324358088Smm  mbedtls_sha512_init(ctx);
1325358088Smm  if (mbedtls_sha512_starts_ret(ctx, 0) == 0)
1326358088Smm    return (ARCHIVE_OK);
1327358088Smm  else
1328358088Smm    return (ARCHIVE_FATAL);
1329358088Smm}
1330358088Smm
1331358088Smmstatic int
1332362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1333358088Smm    size_t insize)
1334358088Smm{
1335358088Smm  if (mbedtls_sha512_update_ret(ctx, indata, insize) == 0)
1336358088Smm    return (ARCHIVE_OK);
1337358088Smm  else
1338358088Smm    return (ARCHIVE_FATAL);
1339358088Smm}
1340358088Smm
1341358088Smmstatic int
1342362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1343358088Smm{
1344358088Smm  if (mbedtls_sha512_finish_ret(ctx, md) == 0) {
1345358088Smm    mbedtls_sha512_free(ctx);
1346358088Smm    return (ARCHIVE_OK);
1347358088Smm  } else {
1348358088Smm    mbedtls_sha512_free(ctx);
1349358088Smm    return (ARCHIVE_FATAL);
1350358088Smm  }
1351358088Smm}
1352358088Smm
1353299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
1354299425Smm
1355299425Smmstatic int
1356362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1357299425Smm{
1358299425Smm  sha512_init(ctx);
1359299425Smm  return (ARCHIVE_OK);
1360299425Smm}
1361299425Smm
1362299425Smmstatic int
1363362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1364299425Smm    size_t insize)
1365299425Smm{
1366299425Smm  sha512_update(ctx, insize, indata);
1367299425Smm  return (ARCHIVE_OK);
1368299425Smm}
1369299425Smm
1370299425Smmstatic int
1371362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1372299425Smm{
1373299425Smm  sha512_digest(ctx, SHA512_DIGEST_SIZE, md);
1374299425Smm  return (ARCHIVE_OK);
1375299425Smm}
1376299425Smm
1377299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
1378299425Smm
1379299425Smmstatic int
1380362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1381299425Smm{
1382311041Smm  if ((*ctx = EVP_MD_CTX_new()) == NULL)
1383311041Smm	return (ARCHIVE_FAILED);
1384311041Smm  EVP_DigestInit(*ctx, EVP_sha512());
1385299425Smm  return (ARCHIVE_OK);
1386299425Smm}
1387299425Smm
1388299425Smmstatic int
1389362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1390299425Smm    size_t insize)
1391299425Smm{
1392311041Smm  EVP_DigestUpdate(*ctx, indata, insize);
1393299425Smm  return (ARCHIVE_OK);
1394299425Smm}
1395299425Smm
1396299425Smmstatic int
1397362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1398299425Smm{
1399311041Smm  if (*ctx) {
1400311041Smm    EVP_DigestFinal(*ctx, md, NULL);
1401311041Smm    EVP_MD_CTX_free(*ctx);
1402311041Smm    *ctx = NULL;
1403311041Smm  }
1404299425Smm  return (ARCHIVE_OK);
1405299425Smm}
1406299425Smm
1407299425Smm#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
1408299425Smm
1409299425Smmstatic int
1410362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1411299425Smm{
1412299425Smm  return (win_crypto_init(ctx, CALG_SHA_512));
1413299425Smm}
1414299425Smm
1415299425Smmstatic int
1416362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1417299425Smm    size_t insize)
1418299425Smm{
1419299425Smm  return (win_crypto_Update(ctx, indata, insize));
1420299425Smm}
1421299425Smm
1422299425Smmstatic int
1423362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1424299425Smm{
1425299425Smm  return (win_crypto_Final(md, 64, ctx));
1426299425Smm}
1427299425Smm
1428299425Smm#else
1429299425Smm
1430299425Smmstatic int
1431362133Smm__archive_sha512init(archive_sha512_ctx *ctx)
1432299425Smm{
1433299425Smm	(void)ctx; /* UNUSED */
1434299425Smm	return (ARCHIVE_FAILED);
1435299425Smm}
1436299425Smm
1437299425Smmstatic int
1438362133Smm__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,
1439299425Smm    size_t insize)
1440299425Smm{
1441299425Smm	(void)ctx; /* UNUSED */
1442299425Smm	(void)indata; /* UNUSED */
1443299425Smm	(void)insize; /* UNUSED */
1444299425Smm	return (ARCHIVE_FAILED);
1445299425Smm}
1446299425Smm
1447299425Smmstatic int
1448362133Smm__archive_sha512final(archive_sha512_ctx *ctx, void *md)
1449299425Smm{
1450299425Smm	(void)ctx; /* UNUSED */
1451299425Smm	(void)md; /* UNUSED */
1452299425Smm	return (ARCHIVE_FAILED);
1453299425Smm}
1454299425Smm
1455299425Smm#endif
1456299425Smm
1457299425Smm/* NOTE: Message Digest functions are set based on availability and by the
1458299425Smm * following order of preference.
1459299425Smm * 1. libc
1460299425Smm * 2. libc2
1461299425Smm * 3. libc3
1462299425Smm * 4. libSystem
1463299425Smm * 5. Nettle
1464299425Smm * 6. OpenSSL
1465299425Smm * 7. libmd
1466299425Smm * 8. Windows API
1467299425Smm */
1468299425Smmconst struct archive_digest __archive_digest =
1469299425Smm{
1470299425Smm/* MD5 */
1471362133Smm  &__archive_md5init,
1472362133Smm  &__archive_md5update,
1473362133Smm  &__archive_md5final,
1474299425Smm
1475299425Smm/* RIPEMD160 */
1476362133Smm  &__archive_ripemd160init,
1477362133Smm  &__archive_ripemd160update,
1478362133Smm  &__archive_ripemd160final,
1479299425Smm
1480299425Smm/* SHA1 */
1481362133Smm  &__archive_sha1init,
1482362133Smm  &__archive_sha1update,
1483362133Smm  &__archive_sha1final,
1484299425Smm
1485299425Smm/* SHA256 */
1486362133Smm  &__archive_sha256init,
1487362133Smm  &__archive_sha256update,
1488362133Smm  &__archive_sha256final,
1489299425Smm
1490299425Smm/* SHA384 */
1491362133Smm  &__archive_sha384init,
1492362133Smm  &__archive_sha384update,
1493362133Smm  &__archive_sha384final,
1494299425Smm
1495299425Smm/* SHA512 */
1496362133Smm  &__archive_sha512init,
1497362133Smm  &__archive_sha512update,
1498362133Smm  &__archive_sha512final
1499299425Smm};
1500