File fix-weak-ciphers.diff of Package kdelibs3
Index: kio/kssl/kssl.cc
===================================================================
--- kio/kssl/kssl.cc (revision 556217)
+++ kio/kssl/kssl.cc (revision 577000)
@@ -129,7 +129,7 @@
return false;
if (m_bAutoReconfig)
- m_cfg->load();
+ m_cfg->load();
if (!m_cfg->tlsv1())
return false;
@@ -138,6 +138,8 @@
d->m_meth = d->kossl->TLSv1_client_method();
d->lastInitTLS = true;
+ m_pi.reset();
+
d->m_ctx = d->kossl->SSL_CTX_new(d->m_meth);
if (d->m_ctx == 0L) {
return false;
@@ -172,9 +174,11 @@
m_pi.reset();
- if (m_cfg->sslv2() && !m_cfg->sslv3())
+ if (!m_cfg->tlsv1() && !m_cfg->sslv3() && m_cfg->sslv2())
d->m_meth = d->kossl->SSLv2_client_method();
- else if (m_cfg->sslv3() && !m_cfg->sslv2())
+ else if (m_cfg->tlsv1() && !m_cfg->sslv3() && !m_cfg->sslv2())
+ d->m_meth = d->kossl->TLSv1_client_method();
+ else if (!m_cfg->tlsv1() && m_cfg->sslv3() && !m_cfg->sslv2())
d->m_meth = d->kossl->SSLv3_client_method();
else d->m_meth = d->kossl->SSLv23_client_method();
@@ -304,10 +308,15 @@
}
*/
- if (!d->lastInitTLS)
- d->kossl->SSL_set_options(d->m_ssl, SSL_OP_NO_TLSv1);
+ int off = SSL_OP_ALL;
+ if (!d->lastInitTLS && !m_cfg->tlsv1())
+ off |= SSL_OP_NO_TLSv1;
+ if (!m_cfg->sslv3())
+ off |= SSL_OP_NO_SSLv3;
+ if (!m_cfg->sslv2())
+ off |= SSL_OP_NO_SSLv2;
- d->kossl->SSL_set_options(d->m_ssl, SSL_OP_ALL);
+ d->kossl->SSL_set_options(d->m_ssl, off);
rc = d->kossl->SSL_set_fd(d->m_ssl, sock);
if (rc == 0) {
@@ -390,10 +399,15 @@
}
*/
- if (!d->lastInitTLS)
- d->kossl->SSL_set_options(d->m_ssl, SSL_OP_NO_TLSv1);
+ int off = SSL_OP_ALL;
+ if (!d->lastInitTLS && !m_cfg->tlsv1())
+ off |= SSL_OP_NO_TLSv1;
+ if (!m_cfg->sslv3())
+ off |= SSL_OP_NO_SSLv3;
+ if (!m_cfg->sslv2())
+ off |= SSL_OP_NO_SSLv2;
- d->kossl->SSL_set_options(d->m_ssl, SSL_OP_ALL);
+ d->kossl->SSL_set_options(d->m_ssl, off);
rc = d->kossl->SSL_set_fd(d->m_ssl, sock);
if (rc == 0) {
@@ -499,6 +513,7 @@
if (err != SSL_ERROR_NONE &&
err != SSL_ERROR_ZERO_RETURN && err != SSL_ERROR_SYSCALL) {
rc = -1; // OpenSSL returns 0 on error too
+ d->kossl->ERR_print_errors_fp(stderr);
}
// else if (err == SSL_ERROR_ZERO_RETURN)
Index: kio/kssl/kopenssl.h
===================================================================
--- kio/kssl/kopenssl.h (revision 550939)
+++ kio/kssl/kopenssl.h (working copy)
@@ -882,6 +882,9 @@ public:
/* Set the subject */
int X509_REQ_set_subject_name(X509_REQ*,X509_NAME*);
+ /* get list of available SSL_CIPHER's sorted by preference */
+ STACK_OF(SSL_CIPHER) *SSL_get_ciphers(const SSL* ssl);
+
#endif
private:
Index: kio/kssl/ksslsettings.cc
===================================================================
--- kio/kssl/ksslsettings.cc (revision 516951)
+++ kio/kssl/ksslsettings.cc (revision 516952)
@@ -179,10 +179,11 @@
}
// Remove any ADH ciphers as per RFC2246
+ // Also remove NULL ciphers and 168bit ciphers
for (unsigned int i = 0; i < cipherSort.count(); i++) {
CipherNode *j = 0L;
while ((j = cipherSort.at(i)) != 0L) {
- if (j->name.contains("ADH-")) {
+ if (j->name.contains("ADH-") || j->name.contains("NULL-") || j->name.contains("DES-CBC3-SHA") || j->name.contains("FZA")) {
cipherSort.remove(j);
} else {
break;
Index: kio/kssl/ksslsettings.cc
===================================================================
--- kio/kssl/ksslsettings.cc (revision 550939)
+++ kio/kssl/ksslsettings.cc (working copy)
@@ -44,9 +44,18 @@
#include <openssl/ssl.h>
#undef crypt
#endif
-
#include <kopenssl.h>
+#ifdef KSSL_HAVE_SSL
+#define sk_new d->kossl->sk_new
+#define sk_push d->kossl->sk_push
+#define sk_free d->kossl->sk_free
+#define sk_value d->kossl->sk_value
+#define sk_num d->kossl->sk_num
+#define sk_dup d->kossl->sk_dup
+#define sk_pop d->kossl->sk_pop
+#endif
+
class CipherNode {
public:
CipherNode(const char *_name, int _keylen) :
@@ -128,63 +137,54 @@ QString KSSLSettings::getCipherList() {
QString tcipher;
bool firstcipher = true;
SSL_METHOD *meth = 0L;
- QSortedList<CipherNode> cipherSort;
+ QPtrList<CipherNode> cipherList;
- cipherSort.setAutoDelete(true);
+ cipherList.setAutoDelete(true);
if (!d->kossl)
d->kossl = KOSSL::self();
- if (m_bUseSSLv3) {
- m_cfg->setGroup("SSLv3");
+ if (m_bUseSSLv3 && m_bUseSSLv2)
+ meth = d->kossl->SSLv23_client_method();
+ else if(m_bUseSSLv3)
meth = d->kossl->SSLv3_client_method();
- for(int i = 0; ; i++) {
- SSL_CIPHER *sc = (meth->get_cipher)(i);
- if (!sc)
- break;
- tcipher.sprintf("cipher_%s", sc->name);
- int bits = d->kossl->SSL_CIPHER_get_bits(sc, NULL);
-
- if (m_cfg->readBoolEntry(tcipher, bits >= 56)) {
- CipherNode *xx = new CipherNode(sc->name,bits);
- if (!cipherSort.contains(xx)) {
- cipherSort.prepend(xx);
- } else {
- delete xx;
- }
- }
- }
- }
-
- if (m_bUseSSLv2) {
- m_cfg->setGroup("SSLv2");
+ else if (m_bUseSSLv2)
meth = d->kossl->SSLv2_client_method();
- for(int i = 0; meth; i++) {
- SSL_CIPHER *sc = (meth->get_cipher)(i);
- if (!sc)
- break;
- tcipher.sprintf("cipher_%s", sc->name);
- int bits = d->kossl->SSL_CIPHER_get_bits(sc, NULL);
-
- if (m_cfg->readBoolEntry(tcipher, bits >= 56)) {
- CipherNode *xx = new CipherNode(sc->name,bits);
- if (!cipherSort.contains(xx)) {
- cipherSort.prepend(xx);
- } else {
- delete xx;
- }
- }
+ SSL_CTX *ctx = d->kossl->SSL_CTX_new(meth);
+ SSL* ssl = d->kossl->SSL_new(ctx);
+ STACK_OF(SSL_CIPHER)* sk = d->kossl->SSL_get_ciphers(ssl);
+ int cnt = sk_SSL_CIPHER_num(sk);
+ for (int i=0; i< cnt; i++) {
+ SSL_CIPHER *sc = sk_SSL_CIPHER_value(sk,i);
+ if (!sc)
+ break;
+
+ if(!strcmp("SSLv2", d->kossl->SSL_CIPHER_get_version(sc)))
+ m_cfg->setGroup("SSLv2");
+ else
+ m_cfg->setGroup("SSLv3");
+
+ tcipher.sprintf("cipher_%s", sc->name);
+ int bits = d->kossl->SSL_CIPHER_get_bits(sc, NULL);
+ if (m_cfg->readBoolEntry(tcipher, bits >= 56)) {
+ CipherNode *xx = new CipherNode(sc->name,bits);
+ if (!cipherList.contains(xx))
+ cipherList.prepend(xx);
+ else
+ delete xx;
}
}
+ d->kossl->SSL_free(ssl);
+ d->kossl->SSL_CTX_free(ctx);
// Remove any ADH ciphers as per RFC2246
// Also remove NULL ciphers and 168bit ciphers
- for (unsigned int i = 0; i < cipherSort.count(); i++) {
+ for (unsigned int i = 0; i < cipherList.count(); i++) {
CipherNode *j = 0L;
- while ((j = cipherSort.at(i)) != 0L) {
+ while ((j = cipherList.at(i)) != 0L) {
if (j->name.contains("ADH-") || j->name.contains("NULL-") || j->name.contains("DES-CBC3-SHA") || j->name.contains("FZA")) {
- cipherSort.remove(j);
+ cipherList.remove(j);
} else {
break;
}
@@ -192,12 +192,12 @@ QString KSSLSettings::getCipherList() {
}
// now assemble the list cipher1:cipher2:cipher3:...:ciphern
- while (!cipherSort.isEmpty()) {
+ while (!cipherList.isEmpty()) {
if (firstcipher)
firstcipher = false;
else clist.append(":");
- clist.append(cipherSort.getLast()->name);
- cipherSort.removeLast();
+ clist.append(cipherList.getLast()->name);
+ cipherList.removeLast();
} // while
kdDebug(7029) << "Cipher list is: " << clist << endl;
@@ -344,3 +344,13 @@ void KSSLSettings::setSSLv3(bool enabled
QString& KSSLSettings::getEGDPath() { return d->m_EGDPath; }
+#ifdef KSSL_HAVE_SSL
+#undef sk_new
+#undef sk_push
+#undef sk_free
+#undef sk_value
+#undef sk_num
+#undef sk_pop
+#undef sk_dup
+#endif
+
Index: kio/kssl/kopenssl.cc
===================================================================
--- kio/kssl/kopenssl.cc (revision 550939)
+++ kio/kssl/kopenssl.cc (working copy)
@@ -20,7 +20,6 @@
#include <config.h>
#endif
-
#ifdef KSSL_HAVE_SSL
#include <openssl/opensslv.h>
#endif
@@ -197,6 +196,8 @@ static int (*K_X509_NAME_add_entry_by_tx
static X509_NAME *(*K_X509_NAME_new)() = 0L;
static int (*K_X509_REQ_set_subject_name)(X509_REQ*,X509_NAME*) = 0L;
static unsigned char *(*K_ASN1_STRING_data)(ASN1_STRING*) = 0L;
+static STACK_OF(SSL_CIPHER) *(*K_SSL_get_ciphers)(const SSL *ssl) = 0L;
+
#endif
}
@@ -567,6 +568,7 @@ KConfig *cfg;
K_SSL_set_session = (int (*)(SSL*,SSL_SESSION*)) _sslLib->symbol("SSL_set_session");
K_d2i_SSL_SESSION = (SSL_SESSION* (*)(SSL_SESSION**,unsigned char**, long)) _sslLib->symbol("d2i_SSL_SESSION");
K_i2d_SSL_SESSION = (int (*)(SSL_SESSION*,unsigned char**)) _sslLib->symbol("i2d_SSL_SESSION");
+ K_SSL_get_ciphers = (STACK *(*)(const SSL*)) _sslLib->symbol("SSL_get_ciphers");
#endif
@@ -1543,5 +1545,10 @@ unsigned char *KOpenSSLProxy::ASN1_STRIN
return 0L;
}
+STACK_OF(SSL_CIPHER) *KOpenSSLProxy::SSL_get_ciphers(const SSL* ssl) {
+ if (K_SSL_get_ciphers) return (K_SSL_get_ciphers)(ssl);
+ return 0L;
+}
+
#endif