version 1.14, 2018/02/07 02:06:51 |
version 1.15, 2018/09/13 02:08:33 |
|
|
const u_char *data, size_t datalen, u_int compat) |
const u_char *data, size_t datalen, u_int compat) |
{ |
{ |
ECDSA_SIG *sig = NULL; |
ECDSA_SIG *sig = NULL; |
|
const BIGNUM *sig_r, *sig_s; |
int hash_alg; |
int hash_alg; |
u_char digest[SSH_DIGEST_MAX_LENGTH]; |
u_char digest[SSH_DIGEST_MAX_LENGTH]; |
size_t len, dlen; |
size_t len, dlen; |
|
|
ret = SSH_ERR_ALLOC_FAIL; |
ret = SSH_ERR_ALLOC_FAIL; |
goto out; |
goto out; |
} |
} |
if ((ret = sshbuf_put_bignum2(bb, sig->r)) != 0 || |
ECDSA_SIG_get0(sig, &sig_r, &sig_s); |
(ret = sshbuf_put_bignum2(bb, sig->s)) != 0) |
if ((ret = sshbuf_put_bignum2(bb, sig_r)) != 0 || |
|
(ret = sshbuf_put_bignum2(bb, sig_s)) != 0) |
goto out; |
goto out; |
if ((ret = sshbuf_put_cstring(b, sshkey_ssh_name_plain(key))) != 0 || |
if ((ret = sshbuf_put_cstring(b, sshkey_ssh_name_plain(key))) != 0 || |
(ret = sshbuf_put_stringb(b, bb)) != 0) |
(ret = sshbuf_put_stringb(b, bb)) != 0) |
|
|
const u_char *data, size_t datalen, u_int compat) |
const u_char *data, size_t datalen, u_int compat) |
{ |
{ |
ECDSA_SIG *sig = NULL; |
ECDSA_SIG *sig = NULL; |
|
BIGNUM *sig_r = NULL, *sig_s = NULL; |
int hash_alg; |
int hash_alg; |
u_char digest[SSH_DIGEST_MAX_LENGTH]; |
u_char digest[SSH_DIGEST_MAX_LENGTH]; |
size_t dlen; |
size_t dlen; |
|
|
} |
} |
|
|
/* parse signature */ |
/* parse signature */ |
if ((sig = ECDSA_SIG_new()) == NULL) { |
if ((sig = ECDSA_SIG_new()) == NULL || |
|
(sig_r = BN_new()) == NULL || |
|
(sig_s = BN_new()) == NULL) { |
ret = SSH_ERR_ALLOC_FAIL; |
ret = SSH_ERR_ALLOC_FAIL; |
goto out; |
goto out; |
} |
} |
if (sshbuf_get_bignum2(sigbuf, sig->r) != 0 || |
if (sshbuf_get_bignum2(sigbuf, sig_r) != 0 || |
sshbuf_get_bignum2(sigbuf, sig->s) != 0) { |
sshbuf_get_bignum2(sigbuf, sig_s) != 0) { |
ret = SSH_ERR_INVALID_FORMAT; |
ret = SSH_ERR_INVALID_FORMAT; |
goto out; |
goto out; |
} |
} |
|
if (!ECDSA_SIG_set0(sig, sig_r, sig_s)) { |
|
ret = SSH_ERR_LIBCRYPTO_ERROR; |
|
goto out; |
|
} |
|
sig_r = sig_s = NULL; /* transferred */ |
|
|
if (sshbuf_len(sigbuf) != 0) { |
if (sshbuf_len(sigbuf) != 0) { |
ret = SSH_ERR_UNEXPECTED_TRAILING_DATA; |
ret = SSH_ERR_UNEXPECTED_TRAILING_DATA; |
goto out; |
goto out; |
|
|
sshbuf_free(sigbuf); |
sshbuf_free(sigbuf); |
sshbuf_free(b); |
sshbuf_free(b); |
ECDSA_SIG_free(sig); |
ECDSA_SIG_free(sig); |
|
BN_clear_free(sig_r); |
|
BN_clear_free(sig_s); |
free(ktype); |
free(ktype); |
return ret; |
return ret; |
} |
} |