diff options
author | Justus Winter <justus@g10code.com> | 2016-04-05 16:01:05 +0200 |
---|---|---|
committer | Justus Winter <justus@g10code.com> | 2016-04-05 16:11:37 +0200 |
commit | 9354293b8c9f234939bc04182f15e2fe512e914e (patch) | |
tree | d6dcf60a6e9a57d117f04ac9e07b0b63892a1baf | |
parent | build: Fix for: Build gpgcompose only in maintainer mode (diff) | |
download | gnupg2-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.c | 43 |
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) |