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 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)
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) 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)
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)