version 1.2, 2013/11/02 22:02:14 |
version 1.3, 2014/01/09 23:20:00 |
|
|
#include "cipher.h" |
#include "cipher.h" |
#include "kex.h" |
#include "kex.h" |
#include "log.h" |
#include "log.h" |
|
#include "digest.h" |
|
|
extern int crypto_scalarmult_curve25519(u_char a[CURVE25519_SIZE], |
extern int crypto_scalarmult_curve25519(u_char a[CURVE25519_SIZE], |
const u_char b[CURVE25519_SIZE], const u_char c[CURVE25519_SIZE]) |
const u_char b[CURVE25519_SIZE], const u_char c[CURVE25519_SIZE]) |
|
|
|
|
void |
void |
kex_c25519_hash( |
kex_c25519_hash( |
const EVP_MD *evp_md, |
int hash_alg, |
char *client_version_string, |
char *client_version_string, |
char *server_version_string, |
char *server_version_string, |
char *ckexinit, int ckexinitlen, |
char *ckexinit, int ckexinitlen, |
|
|
u_char **hash, u_int *hashlen) |
u_char **hash, u_int *hashlen) |
{ |
{ |
Buffer b; |
Buffer b; |
EVP_MD_CTX md; |
static u_char digest[SSH_DIGEST_MAX_LENGTH]; |
static u_char digest[EVP_MAX_MD_SIZE]; |
|
|
|
buffer_init(&b); |
buffer_init(&b); |
buffer_put_cstring(&b, client_version_string); |
buffer_put_cstring(&b, client_version_string); |
|
|
#ifdef DEBUG_KEX |
#ifdef DEBUG_KEX |
buffer_dump(&b); |
buffer_dump(&b); |
#endif |
#endif |
EVP_DigestInit(&md, evp_md); |
if (ssh_digest_buffer(hash_alg, &b, digest, sizeof(digest)) != 0) |
EVP_DigestUpdate(&md, buffer_ptr(&b), buffer_len(&b)); |
fatal("%s: digest_buffer failed", __func__); |
EVP_DigestFinal(&md, digest, NULL); |
|
|
|
buffer_free(&b); |
buffer_free(&b); |
|
|
#ifdef DEBUG_KEX |
#ifdef DEBUG_KEX |
dump_digest("hash", digest, EVP_MD_size(evp_md)); |
dump_digest("hash", digest, ssh_digest_bytes(hash_alg)); |
#endif |
#endif |
*hash = digest; |
*hash = digest; |
*hashlen = EVP_MD_size(evp_md); |
*hashlen = ssh_digest_bytes(hash_alg); |
} |
} |