* Packet type contexts, so that ssh2_pkt_type can correctly decode
* the ambiguous type numbers back into the correct type strings.
*/
-#define SSH2_PKTCTX_DHGROUP1 0x0001
+#define SSH2_PKTCTX_DHGROUP 0x0001
#define SSH2_PKTCTX_DHGEX 0x0002
#define SSH2_PKTCTX_PUBLICKEY 0x0010
#define SSH2_PKTCTX_PASSWORD 0x0020
translate(SSH2_MSG_SERVICE_ACCEPT);
translate(SSH2_MSG_KEXINIT);
translate(SSH2_MSG_NEWKEYS);
- translatec(SSH2_MSG_KEXDH_INIT, SSH2_PKTCTX_DHGROUP1);
- translatec(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP1);
+ translatec(SSH2_MSG_KEXDH_INIT, SSH2_PKTCTX_DHGROUP);
+ translatec(SSH2_MSG_KEXDH_REPLY, SSH2_PKTCTX_DHGROUP);
translatec(SSH2_MSG_KEX_DH_GEX_REQUEST, SSH2_PKTCTX_DHGEX);
translatec(SSH2_MSG_KEX_DH_GEX_GROUP, SSH2_PKTCTX_DHGEX);
translatec(SSH2_MSG_KEX_DH_GEX_INIT, SSH2_PKTCTX_DHGEX);
const static struct ssh_kex *kex_algs[] = {
&ssh_diffiehellman_gex,
- &ssh_diffiehellman
+ &ssh_diffiehellman_group14,
+ &ssh_diffiehellman_group1,
};
const static struct ssh_signkey *hostkey_algs[] = { &ssh_rsa, &ssh_dss };
ssh->rdpkt2_state.incoming_sequence = 0;
s->vstring[s->vslen] = 0;
- s->vstring[strcspn(s->vstring, "\r\n")] = '\0';/* remove EOL chars */
+ s->vstring[strcspn(s->vstring, "\015\012")] = '\0';/* remove EOL chars */
{
char *vlog;
vlog = snewn(20 + s->vslen, char);
/*
* Construct a v2 version string.
*/
- verstring = dupprintf("SSH-2.0-%s\r\n", sshver);
+ verstring = dupprintf("SSH-2.0-%s\015\012", sshver);
ssh->version = 2;
} else {
/*
* Construct a v1 version string.
*/
- verstring = dupprintf("SSH-%s-%s\r\n",
+ verstring = dupprintf("SSH-%s-%s\012",
(ssh_versioncmp(s->version, "1.5") <= 0 ?
s->version : "1.5"),
sshver);
*/
SHA_Init(&ssh->exhashbase);
sha_string(&ssh->exhashbase, verstring,
- strcspn(verstring, "\r\n"));
+ strcspn(verstring, "\015\012"));
sha_string(&ssh->exhashbase, s->vstring,
- strcspn(s->vstring, "\r\n"));
+ strcspn(s->vstring, "\015\012"));
/*
* Initialise SSHv2 protocol.
ssh->s_rdpkt = ssh1_rdpkt;
}
logeventf(ssh, "We claim version: %.*s",
- strcspn(verstring, "\r\n"), verstring);
+ strcspn(verstring, "\015\012"), verstring);
sk_write(ssh->s, verstring, strlen(verstring));
sfree(verstring);
}
* If we're doing Diffie-Hellman group exchange, start by
* requesting a group.
*/
- if (ssh->kex == &ssh_diffiehellman_gex) {
+ if (!ssh->kex->pdata) {
logevent("Doing Diffie-Hellman group exchange");
ssh->pkt_ctx |= SSH2_PKTCTX_DHGEX;
/*
bombout(("unable to read mp-ints from incoming group packet"));
crStop(0);
}
- ssh->kex_ctx = dh_setup_group(s->p, s->g);
+ ssh->kex_ctx = dh_setup_gex(s->p, s->g);
s->kex_init_value = SSH2_MSG_KEX_DH_GEX_INIT;
s->kex_reply_value = SSH2_MSG_KEX_DH_GEX_REPLY;
} else {
- ssh->pkt_ctx |= SSH2_PKTCTX_DHGROUP1;
- ssh->kex_ctx = dh_setup_group1();
+ ssh->pkt_ctx |= SSH2_PKTCTX_DHGROUP;
+ ssh->kex_ctx = dh_setup_group(ssh->kex);
s->kex_init_value = SSH2_MSG_KEXDH_INIT;
s->kex_reply_value = SSH2_MSG_KEXDH_REPLY;
+ logeventf(ssh, "Using Diffie-Hellman with standard group \"%s\"",
+ ssh->kex->groupname);
}
logevent("Doing Diffie-Hellman key exchange");
sfree(c);
}
freetree234(ssh->channels);
+ ssh->channels = NULL;
}
if (ssh->rportfwds) {
while ((pf = delpos234(ssh->rportfwds, 0)) != NULL)
sfree(pf);
freetree234(ssh->rportfwds);
+ ssh->rportfwds = NULL;
}
sfree(ssh->deferred_send_data);
if (ssh->x11auth)
if (ssh->s)
ssh_do_close(ssh);
expire_timer_context(ssh);
- sfree(ssh);
if (ssh->pinger)
pinger_free(ssh->pinger);
+ sfree(ssh);
random_unref();
}