From 944bf8f5b550bdbab292e7fadd0016b341c7bef9 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sun, 10 Apr 2011 09:37:18 -0400 Subject: [PATCH] Added GENKEY --preset to add the passphrase of the generated key to the cache. --- agent/ChangeLog | 5 +++++ agent/agent.h | 2 +- agent/command.c | 9 +++++++-- agent/genkey.c | 12 +++++++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/agent/ChangeLog b/agent/ChangeLog index b05c17479..83ad65178 100644 --- a/agent/ChangeLog +++ b/agent/ChangeLog @@ -1,3 +1,8 @@ +2011-04-10 Ben Kibbey + + * command.c: (cmd_genkey): Add option --preset. + * genkey.c: (agent_genkey): Add parameter preset. + 2011-04-06 Ben Kibbey * command.c: (do_one_keyinfo): Add protection type field. diff --git a/agent/agent.h b/agent/agent.h index 3e01897d1..d5aaec8b7 100644 --- a/agent/agent.h +++ b/agent/agent.h @@ -313,7 +313,7 @@ gpg_error_t agent_ask_new_passphrase (ctrl_t ctrl, const char *prompt, char **r_passphrase); int agent_genkey (ctrl_t ctrl, const char *cache_nonce, const char *keyparam, size_t keyparmlen, - int no_protection, membuf_t *outbuf); + int no_protection, int preset, membuf_t *outbuf); gpg_error_t agent_protect_and_store (ctrl_t ctrl, gcry_sexp_t s_skey, char **passphrase_addr); diff --git a/agent/command.c b/agent/command.c index d53ca5e54..0121a20de 100644 --- a/agent/command.c +++ b/agent/command.c @@ -831,7 +831,7 @@ cmd_pkdecrypt (assuan_context_t ctx, char *line) static const char hlp_genkey[] = - "GENKEY [--no-protection] []\n" + "GENKEY [--no-protection] [--preset] []\n" "\n" "Generate a new key, store the secret part and return the public\n" "part. Here is an example transaction:\n" @@ -843,6 +843,9 @@ static const char hlp_genkey[] = " S: D (public-key\n" " S: D (rsa (n 326487324683264) (e 10001)))\n" " S: OK key created\n" + "\n" + "When the --preset option is used the passphrase for the generated\n" + "key will be added to the cache.\n" "\n"; static gpg_error_t cmd_genkey (assuan_context_t ctx, char *line) @@ -854,8 +857,10 @@ cmd_genkey (assuan_context_t ctx, char *line) size_t valuelen; membuf_t outbuf; char *cache_nonce = NULL; + int opt_preset; char *p; + opt_preset = has_option (line, "--preset"); no_protection = has_option (line, "--no-protection"); line = skip_options (line); @@ -874,7 +879,7 @@ cmd_genkey (assuan_context_t ctx, char *line) init_membuf (&outbuf, 512); rc = agent_genkey (ctrl, cache_nonce, (char*)value, valuelen, no_protection, - &outbuf); + opt_preset, &outbuf); xfree (value); if (rc) clear_outbuf (&outbuf); diff --git a/agent/genkey.c b/agent/genkey.c index f70526ddd..95e0a64ce 100644 --- a/agent/genkey.c +++ b/agent/genkey.c @@ -357,7 +357,7 @@ agent_ask_new_passphrase (ctrl_t ctrl, const char *prompt, int agent_genkey (ctrl_t ctrl, const char *cache_nonce, const char *keyparam, size_t keyparamlen, int no_protection, - membuf_t *outbuf) + int preset, membuf_t *outbuf) { gcry_sexp_t s_keyparam, s_key, s_private, s_public; char *passphrase; @@ -434,6 +434,16 @@ agent_genkey (ctrl_t ctrl, const char *cache_nonce, && !agent_put_cache (cache_nonce, CACHE_MODE_NONCE, passphrase, 900 /*seconds*/)) agent_write_status (ctrl, "CACHE_NONCE", cache_nonce, NULL); + if (preset && !no_protection) + { + unsigned char grip[20]; + char hexgrip[40+1]; + if (gcry_pk_get_keygrip (s_private, grip)) + { + bin2hex(grip, 20, hexgrip); + rc = agent_put_cache (hexgrip, CACHE_MODE_ANY, passphrase, 900); + } + } } xfree (passphrase); passphrase = NULL;