Provide a useful pinentry prompt.
authorWerner Koch <wk@gnupg.org>
Tue, 27 Apr 2010 14:11:41 +0000 (14:11 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 27 Apr 2010 14:11:41 +0000 (14:11 +0000)
g10/ChangeLog
g10/keydb.h
g10/passphrase.c
g10/pubkey-enc.c
g10/sign.c

index e084916..0a1a264 100644 (file)
@@ -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
index 1140453..e860a9f 100644 (file)
@@ -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);
index ddd43d8..1ba76e6 100644 (file)
@@ -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;
+}
index 1a4ec0f..d90559d 100644 (file)
@@ -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);
index d84f433..ce1731f 100644 (file)
@@ -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)