/* Bring the new keys into use after a key exchange */ void recv_msg_newkeys() { TRACE(("enter recv_msg_newkeys")); /* simply check if we've sent SSH_MSG_NEWKEYS, and if so, * switch to the new keys */ if (ses.kexstate.sentnewkeys) { gen_new_keys(); kexinitialise(); /* we've finished with this kex */ } else { ses.kexstate.recvnewkeys = 1; } ses.dataallowed = 1; /* we can send other packets again now */ TRACE(("leave recv_msg_newkeys")); }
/* Bring new keys into use after a key exchange, and let the client know*/ void send_msg_newkeys() { TRACE(("enter send_msg_newkeys")); /* generate the kexinit request */ CHECKCLEARTOWRITE(); buf_putbyte(ses.writepayload, SSH_MSG_NEWKEYS); encrypt_packet(); /* set up our state */ if (ses.kexstate.recvnewkeys) { gen_new_keys(); kexinitialise(); /* we've finished with this kex */ } else { ses.kexstate.sentnewkeys = 1; } TRACE(("leave send_msg_newkeys")); }
/* called only at the start of a session, set up initial state */ static void session_init(int sock, runopts *opts, int childpipe, struct sockaddr *remoteaddr) { struct timeval tv; TRACE(("enter session_init")); ses.remoteaddr = remoteaddr; ses.hostname = getaddrhostname(remoteaddr); ses.sock = sock; ses.maxfd = sock; ses.childpipe = childpipe; ses.opts = opts; if (gettimeofday(&tv, 0) < 0) { dropbear_exit("Error getting time"); } ses.connecttime = tv.tv_sec; kexinitialise(); /* initialise the kex state */ authinitialise(); /* initialise auth state */ chaninitialise(); /* initialise the channel state */ ses.writepayload = buf_new(MAX_TRANS_PAYLOAD_LEN); ses.transseq = 0; ses.readbuf = NULL; ses.decryptreadbuf = NULL; ses.payload = NULL; ses.recvseq = 0; ses.expecting = SSH_MSG_KEXINIT; ses.dataallowed = 0; /* don't send data yet, we'll wait until after kex */ ses.ignorenext = 0; /* set all the algos to none */ ses.keys = (struct key_context*)m_malloc(sizeof(struct key_context)); ses.newkeys = NULL; ses.keys->recv_algo_crypt = &dropbear_nocipher; ses.keys->trans_algo_crypt = &dropbear_nocipher; ses.keys->recv_algo_mac = &dropbear_nohash; ses.keys->trans_algo_mac = &dropbear_nohash; ses.keys->algo_kex = -1; ses.keys->algo_hostkey = -1; ses.keys->recv_algo_comp = DROPBEAR_COMP_NONE; ses.keys->trans_algo_comp = DROPBEAR_COMP_NONE; #ifndef DISABLE_ZLIB ses.keys->recv_zstream = NULL; ses.keys->trans_zstream = NULL; #endif /* key exchange buffers */ ses.session_id = NULL; ses.kexhashbuf = NULL; ses.transkexinit = NULL; ses.dh_K = NULL; ses.remoteident = NULL; sessinitdone = 1; TRACE(("leave session_init")); }