|  | /* $Id: openssl-compat.c,v 1.14 2011/05/10 01:13:38 dtucker Exp $ */ | 
|  |  | 
|  | /* | 
|  | * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au> | 
|  | * | 
|  | * Permission to use, copy, modify, and distribute this software for any | 
|  | * purpose with or without fee is hereby granted, provided that the above | 
|  | * copyright notice and this permission notice appear in all copies. | 
|  | * | 
|  | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | 
|  | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | 
|  | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | 
|  | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | 
|  | * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER | 
|  | * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING | 
|  | * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 
|  | */ | 
|  |  | 
|  | #include "includes.h" | 
|  |  | 
|  | #include <stdarg.h> | 
|  | #include <string.h> | 
|  |  | 
|  | #ifdef USE_OPENSSL_ENGINE | 
|  | # include <openssl/engine.h> | 
|  | # include <openssl/conf.h> | 
|  | #endif | 
|  |  | 
|  | #ifndef HAVE_RSA_GET_DEFAULT_METHOD | 
|  | # include <openssl/rsa.h> | 
|  | #endif | 
|  |  | 
|  | #include "log.h" | 
|  |  | 
|  | #define SSH_DONT_OVERLOAD_OPENSSL_FUNCS | 
|  | #include "openssl-compat.h" | 
|  |  | 
|  | #ifdef SSH_OLD_EVP | 
|  | int | 
|  | ssh_EVP_CipherInit(EVP_CIPHER_CTX *evp, const EVP_CIPHER *type, | 
|  | unsigned char *key, unsigned char *iv, int enc) | 
|  | { | 
|  | EVP_CipherInit(evp, type, key, iv, enc); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int | 
|  | ssh_EVP_Cipher(EVP_CIPHER_CTX *evp, char *dst, char *src, int len) | 
|  | { | 
|  | EVP_Cipher(evp, dst, src, len); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int | 
|  | ssh_EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *evp) | 
|  | { | 
|  | EVP_CIPHER_CTX_cleanup(evp); | 
|  | return 1; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifdef OPENSSL_EVP_DIGESTUPDATE_VOID | 
|  | int | 
|  | ssh_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt) | 
|  | { | 
|  | EVP_DigestUpdate(ctx, d, cnt); | 
|  | return 1; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifndef HAVE_BN_IS_PRIME_EX | 
|  | int | 
|  | BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, void *cb) | 
|  | { | 
|  | if (cb != NULL) | 
|  | fatal("%s: callback args not supported", __func__); | 
|  | return BN_is_prime(p, nchecks, NULL, ctx, NULL); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifndef HAVE_RSA_GENERATE_KEY_EX | 
|  | int | 
|  | RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *bn_e, void *cb) | 
|  | { | 
|  | RSA *new_rsa, tmp_rsa; | 
|  | unsigned long e; | 
|  |  | 
|  | if (cb != NULL) | 
|  | fatal("%s: callback args not supported", __func__); | 
|  | e = BN_get_word(bn_e); | 
|  | if (e == 0xffffffffL) | 
|  | fatal("%s: value of e too large", __func__); | 
|  | new_rsa = RSA_generate_key(bits, e, NULL, NULL); | 
|  | if (new_rsa == NULL) | 
|  | return 0; | 
|  | /* swap rsa/new_rsa then free new_rsa */ | 
|  | tmp_rsa = *rsa; | 
|  | *rsa = *new_rsa; | 
|  | *new_rsa = tmp_rsa; | 
|  | RSA_free(new_rsa); | 
|  | return 1; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifndef HAVE_DSA_GENERATE_PARAMETERS_EX | 
|  | int | 
|  | DSA_generate_parameters_ex(DSA *dsa, int bits, const unsigned char *seed, | 
|  | int seed_len, int *counter_ret, unsigned long *h_ret, void *cb) | 
|  | { | 
|  | DSA *new_dsa, tmp_dsa; | 
|  |  | 
|  | if (cb != NULL) | 
|  | fatal("%s: callback args not supported", __func__); | 
|  | new_dsa = DSA_generate_parameters(bits, (unsigned char *)seed, seed_len, | 
|  | counter_ret, h_ret, NULL, NULL); | 
|  | if (new_dsa == NULL) | 
|  | return 0; | 
|  | /* swap dsa/new_dsa then free new_dsa */ | 
|  | tmp_dsa = *dsa; | 
|  | *dsa = *new_dsa; | 
|  | *new_dsa = tmp_dsa; | 
|  | DSA_free(new_dsa); | 
|  | return 1; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifndef HAVE_RSA_GET_DEFAULT_METHOD | 
|  | RSA_METHOD * | 
|  | RSA_get_default_method(void) | 
|  | { | 
|  | return RSA_PKCS1_SSLeay(); | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #ifdef	USE_OPENSSL_ENGINE | 
|  | void | 
|  | ssh_OpenSSL_add_all_algorithms(void) | 
|  | { | 
|  | OpenSSL_add_all_algorithms(); | 
|  |  | 
|  | /* Enable use of crypto hardware */ | 
|  | ENGINE_load_builtin_engines(); | 
|  | ENGINE_register_all_complete(); | 
|  | OPENSSL_config(NULL); | 
|  | } | 
|  | #endif |