]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/libarchive/libarchive/archive_hash.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.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$
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_LIBMD)
83 #  include <md5.h>
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)
110 #endif
111
112 #if defined(ARCHIVE_HASH_RMD160_LIBC)
113 #  include <rmd160.h>
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)
126 #endif
127
128 #if defined(ARCHIVE_HASH_SHA1_LIBC)
129 #  include <sha1.h>
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)
136 #  include <sha.h>
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)
163 #endif
164
165 #if defined(ARCHIVE_HASH_SHA256_LIBC)
166 #  include <sha2.h>
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)
173 #  include <sha2.h>
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)
180 #  include <sha2.h>
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)
187 #  include <sha256.h>
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)
214 #endif
215
216 #if defined(ARCHIVE_HASH_SHA384_LIBC)
217 #  include <sha2.h>
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)
224 #  include <sha2.h>
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)
231 #  include <sha2.h>
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)
258 #endif
259
260 #if defined(ARCHIVE_HASH_SHA512_LIBC)
261 #  include <sha2.h>
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)
268 #  include <sha2.h>
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)
275 #  include <sha2.h>
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)
282 #  include <sha512.h>
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)
309 #endif