Diff

Differences From Artifact [aa765ad7b6]:

To Artifact [7ae554165e]:


217
218
219
220
221
222
223

224
225
226
227
228
229
230
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231







+







    long savedpos;
    long maxlen;
};

static struct Packet pktin = { 0, 0, NULL, NULL, 0 };
static struct Packet pktout = { 0, 0, NULL, NULL, 0 };

static int ssh_version;
static void (*ssh_protocol)(unsigned char *in, int inlen, int ispkt);
static void ssh1_protocol(unsigned char *in, int inlen, int ispkt);
static void ssh2_protocol(unsigned char *in, int inlen, int ispkt);
static void ssh_size(void);

static int (*s_rdpkt)(unsigned char **data, int *datalen);

968
969
970
971
972
973
974

975
976
977
978
979
980
981
982
983
984
985
986
987

988
989
990
991
992
993
994
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997







+













+







        sha_string(&exhash, vstring, strcspn(vstring, "\r\n"));
        sprintf(vstring, "%s\n", verstring);
        sprintf(vlog, "We claim version: %s", verstring);
        logevent(vlog);
        logevent("Using SSH protocol version 2");
        s_write(vstring, strlen(vstring));
        ssh_protocol = ssh2_protocol;
        ssh_version = 2;
        s_rdpkt = ssh2_rdpkt;
    } else {
        /*
         * This is a v1 server. Begin v1 protocol.
         */
        sprintf(vstring, "SSH-%s-PuTTY\n",
                (ssh_versioncmp(version, "1.5") <= 0 ? version : "1.5"));
        sprintf(vlog, "We claim version: %s", vstring);
        vlog[strcspn(vlog, "\r\n")] = '\0';
        logevent(vlog);
        logevent("Using SSH protocol version 1");
        s_write(vstring, strlen(vstring));
        ssh_protocol = ssh1_protocol;
        ssh_version = 1;
        s_rdpkt = ssh1_rdpkt;
    }
    return 1;
}

/*
 * Handle the key exchange and user authentication phases.
1394
1395
1396
1397
1398
1399
1400



1401

1402
1403
1404
1405
1406
1407
1408
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406

1407
1408
1409
1410
1411
1412
1413
1414







+
+
+
-
+







            fatalbox("Protocol confusion");
        } else if (pktin.type == SSH1_SMSG_FAILURE) {
            c_write("Server refused to allocate pty\r\n", 32);
        }
	logevent("Allocated pty");
    }

    if (*cfg.remote_cmd)
        send_packet(SSH1_CMSG_EXEC_CMD, PKT_STR, cfg.remote_cmd, PKT_END);
    else
    send_packet(SSH1_CMSG_EXEC_SHELL, PKT_END);
        send_packet(SSH1_CMSG_EXEC_SHELL, PKT_END);
    logevent("Started session");

    ssh_state = SSH_STATE_SESSION;
    if (size_needed)
	ssh_size();

    while (1) {
1739
1740
1741
1742
1743
1744
1745





1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761

1762
1763
1764
1765
1766
1767
1768







+
+
+
+
+





-







        crReturn(1);
    } while (!(ispkt && pktin.type == SSH2_MSG_KEXINIT));
    goto begin_key_exchange;

    crFinish(1);
}

/*
 * SSH2: remote identifier for the main session channel.
 */
static unsigned long ssh_remote_channel;

/*
 * Handle the SSH2 userauth and connection layers.
 */
