X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=ssl%2Fstatem%2Fstatem_clnt.c;h=5b53b8605d859c0ff68c650fade365ef94a68feb;hp=fe1cde69e11a6e8a9204729e0ae02f8a4e0d5f5e;hb=0aeddcfa61250a6c474c4f8b3533772a63192f1b;hpb=b9aec69ace2ae84b2b4494cc49725945805d5a29 diff --git a/ssl/statem/statem_clnt.c b/ssl/statem/statem_clnt.c index fe1cde69e1..5b53b8605d 100644 --- a/ssl/statem/statem_clnt.c +++ b/ssl/statem/statem_clnt.c @@ -1527,6 +1527,7 @@ MSG_PROCESS_RETURN tls_process_key_exchange(SSL *s, PACKET *pkt) PACKET prime, generator, pub_key; DH *dh; + BIGNUM *p, *g, *bnpub_key; if (!PACKET_get_length_prefixed_2(pkt, &prime) || !PACKET_get_length_prefixed_2(pkt, &generator) @@ -1550,22 +1551,41 @@ MSG_PROCESS_RETURN tls_process_key_exchange(SSL *s, PACKET *pkt) goto err; } - if ((dh->p = BN_bin2bn(PACKET_data(&prime), - PACKET_remaining(&prime), NULL)) == NULL - || (dh->g = BN_bin2bn(PACKET_data(&generator), - PACKET_remaining(&generator), NULL)) == NULL - || (dh->pub_key = - BN_bin2bn(PACKET_data(&pub_key), - PACKET_remaining(&pub_key), NULL)) == NULL) { + p = BN_bin2bn(PACKET_data(&prime), PACKET_remaining(&prime), NULL); + g = BN_bin2bn(PACKET_data(&generator), PACKET_remaining(&generator), + NULL); + bnpub_key = BN_bin2bn(PACKET_data(&pub_key), PACKET_remaining(&pub_key), + NULL); + if (p == NULL || g == NULL || bnpub_key == NULL) { SSLerr(SSL_F_TLS_PROCESS_KEY_EXCHANGE, ERR_R_BN_LIB); + BN_free(p); + BN_free(g); + BN_free(bnpub_key); goto err; } - if (BN_is_zero(dh->p) || BN_is_zero(dh->g) || BN_is_zero(dh->pub_key)) { + if (BN_is_zero(p) || BN_is_zero(g) || BN_is_zero(bnpub_key)) { SSLerr(SSL_F_TLS_PROCESS_KEY_EXCHANGE, SSL_R_BAD_DH_VALUE); + BN_free(p); + BN_free(g); + BN_free(bnpub_key); goto f_err; } + if (!DH_set0_pqg(dh, p, NULL, g)) { + SSLerr(SSL_F_TLS_PROCESS_KEY_EXCHANGE, ERR_R_BN_LIB); + BN_free(p); + BN_free(g); + BN_free(bnpub_key); + goto err; + } + + if (!DH_set0_key(dh, bnpub_key, NULL)) { + SSLerr(SSL_F_TLS_PROCESS_KEY_EXCHANGE, ERR_R_BN_LIB); + BN_free(bnpub_key); + goto err; + } + if (!ssl_security(s, SSL_SECOP_TMP_DH, DH_security_bits(dh), 0, dh)) { al = SSL_AD_HANDSHAKE_FAILURE; SSLerr(SSL_F_TLS_PROCESS_KEY_EXCHANGE, SSL_R_DH_KEY_TOO_SMALL); @@ -2254,6 +2274,7 @@ psk_err: #ifndef OPENSSL_NO_DH else if (alg_k & (SSL_kDHE | SSL_kDHEPSK)) { DH *dh_clnt = NULL; + BIGNUM *pub_key; skey = s->s3->peer_tmp; if (skey == NULL) { SSLerr(SSL_F_TLS_CONSTRUCT_CLIENT_KEY_EXCHANGE, @@ -2271,9 +2292,10 @@ psk_err: /* send off the data */ - n = BN_num_bytes(dh_clnt->pub_key); + DH_get0_key(dh_clnt, &pub_key, NULL); + n = BN_num_bytes(pub_key); s2n(n, p); - BN_bn2bin(dh_clnt->pub_key, p); + BN_bn2bin(pub_key, p); n += 2; EVP_PKEY_free(ckey); ckey = NULL;