aboutsummaryrefslogtreecommitdiffstats
path: root/agent/findkey.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2016-10-20 03:05:15 +0000
committerNIIBE Yutaka <[email protected]>2016-10-20 03:05:15 +0000
commit82cbab906a3e72a98fdc16096f2f0451465969a2 (patch)
tree03b9e3b4a87abb2082ec628445b438520248337b /agent/findkey.c
parentdirmngr: improve VERSIONCHECK (diff)
downloadgnupg-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.c36
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;
+}