2 * Copyright (c) 2009 Joerg Sonnenberger
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
28 #ifndef __LIBARCHIVE_BUILD
29 #error This header is only to be used internally to libarchive.
32 #ifdef HAVE_SYS_TYPES_H
33 #include <sys/types.h>
37 * Hash function support in various Operating Systems:
40 * - MD5 and SHA1 in libc: without _ after algorithm name
41 * - SHA2 in libc: with _ after algorithm name
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
47 * DragonFly and FreeBSD (XXX not used yet):
48 * - MD5 and SHA1 in libmd: without _ after algorithm name
49 * - SHA256: with _ after algorithm name
51 * Mac OS X (10.4 and later):
52 * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
55 * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
58 * - MD5, SHA1 and SHA2 in archive_windows.c: without algorithm name
59 * and with __la_ prefix.
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)
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);
75 #if defined(ARCHIVE_HASH_MD5_LIBC)
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_LIBMD)
84 # define ARCHIVE_HAS_MD5
85 typedef 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
92 typedef 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
99 typedef 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
106 typedef 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)
112 #if defined(ARCHIVE_HASH_RMD160_LIBC)
114 # define ARCHIVE_HAS_RMD160
115 typedef 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
122 typedef 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)
128 #if defined(ARCHIVE_HASH_SHA1_LIBC)
130 # define ARCHIVE_HAS_SHA1
131 typedef 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)
137 # define ARCHIVE_HAS_SHA1
138 typedef 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
145 typedef 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
152 typedef 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
159 typedef 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)
165 #if defined(ARCHIVE_HASH_SHA256_LIBC)
167 # define ARCHIVE_HAS_SHA256
168 typedef 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)
174 # define ARCHIVE_HAS_SHA256
175 typedef 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)
181 # define ARCHIVE_HAS_SHA256
182 typedef 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)
188 # define ARCHIVE_HAS_SHA256
189 typedef 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
196 typedef 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
203 typedef 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
210 typedef 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)
216 #if defined(ARCHIVE_HASH_SHA384_LIBC)
218 # define ARCHIVE_HAS_SHA384
219 typedef 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)
225 # define ARCHIVE_HAS_SHA384
226 typedef 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)
232 # define ARCHIVE_HAS_SHA384
233 typedef 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
240 typedef 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
247 typedef 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
254 typedef 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)
260 #if defined(ARCHIVE_HASH_SHA512_LIBC)
262 # define ARCHIVE_HAS_SHA512
263 typedef 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)
269 # define ARCHIVE_HAS_SHA512
270 typedef 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)
276 # define ARCHIVE_HAS_SHA512
277 typedef 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)
283 # define ARCHIVE_HAS_SHA512
284 typedef 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
291 typedef 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
298 typedef 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
305 typedef 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)