SslServer: Add support for Elliptic Curve keys
authorMichael Marley <michael@michaelmarley.com>
Mon, 26 Mar 2018 02:11:39 +0000 (22:11 -0400)
committerManuel Nickschas <sputnick@quassel-irc.org>
Fri, 6 Apr 2018 16:37:27 +0000 (18:37 +0200)
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.

(cherry picked from commit d31101ed316b6449de0d8dad7a1e1e8d097807a5)

src/core/sslserver.cpp
src/core/sslserver.h

index 1daa770..5a5be5c 100644 (file)
@@ -25,7 +25,6 @@
 #endif
 
 #include <QDateTime>
-#include <QFile>
 
 #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
index b0f92b5..cf04c53 100644 (file)
@@ -27,6 +27,7 @@
 #include <QSslKey>
 #include <QTcpServer>
 #include <QLinkedList>
+#include <QFile>
 
 class SslServer : public QTcpServer
 {
@@ -71,6 +72,7 @@ private:
      * @return True if certificates loaded successfully, otherwise false.
      */
     bool loadCerts();
+    QSslKey loadKey(QFile *keyFile);
 
     QLinkedList<QTcpSocket *> _pendingConnections;
     QSslCertificate _cert;