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