diff options
Diffstat (limited to 'common-kex.c')
-rw-r--r-- | common-kex.c | 44 |
1 files changed, 24 insertions, 20 deletions
diff --git a/common-kex.c b/common-kex.c index ac48699..7d6b43f 100644 --- a/common-kex.c +++ b/common-kex.c @@ -402,18 +402,28 @@ static void gen_new_zstreams() { /* Belongs in common_kex.c where it should be moved after review */ void recv_msg_kexinit() { + unsigned int kexhashbuf_len = 0; + unsigned int remote_ident_len = 0; + unsigned int local_ident_len = 0; + TRACE(("<- KEXINIT")) TRACE(("enter recv_msg_kexinit")) - /* start the kex hash */ - ses.kexhashbuf = buf_new(MAX_KEXHASHBUF); - if (!ses.kexstate.sentkexinit) { /* we need to send a kex packet */ send_msg_kexinit(); TRACE(("continue recv_msg_kexinit: sent kexinit")) } + /* start the kex hash */ + local_ident_len = strlen(LOCAL_IDENT); + remote_ident_len = strlen((char*)ses.remoteident); + + kexhashbuf_len = local_ident_len + remote_ident_len + + ses.transkexinit->len + ses.payload->len + + KEXHASHBUF_MAX_INTS; + + ses.kexhashbuf = buf_new(kexhashbuf_len); if (IS_DROPBEAR_CLIENT) { @@ -422,20 +432,16 @@ void recv_msg_kexinit() { /* V_C, the client's version string (CR and NL excluded) */ buf_putstring(ses.kexhashbuf, - (unsigned char*)LOCAL_IDENT, strlen(LOCAL_IDENT)); + (unsigned char*)LOCAL_IDENT, local_ident_len); /* V_S, the server's version string (CR and NL excluded) */ - buf_putstring(ses.kexhashbuf, - ses.remoteident, strlen((char*)ses.remoteident)); + buf_putstring(ses.kexhashbuf, ses.remoteident, remote_ident_len); /* I_C, the payload of the client's SSH_MSG_KEXINIT */ buf_putstring(ses.kexhashbuf, - buf_getptr(ses.transkexinit, ses.transkexinit->len), - ses.transkexinit->len); + ses.transkexinit->data, ses.transkexinit->len); /* I_S, the payload of the server's SSH_MSG_KEXINIT */ buf_setpos(ses.payload, 0); - buf_putstring(ses.kexhashbuf, - buf_getptr(ses.payload, ses.payload->len), - ses.payload->len); + buf_putstring(ses.kexhashbuf, ses.payload->data, ses.payload->len); } else { /* SERVER */ @@ -443,21 +449,19 @@ void recv_msg_kexinit() { /* read the peer's choice of algos */ read_kex_algos(); /* V_C, the client's version string (CR and NL excluded) */ - buf_putstring(ses.kexhashbuf, - ses.remoteident, strlen((char*)ses.remoteident)); + buf_putstring(ses.kexhashbuf, ses.remoteident, remote_ident_len); /* V_S, the server's version string (CR and NL excluded) */ - buf_putstring(ses.kexhashbuf, - (unsigned char*)LOCAL_IDENT, strlen(LOCAL_IDENT)); + buf_putstring(ses.kexhashbuf, + (unsigned char*)LOCAL_IDENT, local_ident_len); /* I_C, the payload of the client's SSH_MSG_KEXINIT */ buf_setpos(ses.payload, 0); - buf_putstring(ses.kexhashbuf, - buf_getptr(ses.payload, ses.payload->len), - ses.payload->len); + buf_putstring(ses.kexhashbuf, ses.payload->data, ses.payload->len); + /* I_S, the payload of the server's SSH_MSG_KEXINIT */ buf_putstring(ses.kexhashbuf, - buf_getptr(ses.transkexinit, ses.transkexinit->len), - ses.transkexinit->len); + ses.transkexinit->data, ses.transkexinit->len); + ses.requirenext = SSH_MSG_KEXDH_INIT; } |