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: head/lib/libarchive/archive_hash.h 201171 2009-12-29 06:39:07Z kientzle $ 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> 65 typedef struct { 66 int valid; 67 HCRYPTPROV cryptProv; 68 HCRYPTHASH hash; 69 } Digest_CTX; 70 extern void __la_hash_Init(Digest_CTX *, ALG_ID); 71 extern void __la_hash_Final(unsigned char *, size_t, Digest_CTX *); 72 extern 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 78 typedef 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_LIBSYSTEM) 83 # include <CommonCrypto/CommonDigest.h> 84 # define ARCHIVE_HAS_MD5 85 typedef CC_MD5_CTX archive_md5_ctx; 86 # define archive_md5_init(ctx) CC_MD5_Init(ctx) 87 # define archive_md5_final(ctx, buf) CC_MD5_Final(buf, ctx) 88 # define archive_md5_update(ctx, buf, n) CC_MD5_Update(ctx, buf, n) 89 #elif defined(ARCHIVE_HASH_MD5_OPENSSL) 90 # include <openssl/md5.h> 91 # define ARCHIVE_HAS_MD5 92 typedef MD5_CTX archive_md5_ctx; 93 # define archive_md5_init(ctx) MD5_Init(ctx) 94 # define archive_md5_final(ctx, buf) MD5_Final(buf, ctx) 95 # define archive_md5_update(ctx, buf, n) MD5_Update(ctx, buf, n) 96 #elif defined(ARCHIVE_HASH_MD5_WIN) 97 # define ARCHIVE_HAS_MD5 98 # define MD5_DIGEST_LENGTH 16 99 typedef Digest_CTX archive_md5_ctx; 100 # define archive_md5_init(ctx) __la_hash_Init(ctx, CALG_MD5) 101 # define archive_md5_final(ctx, buf) __la_hash_Final(buf, MD5_DIGEST_LENGTH, ctx) 102 # define archive_md5_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 103 #endif 104 105 #if defined(ARCHIVE_HASH_RMD160_LIBC) 106 # include <rmd160.h> 107 # define ARCHIVE_HAS_RMD160 108 typedef RMD160_CTX archive_rmd160_ctx; 109 # define archive_rmd160_init(ctx) RMD160Init(ctx) 110 # define archive_rmd160_final(ctx, buf) RMD160Final(buf, ctx) 111 # define archive_rmd160_update(ctx, buf, n) RMD160Update(ctx, buf, n) 112 #elif defined(ARCHIVE_HASH_RMD160_OPENSSL) 113 # include <openssl/ripemd.h> 114 # define ARCHIVE_HAS_RMD160 115 typedef RIPEMD160_CTX archive_rmd160_ctx; 116 # define archive_rmd160_init(ctx) RIPEMD160_Init(ctx) 117 # define archive_rmd160_final(ctx, buf) RIPEMD160_Final(buf, ctx) 118 # define archive_rmd160_update(ctx, buf, n) RIPEMD160_Update(ctx, buf, n) 119 #endif 120 121 #if defined(ARCHIVE_HASH_SHA1_LIBC) 122 # include <sha1.h> 123 # define ARCHIVE_HAS_SHA1 124 typedef SHA1_CTX archive_sha1_ctx; 125 # define archive_sha1_init(ctx) SHA1Init(ctx) 126 # define archive_sha1_final(ctx, buf) SHA1Final(buf, ctx) 127 # define archive_sha1_update(ctx, buf, n) SHA1Update(ctx, buf, n) 128 #elif defined(ARCHIVE_HASH_SHA1_LIBSYSTEM) 129 # include <CommonCrypto/CommonDigest.h> 130 # define ARCHIVE_HAS_SHA1 131 typedef CC_SHA1_CTX archive_sha1_ctx; 132 # define archive_sha1_init(ctx) CC_SHA1_Init(ctx) 133 # define archive_sha1_final(ctx, buf) CC_SHA1_Final(buf, ctx) 134 # define archive_sha1_update(ctx, buf, n) CC_SHA1_Update(ctx, buf, n) 135 #elif defined(ARCHIVE_HASH_SHA1_OPENSSL) 136 # include <openssl/sha.h> 137 # define ARCHIVE_HAS_SHA1 138 typedef SHA_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_WIN) 143 # define ARCHIVE_HAS_SHA1 144 # define SHA1_DIGEST_LENGTH 20 145 typedef Digest_CTX archive_sha1_ctx; 146 # define archive_sha1_init(ctx) __la_hash_Init(ctx, CALG_SHA1) 147 # define archive_sha1_final(ctx, buf) __la_hash_Final(buf, SHA1_DIGEST_LENGTH, ctx) 148 # define archive_sha1_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 149 #endif 150 151 #if defined(ARCHIVE_HASH_SHA256_LIBC) 152 # include <sha2.h> 153 # define ARCHIVE_HAS_SHA256 154 typedef SHA256_CTX archive_sha256_ctx; 155 # define archive_sha256_init(ctx) SHA256_Init(ctx) 156 # define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 157 # define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 158 #elif defined(ARCHIVE_HASH_SHA256_LIBC2) 159 # include <sha2.h> 160 # define ARCHIVE_HAS_SHA256 161 typedef SHA256_CTX archive_sha256_ctx; 162 # define archive_sha256_init(ctx) SHA256Init(ctx) 163 # define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx) 164 # define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n) 165 #elif defined(ARCHIVE_HASH_SHA256_LIBC3) 166 # include <sha2.h> 167 # define ARCHIVE_HAS_SHA256 168 typedef SHA2_CTX archive_sha256_ctx; 169 # define archive_sha256_init(ctx) SHA256Init(ctx) 170 # define archive_sha256_final(ctx, buf) SHA256Final(buf, ctx) 171 # define archive_sha256_update(ctx, buf, n) SHA256Update(ctx, buf, n) 172 #elif defined(ARCHIVE_HASH_SHA256_LIBSYSTEM) 173 # include <CommonCrypto/CommonDigest.h> 174 # define ARCHIVE_HAS_SHA256 175 typedef CC_SHA256_CTX archive_shs256_ctx; 176 # define archive_shs256_init(ctx) CC_SHA256_Init(ctx) 177 # define archive_shs256_final(ctx, buf) CC_SHA256_Final(buf, ctx) 178 # define archive_shs256_update(ctx, buf, n) CC_SHA256_Update(ctx, buf, n) 179 #elif defined(ARCHIVE_HASH_SHA256_OPENSSL) 180 # include <openssl/sha.h> 181 # define ARCHIVE_HAS_SHA256 182 typedef SHA256_CTX archive_sha256_ctx; 183 # define archive_sha256_init(ctx) SHA256_Init(ctx) 184 # define archive_sha256_final(ctx, buf) SHA256_Final(buf, ctx) 185 # define archive_sha256_update(ctx, buf, n) SHA256_Update(ctx, buf, n) 186 #elif defined(ARCHIVE_HASH_SHA256_WIN) 187 # define ARCHIVE_HAS_SHA256 188 # define SHA256_DIGEST_LENGTH 32 189 typedef Digest_CTX archive_sha256_ctx; 190 # define archive_sha256_init(ctx) __la_hash_Init(ctx, CALG_SHA_256) 191 # define archive_sha256_final(ctx, buf) __la_hash_Final(buf, SHA256_DIGEST_LENGTH, ctx) 192 # define archive_sha256_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 193 #endif 194 195 #if defined(ARCHIVE_HASH_SHA384_LIBC) 196 # include <sha2.h> 197 # define ARCHIVE_HAS_SHA384 198 typedef SHA384_CTX archive_sha384_ctx; 199 # define archive_sha384_init(ctx) SHA384_Init(ctx) 200 # define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) 201 # define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) 202 #elif defined(ARCHIVE_HASH_SHA384_LIBC2) 203 # include <sha2.h> 204 # define ARCHIVE_HAS_SHA384 205 typedef SHA384_CTX archive_sha384_ctx; 206 # define archive_sha384_init(ctx) SHA384Init(ctx) 207 # define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx) 208 # define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n) 209 #elif defined(ARCHIVE_HASH_SHA384_LIBC3) 210 # include <sha2.h> 211 # define ARCHIVE_HAS_SHA384 212 typedef SHA2_CTX archive_sha384_ctx; 213 # define archive_sha384_init(ctx) SHA384Init(ctx) 214 # define archive_sha384_final(ctx, buf) SHA384Final(buf, ctx) 215 # define archive_sha384_update(ctx, buf, n) SHA384Update(ctx, buf, n) 216 #elif defined(ARCHIVE_HASH_SHA384_LIBSYSTEM) 217 # include <CommonCrypto/CommonDigest.h> 218 # define ARCHIVE_HAS_SHA384 219 typedef CC_SHA512_CTX archive_shs384_ctx; 220 # define archive_shs384_init(ctx) CC_SHA384_Init(ctx) 221 # define archive_shs384_final(ctx, buf) CC_SHA384_Final(buf, ctx) 222 # define archive_shs384_update(ctx, buf, n) CC_SHA384_Update(ctx, buf, n) 223 #elif defined(ARCHIVE_HASH_SHA384_OPENSSL) 224 # include <openssl/sha.h> 225 # define ARCHIVE_HAS_SHA384 226 typedef SHA512_CTX archive_sha384_ctx; 227 # define archive_sha384_init(ctx) SHA384_Init(ctx) 228 # define archive_sha384_final(ctx, buf) SHA384_Final(buf, ctx) 229 # define archive_sha384_update(ctx, buf, n) SHA384_Update(ctx, buf, n) 230 #elif defined(ARCHIVE_HASH_SHA384_WIN) 231 # define ARCHIVE_HAS_SHA384 232 # define SHA384_DIGEST_LENGTH 48 233 typedef Digest_CTX archive_sha384_ctx; 234 # define archive_sha384_init(ctx) __la_hash_Init(ctx, CALG_SHA_384) 235 # define archive_sha384_final(ctx, buf) __la_hash_Final(buf, SHA384_DIGEST_LENGTH, ctx) 236 # define archive_sha384_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 237 #endif 238 239 #if defined(ARCHIVE_HASH_SHA512_LIBC) 240 # include <sha2.h> 241 # define ARCHIVE_HAS_SHA512 242 typedef SHA512_CTX archive_sha512_ctx; 243 # define archive_sha512_init(ctx) SHA512_Init(ctx) 244 # define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 245 # define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 246 #elif defined(ARCHIVE_HASH_SHA512_LIBC2) 247 # include <sha2.h> 248 # define ARCHIVE_HAS_SHA512 249 typedef SHA512_CTX archive_sha512_ctx; 250 # define archive_sha512_init(ctx) SHA512Init(ctx) 251 # define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx) 252 # define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n) 253 #elif defined(ARCHIVE_HASH_SHA512_LIBC3) 254 # include <sha2.h> 255 # define ARCHIVE_HAS_SHA512 256 typedef SHA2_CTX archive_sha512_ctx; 257 # define archive_sha512_init(ctx) SHA512Init(ctx) 258 # define archive_sha512_final(ctx, buf) SHA512Final(buf, ctx) 259 # define archive_sha512_update(ctx, buf, n) SHA512Update(ctx, buf, n) 260 #elif defined(ARCHIVE_HASH_SHA512_LIBSYSTEM) 261 # include <CommonCrypto/CommonDigest.h> 262 # define ARCHIVE_HAS_SHA512 263 typedef CC_SHA512_CTX archive_shs512_ctx; 264 # define archive_shs512_init(ctx) CC_SHA512_Init(ctx) 265 # define archive_shs512_final(ctx, buf) CC_SHA512_Final(buf, ctx) 266 # define archive_shs512_update(ctx, buf, n) CC_SHA512_Update(ctx, buf, n) 267 #elif defined(ARCHIVE_HASH_SHA512_OPENSSL) 268 # include <openssl/sha.h> 269 # define ARCHIVE_HAS_SHA512 270 typedef SHA512_CTX archive_sha512_ctx; 271 # define archive_sha512_init(ctx) SHA512_Init(ctx) 272 # define archive_sha512_final(ctx, buf) SHA512_Final(buf, ctx) 273 # define archive_sha512_update(ctx, buf, n) SHA512_Update(ctx, buf, n) 274 #elif defined(ARCHIVE_HASH_SHA512_WIN) 275 # define ARCHIVE_HAS_SHA512 276 # define SHA512_DIGEST_LENGTH 64 277 typedef Digest_CTX archive_sha512_ctx; 278 # define archive_sha512_init(ctx) __la_hash_Init(ctx, CALG_SHA_512) 279 # define archive_sha512_final(ctx, buf) __la_hash_Final(buf, SHA512_DIGEST_LENGTH, ctx) 280 # define archive_sha512_update(ctx, buf, n) __la_hash_Update(ctx, buf, n) 281 #endif 282