mirror of
https://github.com/clearml/dropbear
synced 2025-01-31 02:46:58 +00:00
Don't usually need to recalculate dh_e for the repeated kexdh_init packet
--HG-- branch : kexguess
This commit is contained in:
parent
f267ca1f3a
commit
78fbed8c3e
17
cli-kex.c
17
cli-kex.c
@ -43,11 +43,19 @@ static void checkhostkey(unsigned char* keyblob, unsigned int keybloblen);
|
|||||||
|
|
||||||
void send_msg_kexdh_init() {
|
void send_msg_kexdh_init() {
|
||||||
TRACE(("send_msg_kexdh_init()"))
|
TRACE(("send_msg_kexdh_init()"))
|
||||||
cli_ses.dh_e = (mp_int*)m_malloc(sizeof(mp_int));
|
if ((cli_ses.dh_e && cli_ses.dh_x
|
||||||
cli_ses.dh_x = (mp_int*)m_malloc(sizeof(mp_int));
|
&& cli_ses.dh_val_algo == ses.newkeys->algo_kex)) {
|
||||||
m_mp_init_multi(cli_ses.dh_e, cli_ses.dh_x, NULL);
|
TRACE(("reusing existing dh_e from first_kex_packet_follows"))
|
||||||
|
} else {
|
||||||
|
if (!cli_ses.dh_e || !cli_ses.dh_e) {
|
||||||
|
cli_ses.dh_e = (mp_int*)m_malloc(sizeof(mp_int));
|
||||||
|
cli_ses.dh_x = (mp_int*)m_malloc(sizeof(mp_int));
|
||||||
|
m_mp_init_multi(cli_ses.dh_e, cli_ses.dh_x, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
gen_kexdh_vals(cli_ses.dh_e, cli_ses.dh_x);
|
gen_kexdh_vals(cli_ses.dh_e, cli_ses.dh_x);
|
||||||
|
cli_ses.dh_val_algo = ses.newkeys->algo_kex;
|
||||||
|
}
|
||||||
|
|
||||||
CHECKCLEARTOWRITE();
|
CHECKCLEARTOWRITE();
|
||||||
buf_putbyte(ses.writepayload, SSH_MSG_KEXDH_INIT);
|
buf_putbyte(ses.writepayload, SSH_MSG_KEXDH_INIT);
|
||||||
@ -99,6 +107,7 @@ void recv_msg_kexdh_reply() {
|
|||||||
mp_clear_multi(cli_ses.dh_e, cli_ses.dh_x, NULL);
|
mp_clear_multi(cli_ses.dh_e, cli_ses.dh_x, NULL);
|
||||||
m_free(cli_ses.dh_e);
|
m_free(cli_ses.dh_e);
|
||||||
m_free(cli_ses.dh_x);
|
m_free(cli_ses.dh_x);
|
||||||
|
cli_ses.dh_val_algo = DROPBEAR_KEX_NONE;
|
||||||
|
|
||||||
if (buf_verify(ses.payload, hostkey, ses.hash, SHA1_HASH_SIZE)
|
if (buf_verify(ses.payload, hostkey, ses.hash, SHA1_HASH_SIZE)
|
||||||
!= DROPBEAR_SUCCESS) {
|
!= DROPBEAR_SUCCESS) {
|
||||||
|
@ -182,6 +182,11 @@ static void cli_sessionloop() {
|
|||||||
|
|
||||||
TRACE2(("enter cli_sessionloop"))
|
TRACE2(("enter cli_sessionloop"))
|
||||||
|
|
||||||
|
if (ses.lastpacket == 0) {
|
||||||
|
TRACE2(("exit cli_sessionloop: no real packets yet"))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (ses.lastpacket == SSH_MSG_KEXINIT && cli_ses.kex_state == KEX_NOTHING) {
|
if (ses.lastpacket == SSH_MSG_KEXINIT && cli_ses.kex_state == KEX_NOTHING) {
|
||||||
/* We initiate the KEXDH. If DH wasn't the correct type, the KEXINIT
|
/* We initiate the KEXDH. If DH wasn't the correct type, the KEXINIT
|
||||||
* negotiation would have failed. */
|
* negotiation would have failed. */
|
||||||
@ -206,10 +211,9 @@ static void cli_sessionloop() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We should exit if we haven't donefirstkex: we shouldn't reach here
|
|
||||||
* in normal operation */
|
|
||||||
if (ses.kexstate.donefirstkex == 0) {
|
if (ses.kexstate.donefirstkex == 0) {
|
||||||
TRACE(("XXX XXX might be bad! leave cli_sessionloop: haven't donefirstkex"))
|
/* We might reach here if we have partial packet reads or have
|
||||||
|
* received SSG_MSG_IGNORE etc. Just skip it */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,8 +214,8 @@ algo_type sshhostkey[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
algo_type sshkex[] = {
|
algo_type sshkex[] = {
|
||||||
{"diffie-hellman-group1-sha1", DROPBEAR_KEX_DH_GROUP1, NULL, 1, NULL},
|
|
||||||
{"diffie-hellman-group14-sha1", DROPBEAR_KEX_DH_GROUP14, NULL, 1, NULL},
|
{"diffie-hellman-group14-sha1", DROPBEAR_KEX_DH_GROUP14, NULL, 1, NULL},
|
||||||
|
{"diffie-hellman-group1-sha1", DROPBEAR_KEX_DH_GROUP1, NULL, 1, NULL},
|
||||||
{KEXGUESS2_ALGO_NAME, KEXGUESS2_ALGO_ID, NULL, 1, NULL},
|
{KEXGUESS2_ALGO_NAME, KEXGUESS2_ALGO_ID, NULL, 1, NULL},
|
||||||
{NULL, 0, NULL, 0, NULL}
|
{NULL, 0, NULL, 0, NULL}
|
||||||
};
|
};
|
||||||
|
@ -241,6 +241,7 @@ typedef enum {
|
|||||||
struct clientsession {
|
struct clientsession {
|
||||||
|
|
||||||
mp_int *dh_e, *dh_x; /* Used during KEX */
|
mp_int *dh_e, *dh_x; /* Used during KEX */
|
||||||
|
int dh_val_algo; /* KEX algorithm corresponding to current dh_e and dh_x */
|
||||||
cli_kex_state kex_state; /* Used for progressing KEX */
|
cli_kex_state kex_state; /* Used for progressing KEX */
|
||||||
cli_state state; /* Used to progress auth/channelsession etc */
|
cli_state state; /* Used to progress auth/channelsession etc */
|
||||||
unsigned donefirstkex : 1; /* Set when we set sentnewkeys, never reset */
|
unsigned donefirstkex : 1; /* Set when we set sentnewkeys, never reset */
|
||||||
|
@ -61,8 +61,9 @@
|
|||||||
#define DROPBEAR_FAILURE -1
|
#define DROPBEAR_FAILURE -1
|
||||||
|
|
||||||
/* various algorithm identifiers */
|
/* various algorithm identifiers */
|
||||||
#define DROPBEAR_KEX_DH_GROUP1 0
|
#define DROPBEAR_KEX_NONE 0
|
||||||
#define DROPBEAR_KEX_DH_GROUP14 1
|
#define DROPBEAR_KEX_DH_GROUP1 1
|
||||||
|
#define DROPBEAR_KEX_DH_GROUP14 2
|
||||||
|
|
||||||
#define DROPBEAR_SIGNKEY_ANY 0
|
#define DROPBEAR_SIGNKEY_ANY 0
|
||||||
#define DROPBEAR_SIGNKEY_RSA 1
|
#define DROPBEAR_SIGNKEY_RSA 1
|
||||||
|
Loading…
Reference in New Issue
Block a user