Path: blob/master/Utilities/cmlibarchive/libarchive/archive_digest.c
3153 views
/*-1* Copyright (c) 2003-2007 Tim Kientzle2* Copyright (c) 2011 Andres Mejia3* Copyright (c) 2011 Michihiro NAKAJIMA4* All rights reserved.5*6* Redistribution and use in source and binary forms, with or without7* modification, are permitted provided that the following conditions8* are met:9* 1. Redistributions of source code must retain the above copyright10* notice, this list of conditions and the following disclaimer.11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR16* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES17* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.18* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,19* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT20* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,21* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY22* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT23* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF24* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.25*/2627#include "archive_platform.h"2829#include "archive.h"30#include "archive_digest_private.h"3132/* In particular, force the configure probe to break if it tries33* to test a combination of OpenSSL and libmd. */34#if defined(ARCHIVE_CRYPTO_OPENSSL) && defined(ARCHIVE_CRYPTO_LIBMD)35#error Cannot use both OpenSSL and libmd.36#endif3738/* Common in other bcrypt implementations, but missing from VS2008. */39#ifndef BCRYPT_SUCCESS40#define BCRYPT_SUCCESS(r) ((NTSTATUS)(r) == STATUS_SUCCESS)41#endif4243/*44* Message digest functions for Windows platform.45*/46#if defined(ARCHIVE_CRYPTO_MD5_WIN) ||\47defined(ARCHIVE_CRYPTO_SHA1_WIN) ||\48defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\49defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\50defined(ARCHIVE_CRYPTO_SHA512_WIN)5152/*53* Initialize a Message digest.54*/55#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA56static int57win_crypto_init(Digest_CTX *ctx, const WCHAR *algo)58{59NTSTATUS status;60ctx->valid = 0;6162status = BCryptOpenAlgorithmProvider(&ctx->hAlg, algo, NULL, 0);63if (!BCRYPT_SUCCESS(status))64return (ARCHIVE_FAILED);65status = BCryptCreateHash(ctx->hAlg, &ctx->hHash, NULL, 0, NULL, 0, 0);66if (!BCRYPT_SUCCESS(status)) {67BCryptCloseAlgorithmProvider(ctx->hAlg, 0);68return (ARCHIVE_FAILED);69}7071ctx->valid = 1;72return (ARCHIVE_OK);73}74#else75static int76win_crypto_init(Digest_CTX *ctx, DWORD prov, ALG_ID algId)77{7879ctx->valid = 0;80if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,81prov, CRYPT_VERIFYCONTEXT)) {82if (GetLastError() != (DWORD)NTE_BAD_KEYSET)83return (ARCHIVE_FAILED);84if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL,85prov, CRYPT_NEWKEYSET))86return (ARCHIVE_FAILED);87}8889if (!CryptCreateHash(ctx->cryptProv, algId, 0, 0, &ctx->hash)) {90CryptReleaseContext(ctx->cryptProv, 0);91return (ARCHIVE_FAILED);92}9394ctx->valid = 1;95return (ARCHIVE_OK);96}97#endif9899/*100* Update a Message digest.101*/102static int103win_crypto_Update(Digest_CTX *ctx, const unsigned char *buf, size_t len)104{105106if (!ctx->valid)107return (ARCHIVE_FAILED);108109#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA110BCryptHashData(ctx->hHash,111(PUCHAR)(uintptr_t)buf,112(ULONG)len, 0);113#else114CryptHashData(ctx->hash,115(unsigned char *)(uintptr_t)buf,116(DWORD)len, 0);117#endif118return (ARCHIVE_OK);119}120121static int122win_crypto_Final(unsigned char *buf, size_t bufsize, Digest_CTX *ctx)123{124#if !(defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA)125DWORD siglen = (DWORD)bufsize;126#endif127128if (!ctx->valid)129return (ARCHIVE_FAILED);130131#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA132BCryptFinishHash(ctx->hHash, buf, (ULONG)bufsize, 0);133BCryptDestroyHash(ctx->hHash);134BCryptCloseAlgorithmProvider(ctx->hAlg, 0);135#else136CryptGetHashParam(ctx->hash, HP_HASHVAL, buf, &siglen, 0);137CryptDestroyHash(ctx->hash);138CryptReleaseContext(ctx->cryptProv, 0);139#endif140ctx->valid = 0;141return (ARCHIVE_OK);142}143144#endif /* defined(ARCHIVE_CRYPTO_*_WIN) */145146147/* MD5 implementations */148#if defined(ARCHIVE_CRYPTO_MD5_LIBC)149150static int151__archive_md5init(archive_md5_ctx *ctx)152{153MD5Init(ctx);154return (ARCHIVE_OK);155}156157static int158__archive_md5update(archive_md5_ctx *ctx, const void *indata,159size_t insize)160{161MD5Update(ctx, indata, insize);162return (ARCHIVE_OK);163}164165static int166__archive_md5final(archive_md5_ctx *ctx, void *md)167{168MD5Final(md, ctx);169return (ARCHIVE_OK);170}171172#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)173174static int175__archive_md5init(archive_md5_ctx *ctx)176{177MD5Init(ctx);178return (ARCHIVE_OK);179}180181static int182__archive_md5update(archive_md5_ctx *ctx, const void *indata,183size_t insize)184{185MD5Update(ctx, indata, insize);186return (ARCHIVE_OK);187}188189static int190__archive_md5final(archive_md5_ctx *ctx, void *md)191{192MD5Final(md, ctx);193return (ARCHIVE_OK);194}195196#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)197198// These functions are available in macOS 10.4 and later, but deprecated from 10.15 onwards.199// We need to continue supporting this feature regardless, so suppress the warnings.200#if defined(__clang__)201#pragma clang diagnostic push202#pragma clang diagnostic ignored "-Wdeprecated-declarations"203#endif204205static int206__archive_md5init(archive_md5_ctx *ctx)207{208CC_MD5_Init(ctx);209return (ARCHIVE_OK);210}211212static int213__archive_md5update(archive_md5_ctx *ctx, const void *indata,214size_t insize)215{216CC_MD5_Update(ctx, indata, insize);217return (ARCHIVE_OK);218}219220static int221__archive_md5final(archive_md5_ctx *ctx, void *md)222{223CC_MD5_Final(md, ctx);224return (ARCHIVE_OK);225}226227#if defined(__clang__)228#pragma clang diagnostic pop229#endif230231#elif defined(ARCHIVE_CRYPTO_MD5_MBEDTLS)232233static int234__archive_md5init(archive_md5_ctx *ctx)235{236mbedtls_md5_init(ctx);237if (mbedtls_md5_starts_ret(ctx) == 0)238return (ARCHIVE_OK);239else240return (ARCHIVE_FATAL);241}242243static int244__archive_md5update(archive_md5_ctx *ctx, const void *indata,245size_t insize)246{247if (mbedtls_md5_update_ret(ctx, indata, insize) == 0)248return (ARCHIVE_OK);249else250return (ARCHIVE_FATAL);251}252253static int254__archive_md5final(archive_md5_ctx *ctx, void *md)255{256if (mbedtls_md5_finish_ret(ctx, md) == 0) {257mbedtls_md5_free(ctx);258return (ARCHIVE_OK);259} else {260mbedtls_md5_free(ctx);261return (ARCHIVE_FATAL);262}263}264265#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)266267static int268__archive_md5init(archive_md5_ctx *ctx)269{270md5_init(ctx);271return (ARCHIVE_OK);272}273274static int275__archive_md5update(archive_md5_ctx *ctx, const void *indata,276size_t insize)277{278md5_update(ctx, insize, indata);279return (ARCHIVE_OK);280}281282static int283__archive_md5final(archive_md5_ctx *ctx, void *md)284{285md5_digest(ctx, MD5_DIGEST_SIZE, md);286return (ARCHIVE_OK);287}288289#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)290291static int292__archive_md5init(archive_md5_ctx *ctx)293{294if ((*ctx = EVP_MD_CTX_new()) == NULL)295return (ARCHIVE_FAILED);296if (!EVP_DigestInit(*ctx, EVP_md5()))297return (ARCHIVE_FAILED);298return (ARCHIVE_OK);299}300301static int302__archive_md5update(archive_md5_ctx *ctx, const void *indata,303size_t insize)304{305EVP_DigestUpdate(*ctx, indata, insize);306return (ARCHIVE_OK);307}308309static int310__archive_md5final(archive_md5_ctx *ctx, void *md)311{312/* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so313* this is meant to cope with that. Real fix is probably to fix314* archive_write_set_format_xar.c315*/316if (*ctx) {317EVP_DigestFinal(*ctx, md, NULL);318EVP_MD_CTX_free(*ctx);319*ctx = NULL;320}321return (ARCHIVE_OK);322}323324#elif defined(ARCHIVE_CRYPTO_MD5_WIN)325326static int327__archive_md5init(archive_md5_ctx *ctx)328{329#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA330return (win_crypto_init(ctx, BCRYPT_MD5_ALGORITHM));331#else332return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_MD5));333#endif334}335336static int337__archive_md5update(archive_md5_ctx *ctx, const void *indata,338size_t insize)339{340return (win_crypto_Update(ctx, indata, insize));341}342343static int344__archive_md5final(archive_md5_ctx *ctx, void *md)345{346return (win_crypto_Final(md, 16, ctx));347}348349#else350351static int352__archive_md5init(archive_md5_ctx *ctx)353{354(void)ctx; /* UNUSED */355return (ARCHIVE_FAILED);356}357358static int359__archive_md5update(archive_md5_ctx *ctx, const void *indata,360size_t insize)361{362(void)ctx; /* UNUSED */363(void)indata; /* UNUSED */364(void)insize; /* UNUSED */365return (ARCHIVE_FAILED);366}367368static int369__archive_md5final(archive_md5_ctx *ctx, void *md)370{371(void)ctx; /* UNUSED */372(void)md; /* UNUSED */373return (ARCHIVE_FAILED);374}375376#endif377378/* RIPEMD160 implementations */379#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)380381static int382__archive_ripemd160init(archive_rmd160_ctx *ctx)383{384RMD160Init(ctx);385return (ARCHIVE_OK);386}387388static int389__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,390size_t insize)391{392RMD160Update(ctx, indata, insize);393return (ARCHIVE_OK);394}395396static int397__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)398{399RMD160Final(md, ctx);400return (ARCHIVE_OK);401}402403#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)404405static int406__archive_ripemd160init(archive_rmd160_ctx *ctx)407{408RIPEMD160_Init(ctx);409return (ARCHIVE_OK);410}411412static int413__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,414size_t insize)415{416RIPEMD160_Update(ctx, indata, insize);417return (ARCHIVE_OK);418}419420static int421__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)422{423RIPEMD160_Final(md, ctx);424return (ARCHIVE_OK);425}426427#elif defined(ARCHIVE_CRYPTO_RMD160_MBEDTLS)428429static int430__archive_ripemd160init(archive_rmd160_ctx *ctx)431{432mbedtls_ripemd160_init(ctx);433if (mbedtls_ripemd160_starts_ret(ctx) == 0)434return (ARCHIVE_OK);435else436return (ARCHIVE_FATAL);437}438439static int440__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,441size_t insize)442{443if (mbedtls_ripemd160_update_ret(ctx, indata, insize) == 0)444return (ARCHIVE_OK);445else446return (ARCHIVE_FATAL);447}448449static int450__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)451{452if (mbedtls_ripemd160_finish_ret(ctx, md) == 0) {453mbedtls_ripemd160_free(ctx);454return (ARCHIVE_OK);455} else {456mbedtls_ripemd160_free(ctx);457return (ARCHIVE_FATAL);458}459}460461#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)462463static int464__archive_ripemd160init(archive_rmd160_ctx *ctx)465{466ripemd160_init(ctx);467return (ARCHIVE_OK);468}469470static int471__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,472size_t insize)473{474ripemd160_update(ctx, insize, indata);475return (ARCHIVE_OK);476}477478static int479__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)480{481ripemd160_digest(ctx, RIPEMD160_DIGEST_SIZE, md);482return (ARCHIVE_OK);483}484485#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)486487static int488__archive_ripemd160init(archive_rmd160_ctx *ctx)489{490if ((*ctx = EVP_MD_CTX_new()) == NULL)491return (ARCHIVE_FAILED);492if (!EVP_DigestInit(*ctx, EVP_ripemd160()))493return (ARCHIVE_FAILED);494return (ARCHIVE_OK);495}496497static int498__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,499size_t insize)500{501EVP_DigestUpdate(*ctx, indata, insize);502return (ARCHIVE_OK);503}504505static int506__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)507{508if (*ctx) {509EVP_DigestFinal(*ctx, md, NULL);510EVP_MD_CTX_free(*ctx);511*ctx = NULL;512}513return (ARCHIVE_OK);514}515516#else517518static int519__archive_ripemd160init(archive_rmd160_ctx *ctx)520{521(void)ctx; /* UNUSED */522return (ARCHIVE_FAILED);523}524525static int526__archive_ripemd160update(archive_rmd160_ctx *ctx, const void *indata,527size_t insize)528{529(void)ctx; /* UNUSED */530(void)indata; /* UNUSED */531(void)insize; /* UNUSED */532return (ARCHIVE_FAILED);533}534535static int536__archive_ripemd160final(archive_rmd160_ctx *ctx, void *md)537{538(void)ctx; /* UNUSED */539(void)md; /* UNUSED */540return (ARCHIVE_FAILED);541}542543#endif544545/* SHA1 implementations */546#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)547548static int549__archive_sha1init(archive_sha1_ctx *ctx)550{551SHA1Init(ctx);552return (ARCHIVE_OK);553}554555static int556__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,557size_t insize)558{559SHA1Update(ctx, indata, insize);560return (ARCHIVE_OK);561}562563static int564__archive_sha1final(archive_sha1_ctx *ctx, void *md)565{566SHA1Final(md, ctx);567return (ARCHIVE_OK);568}569570#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)571572static int573__archive_sha1init(archive_sha1_ctx *ctx)574{575SHA1_Init(ctx);576return (ARCHIVE_OK);577}578579static int580__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,581size_t insize)582{583SHA1_Update(ctx, indata, insize);584return (ARCHIVE_OK);585}586587static int588__archive_sha1final(archive_sha1_ctx *ctx, void *md)589{590SHA1_Final(md, ctx);591return (ARCHIVE_OK);592}593594#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)595596static int597__archive_sha1init(archive_sha1_ctx *ctx)598{599CC_SHA1_Init(ctx);600return (ARCHIVE_OK);601}602603static int604__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,605size_t insize)606{607CC_SHA1_Update(ctx, indata, insize);608return (ARCHIVE_OK);609}610611static int612__archive_sha1final(archive_sha1_ctx *ctx, void *md)613{614CC_SHA1_Final(md, ctx);615return (ARCHIVE_OK);616}617618#elif defined(ARCHIVE_CRYPTO_SHA1_MBEDTLS)619620static int621__archive_sha1init(archive_sha1_ctx *ctx)622{623mbedtls_sha1_init(ctx);624if (mbedtls_sha1_starts_ret(ctx) == 0)625return (ARCHIVE_OK);626else627return (ARCHIVE_FATAL);628}629630static int631__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,632size_t insize)633{634if (mbedtls_sha1_update_ret(ctx, indata, insize) == 0)635return (ARCHIVE_OK);636else637return (ARCHIVE_FATAL);638}639640static int641__archive_sha1final(archive_sha1_ctx *ctx, void *md)642{643if (mbedtls_sha1_finish_ret(ctx, md) == 0) {644mbedtls_sha1_free(ctx);645return (ARCHIVE_OK);646} else {647mbedtls_sha1_free(ctx);648return (ARCHIVE_FATAL);649}650}651652#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)653654static int655__archive_sha1init(archive_sha1_ctx *ctx)656{657sha1_init(ctx);658return (ARCHIVE_OK);659}660661static int662__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,663size_t insize)664{665sha1_update(ctx, insize, indata);666return (ARCHIVE_OK);667}668669static int670__archive_sha1final(archive_sha1_ctx *ctx, void *md)671{672sha1_digest(ctx, SHA1_DIGEST_SIZE, md);673return (ARCHIVE_OK);674}675676#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)677678static int679__archive_sha1init(archive_sha1_ctx *ctx)680{681if ((*ctx = EVP_MD_CTX_new()) == NULL)682return (ARCHIVE_FAILED);683if (!EVP_DigestInit(*ctx, EVP_sha1()))684return (ARCHIVE_FAILED);685return (ARCHIVE_OK);686}687688static int689__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,690size_t insize)691{692EVP_DigestUpdate(*ctx, indata, insize);693return (ARCHIVE_OK);694}695696static int697__archive_sha1final(archive_sha1_ctx *ctx, void *md)698{699/* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so700* this is meant to cope with that. Real fix is probably to fix701* archive_write_set_format_xar.c702*/703if (*ctx) {704EVP_DigestFinal(*ctx, md, NULL);705EVP_MD_CTX_free(*ctx);706*ctx = NULL;707}708return (ARCHIVE_OK);709}710711#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)712713static int714__archive_sha1init(archive_sha1_ctx *ctx)715{716#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA717return (win_crypto_init(ctx, BCRYPT_SHA1_ALGORITHM));718#else719return (win_crypto_init(ctx, PROV_RSA_FULL, CALG_SHA1));720#endif721}722723static int724__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,725size_t insize)726{727return (win_crypto_Update(ctx, indata, insize));728}729730static int731__archive_sha1final(archive_sha1_ctx *ctx, void *md)732{733return (win_crypto_Final(md, 20, ctx));734}735736#else737738static int739__archive_sha1init(archive_sha1_ctx *ctx)740{741(void)ctx; /* UNUSED */742return (ARCHIVE_FAILED);743}744745static int746__archive_sha1update(archive_sha1_ctx *ctx, const void *indata,747size_t insize)748{749(void)ctx; /* UNUSED */750(void)indata; /* UNUSED */751(void)insize; /* UNUSED */752return (ARCHIVE_FAILED);753}754755static int756__archive_sha1final(archive_sha1_ctx *ctx, void *md)757{758(void)ctx; /* UNUSED */759(void)md; /* UNUSED */760return (ARCHIVE_FAILED);761}762763#endif764765/* SHA256 implementations */766#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)767768static int769__archive_sha256init(archive_sha256_ctx *ctx)770{771SHA256_Init(ctx);772return (ARCHIVE_OK);773}774775static int776__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,777size_t insize)778{779SHA256_Update(ctx, indata, insize);780return (ARCHIVE_OK);781}782783static int784__archive_sha256final(archive_sha256_ctx *ctx, void *md)785{786SHA256_Final(md, ctx);787return (ARCHIVE_OK);788}789790#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)791792static int793__archive_sha256init(archive_sha256_ctx *ctx)794{795SHA256Init(ctx);796return (ARCHIVE_OK);797}798799static int800__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,801size_t insize)802{803SHA256Update(ctx, indata, insize);804return (ARCHIVE_OK);805}806807static int808__archive_sha256final(archive_sha256_ctx *ctx, void *md)809{810SHA256Final(md, ctx);811return (ARCHIVE_OK);812}813814#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)815816static int817__archive_sha256init(archive_sha256_ctx *ctx)818{819SHA256Init(ctx);820return (ARCHIVE_OK);821}822823static int824__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,825size_t insize)826{827SHA256Update(ctx, indata, insize);828return (ARCHIVE_OK);829}830831static int832__archive_sha256final(archive_sha256_ctx *ctx, void *md)833{834SHA256Final(md, ctx);835return (ARCHIVE_OK);836}837838#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)839840static int841__archive_sha256init(archive_sha256_ctx *ctx)842{843SHA256_Init(ctx);844return (ARCHIVE_OK);845}846847static int848__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,849size_t insize)850{851SHA256_Update(ctx, indata, insize);852return (ARCHIVE_OK);853}854855static int856__archive_sha256final(archive_sha256_ctx *ctx, void *md)857{858SHA256_Final(md, ctx);859return (ARCHIVE_OK);860}861862#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)863864static int865__archive_sha256init(archive_sha256_ctx *ctx)866{867CC_SHA256_Init(ctx);868return (ARCHIVE_OK);869}870871static int872__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,873size_t insize)874{875CC_SHA256_Update(ctx, indata, insize);876return (ARCHIVE_OK);877}878879static int880__archive_sha256final(archive_sha256_ctx *ctx, void *md)881{882CC_SHA256_Final(md, ctx);883return (ARCHIVE_OK);884}885886#elif defined(ARCHIVE_CRYPTO_SHA256_MBEDTLS)887888static int889__archive_sha256init(archive_sha256_ctx *ctx)890{891mbedtls_sha256_init(ctx);892if (mbedtls_sha256_starts_ret(ctx, 0) == 0)893return (ARCHIVE_OK);894else895return (ARCHIVE_FATAL);896}897898static int899__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,900size_t insize)901{902if (mbedtls_sha256_update_ret(ctx, indata, insize) == 0)903return (ARCHIVE_OK);904else905return (ARCHIVE_FATAL);906}907908static int909__archive_sha256final(archive_sha256_ctx *ctx, void *md)910{911if (mbedtls_sha256_finish_ret(ctx, md) == 0) {912mbedtls_sha256_free(ctx);913return (ARCHIVE_OK);914} else {915mbedtls_sha256_free(ctx);916return (ARCHIVE_FATAL);917}918}919920#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)921922static int923__archive_sha256init(archive_sha256_ctx *ctx)924{925sha256_init(ctx);926return (ARCHIVE_OK);927}928929static int930__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,931size_t insize)932{933sha256_update(ctx, insize, indata);934return (ARCHIVE_OK);935}936937static int938__archive_sha256final(archive_sha256_ctx *ctx, void *md)939{940sha256_digest(ctx, SHA256_DIGEST_SIZE, md);941return (ARCHIVE_OK);942}943944#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)945946static int947__archive_sha256init(archive_sha256_ctx *ctx)948{949if ((*ctx = EVP_MD_CTX_new()) == NULL)950return (ARCHIVE_FAILED);951if (!EVP_DigestInit(*ctx, EVP_sha256()))952return (ARCHIVE_FAILED);953return (ARCHIVE_OK);954}955956static int957__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,958size_t insize)959{960EVP_DigestUpdate(*ctx, indata, insize);961return (ARCHIVE_OK);962}963964static int965__archive_sha256final(archive_sha256_ctx *ctx, void *md)966{967if (*ctx) {968EVP_DigestFinal(*ctx, md, NULL);969EVP_MD_CTX_free(*ctx);970*ctx = NULL;971}972return (ARCHIVE_OK);973}974975#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)976977static int978__archive_sha256init(archive_sha256_ctx *ctx)979{980#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA981return (win_crypto_init(ctx, BCRYPT_SHA256_ALGORITHM));982#else983return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_256));984#endif985}986987static int988__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,989size_t insize)990{991return (win_crypto_Update(ctx, indata, insize));992}993994static int995__archive_sha256final(archive_sha256_ctx *ctx, void *md)996{997return (win_crypto_Final(md, 32, ctx));998}9991000#else10011002static int1003__archive_sha256init(archive_sha256_ctx *ctx)1004{1005(void)ctx; /* UNUSED */1006return (ARCHIVE_FAILED);1007}10081009static int1010__archive_sha256update(archive_sha256_ctx *ctx, const void *indata,1011size_t insize)1012{1013(void)ctx; /* UNUSED */1014(void)indata; /* UNUSED */1015(void)insize; /* UNUSED */1016return (ARCHIVE_FAILED);1017}10181019static int1020__archive_sha256final(archive_sha256_ctx *ctx, void *md)1021{1022(void)ctx; /* UNUSED */1023(void)md; /* UNUSED */1024return (ARCHIVE_FAILED);1025}10261027#endif10281029/* SHA384 implementations */1030#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)10311032static int1033__archive_sha384init(archive_sha384_ctx *ctx)1034{1035SHA384_Init(ctx);1036return (ARCHIVE_OK);1037}10381039static int1040__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1041size_t insize)1042{1043SHA384_Update(ctx, indata, insize);1044return (ARCHIVE_OK);1045}10461047static int1048__archive_sha384final(archive_sha384_ctx *ctx, void *md)1049{1050SHA384_Final(md, ctx);1051return (ARCHIVE_OK);1052}10531054#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)10551056static int1057__archive_sha384init(archive_sha384_ctx *ctx)1058{1059SHA384Init(ctx);1060return (ARCHIVE_OK);1061}10621063static int1064__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1065size_t insize)1066{1067SHA384Update(ctx, indata, insize);1068return (ARCHIVE_OK);1069}10701071static int1072__archive_sha384final(archive_sha384_ctx *ctx, void *md)1073{1074SHA384Final(md, ctx);1075return (ARCHIVE_OK);1076}10771078#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)10791080static int1081__archive_sha384init(archive_sha384_ctx *ctx)1082{1083SHA384Init(ctx);1084return (ARCHIVE_OK);1085}10861087static int1088__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1089size_t insize)1090{1091SHA384Update(ctx, indata, insize);1092return (ARCHIVE_OK);1093}10941095static int1096__archive_sha384final(archive_sha384_ctx *ctx, void *md)1097{1098SHA384Final(md, ctx);1099return (ARCHIVE_OK);1100}11011102#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)11031104static int1105__archive_sha384init(archive_sha384_ctx *ctx)1106{1107CC_SHA384_Init(ctx);1108return (ARCHIVE_OK);1109}11101111static int1112__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1113size_t insize)1114{1115CC_SHA384_Update(ctx, indata, insize);1116return (ARCHIVE_OK);1117}11181119static int1120__archive_sha384final(archive_sha384_ctx *ctx, void *md)1121{1122CC_SHA384_Final(md, ctx);1123return (ARCHIVE_OK);1124}11251126#elif defined(ARCHIVE_CRYPTO_SHA384_MBEDTLS)11271128static int1129__archive_sha384init(archive_sha384_ctx *ctx)1130{1131mbedtls_sha512_init(ctx);1132if (mbedtls_sha512_starts_ret(ctx, 1) == 0)1133return (ARCHIVE_OK);1134else1135return (ARCHIVE_FATAL);1136}11371138static int1139__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1140size_t insize)1141{1142if (mbedtls_sha512_update_ret(ctx, indata, insize) == 0)1143return (ARCHIVE_OK);1144else1145return (ARCHIVE_FATAL);1146}11471148static int1149__archive_sha384final(archive_sha384_ctx *ctx, void *md)1150{1151if (mbedtls_sha512_finish_ret(ctx, md) == 0) {1152mbedtls_sha512_free(ctx);1153return (ARCHIVE_OK);1154} else {1155mbedtls_sha512_free(ctx);1156return (ARCHIVE_FATAL);1157}1158}11591160#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)11611162static int1163__archive_sha384init(archive_sha384_ctx *ctx)1164{1165sha384_init(ctx);1166return (ARCHIVE_OK);1167}11681169static int1170__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1171size_t insize)1172{1173sha384_update(ctx, insize, indata);1174return (ARCHIVE_OK);1175}11761177static int1178__archive_sha384final(archive_sha384_ctx *ctx, void *md)1179{1180sha384_digest(ctx, SHA384_DIGEST_SIZE, md);1181return (ARCHIVE_OK);1182}11831184#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)11851186static int1187__archive_sha384init(archive_sha384_ctx *ctx)1188{1189if ((*ctx = EVP_MD_CTX_new()) == NULL)1190return (ARCHIVE_FAILED);1191if (!EVP_DigestInit(*ctx, EVP_sha384()))1192return (ARCHIVE_FAILED);1193return (ARCHIVE_OK);1194}11951196static int1197__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1198size_t insize)1199{1200EVP_DigestUpdate(*ctx, indata, insize);1201return (ARCHIVE_OK);1202}12031204static int1205__archive_sha384final(archive_sha384_ctx *ctx, void *md)1206{1207if (*ctx) {1208EVP_DigestFinal(*ctx, md, NULL);1209EVP_MD_CTX_free(*ctx);1210*ctx = NULL;1211}1212return (ARCHIVE_OK);1213}12141215#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)12161217static int1218__archive_sha384init(archive_sha384_ctx *ctx)1219{1220#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA1221return (win_crypto_init(ctx, BCRYPT_SHA384_ALGORITHM));1222#else1223return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_384));1224#endif1225}12261227static int1228__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1229size_t insize)1230{1231return (win_crypto_Update(ctx, indata, insize));1232}12331234static int1235__archive_sha384final(archive_sha384_ctx *ctx, void *md)1236{1237return (win_crypto_Final(md, 48, ctx));1238}12391240#else12411242static int1243__archive_sha384init(archive_sha384_ctx *ctx)1244{1245(void)ctx; /* UNUSED */1246return (ARCHIVE_FAILED);1247}12481249static int1250__archive_sha384update(archive_sha384_ctx *ctx, const void *indata,1251size_t insize)1252{1253(void)ctx; /* UNUSED */1254(void)indata; /* UNUSED */1255(void)insize; /* UNUSED */1256return (ARCHIVE_FAILED);1257}12581259static int1260__archive_sha384final(archive_sha384_ctx *ctx, void *md)1261{1262(void)ctx; /* UNUSED */1263(void)md; /* UNUSED */1264return (ARCHIVE_FAILED);1265}12661267#endif12681269/* SHA512 implementations */1270#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)12711272static int1273__archive_sha512init(archive_sha512_ctx *ctx)1274{1275SHA512_Init(ctx);1276return (ARCHIVE_OK);1277}12781279static int1280__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1281size_t insize)1282{1283SHA512_Update(ctx, indata, insize);1284return (ARCHIVE_OK);1285}12861287static int1288__archive_sha512final(archive_sha512_ctx *ctx, void *md)1289{1290SHA512_Final(md, ctx);1291return (ARCHIVE_OK);1292}12931294#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)12951296static int1297__archive_sha512init(archive_sha512_ctx *ctx)1298{1299SHA512Init(ctx);1300return (ARCHIVE_OK);1301}13021303static int1304__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1305size_t insize)1306{1307SHA512Update(ctx, indata, insize);1308return (ARCHIVE_OK);1309}13101311static int1312__archive_sha512final(archive_sha512_ctx *ctx, void *md)1313{1314SHA512Final(md, ctx);1315return (ARCHIVE_OK);1316}13171318#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)13191320static int1321__archive_sha512init(archive_sha512_ctx *ctx)1322{1323SHA512Init(ctx);1324return (ARCHIVE_OK);1325}13261327static int1328__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1329size_t insize)1330{1331SHA512Update(ctx, indata, insize);1332return (ARCHIVE_OK);1333}13341335static int1336__archive_sha512final(archive_sha512_ctx *ctx, void *md)1337{1338SHA512Final(md, ctx);1339return (ARCHIVE_OK);1340}13411342#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)13431344static int1345__archive_sha512init(archive_sha512_ctx *ctx)1346{1347SHA512_Init(ctx);1348return (ARCHIVE_OK);1349}13501351static int1352__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1353size_t insize)1354{1355SHA512_Update(ctx, indata, insize);1356return (ARCHIVE_OK);1357}13581359static int1360__archive_sha512final(archive_sha512_ctx *ctx, void *md)1361{1362SHA512_Final(md, ctx);1363return (ARCHIVE_OK);1364}13651366#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)13671368static int1369__archive_sha512init(archive_sha512_ctx *ctx)1370{1371CC_SHA512_Init(ctx);1372return (ARCHIVE_OK);1373}13741375static int1376__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1377size_t insize)1378{1379CC_SHA512_Update(ctx, indata, insize);1380return (ARCHIVE_OK);1381}13821383static int1384__archive_sha512final(archive_sha512_ctx *ctx, void *md)1385{1386CC_SHA512_Final(md, ctx);1387return (ARCHIVE_OK);1388}13891390#elif defined(ARCHIVE_CRYPTO_SHA512_MBEDTLS)13911392static int1393__archive_sha512init(archive_sha512_ctx *ctx)1394{1395mbedtls_sha512_init(ctx);1396if (mbedtls_sha512_starts_ret(ctx, 0) == 0)1397return (ARCHIVE_OK);1398else1399return (ARCHIVE_FATAL);1400}14011402static int1403__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1404size_t insize)1405{1406if (mbedtls_sha512_update_ret(ctx, indata, insize) == 0)1407return (ARCHIVE_OK);1408else1409return (ARCHIVE_FATAL);1410}14111412static int1413__archive_sha512final(archive_sha512_ctx *ctx, void *md)1414{1415if (mbedtls_sha512_finish_ret(ctx, md) == 0) {1416mbedtls_sha512_free(ctx);1417return (ARCHIVE_OK);1418} else {1419mbedtls_sha512_free(ctx);1420return (ARCHIVE_FATAL);1421}1422}14231424#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)14251426static int1427__archive_sha512init(archive_sha512_ctx *ctx)1428{1429sha512_init(ctx);1430return (ARCHIVE_OK);1431}14321433static int1434__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1435size_t insize)1436{1437sha512_update(ctx, insize, indata);1438return (ARCHIVE_OK);1439}14401441static int1442__archive_sha512final(archive_sha512_ctx *ctx, void *md)1443{1444sha512_digest(ctx, SHA512_DIGEST_SIZE, md);1445return (ARCHIVE_OK);1446}14471448#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)14491450static int1451__archive_sha512init(archive_sha512_ctx *ctx)1452{1453if ((*ctx = EVP_MD_CTX_new()) == NULL)1454return (ARCHIVE_FAILED);1455if (!EVP_DigestInit(*ctx, EVP_sha512()))1456return (ARCHIVE_FAILED);1457return (ARCHIVE_OK);1458}14591460static int1461__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1462size_t insize)1463{1464EVP_DigestUpdate(*ctx, indata, insize);1465return (ARCHIVE_OK);1466}14671468static int1469__archive_sha512final(archive_sha512_ctx *ctx, void *md)1470{1471if (*ctx) {1472EVP_DigestFinal(*ctx, md, NULL);1473EVP_MD_CTX_free(*ctx);1474*ctx = NULL;1475}1476return (ARCHIVE_OK);1477}14781479#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)14801481static int1482__archive_sha512init(archive_sha512_ctx *ctx)1483{1484#if defined(HAVE_BCRYPT_H) && _WIN32_WINNT >= _WIN32_WINNT_VISTA1485return (win_crypto_init(ctx, BCRYPT_SHA512_ALGORITHM));1486#else1487return (win_crypto_init(ctx, PROV_RSA_AES, CALG_SHA_512));1488#endif1489}14901491static int1492__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1493size_t insize)1494{1495return (win_crypto_Update(ctx, indata, insize));1496}14971498static int1499__archive_sha512final(archive_sha512_ctx *ctx, void *md)1500{1501return (win_crypto_Final(md, 64, ctx));1502}15031504#else15051506static int1507__archive_sha512init(archive_sha512_ctx *ctx)1508{1509(void)ctx; /* UNUSED */1510return (ARCHIVE_FAILED);1511}15121513static int1514__archive_sha512update(archive_sha512_ctx *ctx, const void *indata,1515size_t insize)1516{1517(void)ctx; /* UNUSED */1518(void)indata; /* UNUSED */1519(void)insize; /* UNUSED */1520return (ARCHIVE_FAILED);1521}15221523static int1524__archive_sha512final(archive_sha512_ctx *ctx, void *md)1525{1526(void)ctx; /* UNUSED */1527(void)md; /* UNUSED */1528return (ARCHIVE_FAILED);1529}15301531#endif15321533/* NOTE: Message Digest functions are set based on availability and by the1534* following order of preference.1535* 1. libc1536* 2. libc21537* 3. libc31538* 4. libSystem1539* 5. Nettle1540* 6. OpenSSL1541* 7. libmd1542* 8. Windows API1543*/1544const struct archive_digest __archive_digest =1545{1546/* MD5 */1547&__archive_md5init,1548&__archive_md5update,1549&__archive_md5final,15501551/* RIPEMD160 */1552&__archive_ripemd160init,1553&__archive_ripemd160update,1554&__archive_ripemd160final,15551556/* SHA1 */1557&__archive_sha1init,1558&__archive_sha1update,1559&__archive_sha1final,15601561/* SHA256 */1562&__archive_sha256init,1563&__archive_sha256update,1564&__archive_sha256final,15651566/* SHA384 */1567&__archive_sha384init,1568&__archive_sha384update,1569&__archive_sha384final,15701571/* SHA512 */1572&__archive_sha512init,1573&__archive_sha512update,1574&__archive_sha512final1575};157615771578