view src/com/trilead/ssh2/transport/ClientServerHello.java @ 0:0ce5cc452d02

initial version
author Carl Byington <carl@five-ten-sg.com>
date Thu, 22 May 2014 10:41:19 -0700
parents
children
line wrap: on
line source


package com.trilead.ssh2.transport;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;

import com.trilead.ssh2.Connection;

/**
 * ClientServerHello.
 *
 * @author Christian Plattner, plattner@trilead.com
 * @version $Id: ClientServerHello.java,v 1.2 2008/04/01 12:38:09 cplattne Exp $
 */
public class ClientServerHello {
    String server_line;
    String client_line;

    String server_versioncomment;

    public final static int readLineRN(InputStream is, byte[] buffer) throws IOException {
        int pos = 0;
        boolean need10 = false;
        int len = 0;

        while (true) {
            int c = is.read();

            if (c == -1)
                throw new IOException("Premature connection close");

            buffer[pos++] = (byte) c;

            if (c == 13) {
                need10 = true;
                continue;
            }

            if (c == 10)
                break;

            if (need10 == true)
                throw new IOException("Malformed line sent by the server, the line does not end correctly.");

            len++;

            if (pos >= buffer.length)
                throw new IOException("The server sent a too long line.");
        }

        return len;
    }

    public ClientServerHello(InputStream bi, OutputStream bo) throws IOException {
        client_line = "SSH-2.0-" + Connection.identification;
        bo.write((client_line + "\r\n").getBytes("ISO-8859-1"));
        bo.flush();
        byte[] serverVersion = new byte[512];

        for (int i = 0; i < 50; i++) {
            int len = readLineRN(bi, serverVersion);
            server_line = new String(serverVersion, 0, len, "ISO-8859-1");

            if (server_line.startsWith("SSH-"))
                break;
        }

        if (server_line.startsWith("SSH-") == false)
            throw new IOException(
                "Malformed server identification string. There was no line starting with 'SSH-' amongst the first 50 lines.");

        if (server_line.startsWith("SSH-1.99-"))
            server_versioncomment = server_line.substring(9);
        else if (server_line.startsWith("SSH-2.0-"))
            server_versioncomment = server_line.substring(8);
        else
            throw new IOException("Server uses incompatible protocol, it is not SSH-2 compatible.");
    }

    /**
     * @return Returns the client_versioncomment.
     */
    public byte[] getClientString() {
        byte[] result;

        try {
            result = client_line.getBytes("ISO-8859-1");
        }
        catch (UnsupportedEncodingException ign) {
            result = client_line.getBytes();
        }

        return result;
    }

    /**
     * @return Returns the server_versioncomment.
     */
    public byte[] getServerString() {
        byte[] result;

        try {
            result = server_line.getBytes("ISO-8859-1");
        }
        catch (UnsupportedEncodingException ign) {
            result = server_line.getBytes();
        }

        return result;
    }
}