archive_hash.h revision 267654
1/*- 2 * Copyright (c) 2009 Joerg Sonnenberger 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 * 25 * $FreeBSD: releng/9.3/contrib/libarchive/libarchive/archive_hash.h 229592 2012-01-05 12:06:54Z mm $ 26 */ 27 28#ifndef __LIBARCHIVE_BUILD 29#error This header is only to be used internally to libarchive. 30#endif 31 32#ifdef HAVE_SYS_TYPES_H 33#include <sys/types.h> 34#endif 35 36/* 37 * Hash function support in various Operating Systems: 38 * 39 * NetBSD: 40 * - MD5 and SHA1 in libc: without _ after algorithm name 41 * - SHA2 in libc: with _ after algorithm name 42 * 43 * OpenBSD: 44 * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name 45 * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name 46 * 47 * DragonFly and FreeBSD (XXX not used yet): 48 * - MD5 and SHA1 in libmd: without _ after algorithm name 49 * - SHA256: with _ after algorithm name 50 * 51 * Mac OS X (10.4 and later): 52 * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name 53 * 54 * OpenSSL: 55 * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name 56 * 57 * Windows: 58 * - MD5, SHA1 and SHA2 in archive_windows.c: without algorithm name 59 * and with __la_ prefix. 60 */ 61#if defined(ARCHIVE_HASH_MD5_WIN) ||\ 62 defined(ARCHIVE_HASH_SHA1_WIN) || defined(ARCHIVE_HASH_SHA256_WIN) ||\ 63 defined(ARCHIVE_HASH_SHA384_WIN) || defined(ARCHIVE_HASH_SHA512_WIN) 64#include <wincrypt.h> 65typedef struct { 66 int valid; 67 HCRYPTPROV cryptProv; 68 HCRYPTHASH hash; 69} Digest_CTX; 70extern void __la_hash_Init(Digest_CTX *, ALG_ID); 71extern void __la_hash_Final(unsigned char *, size_t, Digest_CTX *); 72extern void __la_hash_Update(Digest_CTX *, const unsigned char *, size_t); 73#endif 74 75#if defined(ARCHIVE_HASH_MD5_LIBC) 76# include <md5.h> 77# define ARCHIVE_HAS_MD5 78typedef MD5_CTX archive_md5_ctx; 79# define archive_md5_init(ctx) MD5Init(ctx) 80# define archive_md5_final(ctx, buf) MD5Final(buf, ctx) 81# define archive_md5_update(ctx, buf, n) MD5Update(ctx, buf, n) 82#elif defined(ARCHIVE_HASH_MD5_LIBMD) 83# include <md5.h> 84# define ARCHIVE_HAS_MD5 85typedef MD5_CTX archive_md5_ctx; 86# define archive_md5_init(ctx) MD5Init(ctx) 87# define archive_md5_final(ctx, buf) MD5Final(buf, ctx) 88# define archive_md5_update(ctx, buf, n) MD5Update(ctx, buf, n) 89#elif defined(ARCHIVE_HASH_MD5_LIBSYSTEM) 90# include <CommonCrypto/CommonDigest.h> 91# define ARCHIVE_HAS_MD5 92typedef CC_MD5_CTX archive_md5_ctx; 93# define archive_md5_init(ctx) CC_MD5_Init(ctx) 94# define archive_md5_final(ctx, buf) CC_MD5_Final(buf, ctx) 95# define archive_md5_update(ctx, buf, n) CC_MD5_Update(ctx, buf, n) 96#elif defined(ARCHIVE_HASH_MD5_OPENSSL) 97# include <openssl/md5.h> 98# define ARCHIVE_HAS_MD5 99typedef MD5_CTX archive_md5_ctx; 100# define archive_md5_init(ctx) MD5_Init(ctx) 101# define archive_md5_final(ctx, buf) MD5_Final(buf, ctx) 102# define archive_md5_update(ctx, buf, n) MD5_Update(ctx, buf, n) 103#elif defined(ARCHIVE_HASH_MD5_WIN) 104# define ARCHIVE_HAS_MD5 105# define MD5_DIGEST_LENGTH 16 106typedef Digest_CTX archive_md5_ctx; 107# define archive_md5_init(ctx) __la_hash_Init(ctx, CALG_MD5) 108# define archive_md5_final(ctx, buf) __la_hash_Final(buf, MD5_DIGEST_LENGTH, ctx) 109# define archive_md5_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 110#endif 111 112#if defined(ARCHIVE_HASH_RMD160_LIBC) 113# include <rmd160.h> 114# define ARCHIVE_HAS_RMD160 115typedef RMD160_CTX archive_rmd160_ctx; 116# define archive_rmd160_init(ctx) RMD160Init(ctx) 117# define archive_rmd160_final(ctx, buf) RMD160Final(buf, ctx) 118# define archive_rmd160_update(ctx, buf, n) RMD160Update(ctx, buf, n) 119#elif defined(ARCHIVE_HASH_RMD160_OPENSSL) 120# include <openssl/ripemd.h> 121# define ARCHIVE_HAS_RMD160 122typedef RIPEMD160_CTX archive_rmd160_ctx; 123# define archive_rmd160_init(ctx) RIPEMD160_Init(ctx) 124# define archive_rmd160_final(ctx, buf) RIPEMD160_Final(buf, ctx) 125# define archive_rmd160_update(ctx, buf, n) RIPEMD160_Update(ctx, buf, n) 126#endif 127 128#if defined(ARCHIVE_HASH_SHA1_LIBC) 129# include <sha1.h> 130# define ARCHIVE_HAS_SHA1 131typedef SHA1_CTX archive_sha1_ctx; 132# define archive_sha1_init(ctx) SHA1Init(ctx) 133# define archive_sha1_final(ctx, buf) SHA1Final(buf, ctx) 134# define archive_sha1_update(ctx, buf, n) SHA1Update(ctx, buf, n) 135#elif defined(ARCHIVE_HASH_SHA1_LIBMD) 136# include <sha.h> 137# define ARCHIVE_HAS_SHA1 138typedef SHA1_CTX archive_sha1_ctx; 139# define archive_sha1_init(ctx) SHA1_Init(ctx) 140# define archive_sha1_final(ctx, buf) SHA1_Final(buf, ctx) 141# define archive_sha1_update(ctx, buf, n) SHA1_Update(ctx, buf, n) 142#elif defined(ARCHIVE_HASH_SHA1_LIBSYSTEM) 143# include <CommonCrypto/CommonDigest.h> 144# define ARCHIVE_HAS_SHA1 145typedef CC_SHA1_CTX archive_sha1_ctx; 146# define archive_sha1_init(ctx) CC_SHA1_Init(ctx) 147# define archive_sha1_final(ctx, buf) CC_SHA1_Final(buf, ctx) 148# define archive_sha1_update(ctx, buf, n) CC_SHA1_Update(ctx, buf, n) 149#elif defined(ARCHIVE_HASH_SHA1_OPENSSL) 150# include <openssl/sha.h> 151# define ARCHIVE_HAS_SHA1 152typedef SHA_CTX archive_sha1_ctx; 153# define archive_sha1_init(ctx) SHA1_Init(ctx) 154# define archive_sha1_final(ctx, buf) SHA1_Final(buf, ctx) 155# define archive_sha1_update(ctx, buf, n) SHA1_Update(ctx, buf, n) 156#elif defined(ARCHIVE_HASH_SHA1_WIN) 157# define ARCHIVE_HAS_SHA1 158# define SHA1_DIGEST_LENGTH 20 159typedef Digest_CTX archive_sha1_ctx; 160# define archive_sha1_init(ctx) __la_hash_Init(ctx, CALG_SHA1) 161# define archive_sha1_final(ctx, buf) __la_hash_Final(buf, SHA1_DIGEST_LENGTH, ctx) 162# define archive_sha1_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 163#endif 164 165#if defined(ARCHIVE_HASH_SHA256_LIBC) 166# include <sha2.h> 167# define ARCHIVE_HAS_SHA256 168typedef SHA256_CTX archive_sha256_ctx; 169# define archive_sha256_init(ctx) SHA256_Init(ctx) 170# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 171# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 172#elif defined(ARCHIVE_HASH_SHA256_LIBC2) 173# include <sha2.h> 174# define ARCHIVE_HAS_SHA256 175typedef SHA256_CTX archive_sha256_ctx; 176# define archive_sha256_init(ctx) SHA256Init(ctx) 177# define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx) 178# define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n) 179#elif defined(ARCHIVE_HASH_SHA256_LIBC3) 180# include <sha2.h> 181# define ARCHIVE_HAS_SHA256 182typedef SHA2_CTX archive_sha256_ctx; 183# define archive_sha256_init(ctx) SHA256Init(ctx) 184# define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx) 185# define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n) 186#elif defined(ARCHIVE_HASH_SHA256_LIBMD) 187# include <sha256.h> 188# define ARCHIVE_HAS_SHA256 189typedef SHA256_CTX archive_sha256_ctx; 190# define archive_sha256_init(ctx) SHA256_Init(ctx) 191# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 192# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 193#elif defined(ARCHIVE_HASH_SHA256_LIBSYSTEM) 194# include <CommonCrypto/CommonDigest.h> 195# define ARCHIVE_HAS_SHA256 196typedef CC_SHA256_CTX archive_shs256_ctx; 197# define archive_shs256_init(ctx) CC_SHA256_Init(ctx) 198# define archive_shs256_final(ctx, buf) CC_SHA256_Final(buf, ctx) 199# define archive_shs256_update(ctx, buf, n) CC_SHA256_Update(ctx, buf, n) 200#elif defined(ARCHIVE_HASH_SHA256_OPENSSL) 201# include <openssl/sha.h> 202# define ARCHIVE_HAS_SHA256 203typedef SHA256_CTX archive_sha256_ctx; 204# define archive_sha256_init(ctx) SHA256_Init(ctx) 205# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 206# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 207#elif defined(ARCHIVE_HASH_SHA256_WIN) 208# define ARCHIVE_HAS_SHA256 209# define SHA256_DIGEST_LENGTH 32 210typedef Digest_CTX archive_sha256_ctx; 211# define archive_sha256_init(ctx) __la_hash_Init(ctx, CALG_SHA_256) 212# define archive_sha256_final(ctx, buf) __la_hash_Final(buf, SHA256_DIGEST_LENGTH, ctx) 213# define archive_sha256_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 214#endif 215 216#if defined(ARCHIVE_HASH_SHA384_LIBC) 217# include <sha2.h> 218# define ARCHIVE_HAS_SHA384 219typedef SHA384_CTX archive_sha384_ctx; 220# define archive_sha384_init(ctx) SHA384_Init(ctx) 221# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) 222# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) 223#elif defined(ARCHIVE_HASH_SHA384_LIBC2) 224# include <sha2.h> 225# define ARCHIVE_HAS_SHA384 226typedef SHA384_CTX archive_sha384_ctx; 227# define archive_sha384_init(ctx) SHA384Init(ctx) 228# define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx) 229# define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n) 230#elif defined(ARCHIVE_HASH_SHA384_LIBC3) 231# include <sha2.h> 232# define ARCHIVE_HAS_SHA384 233typedef SHA2_CTX archive_sha384_ctx; 234# define archive_sha384_init(ctx) SHA384Init(ctx) 235# define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx) 236# define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n) 237#elif defined(ARCHIVE_HASH_SHA384_LIBSYSTEM) 238# include <CommonCrypto/CommonDigest.h> 239# define ARCHIVE_HAS_SHA384 240typedef CC_SHA512_CTX archive_shs384_ctx; 241# define archive_shs384_init(ctx) CC_SHA384_Init(ctx) 242# define archive_shs384_final(ctx, buf) CC_SHA384_Final(buf, ctx) 243# define archive_shs384_update(ctx, buf, n) CC_SHA384_Update(ctx, buf, n) 244#elif defined(ARCHIVE_HASH_SHA384_OPENSSL) 245# include <openssl/sha.h> 246# define ARCHIVE_HAS_SHA384 247typedef SHA512_CTX archive_sha384_ctx; 248# define archive_sha384_init(ctx) SHA384_Init(ctx) 249# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) 250# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) 251#elif defined(ARCHIVE_HASH_SHA384_WIN) 252# define ARCHIVE_HAS_SHA384 253# define SHA384_DIGEST_LENGTH 48 254typedef Digest_CTX archive_sha384_ctx; 255# define archive_sha384_init(ctx) __la_hash_Init(ctx, CALG_SHA_384) 256# define archive_sha384_final(ctx, buf) __la_hash_Final(buf, SHA384_DIGEST_LENGTH, ctx) 257# define archive_sha384_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 258#endif 259 260#if defined(ARCHIVE_HASH_SHA512_LIBC) 261# include <sha2.h> 262# define ARCHIVE_HAS_SHA512 263typedef SHA512_CTX archive_sha512_ctx; 264# define archive_sha512_init(ctx) SHA512_Init(ctx) 265# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 266# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 267#elif defined(ARCHIVE_HASH_SHA512_LIBC2) 268# include <sha2.h> 269# define ARCHIVE_HAS_SHA512 270typedef SHA512_CTX archive_sha512_ctx; 271# define archive_sha512_init(ctx) SHA512Init(ctx) 272# define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx) 273# define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n) 274#elif defined(ARCHIVE_HASH_SHA512_LIBC3) 275# include <sha2.h> 276# define ARCHIVE_HAS_SHA512 277typedef SHA2_CTX archive_sha512_ctx; 278# define archive_sha512_init(ctx) SHA512Init(ctx) 279# define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx) 280# define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n) 281#elif defined(ARCHIVE_HASH_SHA512_LIBMD) 282# include <sha512.h> 283# define ARCHIVE_HAS_SHA512 284typedef SHA512_CTX archive_sha512_ctx; 285# define archive_sha512_init(ctx) SHA512_Init(ctx) 286# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 287# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 288#elif defined(ARCHIVE_HASH_SHA512_LIBSYSTEM) 289# include <CommonCrypto/CommonDigest.h> 290# define ARCHIVE_HAS_SHA512 291typedef CC_SHA512_CTX archive_shs512_ctx; 292# define archive_shs512_init(ctx) CC_SHA512_Init(ctx) 293# define archive_shs512_final(ctx, buf) CC_SHA512_Final(buf, ctx) 294# define archive_shs512_update(ctx, buf, n) CC_SHA512_Update(ctx, buf, n) 295#elif defined(ARCHIVE_HASH_SHA512_OPENSSL) 296# include <openssl/sha.h> 297# define ARCHIVE_HAS_SHA512 298typedef SHA512_CTX archive_sha512_ctx; 299# define archive_sha512_init(ctx) SHA512_Init(ctx) 300# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 301# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 302#elif defined(ARCHIVE_HASH_SHA512_WIN) 303# define ARCHIVE_HAS_SHA512 304# define SHA512_DIGEST_LENGTH 64 305typedef Digest_CTX archive_sha512_ctx; 306# define archive_sha512_init(ctx) __la_hash_Init(ctx, CALG_SHA_512) 307# define archive_sha512_final(ctx, buf) __la_hash_Final(buf, SHA512_DIGEST_LENGTH, ctx) 308# define archive_sha512_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 309#endif 310