void ClientCertManager::setSslKey(const QByteArray &encoded)
{
QSslKey key(encoded, QSsl::Rsa);
+#if QT_VERSION >= 0x050500
+ if (key.isNull() && Client::isCoreFeatureEnabled(Quassel::Feature::EcdsaCertfpKeys))
+ key = QSslKey(encoded, QSsl::Ec);
+#endif
if (key.isNull())
key = QSslKey(encoded, QSsl::Dsa);
_certIdentity->setSslKey(key);
SenderPrefixes, ///< Show prefixes for senders in backlog
RemoteDisconnect, ///< Allow this peer to be remotely disconnected
ExtendedFeatures, ///< Extended features
+#if QT_VERSION >= 0x050500
+ EcdsaCertfpKeys, ///< ECDSA keys for CertFP in identities
+#endif
};
Q_ENUMS(Feature)
void CoreIdentity::setSslKey(const QByteArray &encoded)
{
QSslKey key(encoded, QSsl::Rsa);
+#if QT_VERSION >= 0x050500
+ if (key.isNull())
+ key = QSslKey(encoded, QSsl::Ec);
+#endif
if (key.isNull())
key = QSslKey(encoded, QSsl::Dsa);
setSslKey(key);
keyFile.close();
for (int i = 0; i < 2; i++) {
+#if QT_VERSION >= 0x050500
+ // On Qt5.5+, support QSsl::KeyAlgorithm::Rsa (1), QSsl::KeyAlgorithm::Dsa (2), and QSsl::KeyAlgorithm::Ec (3)
+ for (int j = 1; j < 4; j++) {
+#elif QT_VERSION >= 0x050000
+ // On Qt5.0-Qt5.4, support QSsl::KeyAlgorithm::Rsa (1) and QSsl::KeyAlgorithm::Dsa (2) (Ec wasn't added until 5.5)
+ for (int j = 1; j < 3; j++) {
+#else
+ // On Qt4, support QSsl::KeyAlgorithm::Rsa (0) and QSsl::KeyAlgorithm::Dsa (1) (Qt4 uses different indices for the values)
for (int j = 0; j < 2; j++) {
+#endif
key = QSslKey(keyRaw, (QSsl::KeyAlgorithm)j, (QSsl::EncodingFormat)i);
if (!key.isNull())
goto returnKey;
}
QMessageBox::information(this, tr("Failed to read key"), tr("Failed to read the key file. It is either incompatible or invalid. Note that the key file must not have a passphrase."));
returnKey:
+#if QT_VERSION >= 0x050500
+ if(!key.isNull() && key.algorithm() == QSsl::KeyAlgorithm::Ec && !Client::isCoreFeatureEnabled(Quassel::Feature::EcdsaCertfpKeys)) {
+ QMessageBox::information(this, tr("Core does not support ECDSA keys"), tr("You loaded an ECDSA key, but the core does not support ECDSA keys. Please contact the core administrator."));
+ key.clear();
+ }
+#endif
return key;
}
case QSsl::Rsa:
ui.keyTypeLabel->setText(tr("RSA"));
break;
+#if QT_VERSION >= 0x050500
+ case QSsl::Ec:
+ ui.keyTypeLabel->setText(tr("ECDSA"));
+ break;
+#endif
case QSsl::Dsa:
ui.keyTypeLabel->setText(tr("DSA"));
break;
default:
- ui.keyTypeLabel->setText(tr("No Key loaded"));
+ ui.keyTypeLabel->setText(tr("Invalid key or no key loaded"));
}
ui.clearOrLoadKeyButton->setText(tr("Clear"));
}