aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--agent/ChangeLog5
-rw-r--r--agent/agent.h2
-rw-r--r--agent/command.c9
-rw-r--r--agent/genkey.c12
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 <[email protected]>
+
+ * command.c: (cmd_genkey): Add option --preset.
+ * genkey.c: (agent_genkey): Add parameter preset.
+
2011-04-06 Ben Kibbey <[email protected]>
* 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] [<cache_nonce>]\n"
+ "GENKEY [--no-protection] [--preset] [<cache_nonce>]\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;