version 1.15, 2019/01/21 12:53:35 |
version 1.16, 2020/01/25 00:03:36 |
|
|
} |
} |
|
|
int |
int |
pkcs11_add_provider(char *name, char *pin, struct sshkey ***keysp) |
pkcs11_add_provider(char *name, char *pin, struct sshkey ***keysp, |
|
char ***labelsp) |
{ |
{ |
struct sshkey *k; |
struct sshkey *k; |
int r, type; |
int r, type; |
u_char *blob; |
u_char *blob; |
|
char *label; |
size_t blen; |
size_t blen; |
u_int nkeys, i; |
u_int nkeys, i; |
struct sshbuf *msg; |
struct sshbuf *msg; |
|
|
if ((r = sshbuf_get_u32(msg, &nkeys)) != 0) |
if ((r = sshbuf_get_u32(msg, &nkeys)) != 0) |
fatal("%s: buffer error: %s", __func__, ssh_err(r)); |
fatal("%s: buffer error: %s", __func__, ssh_err(r)); |
*keysp = xcalloc(nkeys, sizeof(struct sshkey *)); |
*keysp = xcalloc(nkeys, sizeof(struct sshkey *)); |
|
if (labelsp) |
|
*labelsp = xcalloc(nkeys, sizeof(char *)); |
for (i = 0; i < nkeys; i++) { |
for (i = 0; i < nkeys; i++) { |
/* XXX clean up properly instead of fatal() */ |
/* XXX clean up properly instead of fatal() */ |
if ((r = sshbuf_get_string(msg, &blob, &blen)) != 0 || |
if ((r = sshbuf_get_string(msg, &blob, &blen)) != 0 || |
(r = sshbuf_skip_string(msg)) != 0) |
(r = sshbuf_get_cstring(msg, &label, NULL)) != 0) |
fatal("%s: buffer error: %s", |
fatal("%s: buffer error: %s", |
__func__, ssh_err(r)); |
__func__, ssh_err(r)); |
if ((r = sshkey_from_blob(blob, blen, &k)) != 0) |
if ((r = sshkey_from_blob(blob, blen, &k)) != 0) |
fatal("%s: bad key: %s", __func__, ssh_err(r)); |
fatal("%s: bad key: %s", __func__, ssh_err(r)); |
wrap_key(k); |
wrap_key(k); |
(*keysp)[i] = k; |
(*keysp)[i] = k; |
|
if (labelsp) |
|
(*labelsp)[i] = label; |
|
else |
|
free(label); |
free(blob); |
free(blob); |
} |
} |
} else if (type == SSH2_AGENT_FAILURE) { |
} else if (type == SSH2_AGENT_FAILURE) { |