aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar ctrlaltca2023-12-04 22:33:55 +0100
committerGravatar GitHub2023-12-04 22:33:55 +0100
commit4b3b0963f9b3b00e33d1dd6a49d83e4e02443b40 (patch)
tree52361d78715c422ca1d90263accaa4dff284f08b /src
parentAttempt at fixinf font width size by enable full font hinting, aka forcing gl... (diff)
downloadKVIrc-4b3b0963f9b3b00e33d1dd6a49d83e4e02443b40.tar.gz
KVIrc-4b3b0963f9b3b00e33d1dd6a49d83e4e02443b40.tar.bz2
KVIrc-4b3b0963f9b3b00e33d1dd6a49d83e4e02443b40.zip
SSL updates (#2575)
Diffstat (limited to 'src')
-rw-r--r--src/kvilib/net/KviSSL.cpp42
-rw-r--r--src/kvilib/net/KviSSL.h2
-rw-r--r--src/kvirc/kernel/KviIrcSocket.cpp3
-rw-r--r--src/modules/dcc/DccMarshal.cpp4
4 files changed, 47 insertions, 4 deletions
diff --git a/src/kvilib/net/KviSSL.cpp b/src/kvilib/net/KviSSL.cpp
index 42b2631e9..70a58aeb2 100644
--- a/src/kvilib/net/KviSSL.cpp
+++ b/src/kvilib/net/KviSSL.cpp
@@ -378,11 +378,23 @@ bool KviSSL::initContext(Method m)
SSL_CTX_set_verify(m_pSSLCtx, SSL_VERIFY_PEER, verify_clientCallback);
}
+ SSL_CTX_set_options (m_pSSLCtx,
+ // disable old, unsecure protocols
+ SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3
+ |SSL_OP_NO_TLSv1|SSL_OP_NO_TLSv1_1
+ // disable unsecure defaults on old openSSL versions
+#ifdef SSL_OP_NO_COMPRESSION
+ |SSL_OP_NO_COMPRESSION
+#endif
+#ifdef SSL_OP_SINGLE_DH_USE
+ |SSL_OP_SINGLE_DH_USE
+#endif
+#ifdef SSL_OP_SINGLE_ECDH_USE
+ |SSL_OP_SINGLE_ECDH_USE
+#endif
+ );
// we want all ciphers to be available here, except insecure ones, orderer by strength;
- // ADH are moved to the end since they are less secure, but they don't need a certificate
- // (so we can use secure dcc without a cert)
- // NOTE: see bug ticket #155
- SSL_CTX_set_cipher_list(m_pSSLCtx, "ALL:!eNULL:!EXP:!SSLv2:+ADH@STRENGTH");
+ SSL_CTX_set_cipher_list(m_pSSLCtx, "ALL:!eNULL:!LOW:!EXP:!SSLv2:!SSLv3:!TLSv1:@STRENGTH");
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
SSL_CTX_set_dh_auto(m_pSSLCtx, 1);
#else
@@ -391,6 +403,21 @@ bool KviSSL::initContext(Method m)
return true;
}
+bool KviSSL::enableADHCiphers()
+{
+ if(!m_pSSLCtx)
+ return false;
+ if(!m_pSSL)
+ return false;
+ // Add Anonymous DH cipher suites to the list of available ciphers.
+ // ADH don't need a certificate, so we can use secure dcc without a cert)
+ // They are moved to the end since they are considered NOT SECURE since at least 2015's Logjam
+ // NOTE: see bug ticket #155
+ if(!SSL_set_cipher_list(m_pSSL, "ALL:!eNULL:!LOW:!EXP:!SSLv2:!SSLv3:!TLSv1:+ADH:+AECDH:@STRENGTH:@SECLEVEL=0"))
+ return false;
+ return true;
+}
+
bool KviSSL::initSocket(kvi_socket_t fd)
{
if(!m_pSSLCtx)
@@ -498,6 +525,13 @@ bool KviSSL::getLastErrorString(KviCString & buffer, bool bPeek)
return false;
}
+bool KviSSL::setTLSHostname(const char * name)
+{
+ if(!m_pSSL)
+ return false;
+ return SSL_set_tlsext_host_name(m_pSSL, name) ? true : false;
+}
+
KviSSL::Result KviSSL::connect()
{
if(!m_pSSL)
diff --git a/src/kvilib/net/KviSSL.h b/src/kvilib/net/KviSSL.h
index 849fb83f3..85dc9a7aa 100644
--- a/src/kvilib/net/KviSSL.h
+++ b/src/kvilib/net/KviSSL.h
@@ -192,6 +192,8 @@ public:
bool initSocket(kvi_socket_t fd);
bool initContext(KviSSL::Method m);
void shutdown();
+ bool setTLSHostname(const char * name);
+ bool enableADHCiphers();
KviSSL::Result connect();
KviSSL::Result accept();
int read(char * buffer, int len);
diff --git a/src/kvirc/kernel/KviIrcSocket.cpp b/src/kvirc/kernel/KviIrcSocket.cpp
index 5a11306ac..299d6c29f 100644
--- a/src/kvirc/kernel/KviIrcSocket.cpp
+++ b/src/kvirc/kernel/KviIrcSocket.cpp
@@ -1356,6 +1356,9 @@ void KviIrcSocket::doSSLHandshake(int)
return; // ops ?
}
+ // TLS: Set SNI hostname
+ m_pSSL->setTLSHostname(m_pIrcServer->hostName().toUtf8().data());
+
switch(m_pSSL->connect())
{
case KviSSL::Success:
diff --git a/src/modules/dcc/DccMarshal.cpp b/src/modules/dcc/DccMarshal.cpp
index 486aa9aee..aa40e6aed 100644
--- a/src/modules/dcc/DccMarshal.cpp
+++ b/src/modules/dcc/DccMarshal.cpp
@@ -602,6 +602,10 @@ void DccMarshal::doSSLHandshake(int)
return; // ops ?
}
+ // Enable the use of Anonymous DH cipher suites, to permit connection without a certificate
+ // Note: this is considered NOT SECURE since at least 2015 (Logjam), but it's still better than plain text
+ m_pSSL->enableADHCiphers();
+
KviSSL::Result r = m_bOutgoing ? m_pSSL->connect() : m_pSSL->accept();
switch(r)