void kexdh(Kex *kex) { if (kex->server) kexdh_server(kex); else kexdh_client(kex); }
void do_kex2_exchange() { Kex *kex ; int seqnr; if (options.ciphers != NULL) { myproposal[PROPOSAL_ENC_ALGS_CTOS] = myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers; } myproposal[PROPOSAL_ENC_ALGS_CTOS] = compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_CTOS]); myproposal[PROPOSAL_ENC_ALGS_STOC] = compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_STOC]); if (options.macs != NULL) { myproposal[PROPOSAL_MAC_ALGS_CTOS] = myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs; } if (options.compression == COMP_NONE) { myproposal[PROPOSAL_COMP_ALGS_CTOS] = myproposal[PROPOSAL_COMP_ALGS_STOC] = "none"; } else if (options.compression == COMP_DELAYED) { myproposal[PROPOSAL_COMP_ALGS_CTOS] = myproposal[PROPOSAL_COMP_ALGS_STOC] = "none,[email protected]"; } myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = list_hostkey_types(); kex = xcalloc(1, sizeof(*kex)); buffer_init(&kex->peer); buffer_init(&kex->my); kex_prop2buf(&kex->my, myproposal); kex->done = 0; kex->server = 1; kex->client_version_string=g_data.client_version_string; kex->server_version_string=g_data.server_version_string; kex->load_host_key=&get_hostkey_by_type; kex->host_key_index=&get_hostkey_index; kex_send_kexinit(kex); //packet_read_expect(SSH2_MSG_KEXINIT); if (SSH2_MSG_KEXINIT != packet_read_seqnr(&seqnr)) { goto err; } kex_input_init(0, seqnr, kex); kex_choose_conf(kex); switch (kex->kex_type) { case KEX_DH_GRP1_SHA1: case KEX_DH_GRP14_SHA1: kexdh_server(kex); break; case KEX_DH_GEX_SHA1: case KEX_DH_GEX_SHA256: kexgex_server(kex); break; default: goto err; } g_data.kex = kex; err: return ; }