From: Michael Marley Date: Mon, 26 Mar 2018 02:11:39 +0000 (-0400) Subject: SslServer: Add support for Elliptic Curve keys X-Git-Tag: travis-deploy-test~140 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=d31101ed316b6449de0d8dad7a1e1e8d097807a5;hp=c2e3479b87e7d0713d302d26fb2d7d01d7b8c9c2 SslServer: Add support for Elliptic Curve keys If the key won't load as an RSA key, attempt to load it again as an EC key. DSA support was not added because DSA is obsolete and no- one should be using it. Note that this only works with Qt5.5 and up as EC support was added in that version (https://github.com/qt/qtbase/commit/962ea569). An if macro has been used to allow for continued compilation under Qt4 and Qt5<5.5. Closes GH-344. --- diff --git a/src/core/sslserver.cpp b/src/core/sslserver.cpp index 8b0d0657..ae231c03 100644 --- a/src/core/sslserver.cpp +++ b/src/core/sslserver.cpp @@ -25,7 +25,6 @@ #endif #include -#include #include "logger.h" #include "quassel.h" @@ -182,10 +181,10 @@ bool SslServer::setCertificate(const QString &path, const QString &keyPath) return false; } - untestedKey = QSslKey(&keyFile, QSsl::Rsa); + untestedKey = loadKey(&keyFile); keyFile.close(); } else { - untestedKey = QSslKey(&certFile, QSsl::Rsa); + untestedKey = loadKey(&certFile); } certFile.close(); @@ -227,4 +226,21 @@ bool SslServer::setCertificate(const QString &path, const QString &keyPath) } +QSslKey SslServer::loadKey(QFile *keyFile) +{ + QSslKey key; + key = QSslKey(keyFile, QSsl::Rsa); +#if QT_VERSION >= 0x050500 + if (key.isNull()) { + if (!keyFile->reset()) { + quWarning() << "SslServer: IO error reading key file"; + return key; + } + key = QSslKey(keyFile, QSsl::Ec); + } +#endif + return key; +} + + #endif // HAVE_SSL diff --git a/src/core/sslserver.h b/src/core/sslserver.h index 1f43cc43..01d6af9e 100644 --- a/src/core/sslserver.h +++ b/src/core/sslserver.h @@ -27,6 +27,7 @@ #include #include #include +#include class SslServer : public QTcpServer { @@ -71,6 +72,7 @@ private: * @return True if certificates loaded successfully, otherwise false. */ bool loadCerts(); + QSslKey loadKey(QFile *keyFile); QLinkedList _pendingConnections; QSslCertificate _cert;