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 <openssl/evp.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 <wincrypt.h>
147typedef struct {
148  int   valid;
149  HCRYPTPROV  cryptProv;
150  HCRYPTHASH  hash;
151} Digest_CTX;
152#endif
153
154/* typedefs */
155#if defined(ARCHIVE_CRYPTO_MD5_LIBC)
156typedef MD5_CTX archive_md5_ctx;
157#elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
158typedef MD5_CTX archive_md5_ctx;
159#elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
160typedef CC_MD5_CTX archive_md5_ctx;
161#elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
162typedef struct md5_ctx archive_md5_ctx;
163#elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
164typedef EVP_MD_CTX archive_md5_ctx;
165#elif defined(ARCHIVE_CRYPTO_MD5_WIN)
166typedef Digest_CTX archive_md5_ctx;
167#else
168typedef unsigned char archive_md5_ctx;
169#endif
170
171#if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
172typedef RMD160_CTX archive_rmd160_ctx;
173#elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
174typedef RIPEMD160_CTX archive_rmd160_ctx;
175#elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
176typedef struct ripemd160_ctx archive_rmd160_ctx;
177#elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
178typedef EVP_MD_CTX archive_rmd160_ctx;
179#else
180typedef unsigned char archive_rmd160_ctx;
181#endif
182
183#if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
184typedef SHA1_CTX archive_sha1_ctx;
185#elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
186typedef SHA1_CTX archive_sha1_ctx;
187#elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
188typedef CC_SHA1_CTX archive_sha1_ctx;
189#elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
190typedef struct sha1_ctx archive_sha1_ctx;
191#elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
192typedef EVP_MD_CTX archive_sha1_ctx;
193#elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
194typedef Digest_CTX archive_sha1_ctx;
195#else
196typedef unsigned char archive_sha1_ctx;
197#endif
198
199#if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
200typedef SHA256_CTX archive_sha256_ctx;
201#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
202typedef SHA256_CTX archive_sha256_ctx;
203#elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
204typedef SHA2_CTX archive_sha256_ctx;
205#elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
206typedef SHA256_CTX archive_sha256_ctx;
207#elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
208typedef CC_SHA256_CTX archive_sha256_ctx;
209#elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
210typedef struct sha256_ctx archive_sha256_ctx;
211#elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
212typedef EVP_MD_CTX archive_sha256_ctx;
213#elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
214typedef Digest_CTX archive_sha256_ctx;
215#else
216typedef unsigned char archive_sha256_ctx;
217#endif
218
219#if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
220typedef SHA384_CTX archive_sha384_ctx;
221#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
222typedef SHA384_CTX archive_sha384_ctx;
223#elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
224typedef SHA2_CTX archive_sha384_ctx;
225#elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
226typedef CC_SHA512_CTX archive_sha384_ctx;
227#elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
228typedef struct sha384_ctx archive_sha384_ctx;
229#elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
230typedef EVP_MD_CTX archive_sha384_ctx;
231#elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
232typedef Digest_CTX archive_sha384_ctx;
233#else
234typedef unsigned char archive_sha384_ctx;
235#endif
236
237#if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
238typedef SHA512_CTX archive_sha512_ctx;
239#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
240typedef SHA512_CTX archive_sha512_ctx;
241#elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
242typedef SHA2_CTX archive_sha512_ctx;
243#elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
244typedef SHA512_CTX archive_sha512_ctx;
245#elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
246typedef CC_SHA512_CTX archive_sha512_ctx;
247#elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
248typedef struct sha512_ctx archive_sha512_ctx;
249#elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
250typedef EVP_MD_CTX archive_sha512_ctx;
251#elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
252typedef Digest_CTX archive_sha512_ctx;
253#else
254typedef unsigned char archive_sha512_ctx;
255#endif
256
257/* defines */
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
265#endif
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)
272
273#if defined(ARCHIVE_CRYPTO_RMD160_LIBC) ||\
274  defined(ARCHIVE_CRYPTO_RMD160_NETTLE) ||\
275  defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
276#define ARCHIVE_HAS_RMD160
277#endif
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)
284
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
292#endif
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)
299
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
309#endif
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)
316
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
325#endif
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)
332
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
342#endif
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)
349
350/* Minimal interface to crypto functionality for internal use in libarchive */
351struct archive_crypto
352{
353  /* Message Digest */
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 *);
372};
373
374extern const struct archive_crypto __archive_crypto;
375
376#endif
377