version 1.11, 2013/11/03 10:37:19 |
version 1.12, 2014/01/09 23:20:00 |
|
|
#include "cipher.h" |
#include "cipher.h" |
#include "buffer.h" |
#include "buffer.h" |
#include "roaming.h" |
#include "roaming.h" |
|
#include "digest.h" |
|
|
static size_t out_buf_size = 0; |
static size_t out_buf_size = 0; |
static char *out_buf = NULL; |
static char *out_buf = NULL; |
|
|
void |
void |
calculate_new_key(u_int64_t *key, u_int64_t cookie, u_int64_t challenge) |
calculate_new_key(u_int64_t *key, u_int64_t cookie, u_int64_t challenge) |
{ |
{ |
const EVP_MD *md = EVP_sha1(); |
u_char hash[SSH_DIGEST_MAX_LENGTH]; |
EVP_MD_CTX ctx; |
|
u_char hash[EVP_MAX_MD_SIZE]; |
|
Buffer b; |
Buffer b; |
|
|
buffer_init(&b); |
buffer_init(&b); |
|
|
buffer_put_int64(&b, cookie); |
buffer_put_int64(&b, cookie); |
buffer_put_int64(&b, challenge); |
buffer_put_int64(&b, challenge); |
|
|
EVP_DigestInit(&ctx, md); |
if (ssh_digest_buffer(SSH_DIGEST_SHA1, &b, hash, sizeof(hash)) != 0) |
EVP_DigestUpdate(&ctx, buffer_ptr(&b), buffer_len(&b)); |
fatal("%s: digest_buffer failed", __func__); |
EVP_DigestFinal(&ctx, hash, NULL); |
|
|
|
buffer_clear(&b); |
buffer_clear(&b); |
buffer_append(&b, hash, EVP_MD_size(md)); |
buffer_append(&b, hash, ssh_digest_bytes(SSH_DIGEST_SHA1)); |
*key = buffer_get_int64(&b); |
*key = buffer_get_int64(&b); |
buffer_free(&b); |
buffer_free(&b); |
} |
} |