archive_digest_private.h revision 315432
1/*-
2* Copyright (c) 2003-2007 Tim Kientzle
3* Copyright (c) 2011 Andres Mejia
4* All rights reserved.
5*
6* Redistribution and use in source and binary forms, with or without
7* modification, are permitted provided that the following conditions
8* are met:
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.
14*
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.
25*/
26
27#ifndef __LIBARCHIVE_BUILD
28#error This header is only to be used internally to libarchive.
29#endif
30
31#ifndef ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
32#define ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
33
34/*
35 * Crypto support in various Operating Systems:
36 *
37 * NetBSD:
38 * - MD5 and SHA1 in libc: without _ after algorithm name
39 * - SHA2 in libc: with _ after algorithm name
40 *
41 * OpenBSD:
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
44 *
45 * DragonFly and FreeBSD:
46 * - MD5 libmd: without _ after algorithm name
47 * - SHA1, SHA256 and SHA512 in libmd: with _ after algorithm name
48 *
49 * Mac OS X (10.4 and later):
50 * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
51 *
52 * OpenSSL:
53 * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
54 *
55 * Windows:
56 * - MD5, SHA1 and SHA2 in archive_crypto.c using Windows crypto API
57 */
58
59/* libc crypto headers */
60#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
61#include <md5.h>
62#endif
63#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
64#include <rmd160.h>
65#endif
66#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
67#include <sha1.h>
68#endif
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)
78#include <sha2.h>
79#endif
80
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
88#endif
89
90#if defined(ARCHIVE_CRYPTO_MD5_LIBMD)
91#include <md5.h>
92#endif
93#if defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
94#include <ripemd.h>
95#endif
96#if defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
97#include <sha.h>
98#endif
99#if defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
100#include <sha256.h>
101#endif
102#if defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
103#include <sha512.h>
104#endif
105
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>
113#endif
114
115/* Nettle crypto headers */
116#if defined(ARCHIVE_CRYPTO_MD5_NETTLE)
117#include <nettle/md5.h>
118#endif
119#if defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
120#include <nettle/ripemd160.h>
121#endif
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>
127#endif
128
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 "archive_openssl_evp_private.h"
138#endif
139
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 <windows.h>
147#include <wincrypt.h>
148typedef struct {
149  int   valid;
150  HCRYPTPROV  cryptProv;
151  HCRYPTHASH  hash;
152} Digest_CTX;
153#endif
154
155/* typedefs */
156#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
157typedef MD5_CTX archive_md5_ctx;
158#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
159typedef MD5_CTX archive_md5_ctx;
160#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
161typedef CC_MD5_CTX archive_md5_ctx;
162#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
163typedef struct md5_ctx archive_md5_ctx;
164#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
165typedef EVP_MD_CTX *archive_md5_ctx;
166#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
167typedef Digest_CTX archive_md5_ctx;
168#else
169typedef unsigned char archive_md5_ctx;
170#endif
171
172#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
173typedef RMD160_CTX archive_rmd160_ctx;
174#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
175typedef RIPEMD160_CTX archive_rmd160_ctx;
176#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
177typedef struct ripemd160_ctx archive_rmd160_ctx;
178#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
179typedef EVP_MD_CTX *archive_rmd160_ctx;
180#else
181typedef unsigned char archive_rmd160_ctx;
182#endif
183
184#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
185typedef SHA1_CTX archive_sha1_ctx;
186#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
187typedef SHA1_CTX archive_sha1_ctx;
188#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
189typedef CC_SHA1_CTX archive_sha1_ctx;
190#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
191typedef struct sha1_ctx archive_sha1_ctx;
192#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
193typedef EVP_MD_CTX *archive_sha1_ctx;
194#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
195typedef Digest_CTX archive_sha1_ctx;
196#else
197typedef unsigned char archive_sha1_ctx;
198#endif
199
200#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
201typedef SHA256_CTX archive_sha256_ctx;
202#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
203typedef SHA256_CTX archive_sha256_ctx;
204#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
205typedef SHA2_CTX archive_sha256_ctx;
206#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
207typedef SHA256_CTX archive_sha256_ctx;
208#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
209typedef CC_SHA256_CTX archive_sha256_ctx;
210#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
211typedef struct sha256_ctx archive_sha256_ctx;
212#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
213typedef EVP_MD_CTX *archive_sha256_ctx;
214#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
215typedef Digest_CTX archive_sha256_ctx;
216#else
217typedef unsigned char archive_sha256_ctx;
218#endif
219
220#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
221typedef SHA384_CTX archive_sha384_ctx;
222#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
223typedef SHA384_CTX archive_sha384_ctx;
224#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
225typedef SHA2_CTX archive_sha384_ctx;
226#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
227typedef CC_SHA512_CTX archive_sha384_ctx;
228#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
229typedef struct sha384_ctx archive_sha384_ctx;
230#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
231typedef EVP_MD_CTX *archive_sha384_ctx;
232#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
233typedef Digest_CTX archive_sha384_ctx;
234#else
235typedef unsigned char archive_sha384_ctx;
236#endif
237
238#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
239typedef SHA512_CTX archive_sha512_ctx;
240#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
241typedef SHA512_CTX archive_sha512_ctx;
242#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
243typedef SHA2_CTX archive_sha512_ctx;
244#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
245typedef SHA512_CTX archive_sha512_ctx;
246#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
247typedef CC_SHA512_CTX archive_sha512_ctx;
248#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
249typedef struct sha512_ctx archive_sha512_ctx;
250#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
251typedef EVP_MD_CTX *archive_sha512_ctx;
252#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
253typedef Digest_CTX archive_sha512_ctx;
254#else
255typedef unsigned char archive_sha512_ctx;
256#endif
257
258/* defines */
259#if defined(ARCHIVE_CRYPTO_MD5_LIBC) ||\
260  defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||	\
261  defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
262  defined(ARCHIVE_CRYPTO_MD5_NETTLE) ||\
263  defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
264  defined(ARCHIVE_CRYPTO_MD5_WIN)
265#define ARCHIVE_HAS_MD5
266#endif
267#define archive_md5_init(ctx)\
268  __archive_digest.md5init(ctx)
269#define archive_md5_final(ctx, md)\
270  __archive_digest.md5final(ctx, md)
271#define archive_md5_update(ctx, buf, n)\
272  __archive_digest.md5update(ctx, buf, n)
273
274#if defined(ARCHIVE_CRYPTO_RMD160_LIBC) ||\
275  defined(ARCHIVE_CRYPTO_RMD160_NETTLE) ||\
276  defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
277#define ARCHIVE_HAS_RMD160
278#endif
279#define archive_rmd160_init(ctx)\
280  __archive_digest.rmd160init(ctx)
281#define archive_rmd160_final(ctx, md)\
282  __archive_digest.rmd160final(ctx, md)
283#define archive_rmd160_update(ctx, buf, n)\
284  __archive_digest.rmd160update(ctx, buf, n)
285
286#if defined(ARCHIVE_CRYPTO_SHA1_LIBC) ||\
287  defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||	\
288  defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
289  defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
290  defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
291  defined(ARCHIVE_CRYPTO_SHA1_WIN)
292#define ARCHIVE_HAS_SHA1
293#endif
294#define archive_sha1_init(ctx)\
295  __archive_digest.sha1init(ctx)
296#define archive_sha1_final(ctx, md)\
297  __archive_digest.sha1final(ctx, md)
298#define archive_sha1_update(ctx, buf, n)\
299  __archive_digest.sha1update(ctx, buf, n)
300
301#if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
302  defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
303  defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
304  defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
305  defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
306  defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
307  defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
308  defined(ARCHIVE_CRYPTO_SHA256_WIN)
309#define ARCHIVE_HAS_SHA256
310#endif
311#define archive_sha256_init(ctx)\
312  __archive_digest.sha256init(ctx)
313#define archive_sha256_final(ctx, md)\
314  __archive_digest.sha256final(ctx, md)
315#define archive_sha256_update(ctx, buf, n)\
316  __archive_digest.sha256update(ctx, buf, n)
317
318#if defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
319  defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
320  defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
321  defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
322  defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
323  defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
324  defined(ARCHIVE_CRYPTO_SHA384_WIN)
325#define ARCHIVE_HAS_SHA384
326#endif
327#define archive_sha384_init(ctx)\
328  __archive_digest.sha384init(ctx)
329#define archive_sha384_final(ctx, md)\
330  __archive_digest.sha384final(ctx, md)
331#define archive_sha384_update(ctx, buf, n)\
332  __archive_digest.sha384update(ctx, buf, n)
333
334#if defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
335  defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
336  defined(ARCHIVE_CRYPTO_SHA512_LIBC3) ||\
337  defined(ARCHIVE_CRYPTO_SHA512_LIBMD) ||\
338  defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) ||\
339  defined(ARCHIVE_CRYPTO_SHA512_NETTLE) ||\
340  defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) ||\
341  defined(ARCHIVE_CRYPTO_SHA512_WIN)
342#define ARCHIVE_HAS_SHA512
343#endif
344#define archive_sha512_init(ctx)\
345  __archive_digest.sha512init(ctx)
346#define archive_sha512_final(ctx, md)\
347  __archive_digest.sha512final(ctx, md)
348#define archive_sha512_update(ctx, buf, n)\
349  __archive_digest.sha512update(ctx, buf, n)
350
351/* Minimal interface to digest functionality for internal use in libarchive */
352struct archive_digest
353{
354  /* Message Digest */
355  int (*md5init)(archive_md5_ctx *ctx);
356  int (*md5update)(archive_md5_ctx *, const void *, size_t);
357  int (*md5final)(archive_md5_ctx *, void *);
358  int (*rmd160init)(archive_rmd160_ctx *);
359  int (*rmd160update)(archive_rmd160_ctx *, const void *, size_t);
360  int (*rmd160final)(archive_rmd160_ctx *, void *);
361  int (*sha1init)(archive_sha1_ctx *);
362  int (*sha1update)(archive_sha1_ctx *, const void *, size_t);
363  int (*sha1final)(archive_sha1_ctx *, void *);
364  int (*sha256init)(archive_sha256_ctx *);
365  int (*sha256update)(archive_sha256_ctx *, const void *, size_t);
366  int (*sha256final)(archive_sha256_ctx *, void *);
367  int (*sha384init)(archive_sha384_ctx *);
368  int (*sha384update)(archive_sha384_ctx *, const void *, size_t);
369  int (*sha384final)(archive_sha384_ctx *, void *);
370  int (*sha512init)(archive_sha512_ctx *);
371  int (*sha512update)(archive_sha512_ctx *, const void *, size_t);
372  int (*sha512final)(archive_sha512_ctx *, void *);
373};
374
375extern const struct archive_digest __archive_digest;
376
377#endif
378