X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=ssl%2Fstatem%2Fstatem_lib.c;h=36d55343b82aa9793a65c65cf52f1941c950e598;hb=150840b9443d371bfa26e2a33051aa137b5606fc;hp=bf1a5b20e0f4c29a9c56efee3b1cd3baf2808024;hpb=643a3580423c8774c08aed7e377495800b7e7266;p=oweals%2Fopenssl.git diff --git a/ssl/statem/statem_lib.c b/ssl/statem/statem_lib.c index bf1a5b20e0..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 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; @@ -2039,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))