Package: gnupg-agent
Version: 2.0.9-3
Severity: important
Tags: patch

Since 2006-07-29 (svn revision number 4209) gpg-preset-passphrase sends
passphrase to gpg-agent as a hex string. However the receiver side did
not follow this change. Therefore command gpg-preset-passphrase of
package gnupg2 became totally unusable. (Check Google for complaining
crowds. :-)

This patch against agent/command.c allows gpg-agent daemon to decode
hexstring passphrase and to put them in the cache as needed.

Gabor

-- System Information:
Debian Release: lenny/sid
  APT prefers testing
  APT policy: (500, 'testing')
Architecture: i386 (i686)

Kernel: Linux 2.6.20-1-686 (SMP w/4 CPU cores)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/bash

Versions of packages gnupg-agent depends on:
ii  libc6                         2.7-13     GNU C Library: Shared libraries
ii  libgcrypt11                   1.4.1-1    LGPL Crypto library - runtime libr
ii  libgpg-error0                 1.4-2      library for common error values an
ii  libpth20                      2.0.7-10   The GNU Portable Threads
ii  libreadline5                  5.2-3      GNU readline and history libraries
ii  pinentry-gtk2 [pinentry]      0.7.5-2    GTK+-2-based PIN or pass-phrase en

Versions of packages gnupg-agent recommends:
ii  gnupg                         1.4.9-3    GNU privacy guard - a free PGP rep
ii  gnupg2                        2.0.9-3    GNU privacy guard - a free PGP rep

gnupg-agent suggests no packages.

-- no debconf information
--- command.c-orig	2008-03-17 14:35:15.000000000 +0100
+++ command.c	2008-08-26 16:54:20.102824581 +0200
@@ -263,6 +263,28 @@
   return 0;
 }
 
+/* Convert (in place) an already parsed hexstring of
+ * 'len' digits to native bytes. */
+#define fromhex(h) ( (h)<='9' ? (h)-'0' : ((h)|0x20)-'a'+10 )
+static char *
+decode_hexstring (char *string, int len)
+{
+  unsigned char *from, *to;
+
+  for (from=to=(unsigned char*)string; len>0; to++)
+    {
+      unsigned char value;
+      value = fromhex(*from);
+      from++;
+      value <<=  4;
+      value |= fromhex(*from);
+      from++;
+      *to = value;
+      len -= 2;
+    }
+  return string;
+}
+
 /* Parse the keygrip in STRING into the provided buffer BUF.  BUF must
    provide space for 20 bytes. BUF is not changed if the function
    returns an error. */
@@ -1135,7 +1157,10 @@
   /* If there is a passphrase, use it.  Currently, a passphrase is
      required.  */
   if (*line)
-    passphrase = line;
+    {
+      passphrase = decode_hexstring(line, len);
+      passphrase[len/2] = '\0';
+    }
   else
     return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
 

Reply via email to