version 1.4, 2019/11/12 19:30:50 |
version 1.5, 2019/11/12 19:31:18 |
|
|
sshbuf_dump_data(resp->sig_r, resp->sig_r_len, stderr); |
sshbuf_dump_data(resp->sig_r, resp->sig_r_len, stderr); |
fprintf(stderr, "%s: sig_s:\n", __func__); |
fprintf(stderr, "%s: sig_s:\n", __func__); |
sshbuf_dump_data(resp->sig_s, resp->sig_s_len, stderr); |
sshbuf_dump_data(resp->sig_s, resp->sig_s_len, stderr); |
fprintf(stderr, "%s: sig_flags = 0x%02x, sig_counter = %u\n", |
|
__func__, resp->flags, resp->counter); |
|
#endif |
#endif |
*retp = inner_sig; |
*retp = inner_sig; |
inner_sig = NULL; |
inner_sig = NULL; |
|
|
return r; |
return r; |
} |
} |
|
|
|
static int |
|
sshsk_ed25519_inner_sig(struct sk_sign_response *resp, struct sshbuf **retp) |
|
{ |
|
struct sshbuf *inner_sig = NULL; |
|
int r = SSH_ERR_INTERNAL_ERROR; |
|
|
|
*retp = NULL; |
|
if ((inner_sig = sshbuf_new()) == NULL) { |
|
r = SSH_ERR_ALLOC_FAIL; |
|
goto out; |
|
} |
|
/* Prepare inner signature object */ |
|
if ((r = sshbuf_put_string(inner_sig, |
|
resp->sig_r, resp->sig_r_len)) != 0 || |
|
(r = sshbuf_put_u8(inner_sig, resp->flags)) != 0 || |
|
(r = sshbuf_put_u32(inner_sig, resp->counter)) != 0) { |
|
debug("%s: buffer error: %s", __func__, ssh_err(r)); |
|
goto out; |
|
} |
|
#ifdef DEBUG_SK |
|
fprintf(stderr, "%s: sig_r:\n", __func__); |
|
sshbuf_dump_data(resp->sig_r, resp->sig_r_len, stderr); |
|
#endif |
|
*retp = inner_sig; |
|
inner_sig = NULL; |
|
r = 0; |
|
out: |
|
sshbuf_free(inner_sig); |
|
return r; |
|
} |
|
|
int |
int |
sshsk_sign(const char *provider_path, const struct sshkey *key, |
sshsk_sign(const char *provider_path, const struct sshkey *key, |
u_char **sigp, size_t *lenp, const u_char *data, size_t datalen, |
u_char **sigp, size_t *lenp, const u_char *data, size_t datalen, |
|
|
{ |
{ |
struct sshsk_provider *skp = NULL; |
struct sshsk_provider *skp = NULL; |
int r = SSH_ERR_INTERNAL_ERROR; |
int r = SSH_ERR_INTERNAL_ERROR; |
|
int type; |
struct sk_sign_response *resp = NULL; |
struct sk_sign_response *resp = NULL; |
struct sshbuf *inner_sig = NULL, *sig = NULL; |
struct sshbuf *inner_sig = NULL, *sig = NULL; |
uint8_t message[32]; |
uint8_t message[32]; |
|
|
*sigp = NULL; |
*sigp = NULL; |
if (lenp != NULL) |
if (lenp != NULL) |
*lenp = 0; |
*lenp = 0; |
|
type = sshkey_type_plain(key->type); |
|
switch (type) { |
|
case KEY_ECDSA_SK: |
|
case KEY_ED25519_SK: |
|
break; |
|
default: |
|
return SSH_ERR_INVALID_ARGUMENT; |
|
} |
if (provider_path == NULL || |
if (provider_path == NULL || |
sshkey_type_plain(key->type) != KEY_ECDSA_SK || |
|
key->sk_key_handle == NULL || |
key->sk_key_handle == NULL || |
key->sk_application == NULL || *key->sk_application == '\0') { |
key->sk_application == NULL || *key->sk_application == '\0') { |
r = SSH_ERR_INVALID_ARGUMENT; |
r = SSH_ERR_INVALID_ARGUMENT; |
|
|
goto out; |
goto out; |
} |
} |
/* Prepare inner signature object */ |
/* Prepare inner signature object */ |
if ((r = sshsk_ecdsa_inner_sig(resp, &inner_sig)) != 0) |
switch (type) { |
goto out; |
case KEY_ECDSA_SK: |
|
if ((r = sshsk_ecdsa_inner_sig(resp, &inner_sig)) != 0) |
|
goto out; |
|
break; |
|
case KEY_ED25519_SK: |
|
if ((r = sshsk_ed25519_inner_sig(resp, &inner_sig)) != 0) |
|
goto out; |
|
break; |
|
} |
/* Assemble outer signature */ |
/* Assemble outer signature */ |
if ((sig = sshbuf_new()) == NULL) { |
if ((sig = sshbuf_new()) == NULL) { |
r = SSH_ERR_ALLOC_FAIL; |
r = SSH_ERR_ALLOC_FAIL; |
|
|
goto out; |
goto out; |
} |
} |
#ifdef DEBUG_SK |
#ifdef DEBUG_SK |
|
fprintf(stderr, "%s: sig_flags = 0x%02x, sig_counter = %u\n", |
|
__func__, resp->flags, resp->counter); |
fprintf(stderr, "%s: hashed message:\n", __func__); |
fprintf(stderr, "%s: hashed message:\n", __func__); |
sshbuf_dump_data(message, sizeof(message), stderr); |
sshbuf_dump_data(message, sizeof(message), stderr); |
fprintf(stderr, "%s: inner:\n", __func__); |
fprintf(stderr, "%s: inner:\n", __func__); |