diff --git a/src/libs/utils/ssh/sshkeygenerator.cpp b/src/libs/utils/ssh/sshkeygenerator.cpp index c5d22436498..172b7c14291 100644 --- a/src/libs/utils/ssh/sshkeygenerator.cpp +++ b/src/libs/utils/ssh/sshkeygenerator.cpp @@ -52,17 +52,13 @@ namespace Utils { using namespace Botan; using namespace Internal; -SshKeyGenerator::SshKeyGenerator() - : m_type(Rsa) - , m_format(OpenSsl) +SshKeyGenerator::SshKeyGenerator() : m_type(Rsa) { } -bool SshKeyGenerator::generateKeys(KeyType type, PrivateKeyFormat format, - int keySize) +bool SshKeyGenerator::generateKeys(KeyType type, PrivateKeyFormat format, int keySize) { m_type = type; - m_format = format; try { AutoSeeded_RNG rng; @@ -70,24 +66,33 @@ bool SshKeyGenerator::generateKeys(KeyType type, PrivateKeyFormat format, if (m_type == Rsa) key = KeyPtr(new RSA_PrivateKey(rng, keySize)); else - key = KeyPtr(new DSA_PrivateKey(rng, DL_Group(rng, DL_Group::DSA_Kosherizer, - keySize))); - return m_format == Pkcs8 - ? generatePkcs8Keys(key) : generateOpenSslKeys(key); + key = KeyPtr(new DSA_PrivateKey(rng, DL_Group(rng, DL_Group::DSA_Kosherizer, keySize))); + switch (format) { + case Pkcs8: + generatePkcs8KeyStrings(key); + break; + case OpenSsl: + generateOpenSslKeyStrings(key); + break; + case Mixed: + default: + generatePkcs8KeyString(key, true); + generateOpenSslPublicKeyString(key); + } + return true; } catch (Botan::Exception &e) { m_error = tr("Error generating key: %1").arg(e.what()); return false; } } -bool SshKeyGenerator::generatePkcs8Keys(const KeyPtr &key) +void SshKeyGenerator::generatePkcs8KeyStrings(const KeyPtr &key) { - generatePkcs8Key(key, false); - generatePkcs8Key(key, true); - return true; + generatePkcs8KeyString(key, false); + generatePkcs8KeyString(key, true); } -void SshKeyGenerator::generatePkcs8Key(const KeyPtr &key, bool privateKey) +void SshKeyGenerator::generatePkcs8KeyString(const KeyPtr &key, bool privateKey) { Pipe pipe; pipe.start_msg(); @@ -105,45 +110,61 @@ void SshKeyGenerator::generatePkcs8Key(const KeyPtr &key, bool privateKey) pipe.message_count() - 1); } -bool SshKeyGenerator::generateOpenSslKeys(const KeyPtr &key) +void SshKeyGenerator::generateOpenSslKeyStrings(const KeyPtr &key) { - QList publicParams; - QList allParams; + generateOpenSslPublicKeyString(key); + generateOpenSslPrivateKeyString(key); +} + +void SshKeyGenerator::generateOpenSslPublicKeyString(const KeyPtr &key) +{ + QList params; QByteArray keyId; if (m_type == Rsa) { - const QSharedPointer rsaKey - = key.dynamicCast(); - publicParams << rsaKey->get_e() << rsaKey->get_n(); - allParams << rsaKey->get_n() << rsaKey->get_e() << rsaKey->get_d() - << rsaKey->get_p() << rsaKey->get_q(); + const QSharedPointer rsaKey = key.dynamicCast(); + params << rsaKey->get_e() << rsaKey->get_n(); keyId = SshCapabilities::PubKeyRsa; } else { - const QSharedPointer dsaKey - = key.dynamicCast(); - publicParams << dsaKey->group_p() << dsaKey->group_q() - << dsaKey->group_g() << dsaKey->get_y(); - allParams << publicParams << dsaKey->get_x(); + const QSharedPointer dsaKey = key.dynamicCast(); + params << dsaKey->group_p() << dsaKey->group_q() << dsaKey->group_g() << dsaKey->get_y(); keyId = SshCapabilities::PubKeyDss; } QByteArray publicKeyBlob = AbstractSshPacket::encodeString(keyId); - foreach (const BigInt &b, publicParams) + foreach (const BigInt &b, params) publicKeyBlob += AbstractSshPacket::encodeMpInt(b); publicKeyBlob = publicKeyBlob.toBase64(); const QByteArray id = "QtCreator/" + QDateTime::currentDateTime().toString(Qt::ISODate).toUtf8(); m_publicKey = keyId + ' ' + publicKeyBlob + ' ' + id; +} + +void SshKeyGenerator::generateOpenSslPrivateKeyString(const KeyPtr &key) +{ + QList params; + QByteArray keyId; + const char *label; + if (m_type == Rsa) { + const QSharedPointer rsaKey + = key.dynamicCast(); + params << rsaKey->get_n() << rsaKey->get_e() << rsaKey->get_d() << rsaKey->get_p() + << rsaKey->get_q(); + keyId = SshCapabilities::PubKeyRsa; + label = "RSA PRIVATE KEY"; + } else { + const QSharedPointer dsaKey = key.dynamicCast(); + params << dsaKey->group_p() << dsaKey->group_q() << dsaKey->group_g() << dsaKey->get_y() + << dsaKey->get_x(); + keyId = SshCapabilities::PubKeyDss; + label = "DSA PRIVATE KEY"; + } DER_Encoder encoder; - encoder.start_cons(SEQUENCE).encode (0U); - foreach (const BigInt &b, allParams) + encoder.start_cons(SEQUENCE).encode(0U); + foreach (const BigInt &b, params) encoder.encode(b); encoder.end_cons(); - const char * const label - = m_type == Rsa ? "RSA PRIVATE KEY" : "DSA PRIVATE KEY"; - m_privateKey - = QByteArray(PEM_Code::encode (encoder.get_contents(), label).c_str()); - return true; + m_privateKey = QByteArray(PEM_Code::encode (encoder.get_contents(), label).c_str()); } } // namespace Utils diff --git a/src/libs/utils/ssh/sshkeygenerator.h b/src/libs/utils/ssh/sshkeygenerator.h index b2b17e4a375..be53be80fa6 100644 --- a/src/libs/utils/ssh/sshkeygenerator.h +++ b/src/libs/utils/ssh/sshkeygenerator.h @@ -49,28 +49,29 @@ class QTCREATOR_UTILS_EXPORT SshKeyGenerator Q_DECLARE_TR_FUNCTIONS(SshKeyGenerator) public: enum KeyType { Rsa, Dsa }; - enum PrivateKeyFormat { Pkcs8, OpenSsl }; + enum PrivateKeyFormat { Pkcs8, OpenSsl, Mixed }; SshKeyGenerator(); bool generateKeys(KeyType type, PrivateKeyFormat format, int keySize); + QString error() const { return m_error; } QByteArray privateKey() const { return m_privateKey; } QByteArray publicKey() const { return m_publicKey; } KeyType type() const { return m_type; } - PrivateKeyFormat format() const { return m_format; } private: typedef QSharedPointer KeyPtr; - bool generatePkcs8Keys(const KeyPtr &key); - void generatePkcs8Key(const KeyPtr &key, bool privateKey); - bool generateOpenSslKeys(const KeyPtr &key); + void generatePkcs8KeyStrings(const KeyPtr &key); + void generatePkcs8KeyString(const KeyPtr &key, bool privateKey); + void generateOpenSslKeyStrings(const KeyPtr &key); + void generateOpenSslPrivateKeyString(const KeyPtr &key); + void generateOpenSslPublicKeyString(const KeyPtr &key); QString m_error; QByteArray m_publicKey; QByteArray m_privateKey; KeyType m_type; - PrivateKeyFormat m_format; }; } // namespace Utils diff --git a/src/plugins/remotelinux/maemodeviceconfigwizard.cpp b/src/plugins/remotelinux/maemodeviceconfigwizard.cpp index c7713386cd6..2eb6f3c87f4 100644 --- a/src/plugins/remotelinux/maemodeviceconfigwizard.cpp +++ b/src/plugins/remotelinux/maemodeviceconfigwizard.cpp @@ -346,7 +346,7 @@ private: m_ui->statusLabel->setText(tr("Creating keys ... ")); SshKeyGenerator keyGenerator; if (!keyGenerator.generateKeys(SshKeyGenerator::Rsa, - SshKeyGenerator::OpenSsl, 1024)) { + SshKeyGenerator::Mixed, 1024)) { QMessageBox::critical(this, tr("Cannot Create Keys"), tr("Key creation failed: %1").arg(keyGenerator.error())); enableInput(); diff --git a/src/plugins/remotelinux/sshkeycreationdialog.cpp b/src/plugins/remotelinux/sshkeycreationdialog.cpp index 18e7f3186cf..b16c68da0eb 100644 --- a/src/plugins/remotelinux/sshkeycreationdialog.cpp +++ b/src/plugins/remotelinux/sshkeycreationdialog.cpp @@ -78,7 +78,7 @@ void SshKeyCreationDialog::generateSshKey() QApplication::setOverrideCursor(Qt::BusyCursor); - if (m_keyGenerator->generateKeys(keyType, SshKeyGenerator::OpenSsl, + if (m_keyGenerator->generateKeys(keyType, SshKeyGenerator::Mixed, m_ui.comboBox->currentText().toUShort())) { m_ui.plainTextEdit->setPlainText(m_keyGenerator->publicKey()); m_ui.savePublicKey->setEnabled(true);