123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- /*-
- * Copyright (c) 2003-2007 Tim Kientzle
- * Copyright (c) 2011 Andres Mejia
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
- #ifndef __LIBARCHIVE_BUILD
- #error This header is only to be used internally to libarchive.
- #endif
- #ifndef ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
- #define ARCHIVE_CRYPTO_PRIVATE_H_INCLUDED
- /*
- * Crypto support in various Operating Systems:
- *
- * NetBSD:
- * - MD5 and SHA1 in libc: without _ after algorithm name
- * - SHA2 in libc: with _ after algorithm name
- *
- * OpenBSD:
- * - MD5, SHA1 and SHA2 in libc: without _ after algorithm name
- * - OpenBSD 4.4 and earlier have SHA2 in libc with _ after algorithm name
- *
- * DragonFly and FreeBSD:
- * - MD5 libmd: without _ after algorithm name
- * - SHA1, SHA256 and SHA512 in libmd: with _ after algorithm name
- *
- * Mac OS X (10.4 and later):
- * - MD5, SHA1 and SHA2 in libSystem: with CC_ prefix and _ after algorithm name
- *
- * OpenSSL:
- * - MD5, SHA1 and SHA2 in libcrypto: with _ after algorithm name
- *
- * Windows:
- * - MD5, SHA1 and SHA2 in archive_crypto.c using Windows crypto API
- */
- /* libc crypto headers */
- #if defined(ARCHIVE_CRYPTO_MD5_LIBC)
- #include <md5.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
- #include <rmd160.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
- #include <sha1.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
- defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
- defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
- defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
- #include <sha2.h>
- #endif
- /* libmd crypto headers */
- #if defined(ARCHIVE_CRYPTO_MD5_LIBMD) ||\
- defined(ARCHIVE_CRYPTO_RMD160_LIBMD) ||\
- defined(ARCHIVE_CRYPTO_SHA1_LIBMD) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
- #define ARCHIVE_CRYPTO_LIBMD 1
- #endif
- #if defined(ARCHIVE_CRYPTO_MD5_LIBMD)
- #include <md5.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
- #include <ripemd.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
- #include <sha.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
- #include <sha256.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
- #include <sha512.h>
- #endif
- /* libSystem crypto headers */
- #if defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
- #include <CommonCrypto/CommonDigest.h>
- #endif
- /* Nettle crypto headers */
- #if defined(ARCHIVE_CRYPTO_MD5_NETTLE)
- #include <nettle/md5.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
- #include <nettle/ripemd160.h>
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
- #include <nettle/sha.h>
- #endif
- /* OpenSSL crypto headers */
- #if defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_RMD160_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
- #define ARCHIVE_CRYPTO_OPENSSL 1
- #include "archive_openssl_evp_private.h"
- #endif
- /* Windows crypto headers */
- #if defined(ARCHIVE_CRYPTO_MD5_WIN) ||\
- defined(ARCHIVE_CRYPTO_SHA1_WIN) ||\
- defined(ARCHIVE_CRYPTO_SHA256_WIN) ||\
- defined(ARCHIVE_CRYPTO_SHA384_WIN) ||\
- defined(ARCHIVE_CRYPTO_SHA512_WIN)
- #include <windows.h>
- #include <wincrypt.h>
- typedef struct {
- int valid;
- HCRYPTPROV cryptProv;
- HCRYPTHASH hash;
- } Digest_CTX;
- #endif
- /* typedefs */
- #if defined(ARCHIVE_CRYPTO_MD5_LIBC)
- typedef MD5_CTX archive_md5_ctx;
- #elif defined(ARCHIVE_CRYPTO_MD5_LIBMD)
- typedef MD5_CTX archive_md5_ctx;
- #elif defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM)
- typedef CC_MD5_CTX archive_md5_ctx;
- #elif defined(ARCHIVE_CRYPTO_MD5_NETTLE)
- typedef struct md5_ctx archive_md5_ctx;
- #elif defined(ARCHIVE_CRYPTO_MD5_OPENSSL)
- typedef EVP_MD_CTX *archive_md5_ctx;
- #elif defined(ARCHIVE_CRYPTO_MD5_WIN)
- typedef Digest_CTX archive_md5_ctx;
- #else
- typedef unsigned char archive_md5_ctx;
- #endif
- #if defined(ARCHIVE_CRYPTO_RMD160_LIBC)
- typedef RMD160_CTX archive_rmd160_ctx;
- #elif defined(ARCHIVE_CRYPTO_RMD160_LIBMD)
- typedef RIPEMD160_CTX archive_rmd160_ctx;
- #elif defined(ARCHIVE_CRYPTO_RMD160_NETTLE)
- typedef struct ripemd160_ctx archive_rmd160_ctx;
- #elif defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
- typedef EVP_MD_CTX *archive_rmd160_ctx;
- #else
- typedef unsigned char archive_rmd160_ctx;
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA1_LIBC)
- typedef SHA1_CTX archive_sha1_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA1_LIBMD)
- typedef SHA1_CTX archive_sha1_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM)
- typedef CC_SHA1_CTX archive_sha1_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA1_NETTLE)
- typedef struct sha1_ctx archive_sha1_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA1_OPENSSL)
- typedef EVP_MD_CTX *archive_sha1_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA1_WIN)
- typedef Digest_CTX archive_sha1_ctx;
- #else
- typedef unsigned char archive_sha1_ctx;
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA256_LIBC)
- typedef SHA256_CTX archive_sha256_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA256_LIBC2)
- typedef SHA256_CTX archive_sha256_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA256_LIBC3)
- typedef SHA2_CTX archive_sha256_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA256_LIBMD)
- typedef SHA256_CTX archive_sha256_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM)
- typedef CC_SHA256_CTX archive_sha256_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA256_NETTLE)
- typedef struct sha256_ctx archive_sha256_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA256_OPENSSL)
- typedef EVP_MD_CTX *archive_sha256_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA256_WIN)
- typedef Digest_CTX archive_sha256_ctx;
- #else
- typedef unsigned char archive_sha256_ctx;
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA384_LIBC)
- typedef SHA384_CTX archive_sha384_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA384_LIBC2)
- typedef SHA384_CTX archive_sha384_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA384_LIBC3)
- typedef SHA2_CTX archive_sha384_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM)
- typedef CC_SHA512_CTX archive_sha384_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA384_NETTLE)
- typedef struct sha384_ctx archive_sha384_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA384_OPENSSL)
- typedef EVP_MD_CTX *archive_sha384_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA384_WIN)
- typedef Digest_CTX archive_sha384_ctx;
- #else
- typedef unsigned char archive_sha384_ctx;
- #endif
- #if defined(ARCHIVE_CRYPTO_SHA512_LIBC)
- typedef SHA512_CTX archive_sha512_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA512_LIBC2)
- typedef SHA512_CTX archive_sha512_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA512_LIBC3)
- typedef SHA2_CTX archive_sha512_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA512_LIBMD)
- typedef SHA512_CTX archive_sha512_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM)
- typedef CC_SHA512_CTX archive_sha512_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA512_NETTLE)
- typedef struct sha512_ctx archive_sha512_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA512_OPENSSL)
- typedef EVP_MD_CTX *archive_sha512_ctx;
- #elif defined(ARCHIVE_CRYPTO_SHA512_WIN)
- typedef Digest_CTX archive_sha512_ctx;
- #else
- typedef unsigned char archive_sha512_ctx;
- #endif
- /* defines */
- #if defined(ARCHIVE_CRYPTO_MD5_LIBC) ||\
- defined(ARCHIVE_CRYPTO_MD5_LIBMD) || \
- defined(ARCHIVE_CRYPTO_MD5_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_MD5_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_MD5_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_MD5_WIN)
- #define ARCHIVE_HAS_MD5
- #endif
- #define archive_md5_init(ctx)\
- __archive_digest.md5init(ctx)
- #define archive_md5_final(ctx, md)\
- __archive_digest.md5final(ctx, md)
- #define archive_md5_update(ctx, buf, n)\
- __archive_digest.md5update(ctx, buf, n)
- #if defined(ARCHIVE_CRYPTO_RMD160_LIBC) ||\
- defined(ARCHIVE_CRYPTO_RMD160_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_RMD160_OPENSSL)
- #define ARCHIVE_HAS_RMD160
- #endif
- #define archive_rmd160_init(ctx)\
- __archive_digest.rmd160init(ctx)
- #define archive_rmd160_final(ctx, md)\
- __archive_digest.rmd160final(ctx, md)
- #define archive_rmd160_update(ctx, buf, n)\
- __archive_digest.rmd160update(ctx, buf, n)
- #if defined(ARCHIVE_CRYPTO_SHA1_LIBC) ||\
- defined(ARCHIVE_CRYPTO_SHA1_LIBMD) || \
- defined(ARCHIVE_CRYPTO_SHA1_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA1_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_SHA1_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA1_WIN)
- #define ARCHIVE_HAS_SHA1
- #endif
- #define archive_sha1_init(ctx)\
- __archive_digest.sha1init(ctx)
- #define archive_sha1_final(ctx, md)\
- __archive_digest.sha1final(ctx, md)
- #define archive_sha1_update(ctx, buf, n)\
- __archive_digest.sha1update(ctx, buf, n)
- #if defined(ARCHIVE_CRYPTO_SHA256_LIBC) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBC2) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBC3) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBMD) ||\
- defined(ARCHIVE_CRYPTO_SHA256_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA256_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_SHA256_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA256_WIN)
- #define ARCHIVE_HAS_SHA256
- #endif
- #define archive_sha256_init(ctx)\
- __archive_digest.sha256init(ctx)
- #define archive_sha256_final(ctx, md)\
- __archive_digest.sha256final(ctx, md)
- #define archive_sha256_update(ctx, buf, n)\
- __archive_digest.sha256update(ctx, buf, n)
- #if defined(ARCHIVE_CRYPTO_SHA384_LIBC) ||\
- defined(ARCHIVE_CRYPTO_SHA384_LIBC2) ||\
- defined(ARCHIVE_CRYPTO_SHA384_LIBC3) ||\
- defined(ARCHIVE_CRYPTO_SHA384_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA384_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_SHA384_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA384_WIN)
- #define ARCHIVE_HAS_SHA384
- #endif
- #define archive_sha384_init(ctx)\
- __archive_digest.sha384init(ctx)
- #define archive_sha384_final(ctx, md)\
- __archive_digest.sha384final(ctx, md)
- #define archive_sha384_update(ctx, buf, n)\
- __archive_digest.sha384update(ctx, buf, n)
- #if defined(ARCHIVE_CRYPTO_SHA512_LIBC) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBC2) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBC3) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBMD) ||\
- defined(ARCHIVE_CRYPTO_SHA512_LIBSYSTEM) ||\
- defined(ARCHIVE_CRYPTO_SHA512_NETTLE) ||\
- defined(ARCHIVE_CRYPTO_SHA512_OPENSSL) ||\
- defined(ARCHIVE_CRYPTO_SHA512_WIN)
- #define ARCHIVE_HAS_SHA512
- #endif
- #define archive_sha512_init(ctx)\
- __archive_digest.sha512init(ctx)
- #define archive_sha512_final(ctx, md)\
- __archive_digest.sha512final(ctx, md)
- #define archive_sha512_update(ctx, buf, n)\
- __archive_digest.sha512update(ctx, buf, n)
- /* Minimal interface to digest functionality for internal use in libarchive */
- struct archive_digest
- {
- /* Message Digest */
- int (*md5init)(archive_md5_ctx *ctx);
- int (*md5update)(archive_md5_ctx *, const void *, size_t);
- int (*md5final)(archive_md5_ctx *, void *);
- int (*rmd160init)(archive_rmd160_ctx *);
- int (*rmd160update)(archive_rmd160_ctx *, const void *, size_t);
- int (*rmd160final)(archive_rmd160_ctx *, void *);
- int (*sha1init)(archive_sha1_ctx *);
- int (*sha1update)(archive_sha1_ctx *, const void *, size_t);
- int (*sha1final)(archive_sha1_ctx *, void *);
- int (*sha256init)(archive_sha256_ctx *);
- int (*sha256update)(archive_sha256_ctx *, const void *, size_t);
- int (*sha256final)(archive_sha256_ctx *, void *);
- int (*sha384init)(archive_sha384_ctx *);
- int (*sha384update)(archive_sha384_ctx *, const void *, size_t);
- int (*sha384final)(archive_sha384_ctx *, void *);
- int (*sha512init)(archive_sha512_ctx *);
- int (*sha512update)(archive_sha512_ctx *, const void *, size_t);
- int (*sha512final)(archive_sha512_ctx *, void *);
- };
- extern const struct archive_digest __archive_digest;
- #endif
|