Update to libarchive-2.8.4.
[dragonfly.git] / contrib / libarchive / libarchive / archive_hash.h
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 <ripemd.h>
107 #  define ARCHIVE_HAS_RMD160
108 typedef RIPEMD160_CTX archive_rmd160_ctx;
109 #  define archive_rmd160_init(ctx)              RIPEMD160_Init(ctx)
110 #  define archive_rmd160_final(ctx, buf)        RIPEMD160_Final(buf, ctx)
111 #  define archive_rmd160_update(ctx, buf, n)    RIPEMD160_Update(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 <sha.h>
123 #  define ARCHIVE_HAS_SHA1
124 typedef SHA1_CTX archive_sha1_ctx;
125 #  define archive_sha1_init(ctx)                SHA1_Init(ctx)
126 #  define archive_sha1_final(ctx, buf)          SHA1_Final(buf, ctx)
127 #  define archive_sha1_update(ctx, buf, n)      SHA1_Update(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 <sha256.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 <sha512.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 <sha512.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