diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2015-05-16 19:34:06 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2015-05-16 19:43:11 +0900 |
| commit | c26da096875d609b354ea5989f62af662f9c609e (patch) | |
| tree | 2e9e4a1279d0b325aed7dc960f39ab770e5efbce /src/SocketCore.cc | |
| parent | 4273885f1677579675f71667d933bd308a020fdd (diff) | |
Add --ssh-host-key-md option
Set checksum for SSH host public key. Use same syntax with --checksum
option. TYPE is hash type. The supported hash type is sha-1 or
md5. DIGEST is hex digest. For example:
sha-1=b030503d4de4539dc7885e6f0f5e256704edf4c3. This option can be
used to validate server's public key when SFTP is used. If this
option is not set, which is default, no validation takes place.
Diffstat (limited to 'src/SocketCore.cc')
| -rw-r--r-- | src/SocketCore.cc | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/SocketCore.cc b/src/SocketCore.cc index 320f04a6..701fc33e 100644 --- a/src/SocketCore.cc +++ b/src/SocketCore.cc @@ -989,7 +989,8 @@ bool SocketCore::tlsHandshake(TLSContext* tlsctx, const std::string& hostname) #ifdef HAVE_LIBSSH2 -bool SocketCore::sshHandshake() +bool SocketCore::sshHandshake(const std::string& hashType, + const std::string& digest) { wantRead_ = false; wantWrite_ = false; @@ -1009,6 +1010,19 @@ bool SocketCore::sshHandshake() throw DL_ABORT_EX(fmt("SSH handshake failure: %s", sshSession_->getLastErrorString().c_str())); } + if (!hashType.empty()) { + auto actualDigest = sshSession_->hostkeyMessageDigest(hashType); + if (actualDigest.empty()) { + throw DL_ABORT_EX(fmt("Empty host key fingerprint from SSH layer: " + "perhaps hash type %s is not supported?", + hashType.c_str())); + } + if (digest != actualDigest) { + throw DL_ABORT_EX(fmt("Unexpected SSH host key: expected %s, actual %s", + util::toHex(digest).c_str(), + util::toHex(actualDigest).c_str())); + } + } return true; } |
