On 09/10/2010 01:16 AM, Scott Wheeler wrote: > I see the same error message. In my case it turned out to be CR-LF line > endings introduced by cut and paste of a certificate in an email client on a > Mac into vi on an Ubuntu box, so arguably it's my fault. However OpenSSL does > handle this, and if it is not supported, a more informative error message > would be useful.
Does the attached patch fix this issue? regards, Nikos
diff --git a/NEWS b/NEWS index 36bcd3c..ae12a69 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,9 @@ See the end for copying conditions. * Version 2.10.2 (unreleased) +** libgnutls: Is now more liberal in the PEM decoding. That is spaces and +tabs are being skipped. + ** libgnutls: Renamed NULL MAC to MAC-NULL to prevent clash with NULL cipher. This prevented the usage of the TLS ciphersuites with NULL cipher. diff --git a/lib/x509_b64.c b/lib/x509_b64.c index 767dbd8..c9bea30 100644 --- a/lib/x509_b64.c +++ b/lib/x509_b64.c @@ -414,7 +414,7 @@ cpydata (const uint8_t * data, int data_size, uint8_t ** result) for (j = i = 0; i < data_size; i++) { - if (data[i] == '\n' || data[i] == '\r') + if (data[i] == '\n' || data[i] == '\r' || data[i] == ' ' || data[i] == '\t') continue; (*result)[j] = data[i]; j++; @@ -427,15 +427,14 @@ cpydata (const uint8_t * data, int data_size, uint8_t ** result) * * The result_size is the return value */ -#define ENDSTR "-----\n" -#define ENDSTR2 "-----\r" +#define ENDSTR "-----" int _gnutls_fbase64_decode (const char *header, const opaque * data, size_t data_size, uint8_t ** result) { int ret; static const char top[] = "-----BEGIN "; - static const char bottom[] = "\n-----END "; + static const char bottom[] = "-----END "; uint8_t *rdata; int rdata_size; uint8_t *kdata; @@ -463,13 +462,10 @@ _gnutls_fbase64_decode (const char *header, const opaque * data, return GNUTLS_E_BASE64_DECODING_ERROR; } - kdata = memmem (rdata, data_size, ENDSTR, sizeof (ENDSTR) - 1); + kdata = memmem (rdata+1, data_size-1, ENDSTR, sizeof (ENDSTR) - 1); /* allow CR as well. */ if (kdata == NULL) - kdata = memmem (rdata, data_size, ENDSTR2, sizeof (ENDSTR2) - 1); - - if (kdata == NULL) { gnutls_assert (); _gnutls_x509_log ("Could not find '%s'\n", ENDSTR);