From 03d34be425a6473d3c95b3fe1f8f47177fde0919 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 27 Apr 2010 14:11:41 +0000 Subject: [PATCH] Provide a useful pinentry prompt. --- g10/ChangeLog | 6 ++++++ g10/keydb.h | 3 +++ g10/passphrase.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++ g10/pubkey-enc.c | 2 +- g10/sign.c | 5 +---- 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 + + * passphrase.c (gpg_format_keydesc): New. + * pubkey-enc.c (get_it): Use it. + * sign.c (do_sign): Use it. + 2010-04-26 Werner Koch * 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)