aboutsummaryrefslogtreecommitdiffstats
path: root/agent/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/command.c')
-rw-r--r--agent/command.c82
1 files changed, 80 insertions, 2 deletions
diff --git a/agent/command.c b/agent/command.c
index ead026341..50196f432 100644
--- a/agent/command.c
+++ b/agent/command.c
@@ -1200,7 +1200,84 @@ cmd_genkey (assuan_context_t ctx, char *line)
}
+static const char hlp_keyattr[] =
+ "KEYATTR [--delete] <hexstring_with_keygrip> <ATTRNAME> [<VALUE>]\n"
+ "\n"
+ "For the secret key, show the attribute of ATTRNAME. With VALUE,\n"
+ "put the value to the attribute. Use --delete option to delete.";
+static gpg_error_t
+cmd_keyattr (assuan_context_t ctx, char *line)
+{
+ ctrl_t ctrl = assuan_get_pointer (ctx);
+ gpg_error_t err;
+ const char *argv[3];
+ int argc;
+ unsigned char grip[20];
+ int opt_delete;
+
+ if (ctrl->restricted)
+ return leave_cmd (ctx, gpg_error (GPG_ERR_FORBIDDEN));
+
+ opt_delete = has_option (line, "--delete");
+
+ line = skip_options (line);
+
+ argc = split_fields (line, argv, DIM (argv));
+ if (argc < 2)
+ {
+ err = gpg_error (GPG_ERR_MISSING_VALUE);
+ goto leave;
+ }
+
+ err = parse_keygrip (ctx, argv[0], grip);
+ if (err)
+ goto leave;
+
+ if (!err)
+ {
+ gcry_sexp_t s_key = NULL;
+ nvc_t keymeta = NULL;
+ const char *p;
+
+ err = agent_raw_key_from_file (ctrl, grip, &s_key, &keymeta);
+ if (keymeta == NULL) /* Not extended format? */
+ {
+ err = gpg_error (GPG_ERR_INV_DATA);
+ goto leave;
+ }
+
+ if (argc == 2)
+ {
+ nve_t e = nvc_lookup (keymeta, argv[1]);
+
+ if (opt_delete)
+ {
+ if (e)
+ nvc_delete (keymeta, e);
+ }
+ else if (e)
+ {
+ p = nve_value (e);
+ if (p)
+ err = assuan_send_data (ctx, p, strlen (p));
+ }
+ }
+ else if (argc == 3)
+ {
+ err = nvc_set (keymeta, argv[1], argv[2]);
+ if (!err)
+ err = nvc_set_private_key (keymeta, s_key);
+ if (!err)
+ err = agent_update_private_key (grip, keymeta);
+ }
+
+ nvc_release (keymeta);
+ gcry_sexp_release (s_key);
+ }
+ leave:
+ return leave_cmd (ctx, err);
+}
static const char hlp_readkey[] =
"READKEY [--no-data] [--format=ssh] <hexstring_with_keygrip>\n"
@@ -1461,7 +1538,7 @@ do_one_keyinfo (ctrl_t ctrl, const unsigned char *grip, assuan_context_t ctx,
{
gcry_sexp_t key;
- if (!agent_raw_key_from_file (ctrl, grip, &key))
+ if (!agent_raw_key_from_file (ctrl, grip, &key, NULL))
{
ssh_get_fingerprint_string (key, with_ssh_fpr, &fpr);
gcry_sexp_release (key);
@@ -4044,7 +4121,8 @@ register_commands (assuan_context_t ctx)
{ "RELOADAGENT", cmd_reloadagent,hlp_reloadagent },
{ "GETINFO", cmd_getinfo, hlp_getinfo },
{ "KEYTOCARD", cmd_keytocard, hlp_keytocard },
- { "KEYTOTPM", cmd_keytotpm, hlp_keytotpm },
+ { "KEYTOTPM", cmd_keytotpm, hlp_keytotpm },
+ { "KEYATTR", cmd_keyattr, hlp_keyattr },
{ NULL }
};
int i, rc;