From: Bodo Möller Date: Mon, 22 Sep 2008 21:22:51 +0000 (+0000) Subject: Make sure that SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG can't X-Git-Tag: OpenSSL_0_9_8j~85 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=d875413a0be952d4356321749e46cc5e6d1e5527;p=oweals%2Fopenssl.git Make sure that SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG can't enable disabled ciphersuites. --- diff --git a/CHANGES b/CHANGES index 30f9cbdf50..c336859d0e 100644 --- a/CHANGES +++ b/CHANGES @@ -4,7 +4,12 @@ Changes between 0.9.8i and 0.9.8j [xx XXX xxxx] - *) + *) Change the server-side SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG behavior + to ensure that even with this option, only ciphersuites in the + server's preference list will be accepted. (Note that the option + applies only when resuming a session, so the earlier behavior was + just about the algorithm choice for symmetric cryptography.) + [Bodo Moeller] Changes between 0.9.8h and 0.9.8i [15 Sep 2008] diff --git a/ssl/s3_srvr.c b/ssl/s3_srvr.c index 398ce469d6..04f9f79ab2 100644 --- a/ssl/s3_srvr.c +++ b/ssl/s3_srvr.c @@ -902,22 +902,28 @@ int ssl3_get_client_hello(SSL *s) break; } } - if (j == 0) - { - if ((s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1)) - { - /* Very bad for multi-threading.... */ - s->session->cipher=sk_SSL_CIPHER_value(ciphers, 0); - } - else + if (j == 0 && (s->options & SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG) && (sk_SSL_CIPHER_num(ciphers) == 1)) + { + /* Special case as client bug workaround: the previously used cipher may + * not be in the current list, the client instead might be trying to + * continue using a cipher that before wasn't chosen due to server + * preferences. We'll have to reject the connection if the cipher is not + * enabled, though. */ + c = sk_SSL_CIPHER_value(ciphers, 0); + if (sk_SSL_CIPHER_find(SSL_get_ciphers(s), c) >= 0) { - /* we need to have the cipher in the cipher - * list if we are asked to reuse it */ - al=SSL_AD_ILLEGAL_PARAMETER; - SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING); - goto f_err; + s->session->cipher = c; + j = 1; } } + if (j == 0) + { + /* we need to have the cipher in the cipher + * list if we are asked to reuse it */ + al=SSL_AD_ILLEGAL_PARAMETER; + SSLerr(SSL_F_SSL3_GET_CLIENT_HELLO,SSL_R_REQUIRED_CIPHER_MISSING); + goto f_err; + } } /* compression */