version 1.55.2.1, 2004/02/28 03:51:33 |
version 1.55.2.2, 2004/08/19 22:37:31 |
|
|
void |
void |
kex_send_kexinit(Kex *kex) |
kex_send_kexinit(Kex *kex) |
{ |
{ |
u_int32_t rand = 0; |
u_int32_t rnd = 0; |
u_char *cookie; |
u_char *cookie; |
int i; |
int i; |
|
|
|
|
cookie = buffer_ptr(&kex->my); |
cookie = buffer_ptr(&kex->my); |
for (i = 0; i < KEX_COOKIE_LEN; i++) { |
for (i = 0; i < KEX_COOKIE_LEN; i++) { |
if (i % 4 == 0) |
if (i % 4 == 0) |
rand = arc4random(); |
rnd = arc4random(); |
cookie[i] = rand; |
cookie[i] = rnd; |
rand >>= 8; |
rnd >>= 8; |
} |
} |
packet_start(SSH2_MSG_KEXINIT); |
packet_start(SSH2_MSG_KEXINIT); |
packet_put_raw(buffer_ptr(&kex->my), buffer_len(&kex->my)); |
packet_put_raw(buffer_ptr(&kex->my), buffer_len(&kex->my)); |
|
|
fatal("no kex alg"); |
fatal("no kex alg"); |
if (strcmp(k->name, KEX_DH1) == 0) { |
if (strcmp(k->name, KEX_DH1) == 0) { |
k->kex_type = KEX_DH_GRP1_SHA1; |
k->kex_type = KEX_DH_GRP1_SHA1; |
|
} else if (strcmp(k->name, KEX_DH14) == 0) { |
|
k->kex_type = KEX_DH_GRP14_SHA1; |
} else if (strcmp(k->name, KEX_DHGEX) == 0) { |
} else if (strcmp(k->name, KEX_DHGEX) == 0) { |
k->kex_type = KEX_DH_GEX_SHA1; |
k->kex_type = KEX_DH_GEX_SHA1; |
} else |
} else |
|
|
ret = current_keys[mode]; |
ret = current_keys[mode]; |
current_keys[mode] = NULL; |
current_keys[mode] = NULL; |
return ret; |
return ret; |
|
} |
|
|
|
void |
|
derive_ssh1_session_id(BIGNUM *host_modulus, BIGNUM *server_modulus, |
|
u_int8_t cookie[8], u_int8_t id[16]) |
|
{ |
|
const EVP_MD *evp_md = EVP_md5(); |
|
EVP_MD_CTX md; |
|
u_int8_t nbuf[2048], obuf[EVP_MAX_MD_SIZE]; |
|
int len; |
|
|
|
EVP_DigestInit(&md, evp_md); |
|
|
|
len = BN_num_bytes(host_modulus); |
|
if (len < (512 / 8) || len > sizeof(nbuf)) |
|
fatal("%s: bad host modulus (len %d)", __func__, len); |
|
BN_bn2bin(host_modulus, nbuf); |
|
EVP_DigestUpdate(&md, nbuf, len); |
|
|
|
len = BN_num_bytes(server_modulus); |
|
if (len < (512 / 8) || len > sizeof(nbuf)) |
|
fatal("%s: bad server modulus (len %d)", __func__, len); |
|
BN_bn2bin(server_modulus, nbuf); |
|
EVP_DigestUpdate(&md, nbuf, len); |
|
|
|
EVP_DigestUpdate(&md, cookie, 8); |
|
|
|
EVP_DigestFinal(&md, obuf, NULL); |
|
memcpy(id, obuf, 16); |
|
|
|
memset(nbuf, 0, sizeof(nbuf)); |
|
memset(obuf, 0, sizeof(obuf)); |
|
memset(&md, 0, sizeof(md)); |
} |
} |
|
|
#if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) |
#if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) |