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.
25 * $FreeBSD: head/lib/libarchive/archive_hash.h 201171 2009-12-29 06:39:07Z kientzle $
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_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)
105 #if defined(ARCHIVE_HASH_RMD160_LIBC)
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)
121 #if defined(ARCHIVE_HASH_SHA1_LIBC)
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)
151 #if defined(ARCHIVE_HASH_SHA256_LIBC)
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)
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)
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)
195 #if defined(ARCHIVE_HASH_SHA384_LIBC)
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)
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)
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)
239 #if defined(ARCHIVE_HASH_SHA512_LIBC)
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)
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)
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)