diff options
author | Nick Mathewson <nickm@torproject.org> | 2020-03-11 10:35:47 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2020-03-11 10:35:47 -0400 |
commit | 554b805093f98418a6f50a2246a8572ec0329a24 (patch) | |
tree | 342c17731ade35b15f85e90513a55b8df1fe4bd8 | |
parent | ff52205362f5d60c209f298a3e3679bc65bdf539 (diff) | |
parent | 55055396ccfb4878772a3bc8360bc3dd56d09c64 (diff) | |
download | tor-554b805093f98418a6f50a2246a8572ec0329a24.tar.gz tor-554b805093f98418a6f50a2246a8572ec0329a24.zip |
Merge branch 'bug33032_041' into bug33032_042
-rw-r--r-- | changes/bug33032 | 6 | ||||
-rw-r--r-- | src/lib/encoding/pem.c | 8 | ||||
-rw-r--r-- | src/test/test_pem.c | 30 |
3 files changed, 43 insertions, 1 deletions
diff --git a/changes/bug33032 b/changes/bug33032 new file mode 100644 index 0000000000..0c665f25df --- /dev/null +++ b/changes/bug33032 @@ -0,0 +1,6 @@ + o Minor bugfixes (key portability): + - When reading PEM-encoded key data, tolerate CRLF line-endings even if + we are not running on Windows. Previously, non-Windows hosts + would reject these line-endings in certain positions, making + certain key files hard to move from one host to another. + Fixes bug 33032; bugfix on 0.3.5.1-alpha. diff --git a/src/lib/encoding/pem.c b/src/lib/encoding/pem.c index 24b238b130..51f37d0840 100644 --- a/src/lib/encoding/pem.c +++ b/src/lib/encoding/pem.c @@ -85,13 +85,19 @@ pem_decode(uint8_t *dest, size_t destlen, const char *src, size_t srclen, src = eat_whitespace_eos(src, eos); char *tag = NULL; - tor_asprintf(&tag, "-----BEGIN %s-----\n", objtype); + tor_asprintf(&tag, "-----BEGIN %s-----", objtype); if ((size_t)(eos-src) < strlen(tag) || fast_memneq(src, tag, strlen(tag))) { tor_free(tag); return -1; } src += strlen(tag); tor_free(tag); + /* At this point we insist on spaces (including CR), then an LF. */ + src = eat_whitespace_eos_no_nl(src, eos); + if (src == eos || *src != '\n') { + /* Extra junk at end of line: this isn't valid. */ + return -1; + } // NOTE lack of trailing \n. We do not enforce its presence. tor_asprintf(&tag, "\n-----END %s-----", objtype); diff --git a/src/test/test_pem.c b/src/test/test_pem.c index 865688b1a7..9eb99181e2 100644 --- a/src/test/test_pem.c +++ b/src/test/test_pem.c @@ -115,8 +115,38 @@ test_crypto_pem_decode(void *arg) ; } +static void +test_crypto_pem_decode_crlf(void *arg) +{ + (void)arg; + char crlf_version[4096]; + uint8_t buf[4096]; + + /* Convert 'expected' to a version with CRLF instead of LF. */ + const char *inp = expected; + char *outp = crlf_version; + while (*inp) { + if (*inp == '\n') { + *outp++ = '\r'; + } + *outp++ = *inp++; + } + *outp = 0; + + /* Decoding should succeed (or else we have bug 33032 again) */ + int n = pem_decode(buf, sizeof(buf), + crlf_version, strlen(crlf_version), + "WOMBAT QUOTE"); + tt_int_op(n, OP_EQ, strlen(example_pre)); + tt_mem_op(buf, OP_EQ, example_pre, n); + + done: + ; +} + struct testcase_t pem_tests[] = { { "encode", test_crypto_pem_encode, 0, NULL, NULL }, { "decode", test_crypto_pem_decode, 0, NULL, NULL }, + { "decode_crlf", test_crypto_pem_decode_crlf, 0, NULL, NULL }, END_OF_TESTCASES }; |