openssl-compat.c revision 262566
1/* $Id: openssl-compat.c,v 1.16 2014/01/17 07:00:41 dtucker Exp $ */
2
3/*
4 * Copyright (c) 2005 Darren Tucker <dtucker@zip.com.au>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include "includes.h"
20
21#include <stdarg.h>
22#include <string.h>
23
24#ifdef USE_OPENSSL_ENGINE
25# include <openssl/engine.h>
26# include <openssl/conf.h>
27#endif
28
29#ifndef HAVE_RSA_GET_DEFAULT_METHOD
30# include <openssl/rsa.h>
31#endif
32
33#include "log.h"
34
35#define SSH_DONT_OVERLOAD_OPENSSL_FUNCS
36#include "openssl-compat.h"
37
38#ifdef SSH_OLD_EVP
39int
40ssh_EVP_CipherInit(EVP_CIPHER_CTX *evp, const EVP_CIPHER *type,
41    unsigned char *key, unsigned char *iv, int enc)
42{
43	EVP_CipherInit(evp, type, key, iv, enc);
44	return 1;
45}
46
47int
48ssh_EVP_Cipher(EVP_CIPHER_CTX *evp, char *dst, char *src, int len)
49{
50	EVP_Cipher(evp, dst, src, len);
51	return 1;
52}
53
54int
55ssh_EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *evp)
56{
57	EVP_CIPHER_CTX_cleanup(evp);
58	return 1;
59}
60#endif
61
62#ifndef HAVE_EVP_DIGESTINIT_EX
63int
64EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *md, void *engine)
65{
66	if (engine != NULL)
67		fatal("%s: ENGINE is not supported", __func__);
68# ifdef OPENSSL_EVP_DIGESTUPDATE_VOID
69	EVP_DigestInit(ctx, md);
70	return 1;
71# else
72	return EVP_DigestInit(ctx, md);
73# endif
74}
75#endif
76
77#ifndef HAVE_EVP_DIGESTFINAL_EX
78int
79EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s)
80{
81# ifdef OPENSSL_EVP_DIGESTUPDATE_VOID
82	EVP_DigestFinal(ctx, md, s);
83	return 1;
84# else
85	return EVP_DigestFinal(ctx, md, s);
86# endif
87}
88#endif
89
90#ifdef OPENSSL_EVP_DIGESTUPDATE_VOID
91int
92ssh_EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt)
93{
94	EVP_DigestUpdate(ctx, d, cnt);
95	return 1;
96}
97#endif
98
99#ifndef HAVE_BN_IS_PRIME_EX
100int
101BN_is_prime_ex(const BIGNUM *p, int nchecks, BN_CTX *ctx, void *cb)
102{
103	if (cb != NULL)
104		fatal("%s: callback args not supported", __func__);
105	return BN_is_prime(p, nchecks, NULL, ctx, NULL);
106}
107#endif
108
109#ifndef HAVE_RSA_GENERATE_KEY_EX
110int
111RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *bn_e, void *cb)
112{
113	RSA *new_rsa, tmp_rsa;
114	unsigned long e;
115
116	if (cb != NULL)
117		fatal("%s: callback args not supported", __func__);
118	e = BN_get_word(bn_e);
119	if (e == 0xffffffffL)
120		fatal("%s: value of e too large", __func__);
121	new_rsa = RSA_generate_key(bits, e, NULL, NULL);
122	if (new_rsa == NULL)
123		return 0;
124	/* swap rsa/new_rsa then free new_rsa */
125	tmp_rsa = *rsa;
126	*rsa = *new_rsa;
127	*new_rsa = tmp_rsa;
128	RSA_free(new_rsa);
129	return 1;
130}
131#endif
132
133#ifndef HAVE_DSA_GENERATE_PARAMETERS_EX
134int
135DSA_generate_parameters_ex(DSA *dsa, int bits, const unsigned char *seed,
136    int seed_len, int *counter_ret, unsigned long *h_ret, void *cb)
137{
138	DSA *new_dsa, tmp_dsa;
139
140	if (cb != NULL)
141		fatal("%s: callback args not supported", __func__);
142	new_dsa = DSA_generate_parameters(bits, (unsigned char *)seed, seed_len,
143	    counter_ret, h_ret, NULL, NULL);
144	if (new_dsa == NULL)
145		return 0;
146	/* swap dsa/new_dsa then free new_dsa */
147	tmp_dsa = *dsa;
148	*dsa = *new_dsa;
149	*new_dsa = tmp_dsa;
150	DSA_free(new_dsa);
151	return 1;
152}
153#endif
154
155#ifndef HAVE_RSA_GET_DEFAULT_METHOD
156RSA_METHOD *
157RSA_get_default_method(void)
158{
159	return RSA_PKCS1_SSLeay();
160}
161#endif
162
163#ifdef	USE_OPENSSL_ENGINE
164void
165ssh_OpenSSL_add_all_algorithms(void)
166{
167	OpenSSL_add_all_algorithms();
168
169	/* Enable use of crypto hardware */
170	ENGINE_load_builtin_engines();
171	ENGINE_register_all_complete();
172	OPENSSL_config(NULL);
173}
174#endif
175