From 8b719e51cf3e1b0ee7bee93a006bfa517fba4926 Mon Sep 17 00:00:00 2001 From: Andreas Schneider Date: Wed, 29 Sep 2010 11:26:35 +0200 Subject: misc: Move ssh_analyze_banner to a common location. Don't duplicate functions! --- src/misc.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'src/misc.c') diff --git a/src/misc.c b/src/misc.c index ee78d8b0..b19c6c9f 100644 --- a/src/misc.c +++ b/src/misc.c @@ -681,6 +681,69 @@ char *ssh_path_expand_escape(ssh_session session, const char *s) { #undef MAX_BUF_SIZE } +/** + * @internal + * + * @brief Analyze the SSH banner to find out if we have a SSHv1 or SSHv2 + * server. + * + * @param session The session to analyze the banner from. + * @param ssh1 The variable which is set if it is a SSHv1 server. + * @param ssh2 The variable which is set if it is a SSHv2 server. + * + * @return 0 on success, < 0 on error. + * + * @see ssh_get_banner() + */ +int ssh_analyze_banner(ssh_session session, int *ssh1, int *ssh2) { + const char *banner = session->clientbanner; + const char *openssh; + + ssh_log(session, SSH_LOG_RARE, "Analyzing banner: %s", banner); + + if (strncmp(banner, "SSH-", 4) != 0) { + ssh_set_error(session, SSH_FATAL, "Protocol mismatch: %s", banner); + return -1; + } + + /* + * Typical banners e.g. are: + * SSH-1.5-blah + * SSH-1.99-blah + * SSH-2.0-blah + */ + switch(banner[4]) { + case '1': + *ssh1 = 1; + if (banner[6] == '9') { + *ssh2 = 1; + } else { + *ssh2 = 0; + } + break; + case '2': + *ssh1 = 0; + *ssh2 = 1; + break; + default: + ssh_set_error(session, SSH_FATAL, "Protocol mismatch: %s", banner); + return -1; + } + + openssh = strstr(banner, "OpenSSH"); + if (openssh != NULL) { + int major, minor; + major = strtol(openssh + 8, (char **) NULL, 10); + minor = strtol(openssh + 10, (char **) NULL, 10); + session->openssh = SSH_VERSION_INT(major, minor, 0); + ssh_log(session, SSH_LOG_RARE, + "We are talking to an OpenSSH client version: %d.%d (%x)", + major, minor, session->openssh); + } + + return 0; +} + /** @} */ /* vim: set ts=4 sw=4 et cindent: */ -- cgit v1.2.3