aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <[email protected]>2015-07-23 10:05:45 +0200
committerChristian Kandeler <[email protected]>2015-07-27 12:39:33 +0000
commit8f5618c3ecc0daf971b19780646cc14a6db12931 (patch)
tree56825d5845ac8e3214ef363e6b6c2bcc31af79d3
parent851054dee8dd87b7333596b59459f798deca1dea (diff)
SSH: Don't assume an exact width of ECDSA keys.
The number specified in the algorithm name is a maximum. Change-Id: I70177a135be29adbf9b58d0dd3b9de339f0d3b7e Reviewed-by: Joerg Bornemann <[email protected]>
-rw-r--r--src/libs/ssh/sshcapabilities.cpp12
-rw-r--r--src/libs/ssh/sshcapabilities_p.h1
-rw-r--r--src/libs/ssh/sshcryptofacility.cpp16
3 files changed, 14 insertions, 15 deletions
diff --git a/src/libs/ssh/sshcapabilities.cpp b/src/libs/ssh/sshcapabilities.cpp
index 6bef99b91de..6d368025bde 100644
--- a/src/libs/ssh/sshcapabilities.cpp
+++ b/src/libs/ssh/sshcapabilities.cpp
@@ -147,6 +147,18 @@ int SshCapabilities::ecdsaIntegerWidthInBytes(const QByteArray &ecdsaAlgo)
.arg(QString::fromLatin1(ecdsaAlgo)));
}
+QByteArray SshCapabilities::ecdsaPubKeyAlgoForKeyWidth(int keyWidthInBytes)
+{
+ if (keyWidthInBytes <= 32)
+ return PubKeyEcdsa256;
+ if (keyWidthInBytes <= 48)
+ return PubKeyEcdsa384;
+ if (keyWidthInBytes <= 66)
+ return PubKeyEcdsa521;
+ throw SshClientException(SshInternalError, SSH_TR("Unexpected ecdsa key size (%1 bytes)")
+ .arg(keyWidthInBytes));
+}
+
const char *SshCapabilities::oid(const QByteArray &ecdsaAlgo)
{
if (ecdsaAlgo == PubKeyEcdsa256)
diff --git a/src/libs/ssh/sshcapabilities_p.h b/src/libs/ssh/sshcapabilities_p.h
index 9f6aa59e5f2..653f29763f2 100644
--- a/src/libs/ssh/sshcapabilities_p.h
+++ b/src/libs/ssh/sshcapabilities_p.h
@@ -81,6 +81,7 @@ public:
const QList<QByteArray> &serverCapabilities);
static int ecdsaIntegerWidthInBytes(const QByteArray &ecdsaAlgo);
+ static QByteArray ecdsaPubKeyAlgoForKeyWidth(int keyWidthInBytes);
static const char *oid(const QByteArray &ecdsaAlgo);
};
diff --git a/src/libs/ssh/sshcryptofacility.cpp b/src/libs/ssh/sshcryptofacility.cpp
index c048b42d944..227c8df3ab5 100644
--- a/src/libs/ssh/sshcryptofacility.cpp
+++ b/src/libs/ssh/sshcryptofacility.cpp
@@ -349,21 +349,7 @@ bool SshEncryptionFacility::createAuthenticationKeyFromOpenSSL(const QByteArray
} else {
BigInt privKey;
sequence.decode_octet_string_bigint(privKey);
- switch (privKey.bytes()) {
- case 32:
- m_authKeyAlgoName = SshCapabilities::PubKeyEcdsa256;
- break;
- case 48:
- m_authKeyAlgoName = SshCapabilities::PubKeyEcdsa384;
- break;
- case 66:
- m_authKeyAlgoName = SshCapabilities::PubKeyEcdsa521;
- break;
- default:
- error = SSH_TR("Unexpected ECDSA key width %1").arg(privKey.bytes());
- return false;
- }
-
+ m_authKeyAlgoName = SshCapabilities::ecdsaPubKeyAlgoForKeyWidth(privKey.bytes());
const EC_Group group(SshCapabilities::oid(m_authKeyAlgoName));
auto * const key = new ECDSA_PrivateKey(m_rng, group, privKey);
m_authKey.reset(key);