diff options
author | Werner Koch <[email protected]> | 2013-02-12 18:17:42 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2013-02-12 18:17:42 +0000 |
commit | caddeef4a7ffe5f2eb6453d364b6ae152e0f6625 (patch) | |
tree | 5894e3f0e365b0c9035efecea2bbd5ad3042ca51 /g10/call-agent.c | |
parent | kbx: Switch from MD5 to SHA-1 for the checksum. (diff) | |
parent | gpg: Implement card_store_subkey again. (diff) | |
download | gnupg-caddeef4a7ffe5f2eb6453d364b6ae152e0f6625.tar.gz gnupg-caddeef4a7ffe5f2eb6453d364b6ae152e0f6625.zip |
Merge branch 'master' into key-storage-work
Diffstat (limited to 'g10/call-agent.c')
-rw-r--r-- | g10/call-agent.c | 294 |
1 files changed, 241 insertions, 53 deletions
diff --git a/g10/call-agent.c b/g10/call-agent.c index 55637e463..85a3f2842 100644 --- a/g10/call-agent.c +++ b/g10/call-agent.c @@ -1,6 +1,6 @@ /* call-agent.c - Divert GPG operations to the agent. * Copyright (C) 2001, 2002, 2003, 2006, 2007, 2008, 2009, - * 2010, 2011 Free Software Foundation, Inc. + * 2010, 2011, 2013 Free Software Foundation, Inc. * * This file is part of GnuPG. * @@ -40,47 +40,60 @@ #include "sysutils.h" #include "call-agent.h" #include "status.h" +#include "../common/shareddefs.h" #ifndef DBG_ASSUAN # define DBG_ASSUAN 1 #endif +#define CONTROL_D ('D' - 'A' + 1) + + static assuan_context_t agent_ctx = NULL; static int did_early_card_test; -struct cipher_parm_s +struct default_inq_parm_s { ctrl_t ctrl; assuan_context_t ctx; + struct { + u32 *keyid; + u32 *mainkeyid; + int pubkey_algo; + } keyinfo; +}; + +struct cipher_parm_s +{ + struct default_inq_parm_s *dflt; + assuan_context_t ctx; unsigned char *ciphertext; size_t ciphertextlen; }; struct writecert_parm_s { - assuan_context_t ctx; + struct default_inq_parm_s *dflt; const unsigned char *certdata; size_t certdatalen; }; struct writekey_parm_s { - assuan_context_t ctx; + struct default_inq_parm_s *dflt; const unsigned char *keydata; size_t keydatalen; }; struct genkey_parm_s { - ctrl_t ctrl; - assuan_context_t ctx; + struct default_inq_parm_s *dflt; const char *keyparms; }; struct import_key_parm_s { - ctrl_t ctrl; - assuan_context_t ctx; + struct default_inq_parm_s *dflt; const void *key; size_t keylen; }; @@ -161,6 +174,19 @@ start_agent (ctrl_t ctrl, int for_card) here used to indirectly enable GPG_ERR_FULLY_CANCELED. */ assuan_transact (agent_ctx, "OPTION agent-awareness=2.1.0", NULL, NULL, NULL, NULL, NULL, NULL); + /* Pass on the pinentry mode. */ + if (opt.pinentry_mode) + { + char *tmp = xasprintf ("OPTION pinentry-mode=%s", + str_pinentry_mode (opt.pinentry_mode)); + rc = assuan_transact (agent_ctx, tmp, + NULL, NULL, NULL, NULL, NULL, NULL); + xfree (tmp); + if (rc) + log_error ("setting pinentry mode '%s' failed: %s\n", + str_pinentry_mode (opt.pinentry_mode), + gpg_strerror (rc)); + } } } @@ -307,20 +333,46 @@ get_serialno_cb (void *opaque, const char *line) static gpg_error_t default_inq_cb (void *opaque, const char *line) { - (void)opaque; + gpg_error_t err = 0; + struct default_inq_parm_s *parm = opaque; if (!strncmp (line, "PINENTRY_LAUNCHED", 17) && (line[17]==' '||!line[17])) { - /* There is no working server mode yet thus we use - AllowSetForegroundWindow window right here. We might want to - do this anyway in case gpg is called on the console. */ - gnupg_allow_set_foregound_window ((pid_t)strtoul (line+17, NULL, 10)); + err = gpg_proxy_pinentry_notify (parm->ctrl, line); + if (err) + log_error (_("failed to proxy %s inquiry to client\n"), + "PINENTRY_LAUNCHED"); /* We do not pass errors to avoid breaking other code. */ } + else if (!strncmp (line, "PASSPHRASE", 10) && (line[10]==' '||!line[10]) + && opt.pinentry_mode == PINENTRY_MODE_LOOPBACK) + { + if (have_static_passphrase ()) + { + const char *s = get_static_passphrase (); + err = assuan_send_data (parm->ctx, s, strlen (s)); + } + else + { + char *pw; + + if (parm->keyinfo.keyid) + emit_status_need_passphrase (parm->keyinfo.keyid, + parm->keyinfo.mainkeyid, + parm->keyinfo.pubkey_algo); + pw = cpr_get_hidden ("passphrase.enter", _("Enter passphrase: ")); + cpr_kill_prompt (); + if (*pw == CONTROL_D && !pw[1]) + err = gpg_error (GPG_ERR_CANCELED); + else + err = assuan_send_data (parm->ctx, pw, strlen (pw)); + xfree (pw); + } + } else log_debug ("ignoring gpg-agent inquiry '%s'\n", line); - return 0; + return err; } @@ -515,6 +567,9 @@ int agent_learn (struct agent_card_info_s *info) { int rc; + struct default_inq_parm_s parm; + + memset (&parm, 0, sizeof parm); rc = start_agent (NULL, 1); if (rc) @@ -532,10 +587,10 @@ agent_learn (struct agent_card_info_s *info) if (rc) return rc; - + parm.ctx = agent_ctx; memset (info, 0, sizeof *info); rc = assuan_transact (agent_ctx, "SCD LEARN --force", - dummy_data_cb, NULL, default_inq_cb, NULL, + dummy_data_cb, NULL, default_inq_cb, &parm, learn_status_cb, info); /* Also try to get the key attributes. */ if (!rc) @@ -544,6 +599,30 @@ agent_learn (struct agent_card_info_s *info) return rc; } + +int +agent_keytocard (const char *hexgrip, int keyno, int force, + const char *serialno, const char *timestamp) +{ + int rc; + char line[ASSUAN_LINELENGTH]; + + snprintf (line, DIM(line)-1, "KEYTOCARD %s%s %s OPENPGP.%d %s", + force?"--force ": "", hexgrip, serialno, keyno, timestamp); + line[DIM(line)-1] = 0; + + rc = start_agent (NULL, 1); + if (rc) + return rc; + + rc = assuan_transact (agent_ctx, line, NULL, NULL, default_inq_cb, + NULL, NULL, NULL); + if (rc) + return rc; + + return rc; +} + /* Call the agent to retrieve a data object. This function returns the data in the same structure as used by the learn command. It is allowed to update such a structure using this commmand. */ @@ -552,6 +631,9 @@ agent_scd_getattr (const char *name, struct agent_card_info_s *info) { int rc; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s parm; + + memset (&parm, 0, sizeof parm); if (!*name) return gpg_error (GPG_ERR_INV_VALUE); @@ -565,7 +647,8 @@ agent_scd_getattr (const char *name, struct agent_card_info_s *info) if (rc) return rc; - rc = assuan_transact (agent_ctx, line, NULL, NULL, default_inq_cb, NULL, + parm.ctx = agent_ctx; + rc = assuan_transact (agent_ctx, line, NULL, NULL, default_inq_cb, &parm, learn_status_cb, info); return rc; @@ -583,6 +666,9 @@ agent_scd_setattr (const char *name, int rc; char line[ASSUAN_LINELENGTH]; char *p; + struct default_inq_parm_s parm; + + memset (&parm, 0, sizeof parm); (void)serialno; @@ -614,8 +700,9 @@ agent_scd_setattr (const char *name, rc = start_agent (NULL, 1); if (!rc) { + parm.ctx = agent_ctx; rc = assuan_transact (agent_ctx, line, NULL, NULL, - default_inq_cb, NULL, NULL, NULL); + default_inq_cb, &parm, NULL, NULL); } status_sc_op_failure (rc); @@ -635,10 +722,11 @@ inq_writecert_parms (void *opaque, const char *line) if (!strncmp (line, "CERTDATA", 8) && (line[8]==' '||!line[8])) { - rc = assuan_send_data (parm->ctx, parm->certdata, parm->certdatalen); + rc = assuan_send_data (parm->dflt->ctx, + parm->certdata, parm->certdatalen); } else - rc = default_inq_cb (opaque, line); + rc = default_inq_cb (parm->dflt, line); return rc; } @@ -652,6 +740,9 @@ agent_scd_writecert (const char *certidstr, int rc; char line[ASSUAN_LINELENGTH]; struct writecert_parm_s parms; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); rc = start_agent (NULL, 1); if (rc) @@ -661,7 +752,8 @@ agent_scd_writecert (const char *certidstr, snprintf (line, DIM(line)-1, "SCD WRITECERT %s", certidstr); line[DIM(line)-1] = 0; - parms.ctx = agent_ctx; + dfltparm.ctx = agent_ctx; + parms.dflt = &dfltparm; parms.certdata = certdata; parms.certdatalen = certdatalen; @@ -683,10 +775,10 @@ inq_writekey_parms (void *opaque, const char *line) if (!strncmp (line, "KEYDATA", 7) && (line[7]==' '||!line[7])) { - rc = assuan_send_data (parm->ctx, parm->keydata, parm->keydatalen); + rc = assuan_send_data (parm->dflt->ctx, parm->keydata, parm->keydatalen); } else - rc = default_inq_cb (opaque, line); + rc = default_inq_cb (parm->dflt, line); return rc; } @@ -700,6 +792,9 @@ agent_scd_writekey (int keyno, const char *serialno, int rc; char line[ASSUAN_LINELENGTH]; struct writekey_parm_s parms; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); (void)serialno; @@ -711,7 +806,8 @@ agent_scd_writekey (int keyno, const char *serialno, snprintf (line, DIM(line)-1, "SCD WRITEKEY --force OPENPGP.%d", keyno); line[DIM(line)-1] = 0; - parms.ctx = agent_ctx; + dfltparm.ctx = agent_ctx; + parms.dflt = &dfltparm; parms.keydata = keydata; parms.keydatalen = keydatalen; @@ -836,6 +932,9 @@ agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force, char line[ASSUAN_LINELENGTH]; gnupg_isotime_t tbuf; struct scd_genkey_parm_s parms; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); (void)serialno; @@ -857,9 +956,10 @@ agent_scd_genkey (struct agent_card_genkey_s *info, int keyno, int force, keyno); line[DIM(line)-1] = 0; + dfltparm.ctx = agent_ctx; memset (info, 0, sizeof *info); rc = assuan_transact (agent_ctx, line, - NULL, NULL, default_inq_cb, NULL, + NULL, NULL, default_inq_cb, &dfltparm, scd_genkey_cb, &parms); xfree (parms.savedbytes); @@ -985,19 +1085,25 @@ agent_scd_readcert (const char *certidstr, char line[ASSUAN_LINELENGTH]; membuf_t data; size_t len; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); *r_buf = NULL; rc = start_agent (NULL, 1); if (rc) return rc; + dfltparm.ctx = agent_ctx; + init_membuf (&data, 2048); snprintf (line, DIM(line)-1, "SCD READCERT %s", certidstr); line[DIM(line)-1] = 0; rc = assuan_transact (agent_ctx, line, membuf_data_cb, &data, - default_inq_cb, NULL, NULL, NULL); + default_inq_cb, &dfltparm, + NULL, NULL); if (rc) { xfree (get_membuf (&data, &len)); @@ -1028,6 +1134,9 @@ agent_scd_change_pin (int chvno, const char *serialno) int rc; char line[ASSUAN_LINELENGTH]; const char *reset = ""; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); (void)serialno; @@ -1038,11 +1147,14 @@ agent_scd_change_pin (int chvno, const char *serialno) rc = start_agent (NULL, 1); if (rc) return rc; + dfltparm.ctx = agent_ctx; snprintf (line, DIM(line)-1, "SCD PASSWD %s %d", reset, chvno); line[DIM(line)-1] = 0; - rc = assuan_transact (agent_ctx, line, NULL, NULL, - default_inq_cb, NULL, NULL, NULL); + rc = assuan_transact (agent_ctx, line, + NULL, NULL, + default_inq_cb, &dfltparm, + NULL, NULL); status_sc_op_failure (rc); return rc; } @@ -1056,16 +1168,21 @@ agent_scd_checkpin (const char *serialno) { int rc; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); rc = start_agent (NULL, 1); if (rc) return rc; + dfltparm.ctx = agent_ctx; snprintf (line, DIM(line)-1, "SCD CHECKPIN %s", serialno); line[DIM(line)-1] = 0; rc = assuan_transact (agent_ctx, line, NULL, NULL, - default_inq_cb, NULL, NULL, NULL); + default_inq_cb, &dfltparm, + NULL, NULL); status_sc_op_failure (rc); return rc; } @@ -1101,12 +1218,16 @@ agent_get_passphrase (const char *cache_id, char *arg3 = NULL; char *arg4 = NULL; membuf_t data; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); *r_passphrase = NULL; rc = start_agent (NULL, 0); if (rc) return rc; + dfltparm.ctx = agent_ctx; /* Check that the gpg-agent understands the repeat option. */ if (assuan_transact (agent_ctx, @@ -1144,7 +1265,8 @@ agent_get_passphrase (const char *cache_id, init_membuf_secure (&data, 64); rc = assuan_transact (agent_ctx, line, membuf_data_cb, &data, - default_inq_cb, NULL, NULL, NULL); + default_inq_cb, &dfltparm, + NULL, NULL); if (rc) xfree (get_membuf (&data, NULL)); @@ -1171,6 +1293,9 @@ agent_clear_passphrase (const char *cache_id) { int rc; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); if (!cache_id || !*cache_id) return 0; @@ -1178,11 +1303,14 @@ agent_clear_passphrase (const char *cache_id) rc = start_agent (NULL, 0); if (rc) return rc; + dfltparm.ctx = agent_ctx; snprintf (line, DIM(line)-1, "CLEAR_PASSPHRASE %s", cache_id); line[DIM(line)-1] = 0; - return assuan_transact (agent_ctx, line, NULL, NULL, - default_inq_cb, NULL, NULL, NULL); + return assuan_transact (agent_ctx, line, + NULL, NULL, + default_inq_cb, &dfltparm, + NULL, NULL); } @@ -1194,10 +1322,14 @@ gpg_agent_get_confirmation (const char *desc) int rc; char *tmp; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); rc = start_agent (NULL, 0); if (rc) return rc; + dfltparm.ctx = agent_ctx; tmp = percent_plus_escape (desc); if (!tmp) @@ -1206,8 +1338,10 @@ gpg_agent_get_confirmation (const char *desc) line[DIM(line)-1] = 0; xfree (tmp); - rc = assuan_transact (agent_ctx, line, NULL, NULL, - default_inq_cb, NULL, NULL, NULL); + rc = assuan_transact (agent_ctx, line, + NULL, NULL, + default_inq_cb, &dfltparm, + NULL, NULL); return rc; } @@ -1438,11 +1572,11 @@ inq_genkey_parms (void *opaque, const char *line) if (!strncmp (line, "KEYPARAM", 8) && (line[8]==' '||!line[8])) { - err = assuan_send_data (parm->ctx, + err = assuan_send_data (parm->dflt->ctx, parm->keyparms, strlen (parm->keyparms)); } else - err = default_inq_cb (parm->ctrl, line); + err = default_inq_cb (parm->dflt, line); return err; } @@ -1459,15 +1593,20 @@ agent_genkey (ctrl_t ctrl, char **cache_nonce_addr, gpg_error_t err; struct genkey_parm_s gk_parm; struct cache_nonce_parm_s cn_parm; + struct default_inq_parm_s dfltparm; membuf_t data; size_t len; unsigned char *buf; char line[ASSUAN_LINELENGTH]; + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; + *r_pubkey = NULL; err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; err = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); @@ -1475,8 +1614,7 @@ agent_genkey (ctrl_t ctrl, char **cache_nonce_addr, return err; init_membuf (&data, 1024); - gk_parm.ctrl = ctrl; - gk_parm.ctx = agent_ctx; + gk_parm.dflt = &dfltparm; gk_parm.keyparms = keyparms; snprintf (line, sizeof line, "GENKEY%s%s%s", no_protection? " --no-protection":"", @@ -1520,11 +1658,16 @@ agent_readkey (ctrl_t ctrl, int fromcard, const char *hexkeygrip, size_t len; unsigned char *buf; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; *r_pubkey = NULL; err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; err = assuan_transact (agent_ctx, "RESET",NULL, NULL, NULL, NULL, NULL, NULL); if (err) @@ -1535,7 +1678,8 @@ agent_readkey (ctrl_t ctrl, int fromcard, const char *hexkeygrip, init_membuf (&data, 1024); err = assuan_transact (agent_ctx, line, membuf_data_cb, &data, - default_inq_cb, NULL, NULL, NULL); + default_inq_cb, &dfltparm, + NULL, NULL); if (err) { xfree (get_membuf (&data, &len)); @@ -1564,17 +1708,26 @@ agent_readkey (ctrl_t ctrl, int fromcard, const char *hexkeygrip, gpg_error_t agent_pksign (ctrl_t ctrl, const char *cache_nonce, const char *keygrip, const char *desc, + u32 *keyid, u32 *mainkeyid, int pubkey_algo, unsigned char *digest, size_t digestlen, int digestalgo, gcry_sexp_t *r_sigval) { gpg_error_t err; char line[ASSUAN_LINELENGTH]; membuf_t data; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; + dfltparm.keyinfo.keyid = keyid; + dfltparm.keyinfo.mainkeyid = mainkeyid; + dfltparm.keyinfo.pubkey_algo = pubkey_algo; *r_sigval = NULL; err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; if (digestlen*2 + 50 > DIM(line)) return gpg_error (GPG_ERR_GENERAL); @@ -1612,8 +1765,9 @@ agent_pksign (ctrl_t ctrl, const char *cache_nonce, cache_nonce? " -- ":"", cache_nonce? cache_nonce:""); err = assuan_transact (agent_ctx, line, - membuf_data_cb, &data, default_inq_cb, ctrl, - NULL, NULL); + membuf_data_cb, &data, + default_inq_cb, &dfltparm, + NULL, NULL); if (err) xfree (get_membuf (&data, NULL)); else @@ -1646,11 +1800,12 @@ inq_ciphertext_cb (void *opaque, const char *line) if (!strncmp (line, "CIPHERTEXT", 10) && (line[10]==' '||!line[10])) { assuan_begin_confidential (parm->ctx); - rc = assuan_send_data (parm->ctx, parm->ciphertext, parm->ciphertextlen); + rc = assuan_send_data (parm->dflt->ctx, + parm->ciphertext, parm->ciphertextlen); assuan_end_confidential (parm->ctx); } else - rc = default_inq_cb (parm->ctrl, line); + rc = default_inq_cb (parm->dflt, line); return rc; } @@ -1659,9 +1814,12 @@ inq_ciphertext_cb (void *opaque, const char *line) /* Call the agent to do a decrypt operation using the key identified by the hex string KEYGRIP and the input data S_CIPHERTEXT. On the success the decoded value is stored verbatim at R_BUF and its - length at R_BUF; the callers needs to release it. */ + length at R_BUF; the callers needs to release it. KEYID, MAINKEYID + and PUBKEY_ALGO are used to construct additional promots or status + messages. */ gpg_error_t agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc, + u32 *keyid, u32 *mainkeyid, int pubkey_algo, gcry_sexp_t s_ciphertext, unsigned char **r_buf, size_t *r_buflen) { @@ -1670,6 +1828,13 @@ agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc, membuf_t data; size_t n, len; char *p, *buf, *endp; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; + dfltparm.keyinfo.keyid = keyid; + dfltparm.keyinfo.mainkeyid = mainkeyid; + dfltparm.keyinfo.pubkey_algo = pubkey_algo; if (!keygrip || strlen(keygrip) != 40 || !s_ciphertext || !r_buf || !r_buflen) return gpg_error (GPG_ERR_INV_VALUE); @@ -1678,6 +1843,7 @@ agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc, err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; err = assuan_transact (agent_ctx, "RESET", NULL, NULL, NULL, NULL, NULL, NULL); @@ -1703,7 +1869,7 @@ agent_pkdecrypt (ctrl_t ctrl, const char *keygrip, const char *desc, { struct cipher_parm_s parm; - parm.ctrl = ctrl; + parm.dflt = &dfltparm; parm.ctx = agent_ctx; err = make_canon_sexp (s_ciphertext, &parm.ciphertext, &parm.ciphertextlen); if (err) @@ -1772,11 +1938,16 @@ agent_keywrap_key (ctrl_t ctrl, int forexport, void **r_kek, size_t *r_keklen) size_t len; unsigned char *buf; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; *r_kek = NULL; err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; snprintf (line, DIM(line)-1, "KEYWRAP_KEY %s", forexport? "--export":"--import"); @@ -1784,7 +1955,8 @@ agent_keywrap_key (ctrl_t ctrl, int forexport, void **r_kek, size_t *r_keklen) init_membuf_secure (&data, 64); err = assuan_transact (agent_ctx, line, membuf_data_cb, &data, - default_inq_cb, ctrl, NULL, NULL); + default_inq_cb, &dfltparm, + NULL, NULL); if (err) { xfree (get_membuf (&data, &len)); @@ -1809,10 +1981,10 @@ inq_import_key_parms (void *opaque, const char *line) if (!strncmp (line, "KEYDATA", 7) && (line[7]==' '||!line[7])) { - err = assuan_send_data (parm->ctx, parm->key, parm->keylen); + err = assuan_send_data (parm->dflt->ctx, parm->key, parm->keylen); } else - err = default_inq_cb (parm->ctrl, line); + err = default_inq_cb (parm->dflt, line); return err; } @@ -1827,10 +1999,15 @@ agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr, struct import_key_parm_s parm; struct cache_nonce_parm_s cn_parm; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; if (desc) { @@ -1842,8 +2019,7 @@ agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr, return err; } - parm.ctrl = ctrl; - parm.ctx = agent_ctx; + parm.dflt = &dfltparm; parm.key = key; parm.keylen = keylen; @@ -1853,7 +2029,8 @@ agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr, cn_parm.cache_nonce_addr = cache_nonce_addr; cn_parm.passwd_nonce_addr = NULL; err = assuan_transact (agent_ctx, line, - NULL, NULL, inq_import_key_parms, &parm, + NULL, NULL, + inq_import_key_parms, &parm, cache_nonce_status_cb, &cn_parm); return err; } @@ -1875,12 +2052,17 @@ agent_export_key (ctrl_t ctrl, const char *hexkeygrip, const char *desc, size_t len; unsigned char *buf; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; *r_result = NULL; err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; if (desc) { @@ -1901,7 +2083,7 @@ agent_export_key (ctrl_t ctrl, const char *hexkeygrip, const char *desc, cn_parm.passwd_nonce_addr = NULL; err = assuan_transact (agent_ctx, line, membuf_data_cb, &data, - default_inq_cb, ctrl, + default_inq_cb, &dfltparm, cache_nonce_status_cb, &cn_parm); if (err) { @@ -1931,14 +2113,20 @@ agent_passwd (ctrl_t ctrl, const char *hexkeygrip, const char *desc, gpg_error_t err; struct cache_nonce_parm_s cn_parm; char line[ASSUAN_LINELENGTH]; + struct default_inq_parm_s dfltparm; + + memset (&dfltparm, 0, sizeof dfltparm); + dfltparm.ctrl = ctrl; err = start_agent (ctrl, 0); if (err) return err; + dfltparm.ctx = agent_ctx; if (!hexkeygrip || strlen (hexkeygrip) != 40) return gpg_error (GPG_ERR_INV_VALUE); + if (desc) { snprintf (line, DIM(line)-1, "SETKEYDESC %s", desc); @@ -1957,7 +2145,7 @@ agent_passwd (ctrl_t ctrl, const char *hexkeygrip, const char *desc, cn_parm.cache_nonce_addr = cache_nonce_addr; cn_parm.passwd_nonce_addr = passwd_nonce_addr; err = assuan_transact (agent_ctx, line, NULL, NULL, - default_inq_cb, ctrl, + default_inq_cb, &dfltparm, cache_nonce_status_cb, &cn_parm); return err; } |