archive_hash.h revision 229592
1228753Smm/*- 2228753Smm * Copyright (c) 2009 Joerg Sonnenberger 3228753Smm * All rights reserved. 4228753Smm * 5228753Smm * Redistribution and use in source and binary forms, with or without 6228753Smm * modification, are permitted provided that the following conditions 7228753Smm * are met: 8228753Smm * 1. Redistributions of source code must retain the above copyright 9228753Smm * notice, this list of conditions and the following disclaimer. 10228753Smm * 2. Redistributions in binary form must reproduce the above copyright 11228753Smm * notice, this list of conditions and the following disclaimer in the 12228753Smm * documentation and/or other materials provided with the distribution. 13228753Smm * 14228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24228753Smm * 25229592Smm * $FreeBSD: stable/9/contrib/libarchive/libarchive/archive_hash.h 229592 2012-01-05 12:06:54Z mm $ 26228753Smm */ 27228753Smm 28228753Smm#ifndef __LIBARCHIVE_BUILD 29228753Smm#error This header is only to be used internally to libarchive. 30228753Smm#endif 31228753Smm 32228753Smm#ifdef HAVE_SYS_TYPES_H 33228753Smm#include <sys/types.h> 34228753Smm#endif 35228753Smm 36228753Smm/* 37228753Smm * Hash function support in various Operating Systems: 38228753Smm * 39228753Smm * NetBSD: 40228753Smm * - MD5 and SHA1 in libc: without _ after algorithm name 41228753Smm * - SHA2 in libc: with _ after algorithm name 42228753Smm * 43228753Smm * OpenBSD: 44228753Smm * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name 45228753Smm * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name 46228753Smm * 47228753Smm * DragonFly and FreeBSD (XXX not used yet): 48228753Smm * - MD5 and SHA1 in libmd: without _ after algorithm name 49228753Smm * - SHA256: with _ after algorithm name 50228753Smm * 51228753Smm * Mac OS X (10.4 and later): 52228753Smm * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name 53228753Smm * 54228753Smm * OpenSSL: 55228753Smm * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name 56228753Smm * 57228753Smm * Windows: 58228753Smm * - MD5, SHA1 and SHA2 in archive_windows.c: without algorithm name 59228753Smm * and with __la_ prefix. 60228753Smm */ 61228753Smm#if defined(ARCHIVE_HASH_MD5_WIN) ||\ 62228753Smm defined(ARCHIVE_HASH_SHA1_WIN) || defined(ARCHIVE_HASH_SHA256_WIN) ||\ 63228753Smm defined(ARCHIVE_HASH_SHA384_WIN) || defined(ARCHIVE_HASH_SHA512_WIN) 64228753Smm#include <wincrypt.h> 65228753Smmtypedef struct { 66228753Smm int valid; 67228753Smm HCRYPTPROV cryptProv; 68228753Smm HCRYPTHASH hash; 69228753Smm} Digest_CTX; 70228753Smmextern void __la_hash_Init(Digest_CTX *, ALG_ID); 71228753Smmextern void __la_hash_Final(unsigned char *, size_t, Digest_CTX *); 72228753Smmextern void __la_hash_Update(Digest_CTX *, const unsigned char *, size_t); 73228753Smm#endif 74228753Smm 75228753Smm#if defined(ARCHIVE_HASH_MD5_LIBC) 76228753Smm# include <md5.h> 77228753Smm# define ARCHIVE_HAS_MD5 78228753Smmtypedef MD5_CTX archive_md5_ctx; 79228753Smm# define archive_md5_init(ctx) MD5Init(ctx) 80228753Smm# define archive_md5_final(ctx, buf) MD5Final(buf, ctx) 81228753Smm# define archive_md5_update(ctx, buf, n) MD5Update(ctx, buf, n) 82228753Smm#elif defined(ARCHIVE_HASH_MD5_LIBMD) 83228753Smm# include <md5.h> 84228753Smm# define ARCHIVE_HAS_MD5 85228753Smmtypedef MD5_CTX archive_md5_ctx; 86228753Smm# define archive_md5_init(ctx) MD5Init(ctx) 87228753Smm# define archive_md5_final(ctx, buf) MD5Final(buf, ctx) 88228753Smm# define archive_md5_update(ctx, buf, n) MD5Update(ctx, buf, n) 89228753Smm#elif defined(ARCHIVE_HASH_MD5_LIBSYSTEM) 90228753Smm# include <CommonCrypto/CommonDigest.h> 91228753Smm# define ARCHIVE_HAS_MD5 92228753Smmtypedef CC_MD5_CTX archive_md5_ctx; 93228753Smm# define archive_md5_init(ctx) CC_MD5_Init(ctx) 94228753Smm# define archive_md5_final(ctx, buf) CC_MD5_Final(buf, ctx) 95228753Smm# define archive_md5_update(ctx, buf, n) CC_MD5_Update(ctx, buf, n) 96228753Smm#elif defined(ARCHIVE_HASH_MD5_OPENSSL) 97228753Smm# include <openssl/md5.h> 98228753Smm# define ARCHIVE_HAS_MD5 99228753Smmtypedef MD5_CTX archive_md5_ctx; 100228753Smm# define archive_md5_init(ctx) MD5_Init(ctx) 101228753Smm# define archive_md5_final(ctx, buf) MD5_Final(buf, ctx) 102228753Smm# define archive_md5_update(ctx, buf, n) MD5_Update(ctx, buf, n) 103228753Smm#elif defined(ARCHIVE_HASH_MD5_WIN) 104228753Smm# define ARCHIVE_HAS_MD5 105228753Smm# define MD5_DIGEST_LENGTH 16 106228753Smmtypedef Digest_CTX archive_md5_ctx; 107228753Smm# define archive_md5_init(ctx) __la_hash_Init(ctx, CALG_MD5) 108228753Smm# define archive_md5_final(ctx, buf) __la_hash_Final(buf, MD5_DIGEST_LENGTH, ctx) 109228753Smm# define archive_md5_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 110228753Smm#endif 111228753Smm 112228753Smm#if defined(ARCHIVE_HASH_RMD160_LIBC) 113228753Smm# include <rmd160.h> 114228753Smm# define ARCHIVE_HAS_RMD160 115228753Smmtypedef RMD160_CTX archive_rmd160_ctx; 116228753Smm# define archive_rmd160_init(ctx) RMD160Init(ctx) 117228753Smm# define archive_rmd160_final(ctx, buf) RMD160Final(buf, ctx) 118228753Smm# define archive_rmd160_update(ctx, buf, n) RMD160Update(ctx, buf, n) 119228753Smm#elif defined(ARCHIVE_HASH_RMD160_OPENSSL) 120228753Smm# include <openssl/ripemd.h> 121228753Smm# define ARCHIVE_HAS_RMD160 122228753Smmtypedef RIPEMD160_CTX archive_rmd160_ctx; 123228753Smm# define archive_rmd160_init(ctx) RIPEMD160_Init(ctx) 124228753Smm# define archive_rmd160_final(ctx, buf) RIPEMD160_Final(buf, ctx) 125228753Smm# define archive_rmd160_update(ctx, buf, n) RIPEMD160_Update(ctx, buf, n) 126228753Smm#endif 127228753Smm 128228753Smm#if defined(ARCHIVE_HASH_SHA1_LIBC) 129228753Smm# include <sha1.h> 130228753Smm# define ARCHIVE_HAS_SHA1 131228753Smmtypedef SHA1_CTX archive_sha1_ctx; 132228753Smm# define archive_sha1_init(ctx) SHA1Init(ctx) 133228753Smm# define archive_sha1_final(ctx, buf) SHA1Final(buf, ctx) 134228753Smm# define archive_sha1_update(ctx, buf, n) SHA1Update(ctx, buf, n) 135228753Smm#elif defined(ARCHIVE_HASH_SHA1_LIBMD) 136228753Smm# include <sha.h> 137228753Smm# define ARCHIVE_HAS_SHA1 138228753Smmtypedef SHA1_CTX archive_sha1_ctx; 139228753Smm# define archive_sha1_init(ctx) SHA1_Init(ctx) 140228753Smm# define archive_sha1_final(ctx, buf) SHA1_Final(buf, ctx) 141228753Smm# define archive_sha1_update(ctx, buf, n) SHA1_Update(ctx, buf, n) 142228753Smm#elif defined(ARCHIVE_HASH_SHA1_LIBSYSTEM) 143228753Smm# include <CommonCrypto/CommonDigest.h> 144228753Smm# define ARCHIVE_HAS_SHA1 145228753Smmtypedef CC_SHA1_CTX archive_sha1_ctx; 146228753Smm# define archive_sha1_init(ctx) CC_SHA1_Init(ctx) 147228753Smm# define archive_sha1_final(ctx, buf) CC_SHA1_Final(buf, ctx) 148228753Smm# define archive_sha1_update(ctx, buf, n) CC_SHA1_Update(ctx, buf, n) 149228753Smm#elif defined(ARCHIVE_HASH_SHA1_OPENSSL) 150228753Smm# include <openssl/sha.h> 151228753Smm# define ARCHIVE_HAS_SHA1 152228753Smmtypedef SHA_CTX archive_sha1_ctx; 153228753Smm# define archive_sha1_init(ctx) SHA1_Init(ctx) 154228753Smm# define archive_sha1_final(ctx, buf) SHA1_Final(buf, ctx) 155228753Smm# define archive_sha1_update(ctx, buf, n) SHA1_Update(ctx, buf, n) 156228753Smm#elif defined(ARCHIVE_HASH_SHA1_WIN) 157228753Smm# define ARCHIVE_HAS_SHA1 158228753Smm# define SHA1_DIGEST_LENGTH 20 159228753Smmtypedef Digest_CTX archive_sha1_ctx; 160228753Smm# define archive_sha1_init(ctx) __la_hash_Init(ctx, CALG_SHA1) 161228753Smm# define archive_sha1_final(ctx, buf) __la_hash_Final(buf, SHA1_DIGEST_LENGTH, ctx) 162228753Smm# define archive_sha1_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 163228753Smm#endif 164228753Smm 165228753Smm#if defined(ARCHIVE_HASH_SHA256_LIBC) 166228753Smm# include <sha2.h> 167228753Smm# define ARCHIVE_HAS_SHA256 168228753Smmtypedef SHA256_CTX archive_sha256_ctx; 169228753Smm# define archive_sha256_init(ctx) SHA256_Init(ctx) 170228753Smm# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 171228753Smm# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 172228753Smm#elif defined(ARCHIVE_HASH_SHA256_LIBC2) 173228753Smm# include <sha2.h> 174228753Smm# define ARCHIVE_HAS_SHA256 175228753Smmtypedef SHA256_CTX archive_sha256_ctx; 176228753Smm# define archive_sha256_init(ctx) SHA256Init(ctx) 177228753Smm# define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx) 178228753Smm# define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n) 179228753Smm#elif defined(ARCHIVE_HASH_SHA256_LIBC3) 180228753Smm# include <sha2.h> 181228753Smm# define ARCHIVE_HAS_SHA256 182228753Smmtypedef SHA2_CTX archive_sha256_ctx; 183228753Smm# define archive_sha256_init(ctx) SHA256Init(ctx) 184228753Smm# define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx) 185228753Smm# define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n) 186228753Smm#elif defined(ARCHIVE_HASH_SHA256_LIBMD) 187228753Smm# include <sha256.h> 188228753Smm# define ARCHIVE_HAS_SHA256 189228753Smmtypedef SHA256_CTX archive_sha256_ctx; 190228753Smm# define archive_sha256_init(ctx) SHA256_Init(ctx) 191228753Smm# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 192228753Smm# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 193228753Smm#elif defined(ARCHIVE_HASH_SHA256_LIBSYSTEM) 194228753Smm# include <CommonCrypto/CommonDigest.h> 195228753Smm# define ARCHIVE_HAS_SHA256 196228753Smmtypedef CC_SHA256_CTX archive_shs256_ctx; 197228753Smm# define archive_shs256_init(ctx) CC_SHA256_Init(ctx) 198228753Smm# define archive_shs256_final(ctx, buf) CC_SHA256_Final(buf, ctx) 199228753Smm# define archive_shs256_update(ctx, buf, n) CC_SHA256_Update(ctx, buf, n) 200228753Smm#elif defined(ARCHIVE_HASH_SHA256_OPENSSL) 201228753Smm# include <openssl/sha.h> 202228753Smm# define ARCHIVE_HAS_SHA256 203228753Smmtypedef SHA256_CTX archive_sha256_ctx; 204228753Smm# define archive_sha256_init(ctx) SHA256_Init(ctx) 205228753Smm# define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 206228753Smm# define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 207228753Smm#elif defined(ARCHIVE_HASH_SHA256_WIN) 208228753Smm# define ARCHIVE_HAS_SHA256 209228753Smm# define SHA256_DIGEST_LENGTH 32 210228753Smmtypedef Digest_CTX archive_sha256_ctx; 211228753Smm# define archive_sha256_init(ctx) __la_hash_Init(ctx, CALG_SHA_256) 212228753Smm# define archive_sha256_final(ctx, buf) __la_hash_Final(buf, SHA256_DIGEST_LENGTH, ctx) 213228753Smm# define archive_sha256_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 214228753Smm#endif 215228753Smm 216228753Smm#if defined(ARCHIVE_HASH_SHA384_LIBC) 217228753Smm# include <sha2.h> 218228753Smm# define ARCHIVE_HAS_SHA384 219228753Smmtypedef SHA384_CTX archive_sha384_ctx; 220228753Smm# define archive_sha384_init(ctx) SHA384_Init(ctx) 221228753Smm# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) 222228753Smm# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) 223228753Smm#elif defined(ARCHIVE_HASH_SHA384_LIBC2) 224228753Smm# include <sha2.h> 225228753Smm# define ARCHIVE_HAS_SHA384 226228753Smmtypedef SHA384_CTX archive_sha384_ctx; 227228753Smm# define archive_sha384_init(ctx) SHA384Init(ctx) 228228753Smm# define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx) 229228753Smm# define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n) 230228753Smm#elif defined(ARCHIVE_HASH_SHA384_LIBC3) 231228753Smm# include <sha2.h> 232228753Smm# define ARCHIVE_HAS_SHA384 233228753Smmtypedef SHA2_CTX archive_sha384_ctx; 234228753Smm# define archive_sha384_init(ctx) SHA384Init(ctx) 235228753Smm# define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx) 236228753Smm# define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n) 237228753Smm#elif defined(ARCHIVE_HASH_SHA384_LIBSYSTEM) 238228753Smm# include <CommonCrypto/CommonDigest.h> 239228753Smm# define ARCHIVE_HAS_SHA384 240228753Smmtypedef CC_SHA512_CTX archive_shs384_ctx; 241228753Smm# define archive_shs384_init(ctx) CC_SHA384_Init(ctx) 242228753Smm# define archive_shs384_final(ctx, buf) CC_SHA384_Final(buf, ctx) 243228753Smm# define archive_shs384_update(ctx, buf, n) CC_SHA384_Update(ctx, buf, n) 244228753Smm#elif defined(ARCHIVE_HASH_SHA384_OPENSSL) 245228753Smm# include <openssl/sha.h> 246228753Smm# define ARCHIVE_HAS_SHA384 247228753Smmtypedef SHA512_CTX archive_sha384_ctx; 248228753Smm# define archive_sha384_init(ctx) SHA384_Init(ctx) 249228753Smm# define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) 250228753Smm# define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) 251228753Smm#elif defined(ARCHIVE_HASH_SHA384_WIN) 252228753Smm# define ARCHIVE_HAS_SHA384 253228753Smm# define SHA384_DIGEST_LENGTH 48 254228753Smmtypedef Digest_CTX archive_sha384_ctx; 255228753Smm# define archive_sha384_init(ctx) __la_hash_Init(ctx, CALG_SHA_384) 256228753Smm# define archive_sha384_final(ctx, buf) __la_hash_Final(buf, SHA384_DIGEST_LENGTH, ctx) 257228753Smm# define archive_sha384_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 258228753Smm#endif 259228753Smm 260228753Smm#if defined(ARCHIVE_HASH_SHA512_LIBC) 261228753Smm# include <sha2.h> 262228753Smm# define ARCHIVE_HAS_SHA512 263228753Smmtypedef SHA512_CTX archive_sha512_ctx; 264228753Smm# define archive_sha512_init(ctx) SHA512_Init(ctx) 265228753Smm# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 266228753Smm# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 267228753Smm#elif defined(ARCHIVE_HASH_SHA512_LIBC2) 268228753Smm# include <sha2.h> 269228753Smm# define ARCHIVE_HAS_SHA512 270228753Smmtypedef SHA512_CTX archive_sha512_ctx; 271228753Smm# define archive_sha512_init(ctx) SHA512Init(ctx) 272228753Smm# define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx) 273228753Smm# define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n) 274228753Smm#elif defined(ARCHIVE_HASH_SHA512_LIBC3) 275228753Smm# include <sha2.h> 276228753Smm# define ARCHIVE_HAS_SHA512 277228753Smmtypedef SHA2_CTX archive_sha512_ctx; 278228753Smm# define archive_sha512_init(ctx) SHA512Init(ctx) 279228753Smm# define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx) 280228753Smm# define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n) 281228753Smm#elif defined(ARCHIVE_HASH_SHA512_LIBMD) 282228753Smm# include <sha512.h> 283228753Smm# define ARCHIVE_HAS_SHA512 284228753Smmtypedef SHA512_CTX archive_sha512_ctx; 285228753Smm# define archive_sha512_init(ctx) SHA512_Init(ctx) 286228753Smm# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 287228753Smm# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 288228753Smm#elif defined(ARCHIVE_HASH_SHA512_LIBSYSTEM) 289228753Smm# include <CommonCrypto/CommonDigest.h> 290228753Smm# define ARCHIVE_HAS_SHA512 291228753Smmtypedef CC_SHA512_CTX archive_shs512_ctx; 292228753Smm# define archive_shs512_init(ctx) CC_SHA512_Init(ctx) 293228753Smm# define archive_shs512_final(ctx, buf) CC_SHA512_Final(buf, ctx) 294228753Smm# define archive_shs512_update(ctx, buf, n) CC_SHA512_Update(ctx, buf, n) 295228753Smm#elif defined(ARCHIVE_HASH_SHA512_OPENSSL) 296228753Smm# include <openssl/sha.h> 297228753Smm# define ARCHIVE_HAS_SHA512 298228753Smmtypedef SHA512_CTX archive_sha512_ctx; 299228753Smm# define archive_sha512_init(ctx) SHA512_Init(ctx) 300228753Smm# define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 301228753Smm# define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 302228753Smm#elif defined(ARCHIVE_HASH_SHA512_WIN) 303228753Smm# define ARCHIVE_HAS_SHA512 304228753Smm# define SHA512_DIGEST_LENGTH 64 305228753Smmtypedef Digest_CTX archive_sha512_ctx; 306228753Smm# define archive_sha512_init(ctx) __la_hash_Init(ctx, CALG_SHA_512) 307228753Smm# define archive_sha512_final(ctx, buf) __la_hash_Final(buf, SHA512_DIGEST_LENGTH, ctx) 308228753Smm# define archive_sha512_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 309228753Smm#endif 310