summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2015-02-06 09:58:52 +0000
committerjsing <>2015-02-06 09:58:52 +0000
commit9bec1611d9610ec152375d6e1f622b93ed03a1a0 (patch)
treeed361a344289c7ae8f6d94cc1f12da9e7618aa36 /src
parentc1f6acb1132a3014b5f1be04adc57d03d6851dbb (diff)
downloadopenbsd-9bec1611d9610ec152375d6e1f622b93ed03a1a0.tar.gz
openbsd-9bec1611d9610ec152375d6e1f622b93ed03a1a0.tar.bz2
openbsd-9bec1611d9610ec152375d6e1f622b93ed03a1a0.zip
Add additional checks to ssl3_send_client_key_exchange() that ensures
ephemeral keys exist for SSL_kDHE and SSL_kECDHE. This would have prevented CVE-2014-3572. ok doug@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libssl/s3_clnt.c43
-rw-r--r--src/lib/libssl/src/ssl/s3_clnt.c43
2 files changed, 50 insertions, 36 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c
index 1a64a7e5f2..b2c7517598 100644
--- a/src/lib/libssl/s3_clnt.c
+++ b/src/lib/libssl/s3_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_clnt.c,v 1.105 2015/02/06 08:30:23 jsing Exp $ */ 1/* $OpenBSD: s3_clnt.c,v 1.106 2015/02/06 09:58:52 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1968,16 +1968,15 @@ ssl3_send_client_key_exchange(SSL *s)
1968 } else if (alg_k & SSL_kDHE) { 1968 } else if (alg_k & SSL_kDHE) {
1969 DH *dh_srvr, *dh_clnt; 1969 DH *dh_srvr, *dh_clnt;
1970 1970
1971 if (s->session->sess_cert->peer_dh_tmp != NULL) 1971 /* Ensure that we have an ephemeral key for DHE. */
1972 dh_srvr = s->session->sess_cert->peer_dh_tmp; 1972 if (s->session->sess_cert->peer_dh_tmp == NULL) {
1973 else {
1974 /* We get them from the cert. */
1975 ssl3_send_alert(s, SSL3_AL_FATAL, 1973 ssl3_send_alert(s, SSL3_AL_FATAL,
1976 SSL_AD_HANDSHAKE_FAILURE); 1974 SSL_AD_HANDSHAKE_FAILURE);
1977 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, 1975 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1978 SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); 1976 SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
1979 goto err; 1977 goto err;
1980 } 1978 }
1979 dh_srvr = s->session->sess_cert->peer_dh_tmp;
1981 1980
1982 /* Generate a new random key. */ 1981 /* Generate a new random key. */
1983 if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) { 1982 if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) {
@@ -2057,22 +2056,30 @@ ssl3_send_client_key_exchange(SSL *s)
2057 */ 2056 */
2058 } 2057 }
2059 2058
2060 if (s->session->sess_cert->peer_ecdh_tmp != NULL) { 2059 /* Ensure that we have an ephemeral key for ECDHE. */
2061 tkey = s->session->sess_cert->peer_ecdh_tmp; 2060 if ((alg_k & SSL_kECDHE) &&
2062 } else { 2061 s->session->sess_cert->peer_ecdh_tmp == NULL) {
2062 ssl3_send_alert(s, SSL3_AL_FATAL,
2063 SSL_AD_HANDSHAKE_FAILURE);
2064 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2065 ERR_R_INTERNAL_ERROR);
2066 goto err;
2067 }
2068 tkey = s->session->sess_cert->peer_ecdh_tmp;
2069
2070 if (alg_k & (SSL_kECDHr|SSL_kECDHe)) {
2063 /* Get the Server Public Key from Cert */ 2071 /* Get the Server Public Key from Cert */
2064 srvr_pub_pkey = X509_get_pubkey(s->session-> \ 2072 srvr_pub_pkey = X509_get_pubkey(s->session-> \
2065 sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); 2073 sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
2066 if ((srvr_pub_pkey == NULL) || 2074 if (srvr_pub_pkey != NULL &&
2067 (srvr_pub_pkey->type != EVP_PKEY_EC) || 2075 srvr_pub_pkey->type == EVP_PKEY_EC)
2068 (srvr_pub_pkey->pkey.ec == NULL)) { 2076 tkey = srvr_pub_pkey->pkey.ec;
2069 SSLerr( 2077 }
2070 SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2071 ERR_R_INTERNAL_ERROR);
2072 goto err;
2073 }
2074 2078
2075 tkey = srvr_pub_pkey->pkey.ec; 2079 if (tkey == NULL) {
2080 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2081 ERR_R_INTERNAL_ERROR);
2082 goto err;
2076 } 2083 }
2077 2084
2078 srvr_group = EC_KEY_get0_group(tkey); 2085 srvr_group = EC_KEY_get0_group(tkey);
@@ -2314,7 +2321,7 @@ ssl3_send_client_key_exchange(SSL *s)
2314 ssl3_send_alert(s, SSL3_AL_FATAL, 2321 ssl3_send_alert(s, SSL3_AL_FATAL,
2315 SSL_AD_HANDSHAKE_FAILURE); 2322 SSL_AD_HANDSHAKE_FAILURE);
2316 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, 2323 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2317 ERR_R_INTERNAL_ERROR); 2324 ERR_R_INTERNAL_ERROR);
2318 goto err; 2325 goto err;
2319 } 2326 }
2320 2327
diff --git a/src/lib/libssl/src/ssl/s3_clnt.c b/src/lib/libssl/src/ssl/s3_clnt.c
index 1a64a7e5f2..b2c7517598 100644
--- a/src/lib/libssl/src/ssl/s3_clnt.c
+++ b/src/lib/libssl/src/ssl/s3_clnt.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: s3_clnt.c,v 1.105 2015/02/06 08:30:23 jsing Exp $ */ 1/* $OpenBSD: s3_clnt.c,v 1.106 2015/02/06 09:58:52 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -1968,16 +1968,15 @@ ssl3_send_client_key_exchange(SSL *s)
1968 } else if (alg_k & SSL_kDHE) { 1968 } else if (alg_k & SSL_kDHE) {
1969 DH *dh_srvr, *dh_clnt; 1969 DH *dh_srvr, *dh_clnt;
1970 1970
1971 if (s->session->sess_cert->peer_dh_tmp != NULL) 1971 /* Ensure that we have an ephemeral key for DHE. */
1972 dh_srvr = s->session->sess_cert->peer_dh_tmp; 1972 if (s->session->sess_cert->peer_dh_tmp == NULL) {
1973 else {
1974 /* We get them from the cert. */
1975 ssl3_send_alert(s, SSL3_AL_FATAL, 1973 ssl3_send_alert(s, SSL3_AL_FATAL,
1976 SSL_AD_HANDSHAKE_FAILURE); 1974 SSL_AD_HANDSHAKE_FAILURE);
1977 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, 1975 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
1978 SSL_R_UNABLE_TO_FIND_DH_PARAMETERS); 1976 SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
1979 goto err; 1977 goto err;
1980 } 1978 }
1979 dh_srvr = s->session->sess_cert->peer_dh_tmp;
1981 1980
1982 /* Generate a new random key. */ 1981 /* Generate a new random key. */
1983 if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) { 1982 if ((dh_clnt = DHparams_dup(dh_srvr)) == NULL) {
@@ -2057,22 +2056,30 @@ ssl3_send_client_key_exchange(SSL *s)
2057 */ 2056 */
2058 } 2057 }
2059 2058
2060 if (s->session->sess_cert->peer_ecdh_tmp != NULL) { 2059 /* Ensure that we have an ephemeral key for ECDHE. */
2061 tkey = s->session->sess_cert->peer_ecdh_tmp; 2060 if ((alg_k & SSL_kECDHE) &&
2062 } else { 2061 s->session->sess_cert->peer_ecdh_tmp == NULL) {
2062 ssl3_send_alert(s, SSL3_AL_FATAL,
2063 SSL_AD_HANDSHAKE_FAILURE);
2064 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2065 ERR_R_INTERNAL_ERROR);
2066 goto err;
2067 }
2068 tkey = s->session->sess_cert->peer_ecdh_tmp;
2069
2070 if (alg_k & (SSL_kECDHr|SSL_kECDHe)) {
2063 /* Get the Server Public Key from Cert */ 2071 /* Get the Server Public Key from Cert */
2064 srvr_pub_pkey = X509_get_pubkey(s->session-> \ 2072 srvr_pub_pkey = X509_get_pubkey(s->session-> \
2065 sess_cert->peer_pkeys[SSL_PKEY_ECC].x509); 2073 sess_cert->peer_pkeys[SSL_PKEY_ECC].x509);
2066 if ((srvr_pub_pkey == NULL) || 2074 if (srvr_pub_pkey != NULL &&
2067 (srvr_pub_pkey->type != EVP_PKEY_EC) || 2075 srvr_pub_pkey->type == EVP_PKEY_EC)
2068 (srvr_pub_pkey->pkey.ec == NULL)) { 2076 tkey = srvr_pub_pkey->pkey.ec;
2069 SSLerr( 2077 }
2070 SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2071 ERR_R_INTERNAL_ERROR);
2072 goto err;
2073 }
2074 2078
2075 tkey = srvr_pub_pkey->pkey.ec; 2079 if (tkey == NULL) {
2080 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2081 ERR_R_INTERNAL_ERROR);
2082 goto err;
2076 } 2083 }
2077 2084
2078 srvr_group = EC_KEY_get0_group(tkey); 2085 srvr_group = EC_KEY_get0_group(tkey);
@@ -2314,7 +2321,7 @@ ssl3_send_client_key_exchange(SSL *s)
2314 ssl3_send_alert(s, SSL3_AL_FATAL, 2321 ssl3_send_alert(s, SSL3_AL_FATAL,
2315 SSL_AD_HANDSHAKE_FAILURE); 2322 SSL_AD_HANDSHAKE_FAILURE);
2316 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE, 2323 SSLerr(SSL_F_SSL3_SEND_CLIENT_KEY_EXCHANGE,
2317 ERR_R_INTERNAL_ERROR); 2324 ERR_R_INTERNAL_ERROR);
2318 goto err; 2325 goto err;
2319 } 2326 }
2320 2327