version 1.11, 2022/10/28 00:41:52 |
version 1.12, 2022/10/28 00:43:08 |
|
|
return ret; |
return ret; |
} |
} |
|
|
int |
static int |
ssh_xmss_sign(const struct sshkey *key, u_char **sigp, size_t *lenp, |
ssh_xmss_sign(struct sshkey *key, |
const u_char *data, size_t datalen, u_int compat) |
u_char **sigp, size_t *lenp, |
|
const u_char *data, size_t datalen, |
|
const char *alg, const char *sk_provider, const char *sk_pin, u_int compat) |
{ |
{ |
u_char *sig = NULL; |
u_char *sig = NULL; |
size_t slen = 0, len = 0, required_siglen; |
size_t slen = 0, len = 0, required_siglen; |
|
|
return r; |
return r; |
} |
} |
|
|
int |
static int |
ssh_xmss_verify(const struct sshkey *key, |
ssh_xmss_verify(const struct sshkey *key, |
const u_char *signature, size_t signaturelen, |
const u_char *sig, size_t siglen, |
const u_char *data, size_t datalen, u_int compat) |
const u_char *data, size_t dlen, const char *alg, u_int compat, |
|
struct sshkey_sig_details **detailsp) |
{ |
{ |
struct sshbuf *b = NULL; |
struct sshbuf *b = NULL; |
char *ktype = NULL; |
char *ktype = NULL; |
|
|
sshkey_type_plain(key->type) != KEY_XMSS || |
sshkey_type_plain(key->type) != KEY_XMSS || |
key->xmss_pk == NULL || |
key->xmss_pk == NULL || |
sshkey_xmss_params(key) == NULL || |
sshkey_xmss_params(key) == NULL || |
signature == NULL || signaturelen == 0) |
sig == NULL || siglen == 0) |
return SSH_ERR_INVALID_ARGUMENT; |
return SSH_ERR_INVALID_ARGUMENT; |
if ((r = sshkey_xmss_siglen(key, &required_siglen)) != 0) |
if ((r = sshkey_xmss_siglen(key, &required_siglen)) != 0) |
return r; |
return r; |
if (datalen >= INT_MAX - required_siglen) |
if (dlen >= INT_MAX - required_siglen) |
return SSH_ERR_INVALID_ARGUMENT; |
return SSH_ERR_INVALID_ARGUMENT; |
|
|
if ((b = sshbuf_from(signature, signaturelen)) == NULL) |
if ((b = sshbuf_from(sig, siglen)) == NULL) |
return SSH_ERR_ALLOC_FAIL; |
return SSH_ERR_ALLOC_FAIL; |
if ((r = sshbuf_get_cstring(b, &ktype, NULL)) != 0 || |
if ((r = sshbuf_get_cstring(b, &ktype, NULL)) != 0 || |
(r = sshbuf_get_string_direct(b, &sigblob, &len)) != 0) |
(r = sshbuf_get_string_direct(b, &sigblob, &len)) != 0) |
|
|
r = SSH_ERR_INVALID_FORMAT; |
r = SSH_ERR_INVALID_FORMAT; |
goto out; |
goto out; |
} |
} |
if (datalen >= SIZE_MAX - len) { |
if (dlen >= SIZE_MAX - len) { |
r = SSH_ERR_INVALID_ARGUMENT; |
r = SSH_ERR_INVALID_ARGUMENT; |
goto out; |
goto out; |
} |
} |
smlen = len + datalen; |
smlen = len + dlen; |
mlen = smlen; |
mlen = smlen; |
if ((sm = malloc(smlen)) == NULL || (m = malloc(mlen)) == NULL) { |
if ((sm = malloc(smlen)) == NULL || (m = malloc(mlen)) == NULL) { |
r = SSH_ERR_ALLOC_FAIL; |
r = SSH_ERR_ALLOC_FAIL; |
goto out; |
goto out; |
} |
} |
memcpy(sm, sigblob, len); |
memcpy(sm, sigblob, len); |
memcpy(sm+len, data, datalen); |
memcpy(sm+len, data, dlen); |
if ((ret = xmss_sign_open(m, &mlen, sm, smlen, |
if ((ret = xmss_sign_open(m, &mlen, sm, smlen, |
key->xmss_pk, sshkey_xmss_params(key))) != 0) { |
key->xmss_pk, sshkey_xmss_params(key))) != 0) { |
debug2_f("xmss_sign_open failed: %d", ret); |
debug2_f("xmss_sign_open failed: %d", ret); |
} |
} |
if (ret != 0 || mlen != datalen) { |
if (ret != 0 || mlen != dlen) { |
r = SSH_ERR_SIGNATURE_INVALID; |
r = SSH_ERR_SIGNATURE_INVALID; |
goto out; |
goto out; |
} |
} |
|
|
/* .ssh_deserialize_public = */ ssh_xmss_deserialize_public, |
/* .ssh_deserialize_public = */ ssh_xmss_deserialize_public, |
/* .generate = */ sshkey_xmss_generate_private_key, |
/* .generate = */ sshkey_xmss_generate_private_key, |
/* .copy_public = */ ssh_xmss_copy_public, |
/* .copy_public = */ ssh_xmss_copy_public, |
|
/* .sign = */ ssh_xmss_sign, |
|
/* .verify = */ ssh_xmss_verify, |
}; |
}; |
|
|
const struct sshkey_impl sshkey_xmss_impl = { |
const struct sshkey_impl sshkey_xmss_impl = { |