summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJustus Winter <justus@g10code.com>2016-04-05 16:01:05 +0200
committerJustus Winter <justus@g10code.com>2016-04-05 16:11:37 +0200
commit9354293b8c9f234939bc04182f15e2fe512e914e (patch)
treed6dcf60a6e9a57d117f04ac9e07b0b63892a1baf
parentbuild: Fix for: Build gpgcompose only in maintainer mode (diff)
downloadgnupg2-9354293b8c9f234939bc04182f15e2fe512e914e.tar.xz
gnupg2-9354293b8c9f234939bc04182f15e2fe512e914e.zip
dirmngr: Autodetect PEM format in dirmngr-client.
* dirmngr/dirmngr-client.c (init_asctobin): New function. (main): Move the initialization code to the new function. (read_pem_certificate): Initialize base64 table. (read_certificate): Try to decode certificates given in files as PEM first. GnuPG-bug-id: 1844 Signed-off-by: Justus Winter <justus@g10code.com>
-rw-r--r--dirmngr/dirmngr-client.c43
1 files changed, 30 insertions, 13 deletions
diff --git a/dirmngr/dirmngr-client.c b/dirmngr/dirmngr-client.c
index 02920d649..c6a33d728 100644
--- a/dirmngr/dirmngr-client.c
+++ b/dirmngr/dirmngr-client.c
@@ -116,6 +116,25 @@ static unsigned char bintoasc[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
static unsigned char asctobin[256]; /* runtime initialized */
+/* Build the helptable for radix64 to bin conversion. */
+static void
+init_asctobin (void)
+{
+ static int initialized;
+ int i;
+ unsigned char *s;
+
+ if (initialized)
+ return;
+ initialized = 1;
+
+ for (i=0; i < 256; i++ )
+ asctobin[i] = 255; /* Used to detect invalid characters. */
+ for (s=bintoasc, i=0; *s; s++, i++)
+ asctobin[*s] = i;
+}
+
+
/* Prototypes. */
static gpg_error_t read_certificate (const char *fname,
unsigned char **rbuf, size_t *rbuflen);
@@ -234,19 +253,6 @@ main (int argc, char **argv )
if (log_get_errorcount (0))
exit (2);
- /* Build the helptable for radix64 to bin conversion. */
- if (opt.pem)
- {
- int i;
- unsigned char *s;
-
- for (i=0; i < 256; i++ )
- asctobin[i] = 255; /* Used to detect invalid characters. */
- for (s=bintoasc, i=0; *s; s++, i++)
- asctobin[*s] = i;
- }
-
-
if (cmd_ping)
err = 0;
else if (cmd_lookup || cmd_loadcrl)
@@ -461,6 +467,8 @@ read_pem_certificate (const char *fname, unsigned char **rbuf, size_t *rbuflen)
s_waitend
} state = s_init;
+ init_asctobin ();
+
fp = fname? fopen (fname, "r") : stdin;
if (!fp)
return gpg_error_from_errno (errno);
@@ -612,6 +620,15 @@ read_certificate (const char *fname, unsigned char **rbuf, size_t *rbuflen)
if (opt.pem)
return read_pem_certificate (fname, rbuf, rbuflen);
+ else if (fname)
+ {
+ /* A filename has been given. Let's just assume it is in PEM
+ format and decode it, and fall back to interpreting it as
+ binary certificate if that fails. */
+ err = read_pem_certificate (fname, rbuf, rbuflen);
+ if (! err)
+ return 0;
+ }
fp = fname? fopen (fname, "rb") : stdin;
if (!fp)