X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=ssl%2Fstatem%2Fstatem_lib.c;h=36d55343b82aa9793a65c65cf52f1941c950e598;hb=150840b9443d371bfa26e2a33051aa137b5606fc;hp=f098213869dbc11748b4914a7611cfe05e58d95c;hpb=c3043dcd55d81617408025b1cdb8241ef753b805;p=oweals%2Fopenssl.git diff --git a/ssl/statem/statem_lib.c b/ssl/statem/statem_lib.c index f098213869..36d55343b8 100644 --- a/ssl/statem/statem_lib.c +++ b/ssl/statem/statem_lib.c @@ -78,6 +78,39 @@ int tls_setup_handshake(SSL *s) return 0; if (s->server) { + STACK_OF(SSL_CIPHER) *ciphers = SSL_get_ciphers(s); + int i, ver_min, ver_max, ok = 0; + + /* + * Sanity check that the maximum version we accept has ciphers + * enabled. For clients we do this check during construction of the + * ClientHello. + */ + if (ssl_get_min_max_version(s, &ver_min, &ver_max) != 0) { + SSLerr(SSL_F_TLS_SETUP_HANDSHAKE, ERR_R_INTERNAL_ERROR); + ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR); + return 0; + } + for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { + const SSL_CIPHER *c = sk_SSL_CIPHER_value(ciphers, i); + + if (SSL_IS_DTLS(s)) { + if (DTLS_VERSION_GE(ver_max, c->min_dtls) && + DTLS_VERSION_LE(ver_max, c->max_dtls)) + ok = 1; + } else if (ver_max >= c->min_tls && ver_max <= c->max_tls) { + ok = 1; + } + if (ok) + break; + } + if (!ok) { + SSLerr(SSL_F_TLS_SETUP_HANDSHAKE, SSL_R_NO_CIPHERS_AVAILABLE); + ERR_add_error_data(1, "No ciphers enabled for max supported " + "SSL/TLS version"); + ssl3_send_alert(s, SSL3_AL_FATAL, SSL_AD_HANDSHAKE_FAILURE); + return 0; + } if (SSL_IS_FIRST_HANDSHAKE(s)) { s->ctx->stats.sess_accept++; } else if (!s->s3->send_connection_binding && @@ -281,7 +314,7 @@ MSG_PROCESS_RETURN tls_process_cert_verify(SSL *s, PACKET *pkt) unsigned char *gost_data = NULL; #endif int al = SSL_AD_INTERNAL_ERROR, ret = MSG_PROCESS_ERROR; - int type = 0, j, pktype; + int type = 0, j; unsigned int len; X509 *peer; const EVP_MD *md = NULL; @@ -303,7 +336,6 @@ MSG_PROCESS_RETURN tls_process_cert_verify(SSL *s, PACKET *pkt) goto f_err; } - pktype = EVP_PKEY_id(pkey); type = X509_certificate_type(peer, pkey); if (!(type & EVP_PKT_SIGN)) { @@ -384,6 +416,7 @@ MSG_PROCESS_RETURN tls_process_cert_verify(SSL *s, PACKET *pkt) } #ifndef OPENSSL_NO_GOST { + int pktype = EVP_PKEY_id(pkey); if (pktype == NID_id_GostR3410_2001 || pktype == NID_id_GostR3410_2012_256 || pktype == NID_id_GostR3410_2012_512) { @@ -418,10 +451,7 @@ MSG_PROCESS_RETURN tls_process_cert_verify(SSL *s, PACKET *pkt) goto f_err; } - if (SSL_IS_TLS13(s)) - ret = MSG_PROCESS_CONTINUE_READING; - else - ret = MSG_PROCESS_CONTINUE_PROCESSING; + ret = MSG_PROCESS_CONTINUE_READING; if (0) { f_err: ssl3_send_alert(s, SSL3_AL_FATAL, al); @@ -801,7 +831,7 @@ static int ssl_add_cert_to_wpacket(SSL *s, WPACKET *pkt, X509 *x, int chain, } if (SSL_IS_TLS13(s) - && !tls_construct_extensions(s, pkt, EXT_TLS1_3_CERTIFICATE, x, + && !tls_construct_extensions(s, pkt, SSL_EXT_TLS1_3_CERTIFICATE, x, chain, al)) return 0; @@ -1603,7 +1633,7 @@ int ssl_choose_server_version(SSL *s, CLIENTHELLO_MSG *hello, DOWNGRADE *dgrd) candidate_vers = TLS1_3_VERSION; /* * TODO(TLS1.3): There is some discussion on the TLS list about - * wheter to ignore versions version != 0; ++vent) { const SSL_METHOD *method; int err; -#ifndef OPENSSL_NO_TLS13DOWNGRADE - static const unsigned char tls11downgrade[] = { - 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44, 0x00 - }; - static const unsigned char tls12downgrade[] = { - 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x44, 0x01 - }; -#endif if (vent->cmeth == NULL) continue; @@ -1792,7 +1814,7 @@ int ssl_choose_client_version(SSL *s, int version, int checkdgrd, int *al) } /* - * ssl_get_client_min_max_version - get minimum and maximum client version + * ssl_get_min_max_version - get minimum and maximum protocol version * @s: The SSL connection * @min_version: The minimum supported version * @max_version: The maximum supported version @@ -1810,8 +1832,7 @@ int ssl_choose_client_version(SSL *s, int version, int checkdgrd, int *al) * Returns 0 on success or an SSL error reason number on failure. On failure * min_version and max_version will also be set to 0. */ -int ssl_get_client_min_max_version(const SSL *s, int *min_version, - int *max_version) +int ssl_get_min_max_version(const SSL *s, int *min_version, int *max_version) { int version; int hole; @@ -1905,7 +1926,7 @@ int ssl_set_client_hello_version(SSL *s) { int ver_min, ver_max, ret; - ret = ssl_get_client_min_max_version(s, &ver_min, &ver_max); + ret = ssl_get_min_max_version(s, &ver_min, &ver_max); if (ret != 0) return ret; @@ -1941,12 +1962,11 @@ int check_in_list(SSL *s, unsigned int group_id, const unsigned char *groups, if (group_id == share_id && (!checkallow || tls_curve_allowed(s, groups, SSL_SECOP_CURVE_CHECK))) { - break; + return 1; } } - /* If i == num_groups then not in the list */ - return i < num_groups; + return 0; } #endif @@ -2032,8 +2052,8 @@ int parse_ca_names(SSL *s, PACKET *pkt, int *al) xn = NULL; } - sk_X509_NAME_pop_free(s->s3->tmp.ca_names, X509_NAME_free); - s->s3->tmp.ca_names = ca_sk; + sk_X509_NAME_pop_free(s->s3->tmp.peer_ca_names, X509_NAME_free); + s->s3->tmp.peer_ca_names = ca_sk; return 1; @@ -2047,7 +2067,7 @@ int parse_ca_names(SSL *s, PACKET *pkt, int *al) int construct_ca_names(SSL *s, WPACKET *pkt) { - STACK_OF(X509_NAME) *ca_sk = SSL_get_client_CA_list(s); + const STACK_OF(X509_NAME) *ca_sk = SSL_get0_CA_list(s); /* Start sub-packet for client CA list */ if (!WPACKET_start_sub_packet_u16(pkt))