c260e0
From 7ab0810c977cec1135d9b5bd85b012ca9e6173cc Mon Sep 17 00:00:00 2001
c260e0
From: Kamil Dudka <kdudka@redhat.com>
c260e0
Date: Wed, 29 Oct 2014 14:14:23 +0100
c260e0
Subject: [PATCH 1/2] nss: drop the code for libcurl-level downgrade to SSLv3
c260e0
c260e0
This code was already deactivated by commit
c260e0
ec783dc142129d3860e542b443caaa78a6172d56.
c260e0
c260e0
Upstream-commit: 3f430c9c3a4e3748bc075b633a9324c5037c9fe7
c260e0
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
c260e0
---
c260e0
 lib/nss.c | 52 ----------------------------------------------------
c260e0
 1 file changed, 52 deletions(-)
c260e0
c260e0
diff --git a/lib/nss.c b/lib/nss.c
c260e0
index 36fa097..0691394 100644
c260e0
--- a/lib/nss.c
c260e0
+++ b/lib/nss.c
c260e0
@@ -835,36 +835,6 @@ static SECStatus SelectClientCert(void *arg, PRFileDesc *sock,
c260e0
   return SECSuccess;
c260e0
 }
c260e0
 
c260e0
-/* This function is supposed to decide, which error codes should be used
c260e0
- * to conclude server is TLS intolerant.
c260e0
- *
c260e0
- * taken from xulrunner - nsNSSIOLayer.cpp
c260e0
- */
c260e0
-static PRBool
c260e0
-isTLSIntoleranceError(PRInt32 err)
c260e0
-{
c260e0
-  switch (err) {
c260e0
-  case SSL_ERROR_BAD_MAC_ALERT:
c260e0
-  case SSL_ERROR_BAD_MAC_READ:
c260e0
-  case SSL_ERROR_HANDSHAKE_FAILURE_ALERT:
c260e0
-  case SSL_ERROR_HANDSHAKE_UNEXPECTED_ALERT:
c260e0
-  case SSL_ERROR_CLIENT_KEY_EXCHANGE_FAILURE:
c260e0
-  case SSL_ERROR_ILLEGAL_PARAMETER_ALERT:
c260e0
-  case SSL_ERROR_NO_CYPHER_OVERLAP:
c260e0
-  case SSL_ERROR_BAD_SERVER:
c260e0
-  case SSL_ERROR_BAD_BLOCK_PADDING:
c260e0
-  case SSL_ERROR_UNSUPPORTED_VERSION:
c260e0
-  case SSL_ERROR_PROTOCOL_VERSION_ALERT:
c260e0
-  case SSL_ERROR_RX_MALFORMED_FINISHED:
c260e0
-  case SSL_ERROR_BAD_HANDSHAKE_HASH_VALUE:
c260e0
-  case SSL_ERROR_DECODE_ERROR_ALERT:
c260e0
-  case SSL_ERROR_RX_UNKNOWN_ALERT:
c260e0
-    return PR_TRUE;
c260e0
-  default:
c260e0
-    return PR_FALSE;
c260e0
-  }
c260e0
-}
c260e0
-
c260e0
 /* update blocking direction in case of PR_WOULD_BLOCK_ERROR */
c260e0
 static void nss_update_connecting_state(ssl_connect_state state, void *secret)
