OpenSSL 1.1 made some CTX structures opaque. Port our code to use the structures only through pointers via OpenSSL 1.1 APIs. Use our adaption layer to make this work with OpenSSL 1.0 and below. Patch-by: Tomas Mraz <tmraz@redhat.com> Patch-from: https://bugzilla.redhat.com/1383744
377 lines
12 KiB
C
377 lines
12 KiB
C
/*-
|
|
* 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 <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
|