version 1.2, 2019/11/12 19:34:40 |
version 1.3, 2019/11/25 00:51:37 |
|
|
int |
int |
ssh_ed25519_sk_verify(const struct sshkey *key, |
ssh_ed25519_sk_verify(const struct sshkey *key, |
const u_char *signature, size_t signaturelen, |
const u_char *signature, size_t signaturelen, |
const u_char *data, size_t datalen, u_int compat) |
const u_char *data, size_t datalen, u_int compat, |
|
struct sshkey_sig_details **detailsp) |
{ |
{ |
struct sshbuf *b = NULL; |
struct sshbuf *b = NULL; |
struct sshbuf *encoded = NULL; |
struct sshbuf *encoded = NULL; |
|
|
unsigned long long smlen = 0, mlen = 0; |
unsigned long long smlen = 0, mlen = 0; |
int r = SSH_ERR_INTERNAL_ERROR; |
int r = SSH_ERR_INTERNAL_ERROR; |
int ret; |
int ret; |
|
struct sshkey_sig_details *details = NULL; |
|
|
|
if (detailsp != NULL) |
|
*detailsp = NULL; |
|
|
if (key == NULL || |
if (key == NULL || |
sshkey_type_plain(key->type) != KEY_ED25519_SK || |
sshkey_type_plain(key->type) != KEY_ED25519_SK || |
key->ed25519_pk == NULL || |
key->ed25519_pk == NULL || |
|
|
r = SSH_ERR_INVALID_ARGUMENT; |
r = SSH_ERR_INVALID_ARGUMENT; |
goto out; |
goto out; |
} |
} |
|
if ((details = calloc(1, sizeof(*details))) == NULL) { |
|
r = SSH_ERR_ALLOC_FAIL; |
|
goto out; |
|
} |
|
details->sk_counter = sig_counter; |
|
details->sk_flags = sig_flags; |
if ((encoded = sshbuf_new()) == NULL) { |
if ((encoded = sshbuf_new()) == NULL) { |
r = SSH_ERR_ALLOC_FAIL; |
r = SSH_ERR_ALLOC_FAIL; |
goto out; |
goto out; |
|
|
/* XXX compare 'm' and 'sm + len' ? */ |
/* XXX compare 'm' and 'sm + len' ? */ |
/* success */ |
/* success */ |
r = 0; |
r = 0; |
|
if (detailsp != NULL) { |
|
*detailsp = details; |
|
details = NULL; |
|
} |
out: |
out: |
if (m != NULL) { |
if (m != NULL) { |
explicit_bzero(m, smlen); /* NB mlen may be invalid if r != 0 */ |
explicit_bzero(m, smlen); /* NB mlen may be invalid if r != 0 */ |
free(m); |
free(m); |
} |
} |
|
sshkey_sig_details_free(details); |
sshbuf_free(b); |
sshbuf_free(b); |
sshbuf_free(encoded); |
sshbuf_free(encoded); |
free(ktype); |
free(ktype); |