2
* Copyright (c) 2003-2007 Tim Kientzle
3
* Copyright (c) 2011 Andres Mejia
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
16
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18
* IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
19
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
#ifndef __LIBARCHIVE_BUILD
28
#error This header is only to be used internally to libarchive.
31
#ifndef ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
32
#define ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
35
* Crypto support in various Operating Systems:
38
* - MD5 and SHA1 in libc: without _ after algorithm name
39
* - SHA2 in libc: with _ after algorithm name
42
* - MD5, SHA1 and SHA2 in libc: without _ after algorithm name
43
* - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name
45
* DragonFly and FreeBSD:
46
* - MD5 libmd: without _ after algorithm name
47
* - SHA1, SHA256 and SHA512 in libmd: with _ after algorithm name
49
* Mac OS X (10.4 and later):
50
* - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
53
* - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
56
* - MD5, SHA1 and SHA2 in archive_crypto.c using Windows crypto API
59
/* libc crypto headers */
60
#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
63
#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
66
#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
69
#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
70
defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
71
defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
72
defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
73
defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
74
defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
75
defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
76
defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
77
defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
81
/* libmd crypto headers */
82
#if defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||\
83
defined(ARCHIVE_CRYPTO_RMD160_LIBMD) ||\
84
defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||\
85
defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
86
defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
87
#define ARCHIVE_CRYPTO_LIBMD 1
90
#if defined(ARCHIVE_CRYPTO_MD5_LIBMD)
93
#if defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
96
#if defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
99
#if defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
102
#if defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
106
/* libSystem crypto headers */
107
#if defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
108
defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
109
defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
110
defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
111
defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
112
#include <CommonCrypto/CommonDigest.h>
115
/* Nettle crypto headers */
116
#if defined(ARCHIVE_CRYPTO_MD5_NETTLE)
117
#include <nettle/md5.h>
119
#if defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
120
#include <nettle/ripemd160.h>
122
#if defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
123
defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
124
defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
125
defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
126
#include <nettle/sha.h>
129
/* OpenSSL crypto headers */
130
#if defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
131
defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) ||\
132
defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
133
defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
134
defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
135
defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
136
#define ARCHIVE_CRYPTO_OPENSSL 1
137
#include <openssl/evp.h>
140
/* Windows crypto headers */
141
#if defined(ARCHIVE_CRYPTO_MD5_WIN) ||\
142
defined(ARCHIVE_CRYPTO_SHA1_WIN) ||\
143
defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
144
defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
145
defined(ARCHIVE_CRYPTO_SHA512_WIN)
146
#include <wincrypt.h>
149
HCRYPTPROV cryptProv;
155
#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
156
typedef MD5_CTX archive_md5_ctx;
157
#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
158
typedef MD5_CTX archive_md5_ctx;
159
#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
160
typedef CC_MD5_CTX archive_md5_ctx;
161
#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
162
typedef struct md5_ctx archive_md5_ctx;
163
#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
164
typedef EVP_MD_CTX archive_md5_ctx;
165
#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
166
typedef Digest_CTX archive_md5_ctx;
168
typedef unsigned char archive_md5_ctx;
171
#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
172
typedef RMD160_CTX archive_rmd160_ctx;
173
#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
174
typedef RIPEMD160_CTX archive_rmd160_ctx;
175
#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
176
typedef struct ripemd160_ctx archive_rmd160_ctx;
177
#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
178
typedef EVP_MD_CTX archive_rmd160_ctx;
180
typedef unsigned char archive_rmd160_ctx;
183
#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
184
typedef SHA1_CTX archive_sha1_ctx;
185
#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
186
typedef SHA1_CTX archive_sha1_ctx;
187
#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
188
typedef CC_SHA1_CTX archive_sha1_ctx;
189
#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
190
typedef struct sha1_ctx archive_sha1_ctx;
191
#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
192
typedef EVP_MD_CTX archive_sha1_ctx;
193
#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
194
typedef Digest_CTX archive_sha1_ctx;
196
typedef unsigned char archive_sha1_ctx;
199
#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
200
typedef SHA256_CTX archive_sha256_ctx;
201
#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
202
typedef SHA256_CTX archive_sha256_ctx;
203
#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
204
typedef SHA2_CTX archive_sha256_ctx;
205
#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
206
typedef SHA256_CTX archive_sha256_ctx;
207
#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
208
typedef CC_SHA256_CTX archive_sha256_ctx;
209
#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
210
typedef struct sha256_ctx archive_sha256_ctx;
211
#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
212
typedef EVP_MD_CTX archive_sha256_ctx;
213
#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
214
typedef Digest_CTX archive_sha256_ctx;
216
typedef unsigned char archive_sha256_ctx;
219
#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
220
typedef SHA384_CTX archive_sha384_ctx;
221
#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
222
typedef SHA384_CTX archive_sha384_ctx;
223
#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
224
typedef SHA2_CTX archive_sha384_ctx;
225
#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
226
typedef CC_SHA512_CTX archive_sha384_ctx;
227
#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
228
typedef struct sha384_ctx archive_sha384_ctx;
229
#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
230
typedef EVP_MD_CTX archive_sha384_ctx;
231
#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
232
typedef Digest_CTX archive_sha384_ctx;
234
typedef unsigned char archive_sha384_ctx;
237
#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
238
typedef SHA512_CTX archive_sha512_ctx;
239
#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
240
typedef SHA512_CTX archive_sha512_ctx;
241
#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
242
typedef SHA2_CTX archive_sha512_ctx;
243
#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
244
typedef SHA512_CTX archive_sha512_ctx;
245
#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
246
typedef CC_SHA512_CTX archive_sha512_ctx;
247
#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
248
typedef struct sha512_ctx archive_sha512_ctx;
249
#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
250
typedef EVP_MD_CTX archive_sha512_ctx;
251
#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
252
typedef Digest_CTX archive_sha512_ctx;
254
typedef unsigned char archive_sha512_ctx;
258
#if defined(ARCHIVE_CRYPTO_MD5_LIBC) ||\
259
defined(ARCHIVE_CRYPTO_MD5_LIBMD) || \
260
defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
261
defined(ARCHIVE_CRYPTO_MD5_NETTLE) ||\
262
defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
263
defined(ARCHIVE_CRYPTO_MD5_WIN)
264
#define ARCHIVE_HAS_MD5
266
#define archive_md5_init(ctx)\
267
__archive_crypto.md5init(ctx)
268
#define archive_md5_final(ctx, md)\
269
__archive_crypto.md5final(ctx, md)
270
#define archive_md5_update(ctx, buf, n)\
271
__archive_crypto.md5update(ctx, buf, n)
273
#if defined(ARCHIVE_CRYPTO_RMD160_LIBC) ||\
274
defined(ARCHIVE_CRYPTO_RMD160_NETTLE) ||\
275
defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
276
#define ARCHIVE_HAS_RMD160
278
#define archive_rmd160_init(ctx)\
279
__archive_crypto.rmd160init(ctx)
280
#define archive_rmd160_final(ctx, md)\
281
__archive_crypto.rmd160final(ctx, md)
282
#define archive_rmd160_update(ctx, buf, n)\
283
__archive_crypto.rmd160update(ctx, buf, n)
285
#if defined(ARCHIVE_CRYPTO_SHA1_LIBC) ||\
286
defined(ARCHIVE_CRYPTO_SHA1_LIBMD) || \
287
defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
288
defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
289
defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
290
defined(ARCHIVE_CRYPTO_SHA1_WIN)
291
#define ARCHIVE_HAS_SHA1
293
#define archive_sha1_init(ctx)\
294
__archive_crypto.sha1init(ctx)
295
#define archive_sha1_final(ctx, md)\
296
__archive_crypto.sha1final(ctx, md)
297
#define archive_sha1_update(ctx, buf, n)\
298
__archive_crypto.sha1update(ctx, buf, n)
300
#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
301
defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
302
defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
303
defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
304
defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
305
defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
306
defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
307
defined(ARCHIVE_CRYPTO_SHA256_WIN)
308
#define ARCHIVE_HAS_SHA256
310
#define archive_sha256_init(ctx)\
311
__archive_crypto.sha256init(ctx)
312
#define archive_sha256_final(ctx, md)\
313
__archive_crypto.sha256final(ctx, md)
314
#define archive_sha256_update(ctx, buf, n)\
315
__archive_crypto.sha256update(ctx, buf, n)
317
#if defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
318
defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
319
defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
320
defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
321
defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
322
defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
323
defined(ARCHIVE_CRYPTO_SHA384_WIN)
324
#define ARCHIVE_HAS_SHA384
326
#define archive_sha384_init(ctx)\
327
__archive_crypto.sha384init(ctx)
328
#define archive_sha384_final(ctx, md)\
329
__archive_crypto.sha384final(ctx, md)
330
#define archive_sha384_update(ctx, buf, n)\
331
__archive_crypto.sha384update(ctx, buf, n)
333
#if defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
334
defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
335
defined(ARCHIVE_CRYPTO_SHA512_LIBC3) ||\
336
defined(ARCHIVE_CRYPTO_SHA512_LIBMD) ||\
337
defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) ||\
338
defined(ARCHIVE_CRYPTO_SHA512_NETTLE) ||\
339
defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) ||\
340
defined(ARCHIVE_CRYPTO_SHA512_WIN)
341
#define ARCHIVE_HAS_SHA512
343
#define archive_sha512_init(ctx)\
344
__archive_crypto.sha512init(ctx)
345
#define archive_sha512_final(ctx, md)\
346
__archive_crypto.sha512final(ctx, md)
347
#define archive_sha512_update(ctx, buf, n)\
348
__archive_crypto.sha512update(ctx, buf, n)
350
/* Minimal interface to crypto functionality for internal use in libarchive */
351
struct archive_crypto
354
int (*md5init)(archive_md5_ctx *ctx);
355
int (*md5update)(archive_md5_ctx *, const void *, size_t);
356
int (*md5final)(archive_md5_ctx *, void *);
357
int (*rmd160init)(archive_rmd160_ctx *);
358
int (*rmd160update)(archive_rmd160_ctx *, const void *, size_t);
359
int (*rmd160final)(archive_rmd160_ctx *, void *);
360
int (*sha1init)(archive_sha1_ctx *);
361
int (*sha1update)(archive_sha1_ctx *, const void *, size_t);
362
int (*sha1final)(archive_sha1_ctx *, void *);
363
int (*sha256init)(archive_sha256_ctx *);
364
int (*sha256update)(archive_sha256_ctx *, const void *, size_t);
365
int (*sha256final)(archive_sha256_ctx *, void *);
366
int (*sha384init)(archive_sha384_ctx *);
367
int (*sha384update)(archive_sha384_ctx *, const void *, size_t);
368
int (*sha384final)(archive_sha384_ctx *, void *);
369
int (*sha512init)(archive_sha512_ctx *);
370
int (*sha512update)(archive_sha512_ctx *, const void *, size_t);
371
int (*sha512final)(archive_sha512_ctx *, void *);
374
extern const struct archive_crypto __archive_crypto;