version 1.104, 2015/01/26 06:10:03 |
version 1.105, 2015/01/30 00:22:25 |
|
|
derive_ssh1_session_id(BIGNUM *host_modulus, BIGNUM *server_modulus, |
derive_ssh1_session_id(BIGNUM *host_modulus, BIGNUM *server_modulus, |
u_int8_t cookie[8], u_int8_t id[16]) |
u_int8_t cookie[8], u_int8_t id[16]) |
{ |
{ |
u_int8_t nbuf[2048], obuf[SSH_DIGEST_MAX_LENGTH]; |
u_int8_t hbuf[2048], sbuf[2048], obuf[SSH_DIGEST_MAX_LENGTH]; |
struct ssh_digest_ctx *hashctx = NULL; |
struct ssh_digest_ctx *hashctx = NULL; |
size_t len; |
size_t hlen, slen; |
int r; |
int r; |
|
|
len = BN_num_bytes(host_modulus); |
hlen = BN_num_bytes(host_modulus); |
if (len < (512 / 8) || (u_int)len > sizeof(nbuf)) |
slen = BN_num_bytes(server_modulus); |
|
if (hlen < (512 / 8) || (u_int)hlen > sizeof(hbuf) || |
|
slen < (512 / 8) || (u_int)slen > sizeof(sbuf)) |
return SSH_ERR_KEY_BITS_MISMATCH; |
return SSH_ERR_KEY_BITS_MISMATCH; |
if (BN_bn2bin(host_modulus, nbuf) <= 0 || |
if (BN_bn2bin(host_modulus, hbuf) <= 0 || |
(hashctx = ssh_digest_start(SSH_DIGEST_MD5)) == NULL || |
BN_bn2bin(server_modulus, sbuf) <= 0) { |
ssh_digest_update(hashctx, nbuf, len) != 0 || |
r = SSH_ERR_LIBCRYPTO_ERROR; |
|
goto out; |
|
} |
|
if ((hashctx = ssh_digest_start(SSH_DIGEST_MD5)) == NULL) { |
|
r = SSH_ERR_ALLOC_FAIL; |
|
goto out; |
|
} |
|
if (ssh_digest_update(hashctx, hbuf, hlen) != 0 || |
|
ssh_digest_update(hashctx, sbuf, slen) != 0 || |
ssh_digest_update(hashctx, cookie, 8) != 0 || |
ssh_digest_update(hashctx, cookie, 8) != 0 || |
ssh_digest_final(hashctx, obuf, sizeof(obuf)) != 0) { |
ssh_digest_final(hashctx, obuf, sizeof(obuf)) != 0) { |
r = SSH_ERR_LIBCRYPTO_ERROR; |
r = SSH_ERR_LIBCRYPTO_ERROR; |
|
|
r = 0; |
r = 0; |
out: |
out: |
ssh_digest_free(hashctx); |
ssh_digest_free(hashctx); |
explicit_bzero(nbuf, sizeof(nbuf)); |
explicit_bzero(hbuf, sizeof(hbuf)); |
|
explicit_bzero(sbuf, sizeof(sbuf)); |
explicit_bzero(obuf, sizeof(obuf)); |
explicit_bzero(obuf, sizeof(obuf)); |
return r; |
return r; |
} |
} |