version 1.3, 2014/01/09 23:20:00 |
version 1.4, 2014/01/12 08:13:13 |
|
|
void |
void |
kexc25519_client(Kex *kex) |
kexc25519_client(Kex *kex) |
{ |
{ |
BIGNUM *shared_secret; |
|
Key *server_host_key; |
Key *server_host_key; |
u_char client_key[CURVE25519_SIZE]; |
u_char client_key[CURVE25519_SIZE]; |
u_char client_pubkey[CURVE25519_SIZE]; |
u_char client_pubkey[CURVE25519_SIZE]; |
|
|
u_char *server_host_key_blob = NULL, *signature = NULL; |
u_char *server_host_key_blob = NULL, *signature = NULL; |
u_char *hash; |
u_char *hash; |
u_int slen, sbloblen, hashlen; |
u_int slen, sbloblen, hashlen; |
|
Buffer shared_secret; |
|
|
kexc25519_keygen(client_key, client_pubkey); |
kexc25519_keygen(client_key, client_pubkey); |
|
|
|
|
signature = packet_get_string(&slen); |
signature = packet_get_string(&slen); |
packet_check_eom(); |
packet_check_eom(); |
|
|
shared_secret = kexc25519_shared_key(client_key, server_pubkey); |
buffer_init(&shared_secret); |
|
kexc25519_shared_key(client_key, server_pubkey, &shared_secret); |
|
|
/* calc and verify H */ |
/* calc and verify H */ |
kex_c25519_hash( |
kex_c25519_hash( |
|
|
server_host_key_blob, sbloblen, |
server_host_key_blob, sbloblen, |
client_pubkey, |
client_pubkey, |
server_pubkey, |
server_pubkey, |
shared_secret, |
buffer_ptr(&shared_secret), buffer_len(&shared_secret), |
&hash, &hashlen |
&hash, &hashlen |
); |
); |
free(server_host_key_blob); |
free(server_host_key_blob); |
|
|
kex->session_id = xmalloc(kex->session_id_len); |
kex->session_id = xmalloc(kex->session_id_len); |
memcpy(kex->session_id, hash, kex->session_id_len); |
memcpy(kex->session_id, hash, kex->session_id_len); |
} |
} |
|
kex_derive_keys(kex, hash, hashlen, |
kex_derive_keys(kex, hash, hashlen, shared_secret); |
buffer_ptr(&shared_secret), buffer_len(&shared_secret)); |
BN_clear_free(shared_secret); |
buffer_free(&shared_secret); |
kex_finish(kex); |
kex_finish(kex); |
} |
} |