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