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