From e1dbb3e5a90cd57547a708c42d10c6904735ea00 Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@nokia.com>
Date: Mon, 9 Jan 2012 15:04:30 +0100
Subject: [PATCH] SSH: Add possibility to force unencrypted private key.

Change-Id: I1161ac5b40bc2d32b3a5a825ba907eea310e7691
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@nokia.com>
---
 src/libs/utils/ssh/sshkeygenerator.cpp | 40 ++++++++++++++++----------
 src/libs/utils/ssh/sshkeygenerator.h   |  6 +++-
 2 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/src/libs/utils/ssh/sshkeygenerator.cpp b/src/libs/utils/ssh/sshkeygenerator.cpp
index d2e1ff1124e..d249812c46f 100644
--- a/src/libs/utils/ssh/sshkeygenerator.cpp
+++ b/src/libs/utils/ssh/sshkeygenerator.cpp
@@ -59,9 +59,11 @@ SshKeyGenerator::SshKeyGenerator() : m_type(Rsa)
 {
 }
 
-bool SshKeyGenerator::generateKeys(KeyType type, PrivateKeyFormat format, int keySize)
+bool SshKeyGenerator::generateKeys(KeyType type, PrivateKeyFormat format, int keySize,
+    EncryptionMode encryptionMode)
 {
     m_type = type;
+    m_encryptionMode = encryptionMode;
 
     try {
         AutoSeeded_RNG rng;
@@ -102,21 +104,10 @@ void SshKeyGenerator::generatePkcs8KeyString(const KeyPtr &key, bool privateKey,
     pipe.start_msg();
     QByteArray *keyData;
     if (privateKey) {
-        QInputDialog d;
-        d.setInputMode(QInputDialog::TextInput);
-        d.setTextEchoMode(QLineEdit::Password);
-        d.setWindowTitle(tr("Password for Private Key"));
-        d.setLabelText(tr("It is recommended that you secure your private key\n"
-            "with a password, which you can enter below."));
-        d.setOkButtonText(tr("Encrypt key file"));
-        d.setCancelButtonText(tr("Do not encrypt key file"));
-        int result = QDialog::Accepted;
         QString password;
-        while (result == QDialog::Accepted && password.isEmpty()) {
-            result = d.exec();
-            password = d.textValue();
-        }
-        if (result == QDialog::Accepted)
+        if (m_encryptionMode == DoOfferEncryption)
+            password = getPassword();
+        if (!password.isEmpty())
             PKCS8::encrypt_key(*key, pipe, rng, password.toLocal8Bit().data());
         else
             PKCS8::encode(*key, pipe);
@@ -188,4 +179,23 @@ void SshKeyGenerator::generateOpenSslPrivateKeyString(const KeyPtr &key)
     m_privateKey = QByteArray(PEM_Code::encode (encoder.get_contents(), label).c_str());
 }
 
+QString SshKeyGenerator::getPassword() const
+{
+    QInputDialog d;
+    d.setInputMode(QInputDialog::TextInput);
+    d.setTextEchoMode(QLineEdit::Password);
+    d.setWindowTitle(tr("Password for Private Key"));
+    d.setLabelText(tr("It is recommended that you secure your private key\n"
+        "with a password, which you can enter below."));
+    d.setOkButtonText(tr("Encrypt key file"));
+    d.setCancelButtonText(tr("Do not encrypt key file"));
+    int result = QDialog::Accepted;
+    QString password;
+    while (result == QDialog::Accepted && password.isEmpty()) {
+        result = d.exec();
+        password = d.textValue();
+    }
+    return result == QDialog::Accepted ? password : QString();
+}
+
 } // namespace Utils
diff --git a/src/libs/utils/ssh/sshkeygenerator.h b/src/libs/utils/ssh/sshkeygenerator.h
index b670ce0b95d..2f5a672dbd1 100644
--- a/src/libs/utils/ssh/sshkeygenerator.h
+++ b/src/libs/utils/ssh/sshkeygenerator.h
@@ -51,9 +51,11 @@ class QTCREATOR_UTILS_EXPORT SshKeyGenerator
 public:
     enum KeyType { Rsa, Dsa };
     enum PrivateKeyFormat { Pkcs8, OpenSsl, Mixed };
+    enum EncryptionMode { DoOfferEncryption, DoNotOfferEncryption }; // Only relevant for Pkcs8 format.
 
     SshKeyGenerator();
-    bool generateKeys(KeyType type, PrivateKeyFormat format, int keySize);
+    bool generateKeys(KeyType type, PrivateKeyFormat format, int keySize,
+        EncryptionMode encryptionMode = DoOfferEncryption);
 
     QString error() const { return m_error; }
     QByteArray privateKey() const { return m_privateKey; }
@@ -69,11 +71,13 @@ private:
     void generateOpenSslKeyStrings(const KeyPtr &key);
     void generateOpenSslPrivateKeyString(const KeyPtr &key);
     void generateOpenSslPublicKeyString(const KeyPtr &key);
+    QString getPassword() const;
 
     QString m_error;
     QByteArray m_publicKey;
     QByteArray m_privateKey;
     KeyType m_type;
+    EncryptionMode m_encryptionMode;
 };
 
 } // namespace Utils
-- 
GitLab