1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-22 14:39:24 -05:00

do_ssh1_login: change return type to void.

Now it does its post-completion work itself instead of telling the
callee to do the same. So its caller, ssh1_coro_wrapper_initial, is
now a _completely_ trivial wrapper - but I'm not taking the
opportunity to fold the two functions together completely, because the
wrapper is going to acquire a new purpose in the next commit :-)
This commit is contained in:
Simon Tatham 2018-05-18 07:22:58 +01:00
parent 265365ab80
commit 96d9d788f6

105
ssh.c
View File

@ -384,7 +384,7 @@ static void ssh2_pkt_addmp(struct Packet *, Bignum b);
static int ssh2_pkt_construct(Ssh, struct Packet *); static int ssh2_pkt_construct(Ssh, struct Packet *);
static void ssh2_pkt_send(Ssh, struct Packet *); static void ssh2_pkt_send(Ssh, struct Packet *);
static void ssh2_pkt_send_noqueue(Ssh, struct Packet *); static void ssh2_pkt_send_noqueue(Ssh, struct Packet *);
static int do_ssh1_login(Ssh ssh, struct Packet *pktin); static void do_ssh1_login(Ssh ssh, struct Packet *pktin);
static void do_ssh2_authconn(Ssh ssh, const unsigned char *in, int inlen, static void do_ssh2_authconn(Ssh ssh, const unsigned char *in, int inlen,
struct Packet *pktin); struct Packet *pktin);
static void ssh_channel_init(struct ssh_channel *c); static void ssh_channel_init(struct ssh_channel *c);
@ -4195,10 +4195,14 @@ int verify_ssh_manual_host_key(Ssh ssh, const char *fingerprint,
return 0; return 0;
} }
static void ssh1_coro_wrapper_initial(Ssh ssh, struct Packet *pktin);
static void ssh1_coro_wrapper_session(Ssh ssh, struct Packet *pktin);
static void ssh1_connection_input(Ssh ssh);
/* /*
* Handle the key exchange and user authentication phases. * Handle the key exchange and user authentication phases.
*/ */
static int do_ssh1_login(Ssh ssh, struct Packet *pktin) static void do_ssh1_login(Ssh ssh, struct Packet *pktin)
{ {
int i, j, ret; int i, j, ret;
unsigned char *ptr; unsigned char *ptr;
@ -4238,11 +4242,11 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
crBeginState; crBeginState;
if (!pktin) if (!pktin)
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type != SSH1_SMSG_PUBLIC_KEY) { if (pktin->type != SSH1_SMSG_PUBLIC_KEY) {
bombout(("Public key packet not received")); bombout(("Public key packet not received"));
crStop(0); crStopV;
} }
logevent("Received public keys"); logevent("Received public keys");
@ -4250,14 +4254,14 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
ptr = ssh_pkt_getdata(pktin, 8); ptr = ssh_pkt_getdata(pktin, 8);
if (!ptr) { if (!ptr) {
bombout(("SSH-1 public key packet stopped before random cookie")); bombout(("SSH-1 public key packet stopped before random cookie"));
crStop(0); crStopV;
} }
memcpy(s->cookie, ptr, 8); memcpy(s->cookie, ptr, 8);
if (!ssh1_pkt_getrsakey(pktin, &s->servkey, &s->keystr1) || if (!ssh1_pkt_getrsakey(pktin, &s->servkey, &s->keystr1) ||
!ssh1_pkt_getrsakey(pktin, &s->hostkey, &s->keystr2)) { !ssh1_pkt_getrsakey(pktin, &s->hostkey, &s->keystr2)) {
bombout(("Failed to read SSH-1 public keys from public key packet")); bombout(("Failed to read SSH-1 public keys from public key packet"));
crStop(0); crStopV;
} }
/* /*
@ -4298,7 +4302,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (s->hostkey.bits > s->hostkey.bytes * 8 || if (s->hostkey.bits > s->hostkey.bytes * 8 ||
s->servkey.bits > s->servkey.bytes * 8) { s->servkey.bits > s->servkey.bytes * 8) {
bombout(("SSH-1 public keys were badly formatted")); bombout(("SSH-1 public keys were badly formatted"));
crStop(0); crStopV;
} }
s->len = (s->hostkey.bytes > s->servkey.bytes ? s->len = (s->hostkey.bytes > s->servkey.bytes ?
@ -4324,7 +4328,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (s->dlgret == 0) { /* did not match */ if (s->dlgret == 0) { /* did not match */
bombout(("Host key did not appear in manually configured list")); bombout(("Host key did not appear in manually configured list"));
sfree(keystr); sfree(keystr);
crStop(0); crStopV;
} else if (s->dlgret < 0) { /* none configured; use standard handling */ } else if (s->dlgret < 0) { /* none configured; use standard handling */
ssh_set_frozen(ssh, 1); ssh_set_frozen(ssh, 1);
s->dlgret = verify_ssh_host_key(ssh->frontend, s->dlgret = verify_ssh_host_key(ssh->frontend,
@ -4338,7 +4342,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (s->dlgret < 0) { if (s->dlgret < 0) {
ssh->user_response = -1; ssh->user_response = -1;
do { do {
crReturn(0); crReturnV;
if (pktin) { if (pktin) {
bombout(("Unexpected data from server while waiting" bombout(("Unexpected data from server while waiting"
" for user host key response")); " for user host key response"));
@ -4352,7 +4356,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (s->dlgret == 0) { if (s->dlgret == 0) {
ssh_disconnect(ssh, "User aborted at host key verification", ssh_disconnect(ssh, "User aborted at host key verification",
NULL, 0, TRUE); NULL, 0, TRUE);
crStop(0); crStopV;
} }
} else { } else {
sfree(keystr); sfree(keystr);
@ -4376,7 +4380,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
} }
if (!ret) { if (!ret) {
bombout(("SSH-1 public key encryptions failed due to bad formatting")); bombout(("SSH-1 public key encryptions failed due to bad formatting"));
crStop(0); crStopV;
} }
logevent("Encrypted session key"); logevent("Encrypted session key");
@ -4414,7 +4418,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
else else
/* shouldn't happen */ /* shouldn't happen */
bombout(("No supported ciphers found")); bombout(("No supported ciphers found"));
crStop(0); crStopV;
} }
/* Warn about chosen cipher if necessary. */ /* Warn about chosen cipher if necessary. */
@ -4425,7 +4429,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (s->dlgret < 0) { if (s->dlgret < 0) {
ssh->user_response = -1; ssh->user_response = -1;
do { do {
crReturn(0); crReturnV;
if (pktin) { if (pktin) {
bombout(("Unexpected data from server while waiting" bombout(("Unexpected data from server while waiting"
" for user response")); " for user response"));
@ -4438,7 +4442,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (s->dlgret == 0) { if (s->dlgret == 0) {
ssh_disconnect(ssh, "User aborted at cipher warning", NULL, ssh_disconnect(ssh, "User aborted at cipher warning", NULL,
0, TRUE); 0, TRUE);
crStop(0); crStopV;
} }
} }
} }
@ -4492,11 +4496,11 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
sfree(s->hostkey.exponent); sfree(s->hostkey.exponent);
s->hostkey.exponent = NULL; s->hostkey.exponent = NULL;
} }
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type != SSH1_SMSG_SUCCESS) { if (pktin->type != SSH1_SMSG_SUCCESS) {
bombout(("Encryption not successfully enabled")); bombout(("Encryption not successfully enabled"));
crStop(0); crStopV;
} }
logevent("Successfully started encryption"); logevent("Successfully started encryption");
@ -4512,7 +4516,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
ret = get_userpass_input(s->cur_prompt, NULL); ret = get_userpass_input(s->cur_prompt, NULL);
while (ret < 0) { while (ret < 0) {
ssh->send_ok = 1; ssh->send_ok = 1;
crWaitUntil(!pktin); crWaitUntilV(!pktin);
ret = get_userpass_input(s->cur_prompt, &ssh->user_input); ret = get_userpass_input(s->cur_prompt, &ssh->user_input);
ssh->send_ok = 0; ssh->send_ok = 0;
} }
@ -4522,7 +4526,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
*/ */
free_prompts(s->cur_prompt); free_prompts(s->cur_prompt);
ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE); ssh_disconnect(ssh, "No username provided", NULL, 0, TRUE);
crStop(0); crStopV;
} }
ssh->username = dupstr(s->cur_prompt->prompts[0]->result); ssh->username = dupstr(s->cur_prompt->prompts[0]->result);
free_prompts(s->cur_prompt); free_prompts(s->cur_prompt);
@ -4541,7 +4545,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
} }
} }
crWaitUntil(pktin); crWaitUntilV(pktin);
if ((s->supported_auths_mask & (1 << SSH1_AUTH_RSA)) == 0) { if ((s->supported_auths_mask & (1 << SSH1_AUTH_RSA)) == 0) {
/* We must not attempt PK auth. Pretend we've already tried it. */ /* We must not attempt PK auth. Pretend we've already tried it. */
@ -4617,7 +4621,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (ssh->auth_agent_query) { if (ssh->auth_agent_query) {
ssh->agent_response = NULL; ssh->agent_response = NULL;
do { do {
crReturn(0); crReturnV;
if (pktin) { if (pktin) {
bombout(("Unexpected data from server while waiting" bombout(("Unexpected data from server while waiting"
" for agent response")); " for agent response"));
@ -4687,7 +4691,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
logeventf(ssh, "Trying Pageant key #%d", s->keyi); logeventf(ssh, "Trying Pageant key #%d", s->keyi);
send_packet(ssh, SSH1_CMSG_AUTH_RSA, send_packet(ssh, SSH1_CMSG_AUTH_RSA,
PKT_BIGNUM, s->key.modulus, PKT_END); PKT_BIGNUM, s->key.modulus, PKT_END);
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
logevent("Key refused"); logevent("Key refused");
continue; continue;
@ -4695,7 +4699,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
logevent("Received RSA challenge"); logevent("Received RSA challenge");
if ((s->challenge = ssh1_pkt_getmp(pktin)) == NULL) { if ((s->challenge = ssh1_pkt_getmp(pktin)) == NULL) {
bombout(("Server's RSA challenge was badly formatted")); bombout(("Server's RSA challenge was badly formatted"));
crStop(0); crStopV;
} }
{ {
@ -4727,7 +4731,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
sfree(agentreq); sfree(agentreq);
ssh->agent_response = NULL; ssh->agent_response = NULL;
do { do {
crReturn(0); crReturnV;
if (pktin) { if (pktin) {
bombout(("Unexpected data from server" bombout(("Unexpected data from server"
" while waiting for agent" " while waiting for agent"
@ -4747,7 +4751,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
PKT_DATA, ret + 5, 16, PKT_DATA, ret + 5, 16,
PKT_END); PKT_END);
sfree(ret); sfree(ret);
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type == SSH1_SMSG_SUCCESS) { if (pktin->type == SSH1_SMSG_SUCCESS) {
logevent logevent
("Pageant's response accepted"); ("Pageant's response accepted");
@ -4821,7 +4825,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
ret = get_userpass_input(s->cur_prompt, NULL); ret = get_userpass_input(s->cur_prompt, NULL);
while (ret < 0) { while (ret < 0) {
ssh->send_ok = 1; ssh->send_ok = 1;
crWaitUntil(!pktin); crWaitUntilV(!pktin);
ret = get_userpass_input(s->cur_prompt, ret = get_userpass_input(s->cur_prompt,
&ssh->user_input); &ssh->user_input);
ssh->send_ok = 0; ssh->send_ok = 0;
@ -4831,7 +4835,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
free_prompts(s->cur_prompt); free_prompts(s->cur_prompt);
ssh_disconnect(ssh, NULL, "Unable to authenticate", ssh_disconnect(ssh, NULL, "Unable to authenticate",
0, TRUE); 0, TRUE);
crStop(0); crStopV;
} }
passphrase = dupstr(s->cur_prompt->prompts[0]->result); passphrase = dupstr(s->cur_prompt->prompts[0]->result);
free_prompts(s->cur_prompt); free_prompts(s->cur_prompt);
@ -4875,14 +4879,14 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
send_packet(ssh, SSH1_CMSG_AUTH_RSA, send_packet(ssh, SSH1_CMSG_AUTH_RSA,
PKT_BIGNUM, s->key.modulus, PKT_END); PKT_BIGNUM, s->key.modulus, PKT_END);
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type == SSH1_SMSG_FAILURE) { if (pktin->type == SSH1_SMSG_FAILURE) {
c_write_str(ssh, "Server refused our public key.\r\n"); c_write_str(ssh, "Server refused our public key.\r\n");
continue; /* go and try something else */ continue; /* go and try something else */
} }
if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) { if (pktin->type != SSH1_SMSG_AUTH_RSA_CHALLENGE) {
bombout(("Bizarre response to offer of public key")); bombout(("Bizarre response to offer of public key"));
crStop(0); crStopV;
} }
{ {
@ -4892,7 +4896,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if ((challenge = ssh1_pkt_getmp(pktin)) == NULL) { if ((challenge = ssh1_pkt_getmp(pktin)) == NULL) {
bombout(("Server's RSA challenge was badly formatted")); bombout(("Server's RSA challenge was badly formatted"));
crStop(0); crStopV;
} }
response = rsadecrypt(challenge, &s->key); response = rsadecrypt(challenge, &s->key);
freebn(s->key.private_exponent);/* burn the evidence */ freebn(s->key.private_exponent);/* burn the evidence */
@ -4913,7 +4917,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
freebn(response); freebn(response);
} }
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type == SSH1_SMSG_FAILURE) { if (pktin->type == SSH1_SMSG_FAILURE) {
if (flags & FLAG_VERBOSE) if (flags & FLAG_VERBOSE)
c_write_str(ssh, "Failed to authenticate with" c_write_str(ssh, "Failed to authenticate with"
@ -4921,7 +4925,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
continue; /* go and try something else */ continue; /* go and try something else */
} else if (pktin->type != SSH1_SMSG_SUCCESS) { } else if (pktin->type != SSH1_SMSG_SUCCESS) {
bombout(("Bizarre response to RSA authentication response")); bombout(("Bizarre response to RSA authentication response"));
crStop(0); crStopV;
} }
break; /* we're through! */ break; /* we're through! */
@ -4940,7 +4944,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
s->pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE; s->pwpkt_type = SSH1_CMSG_AUTH_TIS_RESPONSE;
logevent("Requested TIS authentication"); logevent("Requested TIS authentication");
send_packet(ssh, SSH1_CMSG_AUTH_TIS, PKT_END); send_packet(ssh, SSH1_CMSG_AUTH_TIS, PKT_END);
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type != SSH1_SMSG_AUTH_TIS_CHALLENGE) { if (pktin->type != SSH1_SMSG_AUTH_TIS_CHALLENGE) {
logevent("TIS authentication declined"); logevent("TIS authentication declined");
if (flags & FLAG_INTERACTIVE) if (flags & FLAG_INTERACTIVE)
@ -4955,7 +4959,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
ssh_pkt_getstring(pktin, &challenge, &challengelen); ssh_pkt_getstring(pktin, &challenge, &challengelen);
if (!challenge) { if (!challenge) {
bombout(("TIS challenge packet was badly formed")); bombout(("TIS challenge packet was badly formed"));
crStop(0); crStopV;
} }
logevent("Received TIS challenge"); logevent("Received TIS challenge");
s->cur_prompt->to_server = TRUE; s->cur_prompt->to_server = TRUE;
@ -4983,7 +4987,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
s->pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE; s->pwpkt_type = SSH1_CMSG_AUTH_CCARD_RESPONSE;
logevent("Requested CryptoCard authentication"); logevent("Requested CryptoCard authentication");
send_packet(ssh, SSH1_CMSG_AUTH_CCARD, PKT_END); send_packet(ssh, SSH1_CMSG_AUTH_CCARD, PKT_END);
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) { if (pktin->type != SSH1_SMSG_AUTH_CCARD_CHALLENGE) {
logevent("CryptoCard authentication declined"); logevent("CryptoCard authentication declined");
c_write_str(ssh, "CryptoCard authentication refused.\r\n"); c_write_str(ssh, "CryptoCard authentication refused.\r\n");
@ -4997,7 +5001,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
ssh_pkt_getstring(pktin, &challenge, &challengelen); ssh_pkt_getstring(pktin, &challenge, &challengelen);
if (!challenge) { if (!challenge) {
bombout(("CryptoCard challenge packet was badly formed")); bombout(("CryptoCard challenge packet was badly formed"));
crStop(0); crStopV;
} }
logevent("Received CryptoCard challenge"); logevent("Received CryptoCard challenge");
s->cur_prompt->to_server = TRUE; s->cur_prompt->to_server = TRUE;
@ -5023,7 +5027,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) { if (s->pwpkt_type == SSH1_CMSG_AUTH_PASSWORD) {
if ((s->supported_auths_mask & (1 << SSH1_AUTH_PASSWORD)) == 0) { if ((s->supported_auths_mask & (1 << SSH1_AUTH_PASSWORD)) == 0) {
bombout(("No supported authentication methods available")); bombout(("No supported authentication methods available"));
crStop(0); crStopV;
} }
s->cur_prompt->to_server = TRUE; s->cur_prompt->to_server = TRUE;
s->cur_prompt->name = dupstr("SSH password"); s->cur_prompt->name = dupstr("SSH password");
@ -5042,7 +5046,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
ret = get_userpass_input(s->cur_prompt, NULL); ret = get_userpass_input(s->cur_prompt, NULL);
while (ret < 0) { while (ret < 0) {
ssh->send_ok = 1; ssh->send_ok = 1;
crWaitUntil(!pktin); crWaitUntilV(!pktin);
ret = get_userpass_input(s->cur_prompt, &ssh->user_input); ret = get_userpass_input(s->cur_prompt, &ssh->user_input);
ssh->send_ok = 0; ssh->send_ok = 0;
} }
@ -5054,7 +5058,7 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
*/ */
free_prompts(s->cur_prompt); free_prompts(s->cur_prompt);
ssh_disconnect(ssh, NULL, "Unable to authenticate", 0, TRUE); ssh_disconnect(ssh, NULL, "Unable to authenticate", 0, TRUE);
crStop(0); crStopV;
} }
} }
@ -5183,14 +5187,14 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
} }
logevent("Sent password"); logevent("Sent password");
free_prompts(s->cur_prompt); free_prompts(s->cur_prompt);
crWaitUntil(pktin); crWaitUntilV(pktin);
if (pktin->type == SSH1_SMSG_FAILURE) { if (pktin->type == SSH1_SMSG_FAILURE) {
if (flags & FLAG_VERBOSE) if (flags & FLAG_VERBOSE)
c_write_str(ssh, "Access denied\r\n"); c_write_str(ssh, "Access denied\r\n");
logevent("Authentication refused"); logevent("Authentication refused");
} else if (pktin->type != SSH1_SMSG_SUCCESS) { } else if (pktin->type != SSH1_SMSG_SUCCESS) {
bombout(("Strange packet received, type %d", pktin->type)); bombout(("Strange packet received, type %d", pktin->type));
crStop(0); crStopV;
} }
} }
@ -5202,7 +5206,16 @@ static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
logevent("Authentication successful"); logevent("Authentication successful");
crFinish(1); /* Set up for the next phase */
{
int i;
for (i = 0; i < 256; i++)
if (ssh->packet_dispatch[i] == ssh1_coro_wrapper_initial)
ssh->packet_dispatch[i] = ssh1_coro_wrapper_session;
ssh->current_user_input_fn = ssh1_connection_input;
}
crFinishV;
} }
static void ssh_channel_try_eof(struct ssh_channel *c) static void ssh_channel_try_eof(struct ssh_channel *c)
@ -6279,17 +6292,9 @@ static void ssh1_connection_input(Ssh ssh)
} }
} }
static void ssh1_coro_wrapper_session(Ssh ssh, struct Packet *pktin);
static void ssh1_coro_wrapper_initial(Ssh ssh, struct Packet *pktin) static void ssh1_coro_wrapper_initial(Ssh ssh, struct Packet *pktin)
{ {
if (do_ssh1_login(ssh, pktin)) { do_ssh1_login(ssh, pktin);
int i;
for (i = 0; i < 256; i++)
if (ssh->packet_dispatch[i] == ssh1_coro_wrapper_initial)
ssh->packet_dispatch[i] = ssh1_coro_wrapper_session;
ssh->current_user_input_fn = ssh1_connection_input;
}
} }
static void ssh1_coro_wrapper_session(Ssh ssh, struct Packet *pktin) static void ssh1_coro_wrapper_session(Ssh ssh, struct Packet *pktin)