summaryrefslogtreecommitdiffstats
path: root/g10
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2010-04-27 16:11:41 +0200
committerWerner Koch <wk@gnupg.org>2010-04-27 16:11:41 +0200
commit03d34be425a6473d3c95b3fe1f8f47177fde0919 (patch)
treee60fd4e4c77c400f270dc0abcb390112089367c0 /g10
parentIgnore a stale agent socket. (diff)
downloadgnupg2-03d34be425a6473d3c95b3fe1f8f47177fde0919.tar.xz
gnupg2-03d34be425a6473d3c95b3fe1f8f47177fde0919.zip
Provide a useful pinentry prompt.
Diffstat (limited to 'g10')
-rw-r--r--g10/ChangeLog6
-rw-r--r--g10/keydb.h3
-rw-r--r--g10/passphrase.c54
-rw-r--r--g10/pubkey-enc.c2
-rw-r--r--g10/sign.c5
5 files changed, 65 insertions, 5 deletions
diff --git a/g10/ChangeLog b/g10/ChangeLog
index e084916f0..0a1a264d6 100644
--- a/g10/ChangeLog
+++ b/g10/ChangeLog
@@ -1,3 +1,9 @@
+2010-04-27 Werner Koch <wk@g10code.com>
+
+ * passphrase.c (gpg_format_keydesc): New.
+ * pubkey-enc.c (get_it): Use it.
+ * sign.c (do_sign): Use it.
+
2010-04-26 Werner Koch <wk@g10code.com>
* keygen.c (keygen_set_std_prefs): Explicitly include Z0 in the
diff --git a/g10/keydb.h b/g10/keydb.h
index 114045321..e860a9fbf 100644
--- a/g10/keydb.h
+++ b/g10/keydb.h
@@ -195,6 +195,9 @@ void set_next_passphrase( const char *s );
char *get_last_passphrase(void);
void next_to_last_passphrase(void);
+char *gpg_format_keydesc (PKT_public_key *pk, int escaped);
+
+
/*-- getkey.c --*/
void cache_public_key( PKT_public_key *pk );
void getkey_disable_caches(void);
diff --git a/g10/passphrase.c b/g10/passphrase.c
index ddd43d8d6..1ba76e602 100644
--- a/g10/passphrase.c
+++ b/g10/passphrase.c
@@ -683,3 +683,57 @@ passphrase_to_dek (u32 *keyid, int pubkey_algo,
s2k, mode, tryagain_text, NULL, NULL,
canceled);
}
+
+
+/* Return an allocated utf-8 string describing the key PK. IF ESCAPED
+ is true spaces and control characters are percent or plus
+ escaped. */
+char *
+gpg_format_keydesc (PKT_public_key *pk, int escaped)
+{
+ char *uid;
+ size_t uidlen;
+ const char *algo_name;
+ const char *timestr;
+ char *orig_codeset;
+ char *maink;
+ char *desc;
+
+ algo_name = gcry_pk_algo_name (pk->pubkey_algo);
+ if (!algo_name)
+ algo_name = "?";
+ timestr = strtimestamp (pk->timestamp);
+ uid = get_user_id (pk->keyid, &uidlen);
+
+ orig_codeset = i18n_switchto_utf8 ();
+
+ if (pk->main_keyid[2] && pk->main_keyid[3]
+ && pk->keyid[0] != pk->main_keyid[2]
+ && pk->keyid[1] != pk->main_keyid[3])
+ maink = xtryasprintf (_(" (main key ID %s)"), keystr (pk->main_keyid));
+ else
+ maink = NULL;
+
+ desc = xtryasprintf (_("Please enter the passphrase to unlock the"
+ " secret key for the OpenPGP certificate:\n"
+ "\"%.*s\"\n"
+ "%u-bit %s key, ID %s,\n"
+ "created %s%s.\n"),
+ (int)uidlen, uid,
+ nbits_from_pk (pk), algo_name,
+ keystr (pk->keyid), timestr,
+ maink?maink:"" );
+ xfree (maink);
+ xfree (uid);
+
+ i18n_switchback (orig_codeset);
+
+ if (escaped)
+ {
+ char *tmp = percent_plus_escape (desc);
+ xfree (desc);
+ desc = tmp;
+ }
+
+ return desc;
+}
diff --git a/g10/pubkey-enc.c b/g10/pubkey-enc.c
index 1a4ec0f96..d90559d32 100644
--- a/g10/pubkey-enc.c
+++ b/g10/pubkey-enc.c
@@ -196,7 +196,7 @@ get_it (PKT_pubkey_enc *enc, DEK *dek, PKT_public_key *sk, u32 *keyid)
goto leave;
/* Decrypt. */
- desc = xtrystrdup ("FIXME: Format a description");
+ desc = gpg_format_keydesc (sk, 1);
err = agent_pkdecrypt (NULL, keygrip, desc, s_data, &frame, &nframe);
xfree (desc);
gcry_sexp_release (s_data);
diff --git a/g10/sign.c b/g10/sign.c
index d84f43379..ce1731fc8 100644
--- a/g10/sign.c
+++ b/g10/sign.c
@@ -313,13 +313,10 @@ do_sign (PKT_public_key *pksk, PKT_signature *sig,
char *desc;
gcry_sexp_t s_sigval;
- /* FIXME: desc = gpgsm_format_keydesc (cert); */
- desc = xtrystrdup ("FIXME: Format a description");
-
+ desc = gpg_format_keydesc (pksk, 1);
err = agent_pksign (NULL/*ctrl*/, hexgrip, desc,
dp, gcry_md_get_algo_dlen (mdalgo), mdalgo,
&s_sigval);
-
xfree (desc);
if (err)