diff options
author | NIIBE Yutaka <[email protected]> | 2016-10-20 03:05:15 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2016-10-20 03:05:15 +0000 |
commit | 82cbab906a3e72a98fdc16096f2f0451465969a2 (patch) | |
tree | 03b9e3b4a87abb2082ec628445b438520248337b /agent/findkey.c | |
parent | dirmngr: improve VERSIONCHECK (diff) | |
download | gnupg-82cbab906a3e72a98fdc16096f2f0451465969a2.tar.gz gnupg-82cbab906a3e72a98fdc16096f2f0451465969a2.zip |
agent: Add --card option for READKEY.
* agent/findkey.c (agent_write_shadow_key): New.
* agent/command-ssh.c (card_key_available): Use agent_write_shadow_key.
* agent/learncard.c (agent_handle_learn): Likewise.
* agent/command.c (cmd_readkey): Add --card option.
--
Signed-off-by: NIIBE Yutaka <[email protected]>
Diffstat (limited to '')
-rw-r--r-- | agent/findkey.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/agent/findkey.c b/agent/findkey.c index c5ab0e905..23e94f0dd 100644 --- a/agent/findkey.c +++ b/agent/findkey.c @@ -1492,3 +1492,39 @@ agent_delete_key (ctrl_t ctrl, const char *desc_text, gcry_sexp_release (s_skey); return err; } + + +/* Write an S-expression formatted shadow key to our key storage. + Shadow key is created by an S-expression public key in PKBUF and + card's SERIALNO and the IDSTRING. With FORCE passed as true an + existing key with the given GRIP will get overwritten. */ +gpg_error_t +agent_write_shadow_key (const unsigned char *grip, + const char *serialno, const char *keyid, + const unsigned char *pkbuf, int force) +{ + gpg_error_t err; + unsigned char *shadow_info; + unsigned char *shdkey; + size_t len; + + shadow_info = make_shadow_info (serialno, keyid); + if (!shadow_info) + return gpg_error_from_syserror (); + + err = agent_shadow_key (pkbuf, shadow_info, &shdkey); + xfree (shadow_info); + if (err) + { + log_error ("shadowing the key failed: %s\n", gpg_strerror (err)); + return err; + } + + len = gcry_sexp_canon_len (shdkey, 0, NULL, NULL); + err = agent_write_private_key (grip, shdkey, len, force); + xfree (shdkey); + if (err) + log_error ("error writing key: %s\n", gpg_strerror (err)); + + return err; +} |