aboutsummaryrefslogtreecommitdiffstats
path: root/agent/findkey.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2017-03-24 09:30:17 +0000
committerWerner Koch <[email protected]>2017-03-24 09:35:36 +0000
commit2c237c13628a88ba23742da34ea18d3e205d7c53 (patch)
tree460f3b0071cb276356ad1f34578897fd0e3f0aaa /agent/findkey.c
parentagent: New option --stub-only for DELETE_KEY (diff)
downloadgnupg-2c237c13628a88ba23742da34ea18d3e205d7c53.tar.gz
gnupg-2c237c13628a88ba23742da34ea18d3e205d7c53.zip
agent: New option --enable-extended-key-format.
* agent/gpg-agent.c (oEnableExtendedKeyFormat): New const. (opts): New option --enable-extended-key-format. (parse_rereadable_options): Set option * agent/findkey.c (write_extended_private_key): Add arg 'update'. (agent_write_private_key): Implement new option. Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'agent/findkey.c')
-rw-r--r--agent/findkey.c44
1 files changed, 33 insertions, 11 deletions
diff --git a/agent/findkey.c b/agent/findkey.c
index 4429b7a17..0b2ddf1f9 100644
--- a/agent/findkey.c
+++ b/agent/findkey.c
@@ -52,23 +52,38 @@ struct try_unprotect_arg_s
};
+/* Note: Ownership of FNAME and FP are moved to this function. */
static gpg_error_t
-write_extended_private_key (char *fname, estream_t fp,
+write_extended_private_key (char *fname, estream_t fp, int update,
const void *buf, size_t len)
{
gpg_error_t err;
nvc_t pk = NULL;
gcry_sexp_t key = NULL;
int remove = 0;
- int line;
- err = nvc_parse_private_key (&pk, &line, fp);
- if (err)
+ if (update)
{
- log_error ("error parsing '%s' line %d: %s\n",
- fname, line, gpg_strerror (err));
- goto leave;
+ int line;
+
+ err = nvc_parse_private_key (&pk, &line, fp);
+ if (err && gpg_err_code (err) != GPG_ERR_ENOENT)
+ {
+ log_error ("error parsing '%s' line %d: %s\n",
+ fname, line, gpg_strerror (err));
+ goto leave;
+ }
}
+ else
+ {
+ pk = nvc_new_private_key ();
+ if (!pk)
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
+ }
+ es_clearerr (fp);
err = gcry_sexp_sscan (&key, NULL, buf, len);
if (err)
@@ -111,8 +126,7 @@ write_extended_private_key (char *fname, estream_t fp,
bump_key_eventcounter ();
leave:
- if (fp)
- es_fclose (fp);
+ es_fclose (fp);
if (remove)
gnupg_remove (fname);
xfree (fname);
@@ -193,11 +207,19 @@ agent_write_private_key (const unsigned char *grip,
if (first != '(')
{
- /* Key is in extended format. */
- return write_extended_private_key (fname, fp, buffer, length);
+ /* Key is already in the extended format. */
+ return write_extended_private_key (fname, fp, 1, buffer, length);
+ }
+ if (first == '(' && opt.enable_extended_key_format)
+ {
+ /* Key is in the old format - but we want the extended format. */
+ return write_extended_private_key (fname, fp, 0, buffer, length);
}
}
+ if (opt.enable_extended_key_format)
+ return write_extended_private_key (fname, fp, 0, buffer, length);
+
if (es_fwrite (buffer, length, 1, fp) != 1)
{
gpg_error_t tmperr = gpg_error_from_syserror ();