~sergei.glushchenko/+junk/page-scan-hack

« back to all changes in this revision

Viewing changes to src/libarchive/libarchive/archive_hash.h

merge parallel compression branch.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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 <rmd160.h>
 
107
#  define ARCHIVE_HAS_RMD160
 
108
typedef RMD160_CTX archive_rmd160_ctx;
 
109
#  define archive_rmd160_init(ctx)              RMD160Init(ctx)
 
110
#  define archive_rmd160_final(ctx, buf)        RMD160Final(buf, ctx)
 
111
#  define archive_rmd160_update(ctx, buf, n)    RMD160Update(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 <sha1.h>
 
123
#  define ARCHIVE_HAS_SHA1
 
124
typedef SHA1_CTX archive_sha1_ctx;
 
125
#  define archive_sha1_init(ctx)                SHA1Init(ctx)
 
126
#  define archive_sha1_final(ctx, buf)          SHA1Final(buf, ctx)
 
127
#  define archive_sha1_update(ctx, buf, n)      SHA1Update(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 <sha2.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 <sha2.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 <sha2.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