static void do_ssh2_authconn(unsigned char *in, int inlen, int ispkt)
{
    static unsigned long their_channel;
    static unsigned long remote_winsize;
    static unsigned long remote_maxpkt;

    crBegin;

    /*
     * Request userauth protocol, and await a response to it.
1905
1906
1907
1908
1909
1910
1911
1912

1913
1914
1915
1916
1917
1918
1919
1920
1921

1922
1923
1924
1925
1926
1927
1928
1915
1916
1917
1918
1919
1920
1921

1922
1923
1924
1925
1926
1927
1928
1929
1930

1931
1932
1933
1934
1935
1936
1937
1938







-
+








-
+







    if (pktin.type != SSH2_MSG_CHANNEL_OPEN_CONFIRMATION) {
        fatalbox("Server refused to open a session");
        /* FIXME: error data comes back in FAILURE packet */
    }
    if (ssh2_pkt_getuint32() != 100) {
        fatalbox("Server's channel confirmation cited wrong channel");
    }
    their_channel = ssh2_pkt_getuint32();
    ssh_remote_channel = ssh2_pkt_getuint32();
    remote_winsize = ssh2_pkt_getuint32();
    remote_maxpkt = ssh2_pkt_getuint32();
    logevent("Opened channel for session");

    /*
     * Now allocate a pty for the session.
     */
    ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
    ssh2_pkt_adduint32(their_channel); /* recipient channel */
    ssh2_pkt_adduint32(ssh_remote_channel); /* recipient channel */
    ssh2_pkt_addstring("pty-req");
    ssh2_pkt_addbool(1);               /* want reply */
    ssh2_pkt_addstring(cfg.termtype);
    ssh2_pkt_adduint32(cols);
    ssh2_pkt_adduint32(rows);
    ssh2_pkt_adduint32(0);             /* pixel width */
    ssh2_pkt_adduint32(0);             /* pixel height */
1943
1944
1945
1946
1947
1948
1949
1950

1951
1952
1953
1954
1955
1956
1957
1953
1954
1955
1956
1957
1958
1959

1960
1961
1962
1963
1964
1965
1966
1967







-
+







        logevent("Allocated pty");
    }

    /*
     * Start a shell.
     */
    ssh2_pkt_init(SSH2_MSG_CHANNEL_REQUEST);
    ssh2_pkt_adduint32(their_channel); /* recipient channel */
    ssh2_pkt_adduint32(ssh_remote_channel); /* recipient channel */
    ssh2_pkt_addstring("shell");
    ssh2_pkt_addbool(1);               /* want reply */
    ssh2_pkt_send();
    do {                               /* FIXME: pay attention to these */
        crWaitUntilV(ispkt);
    } while (pktin.type == SSH2_MSG_CHANNEL_WINDOW_ADJUST);
    if (pktin.type != SSH2_MSG_CHANNEL_SUCCESS) {
1990
1991
1992
1993
1994
1995
1996
1997

1998
1999
2000
2001
2002
2003
2004
2000
2001
2002
2003
2004
2005
2006

2007
2008
2009
2010
2011
2012
2013
2014







-
+







                continue;              /* ignore for now (FIXME!) */
	    } else {
		fatalbox("Strange packet received: type %d", pktin.type);
	    }
	} else {
            /* FIXME: for now, ignore window size */
            ssh2_pkt_init(SSH2_MSG_CHANNEL_DATA);
            ssh2_pkt_adduint32(their_channel);
            ssh2_pkt_adduint32(ssh_remote_channel);
            ssh2_pkt_addstring_start();
            ssh2_pkt_addstring_data(in, inlen);
            ssh2_pkt_send();
	}
    }

    crFinishV;
2116
2117
2118
2119
2120
2121
2122
2123



2124
2125









2126


2127
2128
2129
2130
2131
2132
2133
2126
2127
2128
2129
2130
2131
2132

2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146

2147
2148
2149
2150
2151
2152
2153
2154
2155







-
+
+
+


+
+
+
+
+
+
+
+
+
-
+
+







	                PKT_INT, rows, PKT_INT, cols,
	                PKT_INT, 0, PKT_INT, 0, PKT_END);
        }
    }
}

/*
 * (Send Telnet special codes)
 * Send Telnet special codes. TS_EOF is useful for `plink', so you
 * can send an EOF and collect resulting output (e.g. `plink
 * hostname sort').
 */
static void ssh_special (Telnet_Special code) {
    if (code == TS_EOF) {
        if (ssh_version = 1) {
            send_packet(SSH1_CMSG_EOF, PKT_END);
        } else {
            ssh2_pkt_init(SSH2_MSG_CHANNEL_EOF);
            ssh2_pkt_adduint32(ssh_remote_channel);
            ssh2_pkt_send();
        }
    } else {
    /* do nothing */
        /* do nothing */
    }
}


/*
 * Read and decrypt one incoming SSH packet.
 * (only used by pSCP)
 */