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