version 1.5, 2016/01/12 23:42:54 |
version 1.6, 2019/01/21 09:52:25 |
|
|
return 0; |
return 0; |
} |
} |
|
|
int |
|
sshbuf_get_bignum1(struct sshbuf *buf, BIGNUM *v) |
|
{ |
|
const u_char *d = sshbuf_ptr(buf); |
|
u_int16_t len_bits; |
|
size_t len_bytes; |
|
|
|
/* Length in bits */ |
|
if (sshbuf_len(buf) < 2) |
|
return SSH_ERR_MESSAGE_INCOMPLETE; |
|
len_bits = PEEK_U16(d); |
|
len_bytes = (len_bits + 7) >> 3; |
|
if (len_bytes > SSHBUF_MAX_BIGNUM) |
|
return SSH_ERR_BIGNUM_TOO_LARGE; |
|
if (sshbuf_len(buf) < 2 + len_bytes) |
|
return SSH_ERR_MESSAGE_INCOMPLETE; |
|
if (v != NULL && BN_bin2bn(d + 2, len_bytes, v) == NULL) |
|
return SSH_ERR_ALLOC_FAIL; |
|
if (sshbuf_consume(buf, 2 + len_bytes) != 0) { |
|
SSHBUF_DBG(("SSH_ERR_INTERNAL_ERROR")); |
|
SSHBUF_ABORT(); |
|
return SSH_ERR_INTERNAL_ERROR; |
|
} |
|
return 0; |
|
} |
|
|
|
static int |
static int |
get_ec(const u_char *d, size_t len, EC_POINT *v, const EC_GROUP *g) |
get_ec(const u_char *d, size_t len, EC_POINT *v, const EC_GROUP *g) |
{ |
{ |
|
|
explicit_bzero(d, sizeof(d)); |
explicit_bzero(d, sizeof(d)); |
return r; |
return r; |
} |
} |
explicit_bzero(d, sizeof(d)); |
|
return 0; |
|
} |
|
|
|
int |
|
sshbuf_put_bignum1(struct sshbuf *buf, const BIGNUM *v) |
|
{ |
|
int r, len_bits = BN_num_bits(v); |
|
size_t len_bytes = (len_bits + 7) / 8; |
|
u_char d[SSHBUF_MAX_BIGNUM], *dp; |
|
|
|
if (len_bits < 0 || len_bytes > SSHBUF_MAX_BIGNUM) |
|
return SSH_ERR_INVALID_ARGUMENT; |
|
if (BN_bn2bin(v, d) != (int)len_bytes) |
|
return SSH_ERR_INTERNAL_ERROR; /* Shouldn't happen */ |
|
if ((r = sshbuf_reserve(buf, len_bytes + 2, &dp)) < 0) { |
|
explicit_bzero(d, sizeof(d)); |
|
return r; |
|
} |
|
POKE_U16(dp, len_bits); |
|
if (len_bytes != 0) |
|
memcpy(dp + 2, d, len_bytes); |
|
explicit_bzero(d, sizeof(d)); |
explicit_bzero(d, sizeof(d)); |
return 0; |
return 0; |
} |
} |