summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjsing <>2015-01-23 14:40:59 +0000
committerjsing <>2015-01-23 14:40:59 +0000
commit0ca354610056aedab2a285f08e0140b96d01d69a (patch)
tree450f8d7eed375d7c70f748ed9396632f092c9465 /src
parent38bc6a91e6b835277fe04c41f679587c7b390ffe (diff)
downloadopenbsd-0ca354610056aedab2a285f08e0140b96d01d69a.tar.gz
openbsd-0ca354610056aedab2a285f08e0140b96d01d69a.tar.bz2
openbsd-0ca354610056aedab2a285f08e0140b96d01d69a.zip
Ensure that a ServerKeyExchange message is received if the selected cipher
suite uses ephemeral keys. This avoids an issue where an ECHDE cipher suite can effectively be downgraded to ECDH, if the server omits the ServerKeyExchange message and has provided a certificate with an ECC public key. Issue reported to OpenSSL by Karthikeyan Bhargavan. Based on OpenSSL. Fixes CVE-2014-3572. ok beck@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libssl/s3_clnt.c23
-rw-r--r--src/lib/libssl/src/ssl/s3_clnt.c23
2 files changed, 36 insertions, 10 deletions
diff --git a/src/lib/libssl/s3_clnt.c b/src/lib/libssl/s3_clnt.c
index d1f2e05eb8..b1c8ffb200 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.103 2014/12/15 00:46:53 doug Exp $ */ 1/* $OpenBSD: s3_clnt.c,v 1.104 2015/01/23 14:40:59 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 *
@@ -1165,6 +1165,11 @@ ssl3_get_key_exchange(SSL *s)
1165 int curve_nid = 0; 1165 int curve_nid = 0;
1166 int encoded_pt_len = 0; 1166 int encoded_pt_len = 0;
1167 1167
1168 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1169 alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1170
1171 EVP_MD_CTX_init(&md_ctx);
1172
1168 /* 1173 /*
1169 * Use same message size as in ssl3_get_certificate_request() 1174 * Use same message size as in ssl3_get_certificate_request()
1170 * as ServerKeyExchange message may be skipped. 1175 * as ServerKeyExchange message may be skipped.
@@ -1175,11 +1180,21 @@ ssl3_get_key_exchange(SSL *s)
1175 return ((int)n); 1180 return ((int)n);
1176 1181
1177 if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { 1182 if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) {
1183 /*
1184 * Do not skip server key exchange if this cipher suite uses
1185 * ephemeral keys.
1186 */
1187 if (alg_k & (SSL_kDHE|SSL_kECDHE)) {
1188 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1189 SSL_R_UNEXPECTED_MESSAGE);
1190 al = SSL_AD_UNEXPECTED_MESSAGE;
1191 goto f_err;
1192 }
1193
1178 s->s3->tmp.reuse_message = 1; 1194 s->s3->tmp.reuse_message = 1;
1179 return (1); 1195 return (1);
1180 } 1196 }
1181 1197
1182 param = p = (unsigned char *)s->init_msg;
1183 if (s->session->sess_cert != NULL) { 1198 if (s->session->sess_cert != NULL) {
1184 DH_free(s->session->sess_cert->peer_dh_tmp); 1199 DH_free(s->session->sess_cert->peer_dh_tmp);
1185 s->session->sess_cert->peer_dh_tmp = NULL; 1200 s->session->sess_cert->peer_dh_tmp = NULL;
@@ -1192,10 +1207,8 @@ ssl3_get_key_exchange(SSL *s)
1192 goto err; 1207 goto err;
1193 } 1208 }
1194 1209
1210 param = p = (unsigned char *)s->init_msg;
1195 param_len = 0; 1211 param_len = 0;
1196 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1197 alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1198 EVP_MD_CTX_init(&md_ctx);
1199 1212
1200 if (alg_k & SSL_kDHE) { 1213 if (alg_k & SSL_kDHE) {
1201 if ((dh = DH_new()) == NULL) { 1214 if ((dh = DH_new()) == NULL) {
diff --git a/src/lib/libssl/src/ssl/s3_clnt.c b/src/lib/libssl/src/ssl/s3_clnt.c
index d1f2e05eb8..b1c8ffb200 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.103 2014/12/15 00:46:53 doug Exp $ */ 1/* $OpenBSD: s3_clnt.c,v 1.104 2015/01/23 14:40:59 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 *
@@ -1165,6 +1165,11 @@ ssl3_get_key_exchange(SSL *s)
1165 int curve_nid = 0; 1165 int curve_nid = 0;
1166 int encoded_pt_len = 0; 1166 int encoded_pt_len = 0;
1167 1167
1168 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1169 alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1170
1171 EVP_MD_CTX_init(&md_ctx);
1172
1168 /* 1173 /*
1169 * Use same message size as in ssl3_get_certificate_request() 1174 * Use same message size as in ssl3_get_certificate_request()
1170 * as ServerKeyExchange message may be skipped. 1175 * as ServerKeyExchange message may be skipped.
@@ -1175,11 +1180,21 @@ ssl3_get_key_exchange(SSL *s)
1175 return ((int)n); 1180 return ((int)n);
1176 1181
1177 if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) { 1182 if (s->s3->tmp.message_type != SSL3_MT_SERVER_KEY_EXCHANGE) {
1183 /*
1184 * Do not skip server key exchange if this cipher suite uses
1185 * ephemeral keys.
1186 */
1187 if (alg_k & (SSL_kDHE|SSL_kECDHE)) {
1188 SSLerr(SSL_F_SSL3_GET_KEY_EXCHANGE,
1189 SSL_R_UNEXPECTED_MESSAGE);
1190 al = SSL_AD_UNEXPECTED_MESSAGE;
1191 goto f_err;
1192 }
1193
1178 s->s3->tmp.reuse_message = 1; 1194 s->s3->tmp.reuse_message = 1;
1179 return (1); 1195 return (1);
1180 } 1196 }
1181 1197
1182 param = p = (unsigned char *)s->init_msg;
1183 if (s->session->sess_cert != NULL) { 1198 if (s->session->sess_cert != NULL) {
1184 DH_free(s->session->sess_cert->peer_dh_tmp); 1199 DH_free(s->session->sess_cert->peer_dh_tmp);
1185 s->session->sess_cert->peer_dh_tmp = NULL; 1200 s->session->sess_cert->peer_dh_tmp = NULL;
@@ -1192,10 +1207,8 @@ ssl3_get_key_exchange(SSL *s)
1192 goto err; 1207 goto err;
1193 } 1208 }
1194 1209
1210 param = p = (unsigned char *)s->init_msg;
1195 param_len = 0; 1211 param_len = 0;
1196 alg_k = s->s3->tmp.new_cipher->algorithm_mkey;
1197 alg_a = s->s3->tmp.new_cipher->algorithm_auth;
1198 EVP_MD_CTX_init(&md_ctx);
1199 1212
1200 if (alg_k & SSL_kDHE) { 1213 if (alg_k & SSL_kDHE) {
1201 if ((dh = DH_new()) == NULL) { 1214 if ((dh = DH_new()) == NULL) {