archive_digest.c revision 311042
1/*- 2* Copyright (c) 2003-2007 Tim Kientzle 3* Copyright (c) 2011 Andres Mejia 4* Copyright (c) 2011 Michihiro NAKAJIMA 5* All rights reserved. 6* 7* Redistribution and use in source and binary forms, with or without 8* modification, are permitted provided that the following conditions 9* are met: 10* 1. Redistributions of source code must retain the above copyright 11* notice, this list of conditions and the following disclaimer. 12* 2. Redistributions in binary form must reproduce the above copyright 13* notice, this list of conditions and the following disclaimer in the 14* documentation and/or other materials provided with the distribution. 15* 16* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 17* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 20* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26*/ 27 28#include "archive_platform.h" 29 30#include "archive.h" 31#include "archive_digest_private.h" 32 33/* In particular, force the configure probe to break if it tries 34 * to test a combination of OpenSSL and libmd. */ 35#if defined(ARCHIVE_CRYPTO_OPENSSL) && defined(ARCHIVE_CRYPTO_LIBMD) 36#error Cannot use both OpenSSL and libmd. 37#endif 38 39/* 40 * Message digest functions for Windows platform. 41 */ 42#if defined(ARCHIVE_CRYPTO_MD5_WIN) ||\ 43 defined(ARCHIVE_CRYPTO_SHA1_WIN) ||\ 44 defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\ 45 defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\ 46 defined(ARCHIVE_CRYPTO_SHA512_WIN) 47 48/* 49 * Initialize a Message digest. 50 */ 51static int 52win_crypto_init(Digest_CTX *ctx, ALG_ID algId) 53{ 54 55 ctx->valid = 0; 56 if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL, 57 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) { 58 if (GetLastError() != (DWORD)NTE_BAD_KEYSET) 59 return (ARCHIVE_FAILED); 60 if (!CryptAcquireContext(&ctx->cryptProv, NULL, NULL, 61 PROV_RSA_FULL, CRYPT_NEWKEYSET)) 62 return (ARCHIVE_FAILED); 63 } 64 65 if (!CryptCreateHash(ctx->cryptProv, algId, 0, 0, &ctx->hash)) { 66 CryptReleaseContext(ctx->cryptProv, 0); 67 return (ARCHIVE_FAILED); 68 } 69 70 ctx->valid = 1; 71 return (ARCHIVE_OK); 72} 73 74/* 75 * Update a Message digest. 76 */ 77static int 78win_crypto_Update(Digest_CTX *ctx, const unsigned char *buf, size_t len) 79{ 80 81 if (!ctx->valid) 82 return (ARCHIVE_FAILED); 83 84 CryptHashData(ctx->hash, 85 (unsigned char *)(uintptr_t)buf, 86 (DWORD)len, 0); 87 return (ARCHIVE_OK); 88} 89 90static int 91win_crypto_Final(unsigned char *buf, size_t bufsize, Digest_CTX *ctx) 92{ 93 DWORD siglen = (DWORD)bufsize; 94 95 if (!ctx->valid) 96 return (ARCHIVE_FAILED); 97 98 CryptGetHashParam(ctx->hash, HP_HASHVAL, buf, &siglen, 0); 99 CryptDestroyHash(ctx->hash); 100 CryptReleaseContext(ctx->cryptProv, 0); 101 ctx->valid = 0; 102 return (ARCHIVE_OK); 103} 104 105#endif /* defined(ARCHIVE_CRYPTO_*_WIN) */ 106 107 108/* MD5 implementations */ 109#if defined(ARCHIVE_CRYPTO_MD5_LIBC) 110 111static int 112__archive_libc_md5init(archive_md5_ctx *ctx) 113{ 114 MD5Init(ctx); 115 return (ARCHIVE_OK); 116} 117 118static int 119__archive_libc_md5update(archive_md5_ctx *ctx, const void *indata, 120 size_t insize) 121{ 122 MD5Update(ctx, indata, insize); 123 return (ARCHIVE_OK); 124} 125 126static int 127__archive_libc_md5final(archive_md5_ctx *ctx, void *md) 128{ 129 MD5Final(md, ctx); 130 return (ARCHIVE_OK); 131} 132 133#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD) 134 135static int 136__archive_libmd_md5init(archive_md5_ctx *ctx) 137{ 138 MD5Init(ctx); 139 return (ARCHIVE_OK); 140} 141 142static int 143__archive_libmd_md5update(archive_md5_ctx *ctx, const void *indata, 144 size_t insize) 145{ 146 MD5Update(ctx, indata, insize); 147 return (ARCHIVE_OK); 148} 149 150static int 151__archive_libmd_md5final(archive_md5_ctx *ctx, void *md) 152{ 153 MD5Final(md, ctx); 154 return (ARCHIVE_OK); 155} 156 157#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) 158 159static int 160__archive_libsystem_md5init(archive_md5_ctx *ctx) 161{ 162 CC_MD5_Init(ctx); 163 return (ARCHIVE_OK); 164} 165 166static int 167__archive_libsystem_md5update(archive_md5_ctx *ctx, const void *indata, 168 size_t insize) 169{ 170 CC_MD5_Update(ctx, indata, insize); 171 return (ARCHIVE_OK); 172} 173 174static int 175__archive_libsystem_md5final(archive_md5_ctx *ctx, void *md) 176{ 177 CC_MD5_Final(md, ctx); 178 return (ARCHIVE_OK); 179} 180 181#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE) 182 183static int 184__archive_nettle_md5init(archive_md5_ctx *ctx) 185{ 186 md5_init(ctx); 187 return (ARCHIVE_OK); 188} 189 190static int 191__archive_nettle_md5update(archive_md5_ctx *ctx, const void *indata, 192 size_t insize) 193{ 194 md5_update(ctx, insize, indata); 195 return (ARCHIVE_OK); 196} 197 198static int 199__archive_nettle_md5final(archive_md5_ctx *ctx, void *md) 200{ 201 md5_digest(ctx, MD5_DIGEST_SIZE, md); 202 return (ARCHIVE_OK); 203} 204 205#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL) 206 207static int 208__archive_openssl_md5init(archive_md5_ctx *ctx) 209{ 210 if ((*ctx = EVP_MD_CTX_new()) == NULL) 211 return (ARCHIVE_FAILED); 212 EVP_DigestInit(*ctx, EVP_md5()); 213 return (ARCHIVE_OK); 214} 215 216static int 217__archive_openssl_md5update(archive_md5_ctx *ctx, const void *indata, 218 size_t insize) 219{ 220 EVP_DigestUpdate(*ctx, indata, insize); 221 return (ARCHIVE_OK); 222} 223 224static int 225__archive_openssl_md5final(archive_md5_ctx *ctx, void *md) 226{ 227 /* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so 228 * this is meant to cope with that. Real fix is probably to fix 229 * archive_write_set_format_xar.c 230 */ 231 if (*ctx) { 232 EVP_DigestFinal(*ctx, md, NULL); 233 EVP_MD_CTX_free(*ctx); 234 *ctx = NULL; 235 } 236 return (ARCHIVE_OK); 237} 238 239#elif defined(ARCHIVE_CRYPTO_MD5_WIN) 240 241static int 242__archive_windowsapi_md5init(archive_md5_ctx *ctx) 243{ 244 return (win_crypto_init(ctx, CALG_MD5)); 245} 246 247static int 248__archive_windowsapi_md5update(archive_md5_ctx *ctx, const void *indata, 249 size_t insize) 250{ 251 return (win_crypto_Update(ctx, indata, insize)); 252} 253 254static int 255__archive_windowsapi_md5final(archive_md5_ctx *ctx, void *md) 256{ 257 return (win_crypto_Final(md, 16, ctx)); 258} 259 260#else 261 262static int 263__archive_stub_md5init(archive_md5_ctx *ctx) 264{ 265 (void)ctx; /* UNUSED */ 266 return (ARCHIVE_FAILED); 267} 268 269static int 270__archive_stub_md5update(archive_md5_ctx *ctx, const void *indata, 271 size_t insize) 272{ 273 (void)ctx; /* UNUSED */ 274 (void)indata; /* UNUSED */ 275 (void)insize; /* UNUSED */ 276 return (ARCHIVE_FAILED); 277} 278 279static int 280__archive_stub_md5final(archive_md5_ctx *ctx, void *md) 281{ 282 (void)ctx; /* UNUSED */ 283 (void)md; /* UNUSED */ 284 return (ARCHIVE_FAILED); 285} 286 287#endif 288 289/* RIPEMD160 implementations */ 290#if defined(ARCHIVE_CRYPTO_RMD160_LIBC) 291 292static int 293__archive_libc_ripemd160init(archive_rmd160_ctx *ctx) 294{ 295 RMD160Init(ctx); 296 return (ARCHIVE_OK); 297} 298 299static int 300__archive_libc_ripemd160update(archive_rmd160_ctx *ctx, const void *indata, 301 size_t insize) 302{ 303 RMD160Update(ctx, indata, insize); 304 return (ARCHIVE_OK); 305} 306 307static int 308__archive_libc_ripemd160final(archive_rmd160_ctx *ctx, void *md) 309{ 310 RMD160Final(md, ctx); 311 return (ARCHIVE_OK); 312} 313 314#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD) 315 316static int 317__archive_libmd_ripemd160init(archive_rmd160_ctx *ctx) 318{ 319 RIPEMD160_Init(ctx); 320 return (ARCHIVE_OK); 321} 322 323static int 324__archive_libmd_ripemd160update(archive_rmd160_ctx *ctx, const void *indata, 325 size_t insize) 326{ 327 RIPEMD160_Update(ctx, indata, insize); 328 return (ARCHIVE_OK); 329} 330 331static int 332__archive_libmd_ripemd160final(archive_rmd160_ctx *ctx, void *md) 333{ 334 RIPEMD160_Final(md, ctx); 335 return (ARCHIVE_OK); 336} 337 338#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE) 339 340static int 341__archive_nettle_ripemd160init(archive_rmd160_ctx *ctx) 342{ 343 ripemd160_init(ctx); 344 return (ARCHIVE_OK); 345} 346 347static int 348__archive_nettle_ripemd160update(archive_rmd160_ctx *ctx, const void *indata, 349 size_t insize) 350{ 351 ripemd160_update(ctx, insize, indata); 352 return (ARCHIVE_OK); 353} 354 355static int 356__archive_nettle_ripemd160final(archive_rmd160_ctx *ctx, void *md) 357{ 358 ripemd160_digest(ctx, RIPEMD160_DIGEST_SIZE, md); 359 return (ARCHIVE_OK); 360} 361 362#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) 363 364static int 365__archive_openssl_ripemd160init(archive_rmd160_ctx *ctx) 366{ 367 if ((*ctx = EVP_MD_CTX_new()) == NULL) 368 return (ARCHIVE_FAILED); 369 EVP_DigestInit(*ctx, EVP_ripemd160()); 370 return (ARCHIVE_OK); 371} 372 373static int 374__archive_openssl_ripemd160update(archive_rmd160_ctx *ctx, const void *indata, 375 size_t insize) 376{ 377 EVP_DigestUpdate(*ctx, indata, insize); 378 return (ARCHIVE_OK); 379} 380 381static int 382__archive_openssl_ripemd160final(archive_rmd160_ctx *ctx, void *md) 383{ 384 if (*ctx) { 385 EVP_DigestFinal(*ctx, md, NULL); 386 EVP_MD_CTX_free(*ctx); 387 *ctx = NULL; 388 } 389 return (ARCHIVE_OK); 390} 391 392#else 393 394static int 395__archive_stub_ripemd160init(archive_rmd160_ctx *ctx) 396{ 397 (void)ctx; /* UNUSED */ 398 return (ARCHIVE_FAILED); 399} 400 401static int 402__archive_stub_ripemd160update(archive_rmd160_ctx *ctx, const void *indata, 403 size_t insize) 404{ 405 (void)ctx; /* UNUSED */ 406 (void)indata; /* UNUSED */ 407 (void)insize; /* UNUSED */ 408 return (ARCHIVE_FAILED); 409} 410 411static int 412__archive_stub_ripemd160final(archive_rmd160_ctx *ctx, void *md) 413{ 414 (void)ctx; /* UNUSED */ 415 (void)md; /* UNUSED */ 416 return (ARCHIVE_FAILED); 417} 418 419#endif 420 421/* SHA1 implementations */ 422#if defined(ARCHIVE_CRYPTO_SHA1_LIBC) 423 424static int 425__archive_libc_sha1init(archive_sha1_ctx *ctx) 426{ 427 SHA1Init(ctx); 428 return (ARCHIVE_OK); 429} 430 431static int 432__archive_libc_sha1update(archive_sha1_ctx *ctx, const void *indata, 433 size_t insize) 434{ 435 SHA1Update(ctx, indata, insize); 436 return (ARCHIVE_OK); 437} 438 439static int 440__archive_libc_sha1final(archive_sha1_ctx *ctx, void *md) 441{ 442 SHA1Final(md, ctx); 443 return (ARCHIVE_OK); 444} 445 446#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD) 447 448static int 449__archive_libmd_sha1init(archive_sha1_ctx *ctx) 450{ 451 SHA1_Init(ctx); 452 return (ARCHIVE_OK); 453} 454 455static int 456__archive_libmd_sha1update(archive_sha1_ctx *ctx, const void *indata, 457 size_t insize) 458{ 459 SHA1_Update(ctx, indata, insize); 460 return (ARCHIVE_OK); 461} 462 463static int 464__archive_libmd_sha1final(archive_sha1_ctx *ctx, void *md) 465{ 466 SHA1_Final(md, ctx); 467 return (ARCHIVE_OK); 468} 469 470#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) 471 472static int 473__archive_libsystem_sha1init(archive_sha1_ctx *ctx) 474{ 475 CC_SHA1_Init(ctx); 476 return (ARCHIVE_OK); 477} 478 479static int 480__archive_libsystem_sha1update(archive_sha1_ctx *ctx, const void *indata, 481 size_t insize) 482{ 483 CC_SHA1_Update(ctx, indata, insize); 484 return (ARCHIVE_OK); 485} 486 487static int 488__archive_libsystem_sha1final(archive_sha1_ctx *ctx, void *md) 489{ 490 CC_SHA1_Final(md, ctx); 491 return (ARCHIVE_OK); 492} 493 494#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE) 495 496static int 497__archive_nettle_sha1init(archive_sha1_ctx *ctx) 498{ 499 sha1_init(ctx); 500 return (ARCHIVE_OK); 501} 502 503static int 504__archive_nettle_sha1update(archive_sha1_ctx *ctx, const void *indata, 505 size_t insize) 506{ 507 sha1_update(ctx, insize, indata); 508 return (ARCHIVE_OK); 509} 510 511static int 512__archive_nettle_sha1final(archive_sha1_ctx *ctx, void *md) 513{ 514 sha1_digest(ctx, SHA1_DIGEST_SIZE, md); 515 return (ARCHIVE_OK); 516} 517 518#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) 519 520static int 521__archive_openssl_sha1init(archive_sha1_ctx *ctx) 522{ 523 if ((*ctx = EVP_MD_CTX_new()) == NULL) 524 return (ARCHIVE_FAILED); 525 EVP_DigestInit(*ctx, EVP_sha1()); 526 return (ARCHIVE_OK); 527} 528 529static int 530__archive_openssl_sha1update(archive_sha1_ctx *ctx, const void *indata, 531 size_t insize) 532{ 533 EVP_DigestUpdate(*ctx, indata, insize); 534 return (ARCHIVE_OK); 535} 536 537static int 538__archive_openssl_sha1final(archive_sha1_ctx *ctx, void *md) 539{ 540 /* HACK: archive_write_set_format_xar.c is finalizing empty contexts, so 541 * this is meant to cope with that. Real fix is probably to fix 542 * archive_write_set_format_xar.c 543 */ 544 if (*ctx) { 545 EVP_DigestFinal(*ctx, md, NULL); 546 EVP_MD_CTX_free(*ctx); 547 *ctx = NULL; 548 } 549 return (ARCHIVE_OK); 550} 551 552#elif defined(ARCHIVE_CRYPTO_SHA1_WIN) 553 554static int 555__archive_windowsapi_sha1init(archive_sha1_ctx *ctx) 556{ 557 return (win_crypto_init(ctx, CALG_SHA1)); 558} 559 560static int 561__archive_windowsapi_sha1update(archive_sha1_ctx *ctx, const void *indata, 562 size_t insize) 563{ 564 return (win_crypto_Update(ctx, indata, insize)); 565} 566 567static int 568__archive_windowsapi_sha1final(archive_sha1_ctx *ctx, void *md) 569{ 570 return (win_crypto_Final(md, 20, ctx)); 571} 572 573#else 574 575static int 576__archive_stub_sha1init(archive_sha1_ctx *ctx) 577{ 578 (void)ctx; /* UNUSED */ 579 return (ARCHIVE_FAILED); 580} 581 582static int 583__archive_stub_sha1update(archive_sha1_ctx *ctx, const void *indata, 584 size_t insize) 585{ 586 (void)ctx; /* UNUSED */ 587 (void)indata; /* UNUSED */ 588 (void)insize; /* UNUSED */ 589 return (ARCHIVE_FAILED); 590} 591 592static int 593__archive_stub_sha1final(archive_sha1_ctx *ctx, void *md) 594{ 595 (void)ctx; /* UNUSED */ 596 (void)md; /* UNUSED */ 597 return (ARCHIVE_FAILED); 598} 599 600#endif 601 602/* SHA256 implementations */ 603#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) 604 605static int 606__archive_libc_sha256init(archive_sha256_ctx *ctx) 607{ 608 SHA256_Init(ctx); 609 return (ARCHIVE_OK); 610} 611 612static int 613__archive_libc_sha256update(archive_sha256_ctx *ctx, const void *indata, 614 size_t insize) 615{ 616 SHA256_Update(ctx, indata, insize); 617 return (ARCHIVE_OK); 618} 619 620static int 621__archive_libc_sha256final(archive_sha256_ctx *ctx, void *md) 622{ 623 SHA256_Final(md, ctx); 624 return (ARCHIVE_OK); 625} 626 627#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2) 628 629static int 630__archive_libc2_sha256init(archive_sha256_ctx *ctx) 631{ 632 SHA256Init(ctx); 633 return (ARCHIVE_OK); 634} 635 636static int 637__archive_libc2_sha256update(archive_sha256_ctx *ctx, const void *indata, 638 size_t insize) 639{ 640 SHA256Update(ctx, indata, insize); 641 return (ARCHIVE_OK); 642} 643 644static int 645__archive_libc2_sha256final(archive_sha256_ctx *ctx, void *md) 646{ 647 SHA256Final(md, ctx); 648 return (ARCHIVE_OK); 649} 650 651#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3) 652 653static int 654__archive_libc3_sha256init(archive_sha256_ctx *ctx) 655{ 656 SHA256Init(ctx); 657 return (ARCHIVE_OK); 658} 659 660static int 661__archive_libc3_sha256update(archive_sha256_ctx *ctx, const void *indata, 662 size_t insize) 663{ 664 SHA256Update(ctx, indata, insize); 665 return (ARCHIVE_OK); 666} 667 668static int 669__archive_libc3_sha256final(archive_sha256_ctx *ctx, void *md) 670{ 671 SHA256Final(md, ctx); 672 return (ARCHIVE_OK); 673} 674 675#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD) 676 677static int 678__archive_libmd_sha256init(archive_sha256_ctx *ctx) 679{ 680 SHA256_Init(ctx); 681 return (ARCHIVE_OK); 682} 683 684static int 685__archive_libmd_sha256update(archive_sha256_ctx *ctx, const void *indata, 686 size_t insize) 687{ 688 SHA256_Update(ctx, indata, insize); 689 return (ARCHIVE_OK); 690} 691 692static int 693__archive_libmd_sha256final(archive_sha256_ctx *ctx, void *md) 694{ 695 SHA256_Final(md, ctx); 696 return (ARCHIVE_OK); 697} 698 699#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) 700 701static int 702__archive_libsystem_sha256init(archive_sha256_ctx *ctx) 703{ 704 CC_SHA256_Init(ctx); 705 return (ARCHIVE_OK); 706} 707 708static int 709__archive_libsystem_sha256update(archive_sha256_ctx *ctx, const void *indata, 710 size_t insize) 711{ 712 CC_SHA256_Update(ctx, indata, insize); 713 return (ARCHIVE_OK); 714} 715 716static int 717__archive_libsystem_sha256final(archive_sha256_ctx *ctx, void *md) 718{ 719 CC_SHA256_Final(md, ctx); 720 return (ARCHIVE_OK); 721} 722 723#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE) 724 725static int 726__archive_nettle_sha256init(archive_sha256_ctx *ctx) 727{ 728 sha256_init(ctx); 729 return (ARCHIVE_OK); 730} 731 732static int 733__archive_nettle_sha256update(archive_sha256_ctx *ctx, const void *indata, 734 size_t insize) 735{ 736 sha256_update(ctx, insize, indata); 737 return (ARCHIVE_OK); 738} 739 740static int 741__archive_nettle_sha256final(archive_sha256_ctx *ctx, void *md) 742{ 743 sha256_digest(ctx, SHA256_DIGEST_SIZE, md); 744 return (ARCHIVE_OK); 745} 746 747#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) 748 749static int 750__archive_openssl_sha256init(archive_sha256_ctx *ctx) 751{ 752 if ((*ctx = EVP_MD_CTX_new()) == NULL) 753 return (ARCHIVE_FAILED); 754 EVP_DigestInit(*ctx, EVP_sha256()); 755 return (ARCHIVE_OK); 756} 757 758static int 759__archive_openssl_sha256update(archive_sha256_ctx *ctx, const void *indata, 760 size_t insize) 761{ 762 EVP_DigestUpdate(*ctx, indata, insize); 763 return (ARCHIVE_OK); 764} 765 766static int 767__archive_openssl_sha256final(archive_sha256_ctx *ctx, void *md) 768{ 769 if (*ctx) { 770 EVP_DigestFinal(*ctx, md, NULL); 771 EVP_MD_CTX_free(*ctx); 772 *ctx = NULL; 773 } 774 return (ARCHIVE_OK); 775} 776 777#elif defined(ARCHIVE_CRYPTO_SHA256_WIN) 778 779static int 780__archive_windowsapi_sha256init(archive_sha256_ctx *ctx) 781{ 782 return (win_crypto_init(ctx, CALG_SHA_256)); 783} 784 785static int 786__archive_windowsapi_sha256update(archive_sha256_ctx *ctx, const void *indata, 787 size_t insize) 788{ 789 return (win_crypto_Update(ctx, indata, insize)); 790} 791 792static int 793__archive_windowsapi_sha256final(archive_sha256_ctx *ctx, void *md) 794{ 795 return (win_crypto_Final(md, 32, ctx)); 796} 797 798#else 799 800static int 801__archive_stub_sha256init(archive_sha256_ctx *ctx) 802{ 803 (void)ctx; /* UNUSED */ 804 return (ARCHIVE_FAILED); 805} 806 807static int 808__archive_stub_sha256update(archive_sha256_ctx *ctx, const void *indata, 809 size_t insize) 810{ 811 (void)ctx; /* UNUSED */ 812 (void)indata; /* UNUSED */ 813 (void)insize; /* UNUSED */ 814 return (ARCHIVE_FAILED); 815} 816 817static int 818__archive_stub_sha256final(archive_sha256_ctx *ctx, void *md) 819{ 820 (void)ctx; /* UNUSED */ 821 (void)md; /* UNUSED */ 822 return (ARCHIVE_FAILED); 823} 824 825#endif 826 827/* SHA384 implementations */ 828#if defined(ARCHIVE_CRYPTO_SHA384_LIBC) 829 830static int 831__archive_libc_sha384init(archive_sha384_ctx *ctx) 832{ 833 SHA384_Init(ctx); 834 return (ARCHIVE_OK); 835} 836 837static int 838__archive_libc_sha384update(archive_sha384_ctx *ctx, const void *indata, 839 size_t insize) 840{ 841 SHA384_Update(ctx, indata, insize); 842 return (ARCHIVE_OK); 843} 844 845static int 846__archive_libc_sha384final(archive_sha384_ctx *ctx, void *md) 847{ 848 SHA384_Final(md, ctx); 849 return (ARCHIVE_OK); 850} 851 852#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2) 853 854static int 855__archive_libc2_sha384init(archive_sha384_ctx *ctx) 856{ 857 SHA384Init(ctx); 858 return (ARCHIVE_OK); 859} 860 861static int 862__archive_libc2_sha384update(archive_sha384_ctx *ctx, const void *indata, 863 size_t insize) 864{ 865 SHA384Update(ctx, indata, insize); 866 return (ARCHIVE_OK); 867} 868 869static int 870__archive_libc2_sha384final(archive_sha384_ctx *ctx, void *md) 871{ 872 SHA384Final(md, ctx); 873 return (ARCHIVE_OK); 874} 875 876#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3) 877 878static int 879__archive_libc3_sha384init(archive_sha384_ctx *ctx) 880{ 881 SHA384Init(ctx); 882 return (ARCHIVE_OK); 883} 884 885static int 886__archive_libc3_sha384update(archive_sha384_ctx *ctx, const void *indata, 887 size_t insize) 888{ 889 SHA384Update(ctx, indata, insize); 890 return (ARCHIVE_OK); 891} 892 893static int 894__archive_libc3_sha384final(archive_sha384_ctx *ctx, void *md) 895{ 896 SHA384Final(md, ctx); 897 return (ARCHIVE_OK); 898} 899 900#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) 901 902static int 903__archive_libsystem_sha384init(archive_sha384_ctx *ctx) 904{ 905 CC_SHA384_Init(ctx); 906 return (ARCHIVE_OK); 907} 908 909static int 910__archive_libsystem_sha384update(archive_sha384_ctx *ctx, const void *indata, 911 size_t insize) 912{ 913 CC_SHA384_Update(ctx, indata, insize); 914 return (ARCHIVE_OK); 915} 916 917static int 918__archive_libsystem_sha384final(archive_sha384_ctx *ctx, void *md) 919{ 920 CC_SHA384_Final(md, ctx); 921 return (ARCHIVE_OK); 922} 923 924#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE) 925 926static int 927__archive_nettle_sha384init(archive_sha384_ctx *ctx) 928{ 929 sha384_init(ctx); 930 return (ARCHIVE_OK); 931} 932 933static int 934__archive_nettle_sha384update(archive_sha384_ctx *ctx, const void *indata, 935 size_t insize) 936{ 937 sha384_update(ctx, insize, indata); 938 return (ARCHIVE_OK); 939} 940 941static int 942__archive_nettle_sha384final(archive_sha384_ctx *ctx, void *md) 943{ 944 sha384_digest(ctx, SHA384_DIGEST_SIZE, md); 945 return (ARCHIVE_OK); 946} 947 948#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) 949 950static int 951__archive_openssl_sha384init(archive_sha384_ctx *ctx) 952{ 953 if ((*ctx = EVP_MD_CTX_new()) == NULL) 954 return (ARCHIVE_FAILED); 955 EVP_DigestInit(*ctx, EVP_sha384()); 956 return (ARCHIVE_OK); 957} 958 959static int 960__archive_openssl_sha384update(archive_sha384_ctx *ctx, const void *indata, 961 size_t insize) 962{ 963 EVP_DigestUpdate(*ctx, indata, insize); 964 return (ARCHIVE_OK); 965} 966 967static int 968__archive_openssl_sha384final(archive_sha384_ctx *ctx, void *md) 969{ 970 if (*ctx) { 971 EVP_DigestFinal(*ctx, md, NULL); 972 EVP_MD_CTX_free(*ctx); 973 *ctx = NULL; 974 } 975 return (ARCHIVE_OK); 976} 977 978#elif defined(ARCHIVE_CRYPTO_SHA384_WIN) 979 980static int 981__archive_windowsapi_sha384init(archive_sha384_ctx *ctx) 982{ 983 return (win_crypto_init(ctx, CALG_SHA_384)); 984} 985 986static int 987__archive_windowsapi_sha384update(archive_sha384_ctx *ctx, const void *indata, 988 size_t insize) 989{ 990 return (win_crypto_Update(ctx, indata, insize)); 991} 992 993static int 994__archive_windowsapi_sha384final(archive_sha384_ctx *ctx, void *md) 995{ 996 return (win_crypto_Final(md, 48, ctx)); 997} 998 999#else 1000 1001static int 1002__archive_stub_sha384init(archive_sha384_ctx *ctx) 1003{ 1004 (void)ctx; /* UNUSED */ 1005 return (ARCHIVE_FAILED); 1006} 1007 1008static int 1009__archive_stub_sha384update(archive_sha384_ctx *ctx, const void *indata, 1010 size_t insize) 1011{ 1012 (void)ctx; /* UNUSED */ 1013 (void)indata; /* UNUSED */ 1014 (void)insize; /* UNUSED */ 1015 return (ARCHIVE_FAILED); 1016} 1017 1018static int 1019__archive_stub_sha384final(archive_sha384_ctx *ctx, void *md) 1020{ 1021 (void)ctx; /* UNUSED */ 1022 (void)md; /* UNUSED */ 1023 return (ARCHIVE_FAILED); 1024} 1025 1026#endif 1027 1028/* SHA512 implementations */ 1029#if defined(ARCHIVE_CRYPTO_SHA512_LIBC) 1030 1031static int 1032__archive_libc_sha512init(archive_sha512_ctx *ctx) 1033{ 1034 SHA512_Init(ctx); 1035 return (ARCHIVE_OK); 1036} 1037 1038static int 1039__archive_libc_sha512update(archive_sha512_ctx *ctx, const void *indata, 1040 size_t insize) 1041{ 1042 SHA512_Update(ctx, indata, insize); 1043 return (ARCHIVE_OK); 1044} 1045 1046static int 1047__archive_libc_sha512final(archive_sha512_ctx *ctx, void *md) 1048{ 1049 SHA512_Final(md, ctx); 1050 return (ARCHIVE_OK); 1051} 1052 1053#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2) 1054 1055static int 1056__archive_libc2_sha512init(archive_sha512_ctx *ctx) 1057{ 1058 SHA512Init(ctx); 1059 return (ARCHIVE_OK); 1060} 1061 1062static int 1063__archive_libc2_sha512update(archive_sha512_ctx *ctx, const void *indata, 1064 size_t insize) 1065{ 1066 SHA512Update(ctx, indata, insize); 1067 return (ARCHIVE_OK); 1068} 1069 1070static int 1071__archive_libc2_sha512final(archive_sha512_ctx *ctx, void *md) 1072{ 1073 SHA512Final(md, ctx); 1074 return (ARCHIVE_OK); 1075} 1076 1077#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3) 1078 1079static int 1080__archive_libc3_sha512init(archive_sha512_ctx *ctx) 1081{ 1082 SHA512Init(ctx); 1083 return (ARCHIVE_OK); 1084} 1085 1086static int 1087__archive_libc3_sha512update(archive_sha512_ctx *ctx, const void *indata, 1088 size_t insize) 1089{ 1090 SHA512Update(ctx, indata, insize); 1091 return (ARCHIVE_OK); 1092} 1093 1094static int 1095__archive_libc3_sha512final(archive_sha512_ctx *ctx, void *md) 1096{ 1097 SHA512Final(md, ctx); 1098 return (ARCHIVE_OK); 1099} 1100 1101#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD) 1102 1103static int 1104__archive_libmd_sha512init(archive_sha512_ctx *ctx) 1105{ 1106 SHA512_Init(ctx); 1107 return (ARCHIVE_OK); 1108} 1109 1110static int 1111__archive_libmd_sha512update(archive_sha512_ctx *ctx, const void *indata, 1112 size_t insize) 1113{ 1114 SHA512_Update(ctx, indata, insize); 1115 return (ARCHIVE_OK); 1116} 1117 1118static int 1119__archive_libmd_sha512final(archive_sha512_ctx *ctx, void *md) 1120{ 1121 SHA512_Final(md, ctx); 1122 return (ARCHIVE_OK); 1123} 1124 1125#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) 1126 1127static int 1128__archive_libsystem_sha512init(archive_sha512_ctx *ctx) 1129{ 1130 CC_SHA512_Init(ctx); 1131 return (ARCHIVE_OK); 1132} 1133 1134static int 1135__archive_libsystem_sha512update(archive_sha512_ctx *ctx, const void *indata, 1136 size_t insize) 1137{ 1138 CC_SHA512_Update(ctx, indata, insize); 1139 return (ARCHIVE_OK); 1140} 1141 1142static int 1143__archive_libsystem_sha512final(archive_sha512_ctx *ctx, void *md) 1144{ 1145 CC_SHA512_Final(md, ctx); 1146 return (ARCHIVE_OK); 1147} 1148 1149#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE) 1150 1151static int 1152__archive_nettle_sha512init(archive_sha512_ctx *ctx) 1153{ 1154 sha512_init(ctx); 1155 return (ARCHIVE_OK); 1156} 1157 1158static int 1159__archive_nettle_sha512update(archive_sha512_ctx *ctx, const void *indata, 1160 size_t insize) 1161{ 1162 sha512_update(ctx, insize, indata); 1163 return (ARCHIVE_OK); 1164} 1165 1166static int 1167__archive_nettle_sha512final(archive_sha512_ctx *ctx, void *md) 1168{ 1169 sha512_digest(ctx, SHA512_DIGEST_SIZE, md); 1170 return (ARCHIVE_OK); 1171} 1172 1173#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) 1174 1175static int 1176__archive_openssl_sha512init(archive_sha512_ctx *ctx) 1177{ 1178 if ((*ctx = EVP_MD_CTX_new()) == NULL) 1179 return (ARCHIVE_FAILED); 1180 EVP_DigestInit(*ctx, EVP_sha512()); 1181 return (ARCHIVE_OK); 1182} 1183 1184static int 1185__archive_openssl_sha512update(archive_sha512_ctx *ctx, const void *indata, 1186 size_t insize) 1187{ 1188 EVP_DigestUpdate(*ctx, indata, insize); 1189 return (ARCHIVE_OK); 1190} 1191 1192static int 1193__archive_openssl_sha512final(archive_sha512_ctx *ctx, void *md) 1194{ 1195 if (*ctx) { 1196 EVP_DigestFinal(*ctx, md, NULL); 1197 EVP_MD_CTX_free(*ctx); 1198 *ctx = NULL; 1199 } 1200 return (ARCHIVE_OK); 1201} 1202 1203#elif defined(ARCHIVE_CRYPTO_SHA512_WIN) 1204 1205static int 1206__archive_windowsapi_sha512init(archive_sha512_ctx *ctx) 1207{ 1208 return (win_crypto_init(ctx, CALG_SHA_512)); 1209} 1210 1211static int 1212__archive_windowsapi_sha512update(archive_sha512_ctx *ctx, const void *indata, 1213 size_t insize) 1214{ 1215 return (win_crypto_Update(ctx, indata, insize)); 1216} 1217 1218static int 1219__archive_windowsapi_sha512final(archive_sha512_ctx *ctx, void *md) 1220{ 1221 return (win_crypto_Final(md, 64, ctx)); 1222} 1223 1224#else 1225 1226static int 1227__archive_stub_sha512init(archive_sha512_ctx *ctx) 1228{ 1229 (void)ctx; /* UNUSED */ 1230 return (ARCHIVE_FAILED); 1231} 1232 1233static int 1234__archive_stub_sha512update(archive_sha512_ctx *ctx, const void *indata, 1235 size_t insize) 1236{ 1237 (void)ctx; /* UNUSED */ 1238 (void)indata; /* UNUSED */ 1239 (void)insize; /* UNUSED */ 1240 return (ARCHIVE_FAILED); 1241} 1242 1243static int 1244__archive_stub_sha512final(archive_sha512_ctx *ctx, void *md) 1245{ 1246 (void)ctx; /* UNUSED */ 1247 (void)md; /* UNUSED */ 1248 return (ARCHIVE_FAILED); 1249} 1250 1251#endif 1252 1253/* NOTE: Message Digest functions are set based on availability and by the 1254 * following order of preference. 1255 * 1. libc 1256 * 2. libc2 1257 * 3. libc3 1258 * 4. libSystem 1259 * 5. Nettle 1260 * 6. OpenSSL 1261 * 7. libmd 1262 * 8. Windows API 1263 */ 1264const struct archive_digest __archive_digest = 1265{ 1266/* MD5 */ 1267#if defined(ARCHIVE_CRYPTO_MD5_LIBC) 1268 &__archive_libc_md5init, 1269 &__archive_libc_md5update, 1270 &__archive_libc_md5final, 1271#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD) 1272 &__archive_libmd_md5init, 1273 &__archive_libmd_md5update, 1274 &__archive_libmd_md5final, 1275#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) 1276 &__archive_libsystem_md5init, 1277 &__archive_libsystem_md5update, 1278 &__archive_libsystem_md5final, 1279#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE) 1280 &__archive_nettle_md5init, 1281 &__archive_nettle_md5update, 1282 &__archive_nettle_md5final, 1283#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL) 1284 &__archive_openssl_md5init, 1285 &__archive_openssl_md5update, 1286 &__archive_openssl_md5final, 1287#elif defined(ARCHIVE_CRYPTO_MD5_WIN) 1288 &__archive_windowsapi_md5init, 1289 &__archive_windowsapi_md5update, 1290 &__archive_windowsapi_md5final, 1291#elif !defined(ARCHIVE_MD5_COMPILE_TEST) 1292 &__archive_stub_md5init, 1293 &__archive_stub_md5update, 1294 &__archive_stub_md5final, 1295#endif 1296 1297/* RIPEMD160 */ 1298#if defined(ARCHIVE_CRYPTO_RMD160_LIBC) 1299 &__archive_libc_ripemd160init, 1300 &__archive_libc_ripemd160update, 1301 &__archive_libc_ripemd160final, 1302#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD) 1303 &__archive_libmd_ripemd160init, 1304 &__archive_libmd_ripemd160update, 1305 &__archive_libmd_ripemd160final, 1306#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE) 1307 &__archive_nettle_ripemd160init, 1308 &__archive_nettle_ripemd160update, 1309 &__archive_nettle_ripemd160final, 1310#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) 1311 &__archive_openssl_ripemd160init, 1312 &__archive_openssl_ripemd160update, 1313 &__archive_openssl_ripemd160final, 1314#elif !defined(ARCHIVE_RMD160_COMPILE_TEST) 1315 &__archive_stub_ripemd160init, 1316 &__archive_stub_ripemd160update, 1317 &__archive_stub_ripemd160final, 1318#endif 1319 1320/* SHA1 */ 1321#if defined(ARCHIVE_CRYPTO_SHA1_LIBC) 1322 &__archive_libc_sha1init, 1323 &__archive_libc_sha1update, 1324 &__archive_libc_sha1final, 1325#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD) 1326 &__archive_libmd_sha1init, 1327 &__archive_libmd_sha1update, 1328 &__archive_libmd_sha1final, 1329#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) 1330 &__archive_libsystem_sha1init, 1331 &__archive_libsystem_sha1update, 1332 &__archive_libsystem_sha1final, 1333#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE) 1334 &__archive_nettle_sha1init, 1335 &__archive_nettle_sha1update, 1336 &__archive_nettle_sha1final, 1337#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) 1338 &__archive_openssl_sha1init, 1339 &__archive_openssl_sha1update, 1340 &__archive_openssl_sha1final, 1341#elif defined(ARCHIVE_CRYPTO_SHA1_WIN) 1342 &__archive_windowsapi_sha1init, 1343 &__archive_windowsapi_sha1update, 1344 &__archive_windowsapi_sha1final, 1345#elif !defined(ARCHIVE_SHA1_COMPILE_TEST) 1346 &__archive_stub_sha1init, 1347 &__archive_stub_sha1update, 1348 &__archive_stub_sha1final, 1349#endif 1350 1351/* SHA256 */ 1352#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) 1353 &__archive_libc_sha256init, 1354 &__archive_libc_sha256update, 1355 &__archive_libc_sha256final, 1356#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2) 1357 &__archive_libc2_sha256init, 1358 &__archive_libc2_sha256update, 1359 &__archive_libc2_sha256final, 1360#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3) 1361 &__archive_libc3_sha256init, 1362 &__archive_libc3_sha256update, 1363 &__archive_libc3_sha256final, 1364#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD) 1365 &__archive_libmd_sha256init, 1366 &__archive_libmd_sha256update, 1367 &__archive_libmd_sha256final, 1368#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) 1369 &__archive_libsystem_sha256init, 1370 &__archive_libsystem_sha256update, 1371 &__archive_libsystem_sha256final, 1372#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE) 1373 &__archive_nettle_sha256init, 1374 &__archive_nettle_sha256update, 1375 &__archive_nettle_sha256final, 1376#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) 1377 &__archive_openssl_sha256init, 1378 &__archive_openssl_sha256update, 1379 &__archive_openssl_sha256final, 1380#elif defined(ARCHIVE_CRYPTO_SHA256_WIN) 1381 &__archive_windowsapi_sha256init, 1382 &__archive_windowsapi_sha256update, 1383 &__archive_windowsapi_sha256final, 1384#elif !defined(ARCHIVE_SHA256_COMPILE_TEST) 1385 &__archive_stub_sha256init, 1386 &__archive_stub_sha256update, 1387 &__archive_stub_sha256final, 1388#endif 1389 1390/* SHA384 */ 1391#if defined(ARCHIVE_CRYPTO_SHA384_LIBC) 1392 &__archive_libc_sha384init, 1393 &__archive_libc_sha384update, 1394 &__archive_libc_sha384final, 1395#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2) 1396 &__archive_libc2_sha384init, 1397 &__archive_libc2_sha384update, 1398 &__archive_libc2_sha384final, 1399#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3) 1400 &__archive_libc3_sha384init, 1401 &__archive_libc3_sha384update, 1402 &__archive_libc3_sha384final, 1403#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) 1404 &__archive_libsystem_sha384init, 1405 &__archive_libsystem_sha384update, 1406 &__archive_libsystem_sha384final, 1407#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE) 1408 &__archive_nettle_sha384init, 1409 &__archive_nettle_sha384update, 1410 &__archive_nettle_sha384final, 1411#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) 1412 &__archive_openssl_sha384init, 1413 &__archive_openssl_sha384update, 1414 &__archive_openssl_sha384final, 1415#elif defined(ARCHIVE_CRYPTO_SHA384_WIN) 1416 &__archive_windowsapi_sha384init, 1417 &__archive_windowsapi_sha384update, 1418 &__archive_windowsapi_sha384final, 1419#elif !defined(ARCHIVE_SHA384_COMPILE_TEST) 1420 &__archive_stub_sha384init, 1421 &__archive_stub_sha384update, 1422 &__archive_stub_sha384final, 1423#endif 1424 1425/* SHA512 */ 1426#if defined(ARCHIVE_CRYPTO_SHA512_LIBC) 1427 &__archive_libc_sha512init, 1428 &__archive_libc_sha512update, 1429 &__archive_libc_sha512final 1430#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2) 1431 &__archive_libc2_sha512init, 1432 &__archive_libc2_sha512update, 1433 &__archive_libc2_sha512final 1434#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3) 1435 &__archive_libc3_sha512init, 1436 &__archive_libc3_sha512update, 1437 &__archive_libc3_sha512final 1438#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD) 1439 &__archive_libmd_sha512init, 1440 &__archive_libmd_sha512update, 1441 &__archive_libmd_sha512final 1442#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) 1443 &__archive_libsystem_sha512init, 1444 &__archive_libsystem_sha512update, 1445 &__archive_libsystem_sha512final 1446#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE) 1447 &__archive_nettle_sha512init, 1448 &__archive_nettle_sha512update, 1449 &__archive_nettle_sha512final 1450#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) 1451 &__archive_openssl_sha512init, 1452 &__archive_openssl_sha512update, 1453 &__archive_openssl_sha512final 1454#elif defined(ARCHIVE_CRYPTO_SHA512_WIN) 1455 &__archive_windowsapi_sha512init, 1456 &__archive_windowsapi_sha512update, 1457 &__archive_windowsapi_sha512final 1458#elif !defined(ARCHIVE_SHA512_COMPILE_TEST) 1459 &__archive_stub_sha512init, 1460 &__archive_stub_sha512update, 1461 &__archive_stub_sha512final 1462#endif 1463}; 1464