c260e0
 {
c260e0
@@ -1236,10 +1206,6 @@ static CURLcode nss_init_sslver(SSLVersionRange *sslver,
c260e0
   switch (data->set.ssl.version) {
c260e0
   default:
c260e0
   case CURL_SSLVERSION_DEFAULT:
c260e0
-    if(data->state.ssl_connect_retry) {
c260e0
-      infof(data, "TLS disabled due to previous handshake failure\n");
c260e0
-      sslver->max = SSL_LIBRARY_VERSION_3_0;
c260e0
-    }
c260e0
     return CURLE_OK;
c260e0
 
c260e0
   case CURL_SSLVERSION_TLSv1:
c260e0
@@ -1293,12 +1259,8 @@ static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
c260e0
                                  struct SessionHandle *data,
c260e0
                                  CURLcode curlerr)
c260e0
 {
c260e0
-  SSLVersionRange sslver;
c260e0
   PRErrorCode err = 0;
c260e0
 
c260e0
-  /* reset the flag to avoid an infinite loop */
c260e0
-  data->state.ssl_connect_retry = FALSE;
c260e0
-
c260e0
   if(is_nss_error(curlerr)) {
c260e0
     /* read NSPR error code */
c260e0
     err = PR_GetError();
c260e0
@@ -1315,17 +1277,6 @@ static CURLcode nss_fail_connect(struct ssl_connect_data *connssl,
c260e0
   /* cleanup on connection failure */
c260e0
   Curl_llist_destroy(connssl->obj_list, NULL);
c260e0
   connssl->obj_list = NULL;
c260e0
-
c260e0
-  if((SSL_VersionRangeGet(connssl->handle, &sslver) == SECSuccess)
c260e0
-      && (sslver.min == SSL_LIBRARY_VERSION_3_0)
c260e0
-      && (sslver.max == SSL_LIBRARY_VERSION_TLS_1_0)
c260e0
-      && isTLSIntoleranceError(err)) {
c260e0
-    /* schedule reconnect through Curl_retry_request() */
c260e0
-    data->state.ssl_connect_retry = TRUE;
c260e0
-    infof(data, "Error in TLS handshake, trying SSLv3...\n");
c260e0
-    return CURLE_OK;
c260e0
-  }
c260e0
-
c260e0
   return curlerr;
c260e0
 }
c260e0
 
c260e0
@@ -1434,9 +1385,6 @@ static CURLcode nss_setup_connect(struct connectdata *conn, int sockindex)
c260e0
     infof(data, "warning: support for SSL_CBC_RANDOM_IV not compiled in\n");
c260e0
 #endif
c260e0
 
c260e0
-  /* reset the flag to avoid an infinite loop */
c260e0
-  data->state.ssl_connect_retry = FALSE;
c260e0
-
c260e0
   if(data->set.ssl.cipher_list) {
c260e0
     if(set_ciphers(data, model, data->set.ssl.cipher_list) != SECSuccess) {
c260e0
       curlerr = CURLE_SSL_CIPHER;
c260e0
-- 
c260e0
2.1.0
c260e0
c260e0
c260e0
From e21cf86258c3cc2042dfb531cbf94ce2f5405d8c Mon Sep 17 00:00:00 2001
c260e0
From: Kamil Dudka <kdudka@redhat.com>
c260e0
Date: Wed, 29 Oct 2014 14:24:54 +0100
c260e0
Subject: [PATCH 2/2] transfer: drop the code handling the ssl_connect_retry
c260e0
 flag
c260e0
c260e0
Its last use has been removed by the previous commit.
c260e0
c260e0
Upstream-commit: 276741af4ddebe0cc0d446712fb8dfdf0c140e7b
c260e0
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
c260e0
---
c260e0
 lib/transfer.c | 12 ++++--------
c260e0
 lib/urldata.h  |  3 ---
c260e0
 2 files changed, 4 insertions(+), 11 deletions(-)
c260e0
c260e0
diff --git a/lib/transfer.c b/lib/transfer.c
c260e0
index 330b37a..dff6838 100644
c260e0
--- a/lib/transfer.c
c260e0
+++ b/lib/transfer.c
c260e0
@@ -1269,8 +1269,6 @@ CURLcode Curl_pretransfer(struct SessionHandle *data)
c260e0
   data->state.errorbuf = FALSE; /* no error has occurred */
c260e0
   data->state.httpversion = 0; /* don't assume any particular server version */
c260e0
 
c260e0
-  data->state.ssl_connect_retry = FALSE;
c260e0
-
c260e0
   data->state.authproblem = FALSE;
c260e0
   data->state.authhost.want = data->set.httpauth;
c260e0
   data->state.authproxy.want = data->set.proxyauth;
c260e0
@@ -1848,12 +1846,10 @@ CURLcode Curl_retry_request(struct connectdata *conn,
c260e0
      !(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)))
c260e0
     return CURLE_OK;
c260e0
 
c260e0
-  if(/* workaround for broken TLS servers */ data->state.ssl_connect_retry ||
c260e0
-      ((data->req.bytecount +
c260e0
-        data->req.headerbytecount == 0) &&
c260e0
-        conn->bits.reuse &&
c260e0
-        !data->set.opt_no_body &&
c260e0
-        data->set.rtspreq != RTSPREQ_RECEIVE)) {
c260e0
+  if((data->req.bytecount + data->req.headerbytecount == 0) &&
c260e0
+      conn->bits.reuse &&
c260e0
+      !data->set.opt_no_body &&
c260e0
+      (data->set.rtspreq != RTSPREQ_RECEIVE)) {
c260e0
     /* We got no data, we attempted to re-use a connection and yet we want a
c260e0
        "body". This might happen if the connection was left alive when we were
c260e0
        done using it before, but that was closed when we wanted to read from
c260e0
diff --git a/lib/urldata.h b/lib/urldata.h
c260e0
index c91bcff..04f590d 100644
c260e0
--- a/lib/urldata.h
c260e0
+++ b/lib/urldata.h
c260e0
@@ -1288,9 +1288,6 @@ struct UrlState {
c260e0
   } proto;
c260e0
   /* current user of this SessionHandle instance, or NULL */
c260e0
   struct connectdata *current_conn;
c260e0
-
c260e0
-  /* if true, force SSL connection retry (workaround for certain servers) */
c260e0
-  bool ssl_connect_retry;
c260e0
 };
c260e0
 
c260e0
 
c260e0
-- 
c260e0
2.1.0
c260e0