1*4882a593SmuzhiyunFrom 37e233307a79a9250962dcf77b7c7e27a02a1a35 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Khem Raj <raj.khem@gmail.com>
3*4882a593SmuzhiyunDate: Fri, 1 Feb 2019 22:44:10 -0800
4*4882a593SmuzhiyunSubject: [PATCH] Adapt to OpenSSL 1.1.1
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunFrom: Guido Falsi <mad@madpilot.net>
7*4882a593Smuzhiyunhttps://sources.debian.org/src/pam-ssh-agent-auth/0.10.3-3/debian/patches/openssl-1.1.1-1.patch/
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunUpstream-Status: Pending
10*4882a593SmuzhiyunSigned-off-by: Khem Raj <raj.khem@gmail.com>
11*4882a593Smuzhiyun---
12*4882a593Smuzhiyun authfd.c    |  50 ++++++++++++++++++++
13*4882a593Smuzhiyun bufbn.c     |   4 ++
14*4882a593Smuzhiyun cipher.h    |   6 ++-
15*4882a593Smuzhiyun kex.h       |   9 +++-
16*4882a593Smuzhiyun key.c       | 133 ++++++++++++++++++++++++++++++++++++++++++++++++++--
17*4882a593Smuzhiyun ssh-dss.c   |  51 ++++++++++++++++----
18*4882a593Smuzhiyun ssh-ecdsa.c |  40 ++++++++++++----
19*4882a593Smuzhiyun ssh-rsa.c   |  22 +++++++--
20*4882a593Smuzhiyun 8 files changed, 287 insertions(+), 28 deletions(-)
21*4882a593Smuzhiyun
22*4882a593Smuzhiyundiff --git a/authfd.c b/authfd.c
23*4882a593Smuzhiyunindex 212e06b..f91514d 100644
24*4882a593Smuzhiyun--- a/authfd.c
25*4882a593Smuzhiyun+++ b/authfd.c
26*4882a593Smuzhiyun@@ -367,6 +367,7 @@ ssh_get_next_identity(AuthenticationConnection *auth, char **comment, int versio
27*4882a593Smuzhiyun 	case 1:
28*4882a593Smuzhiyun 		key = pamsshagentauth_key_new(KEY_RSA1);
29*4882a593Smuzhiyun 		bits = pamsshagentauth_buffer_get_int(&auth->identities);
30*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
31*4882a593Smuzhiyun 		pamsshagentauth_buffer_get_bignum(&auth->identities, key->rsa->e);
32*4882a593Smuzhiyun 		pamsshagentauth_buffer_get_bignum(&auth->identities, key->rsa->n);
33*4882a593Smuzhiyun 		*comment = pamsshagentauth_buffer_get_string(&auth->identities, NULL);
34*4882a593Smuzhiyun@@ -374,6 +375,15 @@ ssh_get_next_identity(AuthenticationConnection *auth, char **comment, int versio
35*4882a593Smuzhiyun 		if (keybits < 0 || bits != (u_int)keybits)
36*4882a593Smuzhiyun 			pamsshagentauth_logit("Warning: identity keysize mismatch: actual %d, announced %u",
37*4882a593Smuzhiyun 			    BN_num_bits(key->rsa->n), bits);
38*4882a593Smuzhiyun+#else
39*4882a593Smuzhiyun+		pamsshagentauth_buffer_get_bignum(&auth->identities, RSA_get0_e(key->rsa));
40*4882a593Smuzhiyun+		pamsshagentauth_buffer_get_bignum(&auth->identities, RSA_get0_n(key->rsa));
41*4882a593Smuzhiyun+		*comment = pamsshagentauth_buffer_get_string(&auth->identities, NULL);
42*4882a593Smuzhiyun+		keybits = BN_num_bits(RSA_get0_n(key->rsa));
43*4882a593Smuzhiyun+		if (keybits < 0 || bits != (u_int)keybits)
44*4882a593Smuzhiyun+			pamsshagentauth_logit("Warning: identity keysize mismatch: actual %d, announced %u",
45*4882a593Smuzhiyun+			    BN_num_bits(RSA_get0_n(key->rsa)), bits);
46*4882a593Smuzhiyun+#endif
47*4882a593Smuzhiyun 		break;
48*4882a593Smuzhiyun 	case 2:
49*4882a593Smuzhiyun 		blob = pamsshagentauth_buffer_get_string(&auth->identities, &blen);
50*4882a593Smuzhiyun@@ -417,9 +427,15 @@ ssh_decrypt_challenge(AuthenticationConnection *auth,
51*4882a593Smuzhiyun 	}
52*4882a593Smuzhiyun 	pamsshagentauth_buffer_init(&buffer);
53*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_char(&buffer, SSH_AGENTC_RSA_CHALLENGE);
54*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
55*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_int(&buffer, BN_num_bits(key->rsa->n));
56*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(&buffer, key->rsa->e);
57*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(&buffer, key->rsa->n);
58*4882a593Smuzhiyun+#else
59*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_int(&buffer, BN_num_bits(RSA_get0_n(key->rsa)));
60*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(&buffer, RSA_get0_e(key->rsa));
61*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(&buffer, RSA_get0_n(key->rsa));
62*4882a593Smuzhiyun+#endif
63*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(&buffer, challenge);
64*4882a593Smuzhiyun 	pamsshagentauth_buffer_append(&buffer, session_id, 16);
65*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_int(&buffer, response_type);
66*4882a593Smuzhiyun@@ -496,6 +512,7 @@ ssh_agent_sign(AuthenticationConnection *auth,
67*4882a593Smuzhiyun static void
68*4882a593Smuzhiyun ssh_encode_identity_rsa1(Buffer *b, RSA *key, const char *comment)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
71*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_int(b, BN_num_bits(key->n));
72*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(b, key->n);
73*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(b, key->e);
74*4882a593Smuzhiyun@@ -504,6 +521,16 @@ ssh_encode_identity_rsa1(Buffer *b, RSA *key, const char *comment)
75*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(b, key->iqmp);	/* ssh key->u */
76*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(b, key->q);	/* ssh key->p, SSL key->q */
77*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_bignum(b, key->p);	/* ssh key->q, SSL key->p */
78*4882a593Smuzhiyun+#else
79*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_int(b, BN_num_bits(RSA_get0_n(key)));
80*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(b, RSA_get0_n(key));
81*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(b, RSA_get0_e(key));
82*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(b, RSA_get0_d(key));
83*4882a593Smuzhiyun+	/* To keep within the protocol: p < q for ssh. in SSL p > q */
84*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(b, RSA_get0_iqmp(key));	/* ssh key->u */
85*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(b, RSA_get0_q(key));	/* ssh key->p, SSL key->q */
86*4882a593Smuzhiyun+	pamsshagentauth_buffer_put_bignum(b, RSA_get0_p(key));	/* ssh key->q, SSL key->p */
87*4882a593Smuzhiyun+#endif
88*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_cstring(b, comment);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun@@ -513,19 +540,36 @@ ssh_encode_identity_ssh2(Buffer *b, Key *key, const char *comment)
92*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_cstring(b, key_ssh_name(key));
93*4882a593Smuzhiyun 	switch (key->type) {
94*4882a593Smuzhiyun 	case KEY_RSA:
95*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
96*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->rsa->n);
97*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->rsa->e);
98*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->rsa->d);
99*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->rsa->iqmp);
100*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->rsa->p);
101*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->rsa->q);
102*4882a593Smuzhiyun+#else
103*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, RSA_get0_n(key->rsa));
104*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, RSA_get0_e(key->rsa));
105*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, RSA_get0_d(key->rsa));
106*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, RSA_get0_iqmp(key->rsa));
107*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, RSA_get0_p(key->rsa));
108*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, RSA_get0_q(key->rsa));
109*4882a593Smuzhiyun+#endif
110*4882a593Smuzhiyun 		break;
111*4882a593Smuzhiyun 	case KEY_DSA:
112*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
113*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->dsa->p);
114*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->dsa->q);
115*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->dsa->g);
116*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->dsa->pub_key);
117*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(b, key->dsa->priv_key);
118*4882a593Smuzhiyun+#else
119*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, DSA_get0_p(key->dsa));
120*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, DSA_get0_q(key->dsa));
121*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, DSA_get0_g(key->dsa));
122*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, DSA_get0_pub_key(key->dsa));
123*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(b, DSA_get0_priv_key(key->dsa));
124*4882a593Smuzhiyun+#endif
125*4882a593Smuzhiyun 		break;
126*4882a593Smuzhiyun 	}
127*4882a593Smuzhiyun 	pamsshagentauth_buffer_put_cstring(b, comment);
128*4882a593Smuzhiyun@@ -605,9 +649,15 @@ ssh_remove_identity(AuthenticationConnection *auth, Key *key)
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun 	if (key->type == KEY_RSA1) {
131*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_char(&msg, SSH_AGENTC_REMOVE_RSA_IDENTITY);
132*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
133*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_int(&msg, BN_num_bits(key->rsa->n));
134*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum(&msg, key->rsa->e);
135*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum(&msg, key->rsa->n);
136*4882a593Smuzhiyun+#else
137*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_int(&msg, BN_num_bits(RSA_get0_n(key->rsa)));
138*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum(&msg, RSA_get0_e(key->rsa));
139*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum(&msg, RSA_get0_n(key->rsa));
140*4882a593Smuzhiyun+#endif
141*4882a593Smuzhiyun 	} else if (key->type == KEY_DSA || key->type == KEY_RSA) {
142*4882a593Smuzhiyun 		pamsshagentauth_key_to_blob(key, &blob, &blen);
143*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_char(&msg, SSH2_AGENTC_REMOVE_IDENTITY);
144*4882a593Smuzhiyundiff --git a/bufbn.c b/bufbn.c
145*4882a593Smuzhiyunindex 6a49c73..4ecedc1 100644
146*4882a593Smuzhiyun--- a/bufbn.c
147*4882a593Smuzhiyun+++ b/bufbn.c
148*4882a593Smuzhiyun@@ -151,7 +151,11 @@ pamsshagentauth_buffer_put_bignum2_ret(Buffer *buffer, const BIGNUM *value)
149*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_int(buffer, 0);
150*4882a593Smuzhiyun 		return 0;
151*4882a593Smuzhiyun 	}
152*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
153*4882a593Smuzhiyun 	if (value->neg) {
154*4882a593Smuzhiyun+#else
155*4882a593Smuzhiyun+	if (BN_is_negative(value)) {
156*4882a593Smuzhiyun+#endif
157*4882a593Smuzhiyun 		pamsshagentauth_logerror("buffer_put_bignum2_ret: negative numbers not supported");
158*4882a593Smuzhiyun 		return (-1);
159*4882a593Smuzhiyun 	}
160*4882a593Smuzhiyundiff --git a/cipher.h b/cipher.h
161*4882a593Smuzhiyunindex 49bbc16..64f59ca 100644
162*4882a593Smuzhiyun--- a/cipher.h
163*4882a593Smuzhiyun+++ b/cipher.h
164*4882a593Smuzhiyun@@ -59,15 +59,18 @@
165*4882a593Smuzhiyun #define CIPHER_DECRYPT		0
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun typedef struct Cipher Cipher;
168*4882a593Smuzhiyun-typedef struct CipherContext CipherContext;
169*4882a593Smuzhiyun+// typedef struct CipherContext CipherContext;
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun struct Cipher;
172*4882a593Smuzhiyun+/*
173*4882a593Smuzhiyun struct CipherContext {
174*4882a593Smuzhiyun 	int	plaintext;
175*4882a593Smuzhiyun 	EVP_CIPHER_CTX evp;
176*4882a593Smuzhiyun 	Cipher *cipher;
177*4882a593Smuzhiyun };
178*4882a593Smuzhiyun+*/
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun+/*
181*4882a593Smuzhiyun u_int	 cipher_mask_ssh1(int);
182*4882a593Smuzhiyun Cipher	*cipher_by_name(const char *);
183*4882a593Smuzhiyun Cipher	*cipher_by_number(int);
184*4882a593Smuzhiyun@@ -88,4 +91,5 @@ void	 cipher_set_keyiv(CipherContext *, u_char *);
185*4882a593Smuzhiyun int	 cipher_get_keyiv_len(const CipherContext *);
186*4882a593Smuzhiyun int	 cipher_get_keycontext(const CipherContext *, u_char *);
187*4882a593Smuzhiyun void	 cipher_set_keycontext(CipherContext *, u_char *);
188*4882a593Smuzhiyun+*/
189*4882a593Smuzhiyun #endif				/* CIPHER_H */
190*4882a593Smuzhiyundiff --git a/kex.h b/kex.h
191*4882a593Smuzhiyunindex 8e29c90..81ca57d 100644
192*4882a593Smuzhiyun--- a/kex.h
193*4882a593Smuzhiyun+++ b/kex.h
194*4882a593Smuzhiyun@@ -70,7 +70,7 @@ enum kex_exchange {
195*4882a593Smuzhiyun #define KEX_INIT_SENT	0x0001
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun typedef struct Kex Kex;
198*4882a593Smuzhiyun-typedef struct Mac Mac;
199*4882a593Smuzhiyun+// typedef struct Mac Mac;
200*4882a593Smuzhiyun typedef struct Comp Comp;
201*4882a593Smuzhiyun typedef struct Enc Enc;
202*4882a593Smuzhiyun typedef struct Newkeys Newkeys;
203*4882a593Smuzhiyun@@ -84,6 +84,7 @@ struct Enc {
204*4882a593Smuzhiyun 	u_char	*key;
205*4882a593Smuzhiyun 	u_char	*iv;
206*4882a593Smuzhiyun };
207*4882a593Smuzhiyun+/*
208*4882a593Smuzhiyun struct Mac {
209*4882a593Smuzhiyun 	char	*name;
210*4882a593Smuzhiyun 	int	enabled;
211*4882a593Smuzhiyun@@ -95,11 +96,13 @@ struct Mac {
212*4882a593Smuzhiyun 	HMAC_CTX	evp_ctx;
213*4882a593Smuzhiyun 	struct umac_ctx *umac_ctx;
214*4882a593Smuzhiyun };
215*4882a593Smuzhiyun+*/
216*4882a593Smuzhiyun struct Comp {
217*4882a593Smuzhiyun 	int	type;
218*4882a593Smuzhiyun 	int	enabled;
219*4882a593Smuzhiyun 	char	*name;
220*4882a593Smuzhiyun };
221*4882a593Smuzhiyun+/*
222*4882a593Smuzhiyun struct Newkeys {
223*4882a593Smuzhiyun 	Enc	enc;
224*4882a593Smuzhiyun 	Mac	mac;
225*4882a593Smuzhiyun@@ -126,7 +129,9 @@ struct Kex {
226*4882a593Smuzhiyun 	int	(*host_key_index)(Key *);
227*4882a593Smuzhiyun 	void	(*kex[KEX_MAX])(Kex *);
228*4882a593Smuzhiyun };
229*4882a593Smuzhiyun+*/
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun+/*
232*4882a593Smuzhiyun Kex	*kex_setup(char *[PROPOSAL_MAX]);
233*4882a593Smuzhiyun void	 kex_finish(Kex *);
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun@@ -152,6 +157,8 @@ kexgex_hash(const EVP_MD *, char *, char *, char *, int, char *,
236*4882a593Smuzhiyun void
237*4882a593Smuzhiyun derive_ssh1_session_id(BIGNUM *, BIGNUM *, u_int8_t[8], u_int8_t[16]);
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun+*/
240*4882a593Smuzhiyun+
241*4882a593Smuzhiyun #if defined(DEBUG_KEX) || defined(DEBUG_KEXDH)
242*4882a593Smuzhiyun void	dump_digest(char *, u_char *, int);
243*4882a593Smuzhiyun #endif
244*4882a593Smuzhiyundiff --git a/key.c b/key.c
245*4882a593Smuzhiyunindex 107a442..aedbbb5 100644
246*4882a593Smuzhiyun--- a/key.c
247*4882a593Smuzhiyun+++ b/key.c
248*4882a593Smuzhiyun@@ -77,15 +77,21 @@ pamsshagentauth_key_new(int type)
249*4882a593Smuzhiyun 	case KEY_RSA:
250*4882a593Smuzhiyun 		if ((rsa = RSA_new()) == NULL)
251*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new: RSA_new failed");
252*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
253*4882a593Smuzhiyun 		if ((rsa->n = BN_new()) == NULL)
254*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new: BN_new failed");
255*4882a593Smuzhiyun 		if ((rsa->e = BN_new()) == NULL)
256*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new: BN_new failed");
257*4882a593Smuzhiyun+#else
258*4882a593Smuzhiyun+		if (RSA_set0_key(rsa, BN_new(), BN_new(), NULL) != 1)
259*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_new: RSA_set0_key failed");
260*4882a593Smuzhiyun+#endif
261*4882a593Smuzhiyun 		k->rsa = rsa;
262*4882a593Smuzhiyun 		break;
263*4882a593Smuzhiyun 	case KEY_DSA:
264*4882a593Smuzhiyun 		if ((dsa = DSA_new()) == NULL)
265*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new: DSA_new failed");
266*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
267*4882a593Smuzhiyun 		if ((dsa->p = BN_new()) == NULL)
268*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new: BN_new failed");
269*4882a593Smuzhiyun 		if ((dsa->q = BN_new()) == NULL)
270*4882a593Smuzhiyun@@ -94,6 +100,12 @@ pamsshagentauth_key_new(int type)
271*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new: BN_new failed");
272*4882a593Smuzhiyun 		if ((dsa->pub_key = BN_new()) == NULL)
273*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new: BN_new failed");
274*4882a593Smuzhiyun+#else
275*4882a593Smuzhiyun+		if (DSA_set0_pqg(dsa, BN_new(), BN_new(), BN_new()) != 1)
276*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_new: DSA_set0_pqg failed");
277*4882a593Smuzhiyun+		if (DSA_set0_key(dsa, BN_new(), NULL) != 1)
278*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_new: DSA_set0_key failed");
279*4882a593Smuzhiyun+#endif
280*4882a593Smuzhiyun 		k->dsa = dsa;
281*4882a593Smuzhiyun 		break;
282*4882a593Smuzhiyun 	case KEY_ECDSA:
283*4882a593Smuzhiyun@@ -118,6 +130,7 @@ pamsshagentauth_key_new_private(int type)
284*4882a593Smuzhiyun 	switch (k->type) {
285*4882a593Smuzhiyun 	case KEY_RSA1:
286*4882a593Smuzhiyun 	case KEY_RSA:
287*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
288*4882a593Smuzhiyun 		if ((k->rsa->d = BN_new()) == NULL)
289*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new_private: BN_new failed");
290*4882a593Smuzhiyun 		if ((k->rsa->iqmp = BN_new()) == NULL)
291*4882a593Smuzhiyun@@ -130,14 +143,30 @@ pamsshagentauth_key_new_private(int type)
292*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new_private: BN_new failed");
293*4882a593Smuzhiyun 		if ((k->rsa->dmp1 = BN_new()) == NULL)
294*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new_private: BN_new failed");
295*4882a593Smuzhiyun+#else
296*4882a593Smuzhiyun+		if (RSA_set0_key(k->rsa, NULL, NULL, BN_new()) != 1)
297*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_new: RSA_set0_key failed");
298*4882a593Smuzhiyun+		if (RSA_set0_crt_params(k->rsa, BN_new(), BN_new(), BN_new()) != 1)
299*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_new: RSA_set0_crt_params failed");
300*4882a593Smuzhiyun+		if (RSA_set0_factors(k->rsa, BN_new(), BN_new()) != 1)
301*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_new: RSA_set0_factors failed");
302*4882a593Smuzhiyun+#endif
303*4882a593Smuzhiyun 		break;
304*4882a593Smuzhiyun 	case KEY_DSA:
305*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
306*4882a593Smuzhiyun 		if ((k->dsa->priv_key = BN_new()) == NULL)
307*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new_private: BN_new failed");
308*4882a593Smuzhiyun+#else
309*4882a593Smuzhiyun+		if (DSA_set0_key(k->dsa, NULL, BN_new()) != 1)
310*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_new_private: DSA_set0_key failed");
311*4882a593Smuzhiyun+#endif
312*4882a593Smuzhiyun 		break;
313*4882a593Smuzhiyun 	case KEY_ECDSA:
314*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
315*4882a593Smuzhiyun 		if (EC_KEY_set_private_key(k->ecdsa, BN_new()) != 1)
316*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_new_private: EC_KEY_set_private_key failed");
317*4882a593Smuzhiyun+#else
318*4882a593Smuzhiyun+#endif
319*4882a593Smuzhiyun 		break;
320*4882a593Smuzhiyun 	case KEY_ED25519:
321*4882a593Smuzhiyun 		RAND_bytes(k->ed25519->sk, sizeof(k->ed25519->sk));
322*4882a593Smuzhiyun@@ -195,14 +224,26 @@ pamsshagentauth_key_equal(const Key *a, const Key *b)
323*4882a593Smuzhiyun 	case KEY_RSA1:
324*4882a593Smuzhiyun 	case KEY_RSA:
325*4882a593Smuzhiyun 		return a->rsa != NULL && b->rsa != NULL &&
326*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
327*4882a593Smuzhiyun 		    BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
328*4882a593Smuzhiyun 		    BN_cmp(a->rsa->n, b->rsa->n) == 0;
329*4882a593Smuzhiyun+#else
330*4882a593Smuzhiyun+		    BN_cmp(RSA_get0_e(a->rsa), RSA_get0_e(b->rsa)) == 0 &&
331*4882a593Smuzhiyun+		    BN_cmp(RSA_get0_n(a->rsa), RSA_get0_n(b->rsa)) == 0;
332*4882a593Smuzhiyun+#endif
333*4882a593Smuzhiyun 	case KEY_DSA:
334*4882a593Smuzhiyun 		return a->dsa != NULL && b->dsa != NULL &&
335*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
336*4882a593Smuzhiyun 		    BN_cmp(a->dsa->p, b->dsa->p) == 0 &&
337*4882a593Smuzhiyun 		    BN_cmp(a->dsa->q, b->dsa->q) == 0 &&
338*4882a593Smuzhiyun 		    BN_cmp(a->dsa->g, b->dsa->g) == 0 &&
339*4882a593Smuzhiyun 		    BN_cmp(a->dsa->pub_key, b->dsa->pub_key) == 0;
340*4882a593Smuzhiyun+#else
341*4882a593Smuzhiyun+		    BN_cmp(DSA_get0_p(a->dsa), DSA_get0_p(b->dsa)) == 0 &&
342*4882a593Smuzhiyun+		    BN_cmp(DSA_get0_q(a->dsa), DSA_get0_q(b->dsa)) == 0 &&
343*4882a593Smuzhiyun+		    BN_cmp(DSA_get0_g(a->dsa), DSA_get0_g(b->dsa)) == 0 &&
344*4882a593Smuzhiyun+		    BN_cmp(DSA_get0_pub_key(a->dsa), DSA_get0_pub_key(b->dsa)) == 0;
345*4882a593Smuzhiyun+#endif
346*4882a593Smuzhiyun 	case KEY_ECDSA:
347*4882a593Smuzhiyun 		return a->ecdsa != NULL && b->ecdsa != NULL &&
348*4882a593Smuzhiyun 			EC_KEY_check_key(a->ecdsa) == 1 &&
349*4882a593Smuzhiyun@@ -231,7 +272,7 @@ pamsshagentauth_key_fingerprint_raw(const Key *k, enum fp_type dgst_type,
350*4882a593Smuzhiyun     u_int *dgst_raw_length)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	const EVP_MD *md = NULL;
353*4882a593Smuzhiyun-	EVP_MD_CTX ctx;
354*4882a593Smuzhiyun+	EVP_MD_CTX *ctx;
355*4882a593Smuzhiyun 	u_char *blob = NULL;
356*4882a593Smuzhiyun 	u_char *retval = NULL;
357*4882a593Smuzhiyun 	u_int len = 0;
358*4882a593Smuzhiyun@@ -252,12 +293,21 @@ pamsshagentauth_key_fingerprint_raw(const Key *k, enum fp_type dgst_type,
359*4882a593Smuzhiyun 	}
360*4882a593Smuzhiyun 	switch (k->type) {
361*4882a593Smuzhiyun 	case KEY_RSA1:
362*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
363*4882a593Smuzhiyun 		nlen = BN_num_bytes(k->rsa->n);
364*4882a593Smuzhiyun 		elen = BN_num_bytes(k->rsa->e);
365*4882a593Smuzhiyun 		len = nlen + elen;
366*4882a593Smuzhiyun 		blob = pamsshagentauth_xmalloc(len);
367*4882a593Smuzhiyun 		BN_bn2bin(k->rsa->n, blob);
368*4882a593Smuzhiyun 		BN_bn2bin(k->rsa->e, blob + nlen);
369*4882a593Smuzhiyun+#else
370*4882a593Smuzhiyun+		nlen = BN_num_bytes(RSA_get0_n(k->rsa));
371*4882a593Smuzhiyun+		elen = BN_num_bytes(RSA_get0_e(k->rsa));
372*4882a593Smuzhiyun+		len = nlen + elen;
373*4882a593Smuzhiyun+		blob = pamsshagentauth_xmalloc(len);
374*4882a593Smuzhiyun+		BN_bn2bin(RSA_get0_n(k->rsa), blob);
375*4882a593Smuzhiyun+		BN_bn2bin(RSA_get0_e(k->rsa), blob + nlen);
376*4882a593Smuzhiyun+#endif
377*4882a593Smuzhiyun 		break;
378*4882a593Smuzhiyun 	case KEY_DSA:
379*4882a593Smuzhiyun 	case KEY_ECDSA:
380*4882a593Smuzhiyun@@ -273,11 +323,14 @@ pamsshagentauth_key_fingerprint_raw(const Key *k, enum fp_type dgst_type,
381*4882a593Smuzhiyun 	}
382*4882a593Smuzhiyun 	if (blob != NULL) {
383*4882a593Smuzhiyun 		retval = pamsshagentauth_xmalloc(EVP_MAX_MD_SIZE);
384*4882a593Smuzhiyun-		EVP_DigestInit(&ctx, md);
385*4882a593Smuzhiyun-		EVP_DigestUpdate(&ctx, blob, len);
386*4882a593Smuzhiyun-		EVP_DigestFinal(&ctx, retval, dgst_raw_length);
387*4882a593Smuzhiyun+		/* XXX Errors from EVP_* functions are not hadled */
388*4882a593Smuzhiyun+		ctx = EVP_MD_CTX_create();
389*4882a593Smuzhiyun+		EVP_DigestInit(ctx, md);
390*4882a593Smuzhiyun+		EVP_DigestUpdate(ctx, blob, len);
391*4882a593Smuzhiyun+		EVP_DigestFinal(ctx, retval, dgst_raw_length);
392*4882a593Smuzhiyun 		memset(blob, 0, len);
393*4882a593Smuzhiyun 		pamsshagentauth_xfree(blob);
394*4882a593Smuzhiyun+		EVP_MD_CTX_destroy(ctx);
395*4882a593Smuzhiyun 	} else {
396*4882a593Smuzhiyun 		pamsshagentauth_fatal("key_fingerprint_raw: blob is null");
397*4882a593Smuzhiyun 	}
398*4882a593Smuzhiyun@@ -457,10 +510,17 @@ pamsshagentauth_key_read(Key *ret, char **cpp)
399*4882a593Smuzhiyun 			return -1;
400*4882a593Smuzhiyun 		*cpp = cp;
401*4882a593Smuzhiyun 		/* Get public exponent, public modulus. */
402*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
403*4882a593Smuzhiyun 		if (!read_bignum(cpp, ret->rsa->e))
404*4882a593Smuzhiyun 			return -1;
405*4882a593Smuzhiyun 		if (!read_bignum(cpp, ret->rsa->n))
406*4882a593Smuzhiyun 			return -1;
407*4882a593Smuzhiyun+#else
408*4882a593Smuzhiyun+		if (!read_bignum(cpp, RSA_get0_e(ret->rsa)))
409*4882a593Smuzhiyun+			return -1;
410*4882a593Smuzhiyun+		if (!read_bignum(cpp, RSA_get0_n(ret->rsa)))
411*4882a593Smuzhiyun+			return -1;
412*4882a593Smuzhiyun+#endif
413*4882a593Smuzhiyun 		success = 1;
414*4882a593Smuzhiyun 		break;
415*4882a593Smuzhiyun 	case KEY_UNSPEC:
416*4882a593Smuzhiyun@@ -583,10 +643,17 @@ pamsshagentauth_key_write(const Key *key, FILE *f)
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun 	if (key->type == KEY_RSA1 && key->rsa != NULL) {
419*4882a593Smuzhiyun 		/* size of modulus 'n' */
420*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
421*4882a593Smuzhiyun 		bits = BN_num_bits(key->rsa->n);
422*4882a593Smuzhiyun 		fprintf(f, "%u", bits);
423*4882a593Smuzhiyun 		if (write_bignum(f, key->rsa->e) &&
424*4882a593Smuzhiyun 		    write_bignum(f, key->rsa->n)) {
425*4882a593Smuzhiyun+#else
426*4882a593Smuzhiyun+		bits = BN_num_bits(RSA_get0_n(key->rsa));
427*4882a593Smuzhiyun+		fprintf(f, "%u", bits);
428*4882a593Smuzhiyun+		if (write_bignum(f, RSA_get0_e(key->rsa)) &&
429*4882a593Smuzhiyun+		    write_bignum(f, RSA_get0_n(key->rsa))) {
430*4882a593Smuzhiyun+#endif
431*4882a593Smuzhiyun 			success = 1;
432*4882a593Smuzhiyun 		} else {
433*4882a593Smuzhiyun 			pamsshagentauth_logerror("key_write: failed for RSA key");
434*4882a593Smuzhiyun@@ -675,10 +742,17 @@ pamsshagentauth_key_size(const Key *k)
435*4882a593Smuzhiyun {
436*4882a593Smuzhiyun 	switch (k->type) {
437*4882a593Smuzhiyun 	case KEY_RSA1:
438*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
439*4882a593Smuzhiyun 	case KEY_RSA:
440*4882a593Smuzhiyun 		return BN_num_bits(k->rsa->n);
441*4882a593Smuzhiyun 	case KEY_DSA:
442*4882a593Smuzhiyun 		return BN_num_bits(k->dsa->p);
443*4882a593Smuzhiyun+#else
444*4882a593Smuzhiyun+	case KEY_RSA:
445*4882a593Smuzhiyun+		return BN_num_bits(RSA_get0_n(k->rsa));
446*4882a593Smuzhiyun+	case KEY_DSA:
447*4882a593Smuzhiyun+		return BN_num_bits(DSA_get0_p(k->dsa));
448*4882a593Smuzhiyun+#endif
449*4882a593Smuzhiyun 	case KEY_ECDSA:
450*4882a593Smuzhiyun 	{
451*4882a593Smuzhiyun 		int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(k->ecdsa));
452*4882a593Smuzhiyun@@ -769,17 +843,29 @@ pamsshagentauth_key_from_private(const Key *k)
453*4882a593Smuzhiyun 	switch (k->type) {
454*4882a593Smuzhiyun 	case KEY_DSA:
455*4882a593Smuzhiyun 		n = pamsshagentauth_key_new(k->type);
456*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
457*4882a593Smuzhiyun 		if ((BN_copy(n->dsa->p, k->dsa->p) == NULL) ||
458*4882a593Smuzhiyun 		    (BN_copy(n->dsa->q, k->dsa->q) == NULL) ||
459*4882a593Smuzhiyun 		    (BN_copy(n->dsa->g, k->dsa->g) == NULL) ||
460*4882a593Smuzhiyun 		    (BN_copy(n->dsa->pub_key, k->dsa->pub_key) == NULL))
461*4882a593Smuzhiyun+#else
462*4882a593Smuzhiyun+		if ((BN_copy(DSA_get0_p(n->dsa), DSA_get0_p(k->dsa)) == NULL) ||
463*4882a593Smuzhiyun+		    (BN_copy(DSA_get0_q(n->dsa), DSA_get0_q(k->dsa)) == NULL) ||
464*4882a593Smuzhiyun+		    (BN_copy(DSA_get0_g(n->dsa), DSA_get0_g(k->dsa)) == NULL) ||
465*4882a593Smuzhiyun+		    (BN_copy(DSA_get0_pub_key(n->dsa), DSA_get0_pub_key(k->dsa)) == NULL))
466*4882a593Smuzhiyun+#endif
467*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_from_private: BN_copy failed");
468*4882a593Smuzhiyun 		break;
469*4882a593Smuzhiyun 	case KEY_RSA:
470*4882a593Smuzhiyun 	case KEY_RSA1:
471*4882a593Smuzhiyun 		n = pamsshagentauth_key_new(k->type);
472*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
473*4882a593Smuzhiyun 		if ((BN_copy(n->rsa->n, k->rsa->n) == NULL) ||
474*4882a593Smuzhiyun 		    (BN_copy(n->rsa->e, k->rsa->e) == NULL))
475*4882a593Smuzhiyun+#else
476*4882a593Smuzhiyun+		if ((BN_copy(RSA_get0_n(n->rsa), RSA_get0_n(k->rsa)) == NULL) ||
477*4882a593Smuzhiyun+		    (BN_copy(RSA_get0_e(n->rsa), RSA_get0_e(k->rsa)) == NULL))
478*4882a593Smuzhiyun+#endif
479*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_from_private: BN_copy failed");
480*4882a593Smuzhiyun 		break;
481*4882a593Smuzhiyun 	case KEY_ECDSA:
482*4882a593Smuzhiyun@@ -881,8 +967,13 @@ pamsshagentauth_key_from_blob(const u_char *blob, u_int blen)
483*4882a593Smuzhiyun 	switch (type) {
484*4882a593Smuzhiyun 	case KEY_RSA:
485*4882a593Smuzhiyun 		key = pamsshagentauth_key_new(type);
486*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
487*4882a593Smuzhiyun 		if (pamsshagentauth_buffer_get_bignum2_ret(&b, key->rsa->e) == -1 ||
488*4882a593Smuzhiyun 		    pamsshagentauth_buffer_get_bignum2_ret(&b, key->rsa->n) == -1) {
489*4882a593Smuzhiyun+#else
490*4882a593Smuzhiyun+		if (pamsshagentauth_buffer_get_bignum2_ret(&b, RSA_get0_e(key->rsa)) == -1 ||
491*4882a593Smuzhiyun+		    pamsshagentauth_buffer_get_bignum2_ret(&b, RSA_get0_n(key->rsa)) == -1) {
492*4882a593Smuzhiyun+#endif
493*4882a593Smuzhiyun 			pamsshagentauth_logerror("key_from_blob: can't read rsa key");
494*4882a593Smuzhiyun 			pamsshagentauth_key_free(key);
495*4882a593Smuzhiyun 			key = NULL;
496*4882a593Smuzhiyun@@ -894,10 +985,17 @@ pamsshagentauth_key_from_blob(const u_char *blob, u_int blen)
497*4882a593Smuzhiyun 		break;
498*4882a593Smuzhiyun 	case KEY_DSA:
499*4882a593Smuzhiyun 		key = pamsshagentauth_key_new(type);
500*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
501*4882a593Smuzhiyun 		if (pamsshagentauth_buffer_get_bignum2_ret(&b, key->dsa->p) == -1 ||
502*4882a593Smuzhiyun 		    pamsshagentauth_buffer_get_bignum2_ret(&b, key->dsa->q) == -1 ||
503*4882a593Smuzhiyun 		    pamsshagentauth_buffer_get_bignum2_ret(&b, key->dsa->g) == -1 ||
504*4882a593Smuzhiyun 		    pamsshagentauth_buffer_get_bignum2_ret(&b, key->dsa->pub_key) == -1) {
505*4882a593Smuzhiyun+#else
506*4882a593Smuzhiyun+		if (pamsshagentauth_buffer_get_bignum2_ret(&b, DSA_get0_p(key->dsa)) == -1 ||
507*4882a593Smuzhiyun+		    pamsshagentauth_buffer_get_bignum2_ret(&b, DSA_get0_q(key->dsa)) == -1 ||
508*4882a593Smuzhiyun+		    pamsshagentauth_buffer_get_bignum2_ret(&b, DSA_get0_g(key->dsa)) == -1 ||
509*4882a593Smuzhiyun+		    pamsshagentauth_buffer_get_bignum2_ret(&b, DSA_get0_pub_key(key->dsa)) == -1) {
510*4882a593Smuzhiyun+#endif
511*4882a593Smuzhiyun 			pamsshagentauth_logerror("key_from_blob: can't read dsa key");
512*4882a593Smuzhiyun 			pamsshagentauth_key_free(key);
513*4882a593Smuzhiyun 			key = NULL;
514*4882a593Smuzhiyun@@ -1015,6 +1113,7 @@ pamsshagentauth_key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
515*4882a593Smuzhiyun 	}
516*4882a593Smuzhiyun 	pamsshagentauth_buffer_init(&b);
517*4882a593Smuzhiyun 	switch (key->type) {
518*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
519*4882a593Smuzhiyun 	case KEY_DSA:
520*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_cstring(&b, key_ssh_name(key));
521*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(&b, key->dsa->p);
522*4882a593Smuzhiyun@@ -1027,6 +1126,20 @@ pamsshagentauth_key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
523*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(&b, key->rsa->e);
524*4882a593Smuzhiyun 		pamsshagentauth_buffer_put_bignum2(&b, key->rsa->n);
525*4882a593Smuzhiyun 		break;
526*4882a593Smuzhiyun+#else
527*4882a593Smuzhiyun+	case KEY_DSA:
528*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_cstring(&b, key_ssh_name(key));
529*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(&b, DSA_get0_p(key->dsa));
530*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(&b, DSA_get0_q(key->dsa));
531*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(&b, DSA_get0_g(key->dsa));
532*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(&b, DSA_get0_pub_key(key->dsa));
533*4882a593Smuzhiyun+		break;
534*4882a593Smuzhiyun+	case KEY_RSA:
535*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_cstring(&b, key_ssh_name(key));
536*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(&b, RSA_get0_e(key->rsa));
537*4882a593Smuzhiyun+		pamsshagentauth_buffer_put_bignum2(&b, RSA_get0_n(key->rsa));
538*4882a593Smuzhiyun+		break;
539*4882a593Smuzhiyun+#endif
540*4882a593Smuzhiyun 	case KEY_ECDSA:
541*4882a593Smuzhiyun 	{
542*4882a593Smuzhiyun 		size_t l = 0;
543*4882a593Smuzhiyun@@ -1138,14 +1251,20 @@ pamsshagentauth_key_demote(const Key *k)
544*4882a593Smuzhiyun 	case KEY_RSA:
545*4882a593Smuzhiyun 		if ((pk->rsa = RSA_new()) == NULL)
546*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_demote: RSA_new failed");
547*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
548*4882a593Smuzhiyun 		if ((pk->rsa->e = BN_dup(k->rsa->e)) == NULL)
549*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_demote: BN_dup failed");
550*4882a593Smuzhiyun 		if ((pk->rsa->n = BN_dup(k->rsa->n)) == NULL)
551*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_demote: BN_dup failed");
552*4882a593Smuzhiyun+#else
553*4882a593Smuzhiyun+		if (RSA_set0_key(pk->rsa, BN_dup(RSA_get0_n(k->rsa)), BN_dup(RSA_get0_e(k->rsa)), NULL) != 1)
554*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_demote: RSA_set0_key failed");
555*4882a593Smuzhiyun+#endif
556*4882a593Smuzhiyun 		break;
557*4882a593Smuzhiyun 	case KEY_DSA:
558*4882a593Smuzhiyun 		if ((pk->dsa = DSA_new()) == NULL)
559*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_demote: DSA_new failed");
560*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
561*4882a593Smuzhiyun 		if ((pk->dsa->p = BN_dup(k->dsa->p)) == NULL)
562*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_demote: BN_dup failed");
563*4882a593Smuzhiyun 		if ((pk->dsa->q = BN_dup(k->dsa->q)) == NULL)
564*4882a593Smuzhiyun@@ -1154,6 +1273,12 @@ pamsshagentauth_key_demote(const Key *k)
565*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_demote: BN_dup failed");
566*4882a593Smuzhiyun 		if ((pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL)
567*4882a593Smuzhiyun 			pamsshagentauth_fatal("key_demote: BN_dup failed");
568*4882a593Smuzhiyun+#else
569*4882a593Smuzhiyun+		if (DSA_set0_pqg(pk->dsa, BN_dup(DSA_get0_p(k->dsa)), BN_dup(DSA_get0_q(k->dsa)), BN_dup(DSA_get0_g(k->dsa))) != 1)
570*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_demote: DSA_set0_pqg failed");
571*4882a593Smuzhiyun+		if (DSA_set0_key(pk->dsa, BN_dup(DSA_get0_pub_key(k->dsa)), NULL) != 1)
572*4882a593Smuzhiyun+			pamsshagentauth_fatal("key_demote: DSA_set0_key failed");
573*4882a593Smuzhiyun+#endif
574*4882a593Smuzhiyun 		break;
575*4882a593Smuzhiyun 	case KEY_ECDSA:
576*4882a593Smuzhiyun 		pamsshagentauth_fatal("key_demote: implement me");
577*4882a593Smuzhiyundiff --git a/ssh-dss.c b/ssh-dss.c
578*4882a593Smuzhiyunindex 9fdaa5d..1051ae2 100644
579*4882a593Smuzhiyun--- a/ssh-dss.c
580*4882a593Smuzhiyun+++ b/ssh-dss.c
581*4882a593Smuzhiyun@@ -48,37 +48,53 @@ ssh_dss_sign(const Key *key, u_char **sigp, u_int *lenp,
582*4882a593Smuzhiyun {
583*4882a593Smuzhiyun 	DSA_SIG *sig;
584*4882a593Smuzhiyun 	const EVP_MD *evp_md = EVP_sha1();
585*4882a593Smuzhiyun-	EVP_MD_CTX md;
586*4882a593Smuzhiyun+	EVP_MD_CTX *md;
587*4882a593Smuzhiyun 	u_char digest[EVP_MAX_MD_SIZE], sigblob[SIGBLOB_LEN];
588*4882a593Smuzhiyun 	u_int rlen, slen, len, dlen;
589*4882a593Smuzhiyun 	Buffer b;
590*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
591*4882a593Smuzhiyun+	const BIGNUM *r, *s;
592*4882a593Smuzhiyun+#endif
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun 	if (key == NULL || key->type != KEY_DSA || key->dsa == NULL) {
595*4882a593Smuzhiyun 		pamsshagentauth_logerror("ssh_dss_sign: no DSA key");
596*4882a593Smuzhiyun 		return -1;
597*4882a593Smuzhiyun 	}
598*4882a593Smuzhiyun-	EVP_DigestInit(&md, evp_md);
599*4882a593Smuzhiyun-	EVP_DigestUpdate(&md, data, datalen);
600*4882a593Smuzhiyun-	EVP_DigestFinal(&md, digest, &dlen);
601*4882a593Smuzhiyun+	md = EVP_MD_CTX_create();
602*4882a593Smuzhiyun+	EVP_DigestInit(md, evp_md);
603*4882a593Smuzhiyun+	EVP_DigestUpdate(md, data, datalen);
604*4882a593Smuzhiyun+	EVP_DigestFinal(md, digest, &dlen);
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun 	sig = DSA_do_sign(digest, dlen, key->dsa);
607*4882a593Smuzhiyun 	memset(digest, 'd', sizeof(digest));
608*4882a593Smuzhiyun+	EVP_MD_CTX_destroy(md);
609*4882a593Smuzhiyun
610*4882a593Smuzhiyun 	if (sig == NULL) {
611*4882a593Smuzhiyun 		pamsshagentauth_logerror("ssh_dss_sign: sign failed");
612*4882a593Smuzhiyun 		return -1;
613*4882a593Smuzhiyun 	}
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
616*4882a593Smuzhiyun 	rlen = BN_num_bytes(sig->r);
617*4882a593Smuzhiyun 	slen = BN_num_bytes(sig->s);
618*4882a593Smuzhiyun+#else
619*4882a593Smuzhiyun+	DSA_SIG_get0((const DSA_SIG *)sig, (const BIGNUM **)r, (const BIGNUM **)s);
620*4882a593Smuzhiyun+	rlen = BN_num_bytes(r);
621*4882a593Smuzhiyun+	slen = BN_num_bytes(s);
622*4882a593Smuzhiyun+#endif
623*4882a593Smuzhiyun 	if (rlen > INTBLOB_LEN || slen > INTBLOB_LEN) {
624*4882a593Smuzhiyun 		pamsshagentauth_logerror("bad sig size %u %u", rlen, slen);
625*4882a593Smuzhiyun 		DSA_SIG_free(sig);
626*4882a593Smuzhiyun 		return -1;
627*4882a593Smuzhiyun 	}
628*4882a593Smuzhiyun 	memset(sigblob, 0, SIGBLOB_LEN);
629*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
630*4882a593Smuzhiyun 	BN_bn2bin(sig->r, sigblob+ SIGBLOB_LEN - INTBLOB_LEN - rlen);
631*4882a593Smuzhiyun 	BN_bn2bin(sig->s, sigblob+ SIGBLOB_LEN - slen);
632*4882a593Smuzhiyun+#else
633*4882a593Smuzhiyun+	BN_bn2bin(r, sigblob+ SIGBLOB_LEN - INTBLOB_LEN - rlen);
634*4882a593Smuzhiyun+	BN_bn2bin(s, sigblob+ SIGBLOB_LEN - slen);
635*4882a593Smuzhiyun+#endif
636*4882a593Smuzhiyun 	DSA_SIG_free(sig);
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun 	if (datafellows & SSH_BUG_SIGBLOB) {
639*4882a593Smuzhiyun@@ -110,11 +126,14 @@ ssh_dss_verify(const Key *key, const u_char *signature, u_int signaturelen,
640*4882a593Smuzhiyun {
641*4882a593Smuzhiyun 	DSA_SIG *sig;
642*4882a593Smuzhiyun 	const EVP_MD *evp_md = EVP_sha1();
643*4882a593Smuzhiyun-	EVP_MD_CTX md;
644*4882a593Smuzhiyun+	EVP_MD_CTX *md;
645*4882a593Smuzhiyun 	u_char digest[EVP_MAX_MD_SIZE], *sigblob;
646*4882a593Smuzhiyun 	u_int len, dlen;
647*4882a593Smuzhiyun 	int rlen, ret;
648*4882a593Smuzhiyun 	Buffer b;
649*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
650*4882a593Smuzhiyun+	BIGNUM *r, *s;
651*4882a593Smuzhiyun+#endif
652*4882a593Smuzhiyun
653*4882a593Smuzhiyun 	if (key == NULL || key->type != KEY_DSA || key->dsa == NULL) {
654*4882a593Smuzhiyun 		pamsshagentauth_logerror("ssh_dss_verify: no DSA key");
655*4882a593Smuzhiyun@@ -157,6 +176,7 @@ ssh_dss_verify(const Key *key, const u_char *signature, u_int signaturelen,
656*4882a593Smuzhiyun 	/* parse signature */
657*4882a593Smuzhiyun 	if ((sig = DSA_SIG_new()) == NULL)
658*4882a593Smuzhiyun 		pamsshagentauth_fatal("ssh_dss_verify: DSA_SIG_new failed");
659*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
660*4882a593Smuzhiyun 	if ((sig->r = BN_new()) == NULL)
661*4882a593Smuzhiyun 		pamsshagentauth_fatal("ssh_dss_verify: BN_new failed");
662*4882a593Smuzhiyun 	if ((sig->s = BN_new()) == NULL)
663*4882a593Smuzhiyun@@ -164,18 +184,33 @@ ssh_dss_verify(const Key *key, const u_char *signature, u_int signaturelen,
664*4882a593Smuzhiyun 	if ((BN_bin2bn(sigblob, INTBLOB_LEN, sig->r) == NULL) ||
665*4882a593Smuzhiyun 	    (BN_bin2bn(sigblob+ INTBLOB_LEN, INTBLOB_LEN, sig->s) == NULL))
666*4882a593Smuzhiyun 		pamsshagentauth_fatal("ssh_dss_verify: BN_bin2bn failed");
667*4882a593Smuzhiyun+#else
668*4882a593Smuzhiyun+	if ((r = BN_new()) == NULL)
669*4882a593Smuzhiyun+		pamsshagentauth_fatal("ssh_dss_verify: BN_new failed");
670*4882a593Smuzhiyun+	if ((s = BN_new()) == NULL)
671*4882a593Smuzhiyun+		pamsshagentauth_fatal("ssh_dss_verify: BN_new failed");
672*4882a593Smuzhiyun+	if (DSA_SIG_set0(sig, r, s) != 1)
673*4882a593Smuzhiyun+		pamsshagentauth_fatal("ssh_dss_verify: DSA_SIG_set0 failed");
674*4882a593Smuzhiyun+	if ((BN_bin2bn(sigblob, INTBLOB_LEN, r) == NULL) ||
675*4882a593Smuzhiyun+	    (BN_bin2bn(sigblob+ INTBLOB_LEN, INTBLOB_LEN, s) == NULL))
676*4882a593Smuzhiyun+		pamsshagentauth_fatal("ssh_dss_verify: BN_bin2bn failed");
677*4882a593Smuzhiyun+	if (DSA_SIG_set0(sig, r, s) != 1)
678*4882a593Smuzhiyun+		pamsshagentauth_fatal("ssh_dss_verify: DSA_SIG_set0 failed");
679*4882a593Smuzhiyun+#endif
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun 	/* clean up */
682*4882a593Smuzhiyun 	memset(sigblob, 0, len);
683*4882a593Smuzhiyun 	pamsshagentauth_xfree(sigblob);
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun 	/* sha1 the data */
686*4882a593Smuzhiyun-	EVP_DigestInit(&md, evp_md);
687*4882a593Smuzhiyun-	EVP_DigestUpdate(&md, data, datalen);
688*4882a593Smuzhiyun-	EVP_DigestFinal(&md, digest, &dlen);
689*4882a593Smuzhiyun+	md = EVP_MD_CTX_create();
690*4882a593Smuzhiyun+	EVP_DigestInit(md, evp_md);
691*4882a593Smuzhiyun+	EVP_DigestUpdate(md, data, datalen);
692*4882a593Smuzhiyun+	EVP_DigestFinal(md, digest, &dlen);
693*4882a593Smuzhiyun
694*4882a593Smuzhiyun 	ret = DSA_do_verify(digest, dlen, sig, key->dsa);
695*4882a593Smuzhiyun 	memset(digest, 'd', sizeof(digest));
696*4882a593Smuzhiyun+	EVP_MD_CTX_destroy(md);
697*4882a593Smuzhiyun
698*4882a593Smuzhiyun 	DSA_SIG_free(sig);
699*4882a593Smuzhiyun
700*4882a593Smuzhiyundiff --git a/ssh-ecdsa.c b/ssh-ecdsa.c
701*4882a593Smuzhiyunindex efa0f3d..c213959 100644
702*4882a593Smuzhiyun--- a/ssh-ecdsa.c
703*4882a593Smuzhiyun+++ b/ssh-ecdsa.c
704*4882a593Smuzhiyun@@ -41,22 +41,27 @@ ssh_ecdsa_sign(const Key *key, u_char **sigp, u_int *lenp,
705*4882a593Smuzhiyun {
706*4882a593Smuzhiyun     ECDSA_SIG *sig;
707*4882a593Smuzhiyun     const EVP_MD *evp_md = evp_from_key(key);
708*4882a593Smuzhiyun-    EVP_MD_CTX md;
709*4882a593Smuzhiyun+    EVP_MD_CTX *md;
710*4882a593Smuzhiyun     u_char digest[EVP_MAX_MD_SIZE];
711*4882a593Smuzhiyun     u_int len, dlen;
712*4882a593Smuzhiyun     Buffer b, bb;
713*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
714*4882a593Smuzhiyun+	BIGNUM *r, *s;
715*4882a593Smuzhiyun+#endif
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun     if (key == NULL || key->type != KEY_ECDSA || key->ecdsa == NULL) {
718*4882a593Smuzhiyun         pamsshagentauth_logerror("ssh_ecdsa_sign: no ECDSA key");
719*4882a593Smuzhiyun         return -1;
720*4882a593Smuzhiyun     }
721*4882a593Smuzhiyun
722*4882a593Smuzhiyun-    EVP_DigestInit(&md, evp_md);
723*4882a593Smuzhiyun-    EVP_DigestUpdate(&md, data, datalen);
724*4882a593Smuzhiyun-    EVP_DigestFinal(&md, digest, &dlen);
725*4882a593Smuzhiyun+    md = EVP_MD_CTX_create();
726*4882a593Smuzhiyun+    EVP_DigestInit(md, evp_md);
727*4882a593Smuzhiyun+    EVP_DigestUpdate(md, data, datalen);
728*4882a593Smuzhiyun+    EVP_DigestFinal(md, digest, &dlen);
729*4882a593Smuzhiyun
730*4882a593Smuzhiyun     sig = ECDSA_do_sign(digest, dlen, key->ecdsa);
731*4882a593Smuzhiyun     memset(digest, 'd', sizeof(digest));
732*4882a593Smuzhiyun+    EVP_MD_CTX_destroy(md);
733*4882a593Smuzhiyun
734*4882a593Smuzhiyun     if (sig == NULL) {
735*4882a593Smuzhiyun         pamsshagentauth_logerror("ssh_ecdsa_sign: sign failed");
736*4882a593Smuzhiyun@@ -64,8 +69,14 @@ ssh_ecdsa_sign(const Key *key, u_char **sigp, u_int *lenp,
737*4882a593Smuzhiyun     }
738*4882a593Smuzhiyun
739*4882a593Smuzhiyun     pamsshagentauth_buffer_init(&bb);
740*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
741*4882a593Smuzhiyun     if (pamsshagentauth_buffer_get_bignum2_ret(&bb, sig->r) == -1 ||
742*4882a593Smuzhiyun         pamsshagentauth_buffer_get_bignum2_ret(&bb, sig->s) == -1) {
743*4882a593Smuzhiyun+#else
744*4882a593Smuzhiyun+    DSA_SIG_get0(sig, &r, &s);
745*4882a593Smuzhiyun+    if (pamsshagentauth_buffer_get_bignum2_ret(&bb, r) == -1 ||
746*4882a593Smuzhiyun+        pamsshagentauth_buffer_get_bignum2_ret(&bb, s) == -1) {
747*4882a593Smuzhiyun+#endif
748*4882a593Smuzhiyun         pamsshagentauth_logerror("couldn't serialize signature");
749*4882a593Smuzhiyun         ECDSA_SIG_free(sig);
750*4882a593Smuzhiyun         return -1;
751*4882a593Smuzhiyun@@ -94,11 +105,14 @@ ssh_ecdsa_verify(const Key *key, const u_char *signature, u_int signaturelen,
752*4882a593Smuzhiyun {
753*4882a593Smuzhiyun     ECDSA_SIG *sig;
754*4882a593Smuzhiyun     const EVP_MD *evp_md = evp_from_key(key);
755*4882a593Smuzhiyun-    EVP_MD_CTX md;
756*4882a593Smuzhiyun+    EVP_MD_CTX *md;
757*4882a593Smuzhiyun     u_char digest[EVP_MAX_MD_SIZE], *sigblob;
758*4882a593Smuzhiyun     u_int len, dlen;
759*4882a593Smuzhiyun     int rlen, ret;
760*4882a593Smuzhiyun     Buffer b;
761*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER >= 0x10100000L
762*4882a593Smuzhiyun+	BIGNUM *r, *s;
763*4882a593Smuzhiyun+#endif
764*4882a593Smuzhiyun
765*4882a593Smuzhiyun     if (key == NULL || key->type != KEY_ECDSA || key->ecdsa == NULL) {
766*4882a593Smuzhiyun         pamsshagentauth_logerror("ssh_ecdsa_sign: no ECDSA key");
767*4882a593Smuzhiyun@@ -127,8 +141,14 @@ ssh_ecdsa_verify(const Key *key, const u_char *signature, u_int signaturelen,
768*4882a593Smuzhiyun
769*4882a593Smuzhiyun     pamsshagentauth_buffer_init(&b);
770*4882a593Smuzhiyun     pamsshagentauth_buffer_append(&b, sigblob, len);
771*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
772*4882a593Smuzhiyun     if ((pamsshagentauth_buffer_get_bignum2_ret(&b, sig->r) == -1) ||
773*4882a593Smuzhiyun         (pamsshagentauth_buffer_get_bignum2_ret(&b, sig->s) == -1))
774*4882a593Smuzhiyun+#else
775*4882a593Smuzhiyun+    DSA_SIG_get0(sig, &r, &s);
776*4882a593Smuzhiyun+    if ((pamsshagentauth_buffer_get_bignum2_ret(&b, r) == -1) ||
777*4882a593Smuzhiyun+        (pamsshagentauth_buffer_get_bignum2_ret(&b, s) == -1))
778*4882a593Smuzhiyun+#endif
779*4882a593Smuzhiyun         pamsshagentauth_fatal("ssh_ecdsa_verify:"
780*4882a593Smuzhiyun             "pamsshagentauth_buffer_get_bignum2_ret failed");
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun@@ -137,16 +157,18 @@ ssh_ecdsa_verify(const Key *key, const u_char *signature, u_int signaturelen,
783*4882a593Smuzhiyun     pamsshagentauth_xfree(sigblob);
784*4882a593Smuzhiyun
785*4882a593Smuzhiyun     /* sha256 the data */
786*4882a593Smuzhiyun-    EVP_DigestInit(&md, evp_md);
787*4882a593Smuzhiyun-    EVP_DigestUpdate(&md, data, datalen);
788*4882a593Smuzhiyun-    EVP_DigestFinal(&md, digest, &dlen);
789*4882a593Smuzhiyun+    md = EVP_MD_CTX_create();
790*4882a593Smuzhiyun+    EVP_DigestInit(md, evp_md);
791*4882a593Smuzhiyun+    EVP_DigestUpdate(md, data, datalen);
792*4882a593Smuzhiyun+    EVP_DigestFinal(md, digest, &dlen);
793*4882a593Smuzhiyun
794*4882a593Smuzhiyun     ret = ECDSA_do_verify(digest, dlen, sig, key->ecdsa);
795*4882a593Smuzhiyun     memset(digest, 'd', sizeof(digest));
796*4882a593Smuzhiyun+    EVP_MD_CTX_destroy(md);
797*4882a593Smuzhiyun
798*4882a593Smuzhiyun     ECDSA_SIG_free(sig);
799*4882a593Smuzhiyun
800*4882a593Smuzhiyun     pamsshagentauth_verbose("ssh_ecdsa_verify: signature %s",
801*4882a593Smuzhiyun         ret == 1 ? "correct" : ret == 0 ? "incorrect" : "error");
802*4882a593Smuzhiyun     return ret;
803*4882a593Smuzhiyun-}
804*4882a593Smuzhiyun\ No newline at end of file
805*4882a593Smuzhiyun+}
806*4882a593Smuzhiyundiff --git a/ssh-rsa.c b/ssh-rsa.c
807*4882a593Smuzhiyunindex d05844b..9d74eb6 100644
808*4882a593Smuzhiyun--- a/ssh-rsa.c
809*4882a593Smuzhiyun+++ b/ssh-rsa.c
810*4882a593Smuzhiyun@@ -40,7 +40,7 @@ ssh_rsa_sign(const Key *key, u_char **sigp, u_int *lenp,
811*4882a593Smuzhiyun     const u_char *data, u_int datalen)
812*4882a593Smuzhiyun {
813*4882a593Smuzhiyun 	const EVP_MD *evp_md;
814*4882a593Smuzhiyun-	EVP_MD_CTX md;
815*4882a593Smuzhiyun+	EVP_MD_CTX *md;
816*4882a593Smuzhiyun 	u_char digest[EVP_MAX_MD_SIZE], *sig;
817*4882a593Smuzhiyun 	u_int slen, dlen, len;
818*4882a593Smuzhiyun 	int ok, nid;
819*4882a593Smuzhiyun@@ -55,6 +55,7 @@ ssh_rsa_sign(const Key *key, u_char **sigp, u_int *lenp,
820*4882a593Smuzhiyun 		pamsshagentauth_logerror("ssh_rsa_sign: EVP_get_digestbynid %d failed", nid);
821*4882a593Smuzhiyun 		return -1;
822*4882a593Smuzhiyun 	}
823*4882a593Smuzhiyun+	md = EVP_MD_CTX_create();
824*4882a593Smuzhiyun 	EVP_DigestInit(&md, evp_md);
825*4882a593Smuzhiyun 	EVP_DigestUpdate(&md, data, datalen);
826*4882a593Smuzhiyun 	EVP_DigestFinal(&md, digest, &dlen);
827*4882a593Smuzhiyun@@ -64,6 +65,7 @@ ssh_rsa_sign(const Key *key, u_char **sigp, u_int *lenp,
828*4882a593Smuzhiyun
829*4882a593Smuzhiyun 	ok = RSA_sign(nid, digest, dlen, sig, &len, key->rsa);
830*4882a593Smuzhiyun 	memset(digest, 'd', sizeof(digest));
831*4882a593Smuzhiyun+	EVP_MD_CTX_destroy(md);
832*4882a593Smuzhiyun
833*4882a593Smuzhiyun 	if (ok != 1) {
834*4882a593Smuzhiyun 		int ecode = ERR_get_error();
835*4882a593Smuzhiyun@@ -107,7 +109,7 @@ ssh_rsa_verify(const Key *key, const u_char *signature, u_int signaturelen,
836*4882a593Smuzhiyun {
837*4882a593Smuzhiyun 	Buffer b;
838*4882a593Smuzhiyun 	const EVP_MD *evp_md;
839*4882a593Smuzhiyun-	EVP_MD_CTX md;
840*4882a593Smuzhiyun+	EVP_MD_CTX *md;
841*4882a593Smuzhiyun 	char *ktype;
842*4882a593Smuzhiyun 	u_char digest[EVP_MAX_MD_SIZE], *sigblob;
843*4882a593Smuzhiyun 	u_int len, dlen, modlen;
844*4882a593Smuzhiyun@@ -117,9 +119,17 @@ ssh_rsa_verify(const Key *key, const u_char *signature, u_int signaturelen,
845*4882a593Smuzhiyun 		pamsshagentauth_logerror("ssh_rsa_verify: no RSA key");
846*4882a593Smuzhiyun 		return -1;
847*4882a593Smuzhiyun 	}
848*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
849*4882a593Smuzhiyun 	if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
850*4882a593Smuzhiyun+#else
851*4882a593Smuzhiyun+	if (BN_num_bits(RSA_get0_n(key->rsa)) < SSH_RSA_MINIMUM_MODULUS_SIZE) {
852*4882a593Smuzhiyun+#endif
853*4882a593Smuzhiyun 		pamsshagentauth_logerror("ssh_rsa_verify: RSA modulus too small: %d < minimum %d bits",
854*4882a593Smuzhiyun+#if OPENSSL_VERSION_NUMBER < 0x10100000L
855*4882a593Smuzhiyun 		    BN_num_bits(key->rsa->n), SSH_RSA_MINIMUM_MODULUS_SIZE);
856*4882a593Smuzhiyun+#else
857*4882a593Smuzhiyun+		    BN_num_bits(RSA_get0_n(key->rsa)), SSH_RSA_MINIMUM_MODULUS_SIZE);
858*4882a593Smuzhiyun+#endif
859*4882a593Smuzhiyun 		return -1;
860*4882a593Smuzhiyun 	}
861*4882a593Smuzhiyun 	pamsshagentauth_buffer_init(&b);
862*4882a593Smuzhiyun@@ -161,12 +171,14 @@ ssh_rsa_verify(const Key *key, const u_char *signature, u_int signaturelen,
863*4882a593Smuzhiyun 		pamsshagentauth_xfree(sigblob);
864*4882a593Smuzhiyun 		return -1;
865*4882a593Smuzhiyun 	}
866*4882a593Smuzhiyun-	EVP_DigestInit(&md, evp_md);
867*4882a593Smuzhiyun-	EVP_DigestUpdate(&md, data, datalen);
868*4882a593Smuzhiyun-	EVP_DigestFinal(&md, digest, &dlen);
869*4882a593Smuzhiyun+	md = EVP_MD_CTX_create();
870*4882a593Smuzhiyun+	EVP_DigestInit(md, evp_md);
871*4882a593Smuzhiyun+	EVP_DigestUpdate(md, data, datalen);
872*4882a593Smuzhiyun+	EVP_DigestFinal(md, digest, &dlen);
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun 	ret = openssh_RSA_verify(nid, digest, dlen, sigblob, len, key->rsa);
875*4882a593Smuzhiyun 	memset(digest, 'd', sizeof(digest));
876*4882a593Smuzhiyun+	EVP_MD_CTX_destroy(md);
877*4882a593Smuzhiyun 	memset(sigblob, 's', len);
878*4882a593Smuzhiyun 	pamsshagentauth_xfree(sigblob);
879*4882a593Smuzhiyun 	pamsshagentauth_verbose("ssh_rsa_verify: signature %scorrect", (ret==0) ? "in" : "");
880