diff --git a/FUZZING.md b/FUZZING.md index 86d093084c..9f4edef195 100644 --- a/FUZZING.md +++ b/FUZZING.md @@ -30,15 +30,15 @@ The arguments to `jobs` and `workers` should be the number of cores that you wis The recommended values of `max_len` for each test are: -| Test | `max_len` value | -|-----------|-----------------| -| `cert` | 3072 | -| `client` | 20000 | -| `pkcs8` | 2048 | -| `privkey` | 2048 | -| `server` | 4096 | -| `spki` | 1024 | - +| Test | `max_len` value | +|------------|-----------------| +| `cert` | 3072 | +| `client` | 20000 | +| `pkcs8` | 2048 | +| `privkey` | 2048 | +| `server` | 4096 | +| `spki` | 1024 | +| `read_pem` | 512 | These were determined by rounding up the length of the largest case in the corpus. diff --git a/crypto/base64/base64.c b/crypto/base64/base64.c index 61f79cda16..0763a3e402 100644 --- a/crypto/base64/base64.c +++ b/crypto/base64/base64.c @@ -60,61 +60,42 @@ #include #include +#include + + +/* Encoding. */ static const unsigned char data_bin2ascii[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; #define conv_bin2ascii(a) (data_bin2ascii[(a) & 0x3f]) -/* 64 char lines - * pad input with 0 - * left over chars are set to = - * 1 byte => xx== - * 2 bytes => xxx= - * 3 bytes => xxxx - */ -#define BIN_PER_LINE (64/4*3) -#define CHUNKS_PER_LINE (64/4) -#define CHAR_PER_LINE (64+1) - -/* 0xF0 is a EOLN - * 0xF1 is ignore but next needs to be 0xF0 (for \r\n processing). - * 0xF2 is EOF - * 0xE0 is ignore at start of line. - * 0xFF is error */ - -#define B64_EOLN 0xF0 -#define B64_CR 0xF1 -#define B64_EOF 0xF2 -#define B64_WS 0xE0 -#define B64_ERROR 0xFF -#define B64_NOT_BASE64(a) (((a) | 0x13) == 0xF3) - -static const uint8_t data_ascii2bin[128] = { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xF0, 0xFF, - 0xFF, 0xF1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3E, 0xFF, 0xF2, 0xFF, 0x3F, - 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, - 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, - 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, - 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, - 0x31, 0x32, 0x33, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -}; +OPENSSL_COMPILE_ASSERT(sizeof(((EVP_ENCODE_CTX *)(NULL))->data) % 3 == 0, + data_length_must_be_multiple_of_base64_chunk_size); -static uint8_t conv_ascii2bin(uint8_t a) { - if (a >= 128) { - return 0xFF; +int EVP_EncodedLength(size_t *out_len, size_t len) { + if (len + 2 < len) { + return 0; + } + len += 2; + len /= 3; + + if (((len << 2) >> 2) != len) { + return 0; + } + len <<= 2; + + if (len + 1 < len) { + return 0; } - return data_ascii2bin[a]; + len++; + + *out_len = len; + return 1; } void EVP_EncodeInit(EVP_ENCODE_CTX *ctx) { - ctx->length = 48; - ctx->num = 0; - ctx->line_num = 0; + memset(ctx, 0, sizeof(EVP_ENCODE_CTX)); } void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len, @@ -126,55 +107,72 @@ void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len, return; } - assert(ctx->length <= sizeof(ctx->enc_data)); - assert(ctx->num < ctx->length); + assert(ctx->data_used < sizeof(ctx->data)); - if (ctx->length - ctx->num > in_len) { - memcpy(&ctx->enc_data[ctx->num], in, in_len); - ctx->num += in_len; + if (sizeof(ctx->data) - ctx->data_used > in_len) { + memcpy(&ctx->data[ctx->data_used], in, in_len); + ctx->data_used += in_len; return; } - if (ctx->num != 0) { - size_t todo = ctx->length - ctx->num; - memcpy(&ctx->enc_data[ctx->num], in, todo); + if (ctx->data_used != 0) { + const size_t todo = sizeof(ctx->data) - ctx->data_used; + memcpy(&ctx->data[ctx->data_used], in, todo); in += todo; in_len -= todo; - size_t encoded = EVP_EncodeBlock(out, ctx->enc_data, ctx->length); - ctx->num = 0; + + size_t encoded = EVP_EncodeBlock(out, ctx->data, sizeof(ctx->data)); + ctx->data_used = 0; + out += encoded; *(out++) = '\n'; *out = '\0'; + total = encoded + 1; } - while (in_len >= ctx->length) { - size_t encoded = EVP_EncodeBlock(out, in, ctx->length); - in += ctx->length; - in_len -= ctx->length; + while (in_len >= sizeof(ctx->data)) { + size_t encoded = EVP_EncodeBlock(out, in, sizeof(ctx->data)); + in += sizeof(ctx->data); + in_len -= sizeof(ctx->data); + out += encoded; *(out++) = '\n'; *out = '\0'; + + if (total + encoded + 1 < total) { + *out_len = 0; + return; + } + total += encoded + 1; } if (in_len != 0) { - memcpy(&ctx->enc_data[0], in, in_len); + memcpy(ctx->data, in, in_len); + } + + ctx->data_used = in_len; + + if (total > INT_MAX) { + /* We cannot signal an error, but we can at least avoid making *out_len + * negative. */ + total = 0; } - ctx->num = in_len; *out_len = total; } void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len) { - unsigned ret = 0; - - if (ctx->num != 0) { - ret = EVP_EncodeBlock(out, ctx->enc_data, ctx->num); - out[ret++] = '\n'; - out[ret] = '\0'; - ctx->num = 0; + if (ctx->data_used == 0) { + *out_len = 0; + return; } - *out_len = ret; + + size_t encoded = EVP_EncodeBlock(out, ctx->data, ctx->data_used); + out[encoded++] = '\n'; + out[encoded] = '\0'; + ctx->data_used = 0; + *out_len = encoded; } size_t EVP_EncodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) { @@ -209,246 +207,223 @@ size_t EVP_EncodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) { return ret; } + +/* Decoding. */ + int EVP_DecodedLength(size_t *out_len, size_t len) { if (len % 4 != 0) { return 0; } + *out_len = (len / 4) * 3; return 1; } -int EVP_DecodeBase64(uint8_t *out, size_t *out_len, size_t max_out, - const uint8_t *in, size_t in_len) { - uint8_t a, b, c, d; - size_t pad_len = 0, len = 0, max_len, i; - uint32_t l; +void EVP_DecodeInit(EVP_ENCODE_CTX *ctx) { + memset(ctx, 0, sizeof(EVP_ENCODE_CTX)); +} + +/* kBase64ASCIIToBinData maps characters (c < 128) to their base64 value, or + * else 0xff if they are invalid. As a special case, the padding character + * ('=') is mapped to zero. */ +static const uint8_t kBase64ASCIIToBinData[128] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3e, 0xff, 0xff, 0xff, 0x3f, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0xff, 0xff, + 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, + 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, + 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + 0x31, 0x32, 0x33, 0xff, 0xff, 0xff, 0xff, 0xff, +}; + +static uint8_t base64_ascii_to_bin(uint8_t a) { + if (a >= 128) { + return 0xFF; + } - if (!EVP_DecodedLength(&max_len, in_len) || max_out < max_len) { + return kBase64ASCIIToBinData[a]; +} + +/* base64_decode_quad decodes a single “quad” (i.e. four characters) of base64 + * data and writes up to three bytes to |out|. It sets |*out_num_bytes| to the + * number of bytes written, which will be less than three if the quad ended + * with padding. It returns one on success or zero on error. */ +static int base64_decode_quad(uint8_t *out, size_t *out_num_bytes, + const uint8_t *in) { + const uint8_t a = base64_ascii_to_bin(in[0]); + const uint8_t b = base64_ascii_to_bin(in[1]); + const uint8_t c = base64_ascii_to_bin(in[2]); + const uint8_t d = base64_ascii_to_bin(in[3]); + if (a == 0xff || b == 0xff || c == 0xff || d == 0xff) { return 0; } - for (i = 0; i < in_len; i += 4) { - a = conv_ascii2bin(*(in++)); - b = conv_ascii2bin(*(in++)); - if (i + 4 == in_len && in[1] == '=') { - if (in[0] == '=') { - pad_len = 2; - } else { - pad_len = 1; - } - } - if (pad_len < 2) { - c = conv_ascii2bin(*(in++)); - } else { - c = 0; - } - if (pad_len < 1) { - d = conv_ascii2bin(*(in++)); - } else { - d = 0; - } - if ((a & 0x80) || (b & 0x80) || (c & 0x80) || (d & 0x80)) { + const uint32_t v = ((uint32_t)a) << 18 | ((uint32_t)b) << 12 | + ((uint32_t)c) << 6 | (uint32_t)d; + + const unsigned padding_pattern = (in[0] == '=') << 3 | + (in[1] == '=') << 2 | + (in[2] == '=') << 1 | + (in[3] == '='); + + switch (padding_pattern) { + case 0: + /* The common case of no padding. */ + *out_num_bytes = 3; + out[0] = v >> 16; + out[1] = v >> 8; + out[2] = v; + break; + + case 1: /* xxx= */ + *out_num_bytes = 2; + out[0] = v >> 16; + out[1] = v >> 8; + break; + + case 3: /* xx== */ + *out_num_bytes = 1; + out[0] = v >> 16; + break; + + default: return 0; - } - l = ((((uint32_t)a) << 18L) | (((uint32_t)b) << 12L) | - (((uint32_t)c) << 6L) | (((uint32_t)d))); - *(out++) = (uint8_t)(l >> 16L) & 0xff; - if (pad_len < 2) { - *(out++) = (uint8_t)(l >> 8L) & 0xff; - } - if (pad_len < 1) { - *(out++) = (uint8_t)(l) & 0xff; - } - len += 3 - pad_len; } - *out_len = len; - return 1; -} -void EVP_DecodeInit(EVP_ENCODE_CTX *ctx) { - ctx->length = 30; - ctx->num = 0; - ctx->line_num = 0; - ctx->expect_nl = 0; + return 1; } int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len, const uint8_t *in, size_t in_len) { - int seof = -1, eof = 0, rv = -1, v, tmp, exp_nl; - uint8_t *d; - unsigned i, n, ln, ret = 0; - - n = ctx->num; - d = ctx->enc_data; - ln = ctx->line_num; - exp_nl = ctx->expect_nl; - - /* last line of input. */ - if (in_len == 0 || (n == 0 && conv_ascii2bin(in[0]) == B64_EOF)) { - rv = 0; - goto end; + *out_len = 0; + + if (ctx->error_encountered) { + return -1; } - /* We parse the input data */ + size_t bytes_out = 0, i; for (i = 0; i < in_len; i++) { - /* If the current line is > 80 characters, scream alot */ - if (ln >= 80) { - rv = -1; - goto end; + const char c = in[i]; + switch (c) { + case ' ': + case '\t': + case '\r': + case '\n': + continue; } - /* Get char and put it into the buffer */ - tmp = *(in++); - v = conv_ascii2bin(tmp); - /* only save the good data :-) */ - if (!B64_NOT_BASE64(v)) { - assert(n < sizeof(ctx->enc_data)); - d[n++] = tmp; - ln++; - } else if (v == B64_ERROR) { - rv = -1; - goto end; + if (base64_ascii_to_bin(c) == 0xff || ctx->eof_seen) { + ctx->error_encountered = 1; + return -1; } - /* have we seen a '=' which is 'definitly' the last - * input line. seof will point to the character that - * holds it. and eof will hold how many characters to - * chop off. */ - if (tmp == '=') { - if (seof == -1) { - seof = n; + ctx->data[ctx->data_used++] = c; + if (ctx->data_used == 4) { + size_t num_bytes_resulting; + if (!base64_decode_quad(out, &num_bytes_resulting, ctx->data)) { + ctx->error_encountered = 1; + return -1; } - eof++; - if (eof > 2) { - /* There are, at most, two equals signs at the end of base64 data. */ - rv = -1; - goto end; - } - } - if (v == B64_CR) { - ln = 0; - if (exp_nl) { - continue; - } - } + ctx->data_used = 0; + bytes_out += num_bytes_resulting; + out += num_bytes_resulting; - /* eoln */ - if (v == B64_EOLN) { - ln = 0; - if (exp_nl) { - exp_nl = 0; - continue; - } - } - exp_nl = 0; - - /* If we are at the end of input and it looks like a - * line, process it. */ - if ((i + 1) == in_len && (((n & 3) == 0) || eof)) { - v = B64_EOF; - /* In case things were given us in really small - records (so two '=' were given in separate - updates), eof may contain the incorrect number - of ending bytes to skip, so let's redo the count */ - eof = 0; - if (d[n - 1] == '=') { - eof++; - } - if (d[n - 2] == '=') { - eof++; + if (num_bytes_resulting < 3) { + ctx->eof_seen = 1; } - /* There will never be more than two '=' */ } + } - if ((v == B64_EOF && (n & 3) == 0) || n >= 64) { - /* This is needed to work correctly on 64 byte input - * lines. We process the line and then need to - * accept the '\n' */ - if (v != B64_EOF && n >= 64) { - exp_nl = 1; - } - if (n > 0) { - /* TODO(davidben): Switch this to EVP_DecodeBase64. */ - v = EVP_DecodeBlock(out, d, n); - n = 0; - if (v < 0) { - rv = 0; - goto end; - } - if (eof > v) { - rv = -1; - goto end; - } - ret += (v - eof); - } else { - eof = 1; - v = 0; - } + if (bytes_out > INT_MAX) { + ctx->error_encountered = 1; + *out_len = 0; + return -1; + } + *out_len = bytes_out; - /* This is the case where we have had a short - * but valid input line */ - if (v < (int)ctx->length && eof) { - rv = 0; - goto end; - } else { - ctx->length = v; - } + if (ctx->eof_seen) { + return 0; + } - if (seof >= 0) { - rv = 0; - goto end; - } - out += v; - } + return 1; +} + +int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len) { + *out_len = 0; + if (ctx->error_encountered || ctx->data_used != 0) { + return -1; } - rv = 1; - -end: - *out_len = ret; - ctx->num = n; - ctx->line_num = ln; - ctx->expect_nl = exp_nl; - return rv; + + return 1; } -int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, uint8_t *out, int *outl) { - int i; +int EVP_DecodeBase64(uint8_t *out, size_t *out_len, size_t max_out, + const uint8_t *in, size_t in_len) { + *out_len = 0; + + if (in_len % 4 != 0) { + return 0; + } - *outl = 0; - if (ctx->num != 0) { - /* TODO(davidben): Switch this to EVP_DecodeBase64. */ - i = EVP_DecodeBlock(out, ctx->enc_data, ctx->num); - if (i < 0) { - return -1; + size_t max_len; + if (!EVP_DecodedLength(&max_len, in_len) || + max_out < max_len) { + return 0; + } + + size_t i, bytes_out = 0; + for (i = 0; i < in_len; i += 4) { + size_t num_bytes_resulting; + + if (!base64_decode_quad(out, &num_bytes_resulting, &in[i])) { + return 0; + } + + bytes_out += num_bytes_resulting; + out += num_bytes_resulting; + if (num_bytes_resulting != 3 && i != in_len - 4) { + return 0; } - ctx->num = 0; - *outl = i; - return 1; - } else { - return 1; } + + *out_len = bytes_out; + return 1; } int EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) { - size_t dst_len; + /* Trim spaces and tabs from the beginning of the input. */ + while (src_len > 0) { + if (src[0] != ' ' && src[0] != '\t') { + break; + } - /* trim white space from the start of the line. */ - while (conv_ascii2bin(*src) == B64_WS && src_len > 0) { src++; src_len--; } - /* strip off stuff at the end of the line - * ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */ - while (src_len > 3 && B64_NOT_BASE64(conv_ascii2bin(src[src_len - 1]))) { - src_len--; - } + /* Trim newlines, spaces and tabs from the end of the line. */ + while (src_len > 0) { + switch (src[src_len-1]) { + case ' ': + case '\t': + case '\r': + case '\n': + src_len--; + continue; + } - if (!EVP_DecodedLength(&dst_len, src_len) || dst_len > INT_MAX) { - return -1; + break; } - if (!EVP_DecodeBase64(dst, &dst_len, dst_len, src, src_len)) { + + size_t dst_len; + if (!EVP_DecodedLength(&dst_len, src_len) || + dst_len > INT_MAX || + !EVP_DecodeBase64(dst, &dst_len, dst_len, src, src_len)) { return -1; } @@ -461,21 +436,3 @@ int EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) { return dst_len; } - -int EVP_EncodedLength(size_t *out_len, size_t len) { - if (len + 2 < len) { - return 0; - } - len += 2; - len /= 3; - if (((len << 2) >> 2) != len) { - return 0; - } - len <<= 2; - if (len + 1 < len) { - return 0; - } - len++; - *out_len = len; - return 1; -} diff --git a/crypto/base64/base64_test.cc b/crypto/base64/base64_test.cc index da016e6694..a608773213 100644 --- a/crypto/base64/base64_test.cc +++ b/crypto/base64/base64_test.cc @@ -15,76 +15,203 @@ #include #include +#include +#include + #include #include #include +enum encoding_relation { + // canonical indicates that the encoding is the expected encoding of the + // input. + canonical, + // valid indicates that the encoding is /a/ valid encoding of the input, but + // need not be the canonical one. + valid, + // invalid indicates that the encoded data is valid. + invalid, +}; + struct TestVector { + enum encoding_relation relation; const char *decoded; const char *encoded; }; // Test vectors from RFC 4648. static const TestVector kTestVectors[] = { - { "", "" }, - { "f" , "Zg==" }, - { "fo", "Zm8=" }, - { "foo", "Zm9v" }, - { "foob", "Zm9vYg==" }, - { "fooba", "Zm9vYmE=" }, - { "foobar", "Zm9vYmFy" }, + {canonical, "", ""}, + {canonical, "f", "Zg==\n"}, + {canonical, "fo", "Zm8=\n"}, + {canonical, "foo", "Zm9v\n"}, + {canonical, "foob", "Zm9vYg==\n"}, + {canonical, "fooba", "Zm9vYmE=\n"}, + {canonical, "foobar", "Zm9vYmFy\n"}, + {valid, "foobar", "Zm9vYmFy\n\n"}, + {valid, "foobar", " Zm9vYmFy\n\n"}, + {valid, "foobar", " Z m 9 v Y m F y\n\n"}, + {invalid, "", "Zm9vYmFy=\n"}, + {invalid, "", "Zm9vYmFy==\n"}, + {invalid, "", "Zm9vYmFy===\n"}, + {invalid, "", "Z"}, + {invalid, "", "Z\n"}, + {invalid, "", "ab!c"}, + {invalid, "", "ab=c"}, + {invalid, "", "abc"}, + + {canonical, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==\n"}, + {valid, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA\n==\n"}, + {valid, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA=\n=\n"}, + {invalid, "", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA=\n==\n"}, + {canonical, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4\neHh4eHh" + "4eHh4eHh4\n"}, + {canonical, + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4\neHh4eHh" + "4eHh4eHh4eHh4eA==\n"}, + {valid, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh\n4eHh4eHh" + "4eHh4eHh4eHh4eA==\n"}, + {valid, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4e" + "Hh4eHh4eHh4eA==\n"}, + {invalid, "", + "eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eA==" + "\neHh4eHh4eHh4eHh4eHh4eHh4\n"}, + + // A '-' has traditionally been treated as the end of the data by OpenSSL + // and anything following would be ignored. BoringSSL does not accept this + // non-standard extension. + {invalid, "", "Zm9vYmFy-anythinggoes"}, + {invalid, "", "Zm9vYmFy\n-anythinggoes"}, + + // CVE-2015-0292 + {invalid, "", + "ZW5jb2RlIG1lCg===========================================================" + "=======\n"}, }; static const size_t kNumTests = sizeof(kTestVectors) / sizeof(kTestVectors[0]); -static bool TestEncode() { - for (size_t i = 0; i < kNumTests; i++) { +// RemoveNewlines returns a copy of |in| with all '\n' characters removed. +static std::string RemoveNewlines(const char *in) { + std::string ret; + const size_t in_len = strlen(in); + + size_t i; + for (i = 0; i < in_len; i++) { + if (in[i] != '\n') { + ret.push_back(in[i]); + } + } + + return ret; +} + +static bool TestEncodeBlock() { + for (unsigned i = 0; i < kNumTests; i++) { const TestVector *t = &kTestVectors[i]; - uint8_t out[9]; - size_t len = EVP_EncodeBlock(out, (const uint8_t*)t->decoded, - strlen(t->decoded)); - if (len != strlen(t->encoded) || - memcmp(out, t->encoded, len) != 0) { + if (t->relation != canonical) { + continue; + } + + const size_t decoded_len = strlen(t->decoded); + size_t max_encoded_len; + if (!EVP_EncodedLength(&max_encoded_len, decoded_len)) { + fprintf(stderr, "#%u: EVP_EncodedLength failed\n", i); + return false; + } + + std::vector out_vec(max_encoded_len); + uint8_t *out = out_vec.data(); + size_t len = EVP_EncodeBlock(out, (const uint8_t *)t->decoded, decoded_len); + + std::string encoded(RemoveNewlines(t->encoded)); + if (len != encoded.size() || + memcmp(out, encoded.data(), len) != 0) { fprintf(stderr, "encode(\"%s\") = \"%.*s\", want \"%s\"\n", - t->decoded, (int)len, (const char*)out, t->encoded); + t->decoded, (int)len, (const char*)out, encoded.c_str()); return false; } } + return true; } -static bool TestDecode() { - uint8_t out[6]; +static bool TestDecodeBase64() { size_t len; - for (size_t i = 0; i < kNumTests; i++) { - // Test the normal API. + for (unsigned i = 0; i < kNumTests; i++) { const TestVector *t = &kTestVectors[i]; - size_t expected_len = strlen(t->decoded); - if (!EVP_DecodeBase64(out, &len, sizeof(out), - (const uint8_t*)t->encoded, strlen(t->encoded))) { - fprintf(stderr, "decode(\"%s\") failed\n", t->encoded); - return false; + + if (t->relation == valid) { + // The non-canonical encodings will generally have odd whitespace etc + // that |EVP_DecodeBase64| will reject. + continue; } - if (len != strlen(t->decoded) || - memcmp(out, t->decoded, len) != 0) { - fprintf(stderr, "decode(\"%s\") = \"%.*s\", want \"%s\"\n", - t->encoded, (int)len, (const char*)out, t->decoded); - return false; + + const std::string encoded(RemoveNewlines(t->encoded)); + std::vector out_vec(encoded.size()); + uint8_t *out = out_vec.data(); + + int ok = EVP_DecodeBase64(out, &len, out_vec.size(), + (const uint8_t *)encoded.data(), encoded.size()); + + if (t->relation == invalid) { + if (ok) { + fprintf(stderr, "decode(\"%s\") didn't fail but should have\n", + encoded.c_str()); + return false; + } + } else if (t->relation == canonical) { + if (!ok) { + fprintf(stderr, "decode(\"%s\") failed\n", encoded.c_str()); + return false; + } + + if (len != strlen(t->decoded) || + memcmp(out, t->decoded, len) != 0) { + fprintf(stderr, "decode(\"%s\") = \"%.*s\", want \"%s\"\n", + encoded.c_str(), (int)len, (const char*)out, t->decoded); + return false; + } + } + } + + return true; +} + +static bool TestDecodeBlock() { + for (unsigned i = 0; i < kNumTests; i++) { + const TestVector *t = &kTestVectors[i]; + if (t->relation != canonical) { + continue; } + std::string encoded(RemoveNewlines(t->encoded)); + + std::vector out_vec(encoded.size()); + uint8_t *out = out_vec.data(); + // Test that the padding behavior of the deprecated API is preserved. - int ret = EVP_DecodeBlock(out, (const uint8_t*)t->encoded, - strlen(t->encoded)); + int ret = + EVP_DecodeBlock(out, (const uint8_t *)encoded.data(), encoded.size()); if (ret < 0) { - fprintf(stderr, "decode(\"%s\") failed\n", t->encoded); + fprintf(stderr, "EVP_DecodeBlock(\"%s\") failed\n", t->encoded); return false; } if (ret % 3 != 0) { fprintf(stderr, "EVP_DecodeBlock did not ignore padding\n"); return false; } + size_t expected_len = strlen(t->decoded); if (expected_len % 3 != 0) { ret -= 3 - (expected_len % 3); } @@ -96,19 +223,155 @@ static bool TestDecode() { } } - if (EVP_DecodeBase64(out, &len, sizeof(out), (const uint8_t*)"a!bc", 4)) { - fprintf(stderr, "Failed to reject invalid characters in the middle.\n"); - return false; - } + return true; +} + +static bool TestEncodeDecode() { + for (unsigned test_num = 0; test_num < kNumTests; test_num++) { + const TestVector *t = &kTestVectors[test_num]; + + EVP_ENCODE_CTX ctx; + const size_t decoded_len = strlen(t->decoded); + + if (t->relation == canonical) { + size_t max_encoded_len; + if (!EVP_EncodedLength(&max_encoded_len, decoded_len)) { + fprintf(stderr, "#%u: EVP_EncodedLength failed\n", test_num); + return false; + } + + // EVP_EncodeUpdate will output new lines every 64 bytes of output so we + // need slightly more than |EVP_EncodedLength| returns. */ + max_encoded_len += (max_encoded_len + 63) >> 6; + std::vector out_vec(max_encoded_len); + uint8_t *out = out_vec.data(); + + EVP_EncodeInit(&ctx); + + int out_len; + EVP_EncodeUpdate(&ctx, out, &out_len, + reinterpret_cast(t->decoded), + decoded_len); + size_t total = out_len; + + EVP_EncodeFinal(&ctx, out + total, &out_len); + total += out_len; + + if (total != strlen(t->encoded) || memcmp(out, t->encoded, total) != 0) { + fprintf(stderr, "#%u: EVP_EncodeUpdate produced different output: '%s' (%u)\n", + test_num, out, static_cast(total)); + return false; + } + } + + std::vector out_vec(strlen(t->encoded)); + uint8_t *out = out_vec.data(); + + EVP_DecodeInit(&ctx); + int out_len; + size_t total = 0; + int ret = EVP_DecodeUpdate(&ctx, out, &out_len, + reinterpret_cast(t->encoded), + strlen(t->encoded)); + if (ret != -1) { + total = out_len; + ret = EVP_DecodeFinal(&ctx, out + total, &out_len); + total += out_len; + } + + switch (t->relation) { + case canonical: + case valid: + if (ret == -1) { + fprintf(stderr, "#%u: EVP_DecodeUpdate failed\n", test_num); + return false; + } + if (total != decoded_len || memcmp(out, t->decoded, decoded_len)) { + fprintf(stderr, "#%u: EVP_DecodeUpdate produced incorrect output\n", + test_num); + return false; + } + break; - if (EVP_DecodeBase64(out, &len, sizeof(out), (const uint8_t*)"a=bc", 4)) { - fprintf(stderr, "Failed to reject invalid characters in the middle.\n"); - return false; + case invalid: + if (ret != -1) { + fprintf(stderr, "#%u: EVP_DecodeUpdate was successful but shouldn't have been\n", test_num); + return false; + } + break; + } } - if (EVP_DecodeBase64(out, &len, sizeof(out), (const uint8_t*)"abc", 4)) { - fprintf(stderr, "Failed to reject invalid input length.\n"); - return false; + return true; +} + +static bool TestDecodeUpdateStreaming() { + for (unsigned test_num = 0; test_num < kNumTests; test_num++) { + const TestVector *t = &kTestVectors[test_num]; + if (t->relation == invalid) { + continue; + } + + const size_t encoded_len = strlen(t->encoded); + + std::vector out(encoded_len); + + for (size_t chunk_size = 1; chunk_size <= encoded_len; chunk_size++) { + size_t out_len = 0; + EVP_ENCODE_CTX ctx; + EVP_DecodeInit(&ctx); + + for (size_t i = 0; i < encoded_len;) { + size_t todo = encoded_len - i; + if (todo > chunk_size) { + todo = chunk_size; + } + + int bytes_written; + int ret = EVP_DecodeUpdate( + &ctx, out.data() + out_len, &bytes_written, + reinterpret_cast(t->encoded + i), todo); + i += todo; + + switch (ret) { + case -1: + fprintf(stderr, "#%u: EVP_DecodeUpdate returned error\n", test_num); + return 0; + case 0: + out_len += bytes_written; + if (i == encoded_len || + (i + 1 == encoded_len && t->encoded[i] == '\n') || + /* If there was an '-' in the input (which means “EOF”) then + * this loop will continue to test that |EVP_DecodeUpdate| will + * ignore the remainder of the input. */ + strchr(t->encoded, '-') != nullptr) { + break; + } + + fprintf(stderr, + "#%u: EVP_DecodeUpdate returned zero before end of " + "encoded data\n", + test_num); + return 0; + default: + out_len += bytes_written; + } + } + + int bytes_written; + int ret = EVP_DecodeFinal(&ctx, out.data() + out_len, &bytes_written); + if (ret == -1) { + fprintf(stderr, "#%u: EVP_DecodeFinal returned error\n", test_num); + return 0; + } + out_len += bytes_written; + + if (out_len != strlen(t->decoded) || + memcmp(out.data(), t->decoded, out_len) != 0) { + fprintf(stderr, "#%u: incorrect output\n", test_num); + return 0; + } + } } return true; @@ -117,8 +380,11 @@ static bool TestDecode() { int main(void) { CRYPTO_library_init(); - if (!TestEncode() || - !TestDecode()) { + if (!TestEncodeBlock() || + !TestDecodeBase64() || + !TestDecodeBlock() || + !TestDecodeUpdateStreaming() || + !TestEncodeDecode()) { return 1; } diff --git a/decrepit/bio/base64_bio.c b/decrepit/bio/base64_bio.c index 2056138f65..8415bfedb4 100644 --- a/decrepit/bio/base64_bio.c +++ b/decrepit/bio/base64_bio.c @@ -452,7 +452,7 @@ static long b64_ctrl(BIO *b, int cmd, long num, void *ptr) { case BIO_CTRL_WPENDING: /* More to write in buffer */ assert(ctx->buf_len >= ctx->buf_off); ret = ctx->buf_len - ctx->buf_off; - if ((ret == 0) && (ctx->encode != B64_NONE) && (ctx->base64.num != 0)) { + if ((ret == 0) && (ctx->encode != B64_NONE) && (ctx->base64.data_used != 0)) { ret = 1; } else if (ret <= 0) { ret = BIO_ctrl(b->next_bio, cmd, num, ptr); @@ -484,7 +484,7 @@ static long b64_ctrl(BIO *b, int cmd, long num, void *ptr) { ctx->tmp_len = 0; goto again; } - } else if (ctx->encode != B64_NONE && ctx->base64.num != 0) { + } else if (ctx->encode != B64_NONE && ctx->base64.data_used != 0) { ctx->buf_off = 0; EVP_EncodeFinal(&(ctx->base64), (uint8_t *)ctx->buf, &(ctx->buf_len)); /* push out the bytes */ diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt index f315347e1e..5bef3ae97e 100644 --- a/fuzz/CMakeLists.txt +++ b/fuzz/CMakeLists.txt @@ -55,3 +55,12 @@ add_executable( target_link_libraries(client Fuzzer) target_link_libraries(client crypto) target_link_libraries(client ssl) + +add_executable( + read_pem + + read_pem.cc +) + +target_link_libraries(read_pem Fuzzer) +target_link_libraries(read_pem crypto) diff --git a/fuzz/read_pem.cc b/fuzz/read_pem.cc new file mode 100644 index 0000000000..511c4ee060 --- /dev/null +++ b/fuzz/read_pem.cc @@ -0,0 +1,36 @@ +/* Copyright (c) 2016, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + +#include +#include +#include + + +extern "C" int LLVMFuzzerTestOneInput(uint8_t *buf, size_t len) { + char *name, *header; + uint8_t *pem_data; + long pem_len; + + BIO *bio = BIO_new_mem_buf(buf, len); + + if (PEM_read_bio(bio, &name, &header, &pem_data, &pem_len) == 1) { + OPENSSL_free(name); + OPENSSL_free(header); + OPENSSL_free(pem_data); + } + + BIO_free(bio); + + return 0; +} diff --git a/fuzz/read_pem_corpus/01270d57eecae64f59b9b27cc06e3f9eaf2304e2 b/fuzz/read_pem_corpus/01270d57eecae64f59b9b27cc06e3f9eaf2304e2 new file mode 100644 index 0000000000..7709f4a36a --- /dev/null +++ b/fuzz/read_pem_corpus/01270d57eecae64f59b9b27cc06e3f9eaf2304e2 @@ -0,0 +1 @@ +-----BEGIN O-------- \ No newline at end of file diff --git a/fuzz/read_pem_corpus/0ab8318acaf6e678dd02e2b5c343ed41111b393d b/fuzz/read_pem_corpus/0ab8318acaf6e678dd02e2b5c343ed41111b393d new file mode 100644 index 0000000000..74e0f12e32 --- /dev/null +++ b/fuzz/read_pem_corpus/0ab8318acaf6e678dd02e2b5c343ed41111b393d @@ -0,0 +1 @@ +! \ No newline at end of file diff --git a/fuzz/read_pem_corpus/0b08765ad46bb11ac55348755ad5c8e4386bd2f3 b/fuzz/read_pem_corpus/0b08765ad46bb11ac55348755ad5c8e4386bd2f3 new file mode 100644 index 0000000000..80ece3cf04 Binary files /dev/null and b/fuzz/read_pem_corpus/0b08765ad46bb11ac55348755ad5c8e4386bd2f3 differ diff --git a/fuzz/read_pem_corpus/0bdb9660f74f82a5471210026fdee0b674f1114e b/fuzz/read_pem_corpus/0bdb9660f74f82a5471210026fdee0b674f1114e new file mode 100644 index 0000000000..6f429701ad --- /dev/null +++ b/fuzz/read_pem_corpus/0bdb9660f74f82a5471210026fdee0b674f1114e @@ -0,0 +1,33 @@ +-G +----BEGIN O----- +----(END /!----G +( + 7-- +--BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN :4'----- +G +UU-- +--BEGIN :4'----- +G +UU -----BEGIN 24'/---- +----BEGIN :4'----- +G +UU qG +wFUG + fbwFUU QG +wFU QG +wFUG + fbwFUU QG +wFU fbwFUUU G +bwFU f +bwFU U fbwFUU f +bwFU U fbU fbwF fUG + fbwFU f fTwFTU fbwFUf( +FUU f +bwFU U fbwFUU;!(;)-----EN /O!:--- +---BE- NI-GO--- +---* + f +bwFU U fbU fbw-----BEG-F fU \ No newline at end of file diff --git a/fuzz/read_pem_corpus/0c4287915a432e6b50e1c2eb0f4ca037b1730aa0 b/fuzz/read_pem_corpus/0c4287915a432e6b50e1c2eb0f4ca037b1730aa0 new file mode 100644 index 0000000000..0bcf00c1f5 Binary files /dev/null and b/fuzz/read_pem_corpus/0c4287915a432e6b50e1c2eb0f4ca037b1730aa0 differ diff --git a/fuzz/read_pem_corpus/0d583f2aee2e15a7dc7eb93af1ecf44203b537f4 b/fuzz/read_pem_corpus/0d583f2aee2e15a7dc7eb93af1ecf44203b537f4 new file mode 100644 index 0000000000..8782df57c0 --- /dev/null +++ b/fuzz/read_pem_corpus/0d583f2aee2e15a7dc7eb93af1ecf44203b537f4 @@ -0,0 +1,3 @@ +------BEG-* +----BEGIN N )(!a!*)(a':':--!;'---BEGIN )a':'!;'R):u ;qrR)M +* \ No newline at end of file diff --git a/fuzz/read_pem_corpus/0e3deb2e809b535f39efded20697314a29c8335a b/fuzz/read_pem_corpus/0e3deb2e809b535f39efded20697314a29c8335a new file mode 100644 index 0000000000..77d030eba4 --- /dev/null +++ b/fuzz/read_pem_corpus/0e3deb2e809b535f39efded20697314a29c8335a @@ -0,0 +1,7 @@ +- +---BEGIN O----- +----(END--=--END /!-----BE-----END GI 5;!(;)-----END /!--- + +- +6(- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/0f29362dfb076a14a103e8bc2c9681fac93c237d b/fuzz/read_pem_corpus/0f29362dfb076a14a103e8bc2c9681fac93c237d new file mode 100644 index 0000000000..c8e019d145 Binary files /dev/null and b/fuzz/read_pem_corpus/0f29362dfb076a14a103e8bc2c9681fac93c237d differ diff --git a/fuzz/read_pem_corpus/1078e6b183abbe50aa19cffd741db1cb30e5cf4f b/fuzz/read_pem_corpus/1078e6b183abbe50aa19cffd741db1cb30e5cf4f new file mode 100644 index 0000000000..61da76b971 --- /dev/null +++ b/fuzz/read_pem_corpus/1078e6b183abbe50aa19cffd741db1cb30e5cf4f @@ -0,0 +1,8 @@ +-----BEGIN O!:'U('((/!;!;O!:'U('((/!;!;6();':('H('G)MG'yO )O(*----- +-----BEGIN :(*:!:O!:'U('(:(/!;!;6();-----BEGIN (/!;!;6();':('H('G)':('H('G)MG-----BEGIN O!:'U('((/!;!;O!:'U('((/!;!;3();':('H('G)MG'yO )O(*----- +-----BEGIN :(*:!:O!O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*;:) + +*:!------ +----BEIN *;:) +N O!:'U('((!;!;6();''yO )o(*(*;:)*:!::(';'(;)(!:):"PZw;:P:('H(%G; ) \ No newline at end of file diff --git a/fuzz/read_pem_corpus/149b4073e8ee2d37455c0d7867c7cffdecf0f8e1 b/fuzz/read_pem_corpus/149b4073e8ee2d37455c0d7867c7cffdecf0f8e1 new file mode 100644 index 0000000000..71c2bae54d --- /dev/null +++ b/fuzz/read_pem_corpus/149b4073e8ee2d37455c0d7867c7cffdecf0f8e1 @@ -0,0 +1,17 @@ +O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*--------- +;:) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('G)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(';)MG'yO )o(*(*----- +O*;:) + +----B--E-6-BG \ No newline at end of file diff --git a/fuzz/read_pem_corpus/15dd914fbdc4335ebc69caa9afe37681dd75cc32 b/fuzz/read_pem_corpus/15dd914fbdc4335ebc69caa9afe37681dd75cc32 new file mode 100644 index 0000000000..592aee1a70 --- /dev/null +++ b/fuzz/read_pem_corpus/15dd914fbdc4335ebc69caa9afe37681dd75cc32 @@ -0,0 +1,17 @@ +------ +----- +----BEGIN 6( + +----N!(ED /-----BEGI 6;!(;)--'-8-END - +---BEGIN O----- +----(END--=--END -----BEGIN O----- +----(END /!-----BEGIN 6;!(;)-----END //!-----!;BE-----END GI 5;!(;)-----END ----- +/!--- + +- +6/!--!----- +6(- + +- +6((- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/18810634408061267ccb64d68fb85b4ed93515e8 b/fuzz/read_pem_corpus/18810634408061267ccb64d68fb85b4ed93515e8 new file mode 100644 index 0000000000..8cb5a8c8e3 --- /dev/null +++ b/fuzz/read_pem_corpus/18810634408061267ccb64d68fb85b4ed93515e8 @@ -0,0 +1,45 @@ +-----BEGIN O-*--- +-( +-(END /!----G +( + (-- +( +BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN :4'----- +G +UU-- +--BEGIN :4'G +----- +G +UU -----BEGIN 24'/---- +-----BEGIN :4'---=- +G +UU-----BEGIN O----- +-( +-(END /!----G +( + (-- +( +BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN QG +wF:4'----- +G +UU-- +--BEGIN :4'G +----- +G +UU -----BEGIN 24'/---- +-----BGIN :4'----- +G +UU QG +wFUG + fbwFUU QG +wFU UQG +wFUG + fbwFUU QG +wFU fG + b \ No newline at end of file diff --git a/fuzz/read_pem_corpus/1f68f0ee67566b2954a4e2d2c31f6abb60cdaed5 b/fuzz/read_pem_corpus/1f68f0ee67566b2954a4e2d2c31f6abb60cdaed5 new file mode 100644 index 0000000000..089c789248 --- /dev/null +++ b/fuzz/read_pem_corpus/1f68f0ee67566b2954a4e2d2c31f6abb60cdaed5 @@ -0,0 +1,4 @@ +-* +-----BEG--)--BEGIN N )a':':--!;'* +---BEGIN )a':':!;'R):u::rR)M' +* \ No newline at end of file diff --git a/fuzz/read_pem_corpus/20a000f3932e041a634b759b7cef8138b5b40f67 b/fuzz/read_pem_corpus/20a000f3932e041a634b759b7cef8138b5b40f67 new file mode 100644 index 0000000000..d3be1807c2 Binary files /dev/null and b/fuzz/read_pem_corpus/20a000f3932e041a634b759b7cef8138b5b40f67 differ diff --git a/fuzz/read_pem_corpus/20d3859cd71d9b215f55983a5ac9cce7c0a36cc4 b/fuzz/read_pem_corpus/20d3859cd71d9b215f55983a5ac9cce7c0a36cc4 new file mode 100644 index 0000000000..e2d9d4c5cd Binary files /dev/null and b/fuzz/read_pem_corpus/20d3859cd71d9b215f55983a5ac9cce7c0a36cc4 differ diff --git a/fuzz/read_pem_corpus/217d0e120e43e1899a8ab51009de55038fe52789 b/fuzz/read_pem_corpus/217d0e120e43e1899a8ab51009de55038fe52789 new file mode 100644 index 0000000000..b66cf6b857 --- /dev/null +++ b/fuzz/read_pem_corpus/217d0e120e43e1899a8ab51009de55038fe52789 @@ -0,0 +1,15 @@ +-----BEGIN :T!(!*!*z:'*:Ͱ:!m*O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*-------END :) +O*;:) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('1)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(';)MG'yO )o(*(*----- +-----END O*;;)''D;:f(;w:;;V*H \ No newline at end of file diff --git a/fuzz/read_pem_corpus/2493849afd1697d00f4c2f36af4522e6a9ba46b8 b/fuzz/read_pem_corpus/2493849afd1697d00f4c2f36af4522e6a9ba46b8 new file mode 100644 index 0000000000..08dee539a8 Binary files /dev/null and b/fuzz/read_pem_corpus/2493849afd1697d00f4c2f36af4522e6a9ba46b8 differ diff --git a/fuzz/read_pem_corpus/27c891aa76f51487ada28b1fc69ac13c7315c933 b/fuzz/read_pem_corpus/27c891aa76f51487ada28b1fc69ac13c7315c933 new file mode 100644 index 0000000000..ffa0411365 Binary files /dev/null and b/fuzz/read_pem_corpus/27c891aa76f51487ada28b1fc69ac13c7315c933 differ diff --git a/fuzz/read_pem_corpus/27ec8c0bf073ec4ea4f5ee15fbaca4fb32f728b3 b/fuzz/read_pem_corpus/27ec8c0bf073ec4ea4f5ee15fbaca4fb32f728b3 new file mode 100644 index 0000000000..db3ca3cc93 --- /dev/null +++ b/fuzz/read_pem_corpus/27ec8c0bf073ec4ea4f5ee15fbaca4fb32f728b3 @@ -0,0 +1 @@ +O!:'U('((/!;!;6();'8('H('G)MG'yO )o(*(*;:)O!:'U(*:!::(';'(;'(:(/))(-----BEGIN (/!;!;6();':('!;!;H('G)MG'yO*o( )(*;:)*:!::(';'(6;)(!:):"PZw;:P; :'::7!))vǾ:kqU;|:؎8*:;s(f!;;)j*:: \ No newline at end of file diff --git a/fuzz/read_pem_corpus/2904f9b6f6cb0ddf9248537b4fb4b2170174b74f b/fuzz/read_pem_corpus/2904f9b6f6cb0ddf9248537b4fb4b2170174b74f new file mode 100644 index 0000000000..0e95e43bff --- /dev/null +++ b/fuzz/read_pem_corpus/2904f9b6f6cb0ddf9248537b4fb4b2170174b74f @@ -0,0 +1,3 @@ +-----BEGIN x:*****f(~'!5 ) );'*E--------------- + +-----E::T***f(~'!5); C'*E;:;h0G;G('!*'l*)!:!:;'4C*3:)((#(':(''u*!!!;!;) \ No newline at end of file diff --git a/fuzz/read_pem_corpus/2a7b8759f3267d3ddca22e936df0b21eabb1aeed b/fuzz/read_pem_corpus/2a7b8759f3267d3ddca22e936df0b21eabb1aeed new file mode 100644 index 0000000000..e07812af50 Binary files /dev/null and b/fuzz/read_pem_corpus/2a7b8759f3267d3ddca22e936df0b21eabb1aeed differ diff --git a/fuzz/read_pem_corpus/2aaf881c96d0758e5ac244a74deccb7e6363c111 b/fuzz/read_pem_corpus/2aaf881c96d0758e5ac244a74deccb7e6363c111 new file mode 100644 index 0000000000..08e697b65a --- /dev/null +++ b/fuzz/read_pem_corpus/2aaf881c96d0758e5ac244a74deccb7e6363c111 @@ -0,0 +1,14 @@ +-----BEGIN O----- +----(END /!-----BEGI 7;!(;)-----END /O!:--- +-----END O----- +----(END /!---'U('(:(!/;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!- +:(';'(;)- +(!:):"PZg;:; :'::7!))v*Ǿ:--BEGIN 6;!(;)-- +----END /!----- +- +kqU;!:O'U|:؎9*:;s(f!;;)------ +----BEGIN O----- +----(END /!-----BEGIN 6 +j- +;!(;)-----END 6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/2ef2666e807e55481eb81bd2bd8369a4422dfc6f b/fuzz/read_pem_corpus/2ef2666e807e55481eb81bd2bd8369a4422dfc6f new file mode 100644 index 0000000000..5ed63dd8dc --- /dev/null +++ b/fuzz/read_pem_corpus/2ef2666e807e55481eb81bd2bd8369a4422dfc6f @@ -0,0 +1,5 @@ +-----BEGIN --+---'---+------- + +-----BEGIN :T!(!*!*z:H_t);~*N?!:m*;*'---+-------- +GIN '----- +:T!(!-c:>:;}!;*:!;'y 'x'`)*a;:!E!*)(*)()''*:E*:1***!*z:H:*'*$'F';'*T!):- \ No newline at end of file diff --git a/fuzz/read_pem_corpus/318bcf81a2b6fa0ce680ec82cf11e8a6e4bd93f0 b/fuzz/read_pem_corpus/318bcf81a2b6fa0ce680ec82cf11e8a6e4bd93f0 new file mode 100644 index 0000000000..36b112609e --- /dev/null +++ b/fuzz/read_pem_corpus/318bcf81a2b6fa0ce680ec82cf11e8a6e4bd93f0 @@ -0,0 +1,4 @@ +-----BEGIN O----- +----(END /!-----BEGI 2;!(;)-----ED/ !--- + +-6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/358ff4aeb6903affa5d080c317c3270ac4f13121 b/fuzz/read_pem_corpus/358ff4aeb6903affa5d080c317c3270ac4f13121 new file mode 100644 index 0000000000..be1427a10e --- /dev/null +++ b/fuzz/read_pem_corpus/358ff4aeb6903affa5d080c317c3270ac4f13121 @@ -0,0 +1 @@ +- \ No newline at end of file diff --git a/fuzz/read_pem_corpus/35bae979e092abdc6b31f8b3c52ddcafa4722a9a b/fuzz/read_pem_corpus/35bae979e092abdc6b31f8b3c52ddcafa4722a9a new file mode 100644 index 0000000000..654203b5d6 --- /dev/null +++ b/fuzz/read_pem_corpus/35bae979e092abdc6b31f8b3c52ddcafa4722a9a @@ -0,0 +1,11 @@ +-----BEGIN O---- +----N!(ED /-----BEGI 6;!(;)----8-END - +---BEGIN O----- +----(END--=--END /!-----BE-----END GI 5;!(;)-----END /!--- + +- +6/!--- + +- +6((- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/38fccbaee723a06ca137a952843b58d32d35ef25 b/fuzz/read_pem_corpus/38fccbaee723a06ca137a952843b58d32d35ef25 new file mode 100644 index 0000000000..1ddb5fd95e --- /dev/null +++ b/fuzz/read_pem_corpus/38fccbaee723a06ca137a952843b58d32d35ef25 @@ -0,0 +1,2 @@ +-----BEGIN --+----- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/3aaa3cdd4444fad7e59ba1ac2c0cbe6b60ea1181 b/fuzz/read_pem_corpus/3aaa3cdd4444fad7e59ba1ac2c0cbe6b60ea1181 new file mode 100644 index 0000000000..de6ff53b59 --- /dev/null +++ b/fuzz/read_pem_corpus/3aaa3cdd4444fad7e59ba1ac2c0cbe6b60ea1181 @@ -0,0 +1 @@ +-----BEGIN \ No newline at end of file diff --git a/fuzz/read_pem_corpus/3b981c1e4697103278b32ee4e29e3a7b5225d798 b/fuzz/read_pem_corpus/3b981c1e4697103278b32ee4e29e3a7b5225d798 new file mode 100644 index 0000000000..9f35df061d --- /dev/null +++ b/fuzz/read_pem_corpus/3b981c1e4697103278b32ee4e29e3a7b5225d798 @@ -0,0 +1,14 @@ +O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*-------END :) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('1)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(';)MG'yO )o(*(*----- +-----END O*;;)''D;:f(;w:; ,=*'4>;9:(;'5*i)T;:) \ No newline at end of file diff --git a/fuzz/read_pem_corpus/3bff6c9ef0381ea1080fdfb5b4f9c02e95f549b2 b/fuzz/read_pem_corpus/3bff6c9ef0381ea1080fdfb5b4f9c02e95f549b2 new file mode 100644 index 0000000000..c998e40ad3 Binary files /dev/null and b/fuzz/read_pem_corpus/3bff6c9ef0381ea1080fdfb5b4f9c02e95f549b2 differ diff --git a/fuzz/read_pem_corpus/3cdb51f7ffc8ef0bd03265c3a414069815821d18 b/fuzz/read_pem_corpus/3cdb51f7ffc8ef0bd03265c3a414069815821d18 new file mode 100644 index 0000000000..60180841a2 Binary files /dev/null and b/fuzz/read_pem_corpus/3cdb51f7ffc8ef0bd03265c3a414069815821d18 differ diff --git a/fuzz/read_pem_corpus/3f46a93da1448c00d2a9f3a62117bd522ce8de64 b/fuzz/read_pem_corpus/3f46a93da1448c00d2a9f3a62117bd522ce8de64 new file mode 100644 index 0000000000..a082d7ca87 Binary files /dev/null and b/fuzz/read_pem_corpus/3f46a93da1448c00d2a9f3a62117bd522ce8de64 differ diff --git a/fuzz/read_pem_corpus/411752e433e18c27f83b9728256082c2ffb77ebb b/fuzz/read_pem_corpus/411752e433e18c27f83b9728256082c2ffb77ebb new file mode 100644 index 0000000000..cc8856077b --- /dev/null +++ b/fuzz/read_pem_corpus/411752e433e18c27f83b9728256082c2ffb77ebb @@ -0,0 +1,15 @@ +O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*-------END :) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('1)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(';)MG'yO )o(*(*----- +-----END O*;;)''D;:f(;w:; ,=*'4>;9:(;'5*i)T;:G +) \ No newline at end of file diff --git a/fuzz/read_pem_corpus/42650de48dbf62d86a91ede484061f834214915d b/fuzz/read_pem_corpus/42650de48dbf62d86a91ede484061f834214915d new file mode 100644 index 0000000000..bc4db0e67b --- /dev/null +++ b/fuzz/read_pem_corpus/42650de48dbf62d86a91ede484061f834214915d @@ -0,0 +1,2 @@ +-----BEGIN O----- +----(END------B /!----BEGIN 6;!(;)-----END EGIN ---/!;!6(-BEGIN O \ No newline at end of file diff --git a/fuzz/read_pem_corpus/488ae502baabc6506f8722dcdc5294940fa5d588 b/fuzz/read_pem_corpus/488ae502baabc6506f8722dcdc5294940fa5d588 new file mode 100644 index 0000000000..ec5064dcd3 Binary files /dev/null and b/fuzz/read_pem_corpus/488ae502baabc6506f8722dcdc5294940fa5d588 differ diff --git a/fuzz/read_pem_corpus/4aa25eda7560bbd746d9a69b63965c0de21bb53e b/fuzz/read_pem_corpus/4aa25eda7560bbd746d9a69b63965c0de21bb53e new file mode 100644 index 0000000000..8935731f9b --- /dev/null +++ b/fuzz/read_pem_corpus/4aa25eda7560bbd746d9a69b63965c0de21bb53e @@ -0,0 +1,34 @@ +-----BEGIN O----- +-( +-(END /!----G +( + (-- +( +BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN :4'----- +G +UU-- +--BEGIN :4'G +----- +G +UU -----BEGIN 24'/---- +-----BEGIN :4'----- +G +UU QG +wFUG + fbwFUU QG +wFU QG +wFUG + fbwFUU QG +wFU fbwFUUU G +bwFU f +bwFU U f fbwFUU f +bwFU U fbU fbwF fUG + fbwFU f fTwFTU fbwFUfbwFUU f +bwFU U fbwFUU;!(;)-----EN /O!:--- +---BE- NI-GO--- +---* + f +bwFU U fbU fbw-----BEG-F fU \ No newline at end of file diff --git a/fuzz/read_pem_corpus/4b32aa9edbd17b2d63390a41cc98739be7d45596 b/fuzz/read_pem_corpus/4b32aa9edbd17b2d63390a41cc98739be7d45596 new file mode 100644 index 0000000000..0240c224ea --- /dev/null +++ b/fuzz/read_pem_corpus/4b32aa9edbd17b2d63390a41cc98739be7d45596 @@ -0,0 +1,7 @@ +-----BEGIN :4'----- + f uf f - +;3;w: ,=*'3>;9:5;('*i)T'fi'(;n*;;*?;----- +-----END :4'----- +:$;(:!@;L)J))':Z:!:.6'y:*'*aYXX;:()*!;S------BEGIN :f(;w:; ,=*'3>;9:(;i'(; +E=BEGI(N-----)GIԂ')*::!!;!>:r*>!oT#!>;):)) :pэ*;e' *(%y*';*'(d'!;Տ;N 'i'(; +%i;;)''D;:;;)j':';;ki!'!''D;m!!('4!$!0* \ No newline at end of file diff --git a/fuzz/read_pem_corpus/4d43fa4e63042871afdb387b75a8845d47b46d18 b/fuzz/read_pem_corpus/4d43fa4e63042871afdb387b75a8845d47b46d18 new file mode 100644 index 0000000000..23ab556b4c Binary files /dev/null and b/fuzz/read_pem_corpus/4d43fa4e63042871afdb387b75a8845d47b46d18 differ diff --git a/fuzz/read_pem_corpus/548649f5502df5e77b9d332d3f1e29dedd7afdb2 b/fuzz/read_pem_corpus/548649f5502df5e77b9d332d3f1e29dedd7afdb2 new file mode 100644 index 0000000000..a6b3eb0c1b Binary files /dev/null and b/fuzz/read_pem_corpus/548649f5502df5e77b9d332d3f1e29dedd7afdb2 differ diff --git a/fuzz/read_pem_corpus/55885a3f94688b36e34fac8ce1fd7fcc7bb7208c b/fuzz/read_pem_corpus/55885a3f94688b36e34fac8ce1fd7fcc7bb7208c new file mode 100644 index 0000000000..dbf27e96c5 Binary files /dev/null and b/fuzz/read_pem_corpus/55885a3f94688b36e34fac8ce1fd7fcc7bb7208c differ diff --git a/fuzz/read_pem_corpus/5891dd7c6715eca7f427ed9267de9da72b8e82e8 b/fuzz/read_pem_corpus/5891dd7c6715eca7f427ed9267de9da72b8e82e8 new file mode 100644 index 0000000000..fe31431959 --- /dev/null +++ b/fuzz/read_pem_corpus/5891dd7c6715eca7f427ed9267de9da72b8e82e8 @@ -0,0 +1,15 @@ +-----BEGIN :T!(!*!*z:'*:Ͱ:!m*O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*-------END :) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('1)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(';)MG'yO )o(*(*----- +-----END O*;;)''D;:f(;w:;;*H----- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/58bdb0aea139a2790c2e1a3b25e302892a6c4b55 b/fuzz/read_pem_corpus/58bdb0aea139a2790c2e1a3b25e302892a6c4b55 new file mode 100644 index 0000000000..2a9c6c51db Binary files /dev/null and b/fuzz/read_pem_corpus/58bdb0aea139a2790c2e1a3b25e302892a6c4b55 differ diff --git a/fuzz/read_pem_corpus/5c720dc0326e4ffa322f706337df9bc87f42fd96 b/fuzz/read_pem_corpus/5c720dc0326e4ffa322f706337df9bc87f42fd96 new file mode 100644 index 0000000000..32ddacab9a Binary files /dev/null and b/fuzz/read_pem_corpus/5c720dc0326e4ffa322f706337df9bc87f42fd96 differ diff --git a/fuzz/read_pem_corpus/667da9df1cde33d635bbde1986827573ed686a7e b/fuzz/read_pem_corpus/667da9df1cde33d635bbde1986827573ed686a7e new file mode 100644 index 0000000000..e0f7f03577 --- /dev/null +++ b/fuzz/read_pem_corpus/667da9df1cde33d635bbde1986827573ed686a7e @@ -0,0 +1,6 @@ +O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*----- +O*;:) + +----BEGIN O!:'U('O*;:) +-----BEGIN :(/!(( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/66f8b696c46c10a6db20b690e4431b72745f4760 b/fuzz/read_pem_corpus/66f8b696c46c10a6db20b690e4431b72745f4760 new file mode 100644 index 0000000000..1a3eaae40e --- /dev/null +++ b/fuzz/read_pem_corpus/66f8b696c46c10a6db20b690e4431b72745f4760 @@ -0,0 +1,7 @@ +-----BEGIN !:T(!*!*z:H----- +F'*T!:m*;*c:>:;}!;*Z:!;'y 'x'`)*a;:!E!*)('---+---- +*)()''*:E*:1**';)*(;*-----vBEGIN --+---'---+------/ + +-----BEGIN --+---'---+------- + + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/699044ddfe4887d6081ce2a36c1302814294eb68 b/fuzz/read_pem_corpus/699044ddfe4887d6081ce2a36c1302814294eb68 new file mode 100644 index 0000000000..3e36ec287b --- /dev/null +++ b/fuzz/read_pem_corpus/699044ddfe4887d6081ce2a36c1302814294eb68 @@ -0,0 +1,15 @@ +--* +--* +BEGIN -* +a!*)(-----BE-* + +----BEGIN N --* +--* +BEGIN -* +a!*)(-----BE-* + +----BEGIN N )(!a!*)(a':':--!9'---BEGIN )a'-* +a!*)(--:'!;'R):w (;Rrq)---B)(!a!*)(a':'E-* + +----BEGIN N :--!9'---BEGIN )a')(!-* + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/6d1d12ef00c585b4c859479bfa2522f4a447d907 b/fuzz/read_pem_corpus/6d1d12ef00c585b4c859479bfa2522f4a447d907 new file mode 100644 index 0000000000..3c91ae4434 --- /dev/null +++ b/fuzz/read_pem_corpus/6d1d12ef00c585b4c859479bfa2522f4a447d907 @@ -0,0 +1,5 @@ +-----BEGIN --+---'------BEGIN --+---'---+------- + +-----BEGIN :T!(!**z:H_t);~*N?!:m*;*'----+------/ + +- \ No newline at end of file diff --git a/fuzz/read_pem_corpus/6d67bafd83bed7aadd641417671e6864dc87073c b/fuzz/read_pem_corpus/6d67bafd83bed7aadd641417671e6864dc87073c new file mode 100644 index 0000000000..50119ec34e --- /dev/null +++ b/fuzz/read_pem_corpus/6d67bafd83bed7aadd641417671e6864dc87073c @@ -0,0 +1,16 @@ +O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*-------END :) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('G)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(';)MG'yO )o(*(*----- +-----END O*;:)Ĺ + +----B--E-6-BG \ No newline at end of file diff --git a/fuzz/read_pem_corpus/6dcb7976d9af4a72b3667926f1fe7642c75685b2 b/fuzz/read_pem_corpus/6dcb7976d9af4a72b3667926f1fe7642c75685b2 new file mode 100644 index 0000000000..2090fe2068 Binary files /dev/null and b/fuzz/read_pem_corpus/6dcb7976d9af4a72b3667926f1fe7642c75685b2 differ diff --git a/fuzz/read_pem_corpus/6e6aa5ec1653a57a37c043255ab834f6b2228b80 b/fuzz/read_pem_corpus/6e6aa5ec1653a57a37c043255ab834f6b2228b80 new file mode 100644 index 0000000000..7ad3f5c39b --- /dev/null +++ b/fuzz/read_pem_corpus/6e6aa5ec1653a57a37c043255ab834f6b2228b80 @@ -0,0 +1,2 @@ +-----BEGIN O!:'U('((/!;!;O!:'U('((/!;!;3();':('H('GO*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*)MG'----- \ No newline at end of file diff --git a/fuzz/read_pem_corpus/729be2837328d9f25597b1d605188bc724c632e6 b/fuzz/read_pem_corpus/729be2837328d9f25597b1d605188bc724c632e6 new file mode 100644 index 0000000000..6f38622941 --- /dev/null +++ b/fuzz/read_pem_corpus/729be2837328d9f25597b1d605188bc724c632e6 @@ -0,0 +1,6 @@ +O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('G)MG'O*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(----BEGIN ;(j-/!;!;6();':('; \ No newline at end of file diff --git a/fuzz/read_pem_corpus/74a4f38726a49f3a8c06763d58d8fc229b2aa915 b/fuzz/read_pem_corpus/74a4f38726a49f3a8c06763d58d8fc229b2aa915 new file mode 100644 index 0000000000..a88821da31 --- /dev/null +++ b/fuzz/read_pem_corpus/74a4f38726a49f3a8c06763d58d8fc229b2aa915 @@ -0,0 +1,3 @@ +-----BEGIN --+---'---+------- + + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/74b9536c60def2f9cb8e83512b80ff8406d12567 b/fuzz/read_pem_corpus/74b9536c60def2f9cb8e83512b80ff8406d12567 new file mode 100644 index 0000000000..fc048fe483 Binary files /dev/null and b/fuzz/read_pem_corpus/74b9536c60def2f9cb8e83512b80ff8406d12567 differ diff --git a/fuzz/read_pem_corpus/74b97735df0ee03d5a912734de93772093826bda b/fuzz/read_pem_corpus/74b97735df0ee03d5a912734de93772093826bda new file mode 100644 index 0000000000..16ea15dd6d --- /dev/null +++ b/fuzz/read_pem_corpus/74b97735df0ee03d5a912734de93772093826bda @@ -0,0 +1,33 @@ +-6( + +----- +----BEGIN 6( + +----N!(ED /-----BEGI 5;!()--'-8-END - +---BEGIN O----- +----(END--=--E------ +----- +----ND -----BEGIN O----- +----(END /!-----BEGIN 6;!(;)-----END //!-----!;BE-----END GI 5;!(;)-----END /!--- + +- +6BEGIN 6( + +----N!(ED /-----BEGI 6;!(;)--'-8-END - +---BEGIN O----- +---;(END--=--END -----BEGIN O- +--- +----(END /!-----BEGIN 6;!(;)-----END //!-----!;BE-----END GI 5/!--!----- +6(-;!(;)-----END /!--- + +- +6/!-- + +- +6((- +!----- +6(- + +- +6((- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/7539289d67a0974d16f0ed01ded0a58a02b21126 b/fuzz/read_pem_corpus/7539289d67a0974d16f0ed01ded0a58a02b21126 new file mode 100644 index 0000000000..59ae4f4716 --- /dev/null +++ b/fuzz/read_pem_corpus/7539289d67a0974d16f0ed01ded0a58a02b21126 @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/78c435e1927ec196afab938edced0b9ee267e70b b/fuzz/read_pem_corpus/78c435e1927ec196afab938edced0b9ee267e70b new file mode 100644 index 0000000000..7eeef2a9c2 Binary files /dev/null and b/fuzz/read_pem_corpus/78c435e1927ec196afab938edced0b9ee267e70b differ diff --git a/fuzz/read_pem_corpus/78e4c8a5d73cf074f243ef12a3669fef1e848121 b/fuzz/read_pem_corpus/78e4c8a5d73cf074f243ef12a3669fef1e848121 new file mode 100644 index 0000000000..890697e640 --- /dev/null +++ b/fuzz/read_pem_corpus/78e4c8a5d73cf074f243ef12a3669fef1e848121 @@ -0,0 +1,10 @@ +-----BEGIN O----- +----(END /!-----BEGI 7;!(;)-----END /O!:-----BEGIN O----- +----(END /!---'U('(:(/!;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!::(';'(;)(!:):"PZg;:; :'::7!))vǾ:--BEGIN 6;!(;)-- +----END /!----- +- +kqU;O!:'U|:؎8*:;s(f!;;)--*---- +----BEGIN O----- +----(END /!-----BEGIN 6- +j*:;!(;)-----END 6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/7a582440bd4712ab88a3e745f928202707585e6f b/fuzz/read_pem_corpus/7a582440bd4712ab88a3e745f928202707585e6f new file mode 100644 index 0000000000..84f5797cd6 --- /dev/null +++ b/fuzz/read_pem_corpus/7a582440bd4712ab88a3e745f928202707585e6f @@ -0,0 +1,33 @@ +-----BEGIN O----- +-( +-(END /!----G +( + 7-- +( +BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN :4'----- +G +UU-- +--BEGIN :4'----- +G +UU -----BEGIN 24'/---- +-----BEGIN :4'----- +G +UU QG +wFUG + fbwFUU QG +wFU QG +wFUG + fbwFUU QG +wFU fbwFUUU G +bwFU f +bwFU U f fbwFUU f +bwFU U fbU fbwF fUG + fbwFU f fTwFTU fbwFUfbwFUU f +bwFU U fbwFUU;!(;)-----EN /O!:--- +---BE- NI-GO--- +---* + f +bwFU U fbU fbw-----BEG-F fU \ No newline at end of file diff --git a/fuzz/read_pem_corpus/7b8e2a5dfa03cc13b70eb5f77d61222c108ab6bd b/fuzz/read_pem_corpus/7b8e2a5dfa03cc13b70eb5f77d61222c108ab6bd new file mode 100644 index 0000000000..7e27d28435 Binary files /dev/null and b/fuzz/read_pem_corpus/7b8e2a5dfa03cc13b70eb5f77d61222c108ab6bd differ diff --git a/fuzz/read_pem_corpus/824b6dd27deb9ed157fdc80485f104268f7232fe b/fuzz/read_pem_corpus/824b6dd27deb9ed157fdc80485f104268f7232fe new file mode 100644 index 0000000000..7a8b3f8816 Binary files /dev/null and b/fuzz/read_pem_corpus/824b6dd27deb9ed157fdc80485f104268f7232fe differ diff --git a/fuzz/read_pem_corpus/825edbf21bc40ec23225772635ea6390e6d9fb4c b/fuzz/read_pem_corpus/825edbf21bc40ec23225772635ea6390e6d9fb4c new file mode 100644 index 0000000000..a92ec4f430 --- /dev/null +++ b/fuzz/read_pem_corpus/825edbf21bc40ec23225772635ea6390e6d9fb4c @@ -0,0 +1,3 @@ +-----BEGIN --+---'---+------/ + + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/8347c4366b5d668b467fb589c3090f201eacb5db b/fuzz/read_pem_corpus/8347c4366b5d668b467fb589c3090f201eacb5db new file mode 100644 index 0000000000..a0629275d4 Binary files /dev/null and b/fuzz/read_pem_corpus/8347c4366b5d668b467fb589c3090f201eacb5db differ diff --git a/fuzz/read_pem_corpus/874ed5d633d245b10fdda52c49627b43b3f2e25b b/fuzz/read_pem_corpus/874ed5d633d245b10fdda52c49627b43b3f2e25b new file mode 100644 index 0000000000..a11db388ac --- /dev/null +++ b/fuzz/read_pem_corpus/874ed5d633d245b10fdda52c49627b43b3f2e25b @@ -0,0 +1,14 @@ +-----BEGIN :T!(!*!*z:'*:Ͱ:!m*O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*-------END :) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('1)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(';)MG'yO )o(*(*----- +-----END O*;;)''D;:f(;w:;;*H--- \ No newline at end of file diff --git a/fuzz/read_pem_corpus/88581ebac8ffbea71bb83f704e14d789dbc33f37 b/fuzz/read_pem_corpus/88581ebac8ffbea71bb83f704e14d789dbc33f37 new file mode 100644 index 0000000000..66f9ba8255 --- /dev/null +++ b/fuzz/read_pem_corpus/88581ebac8ffbea71bb83f704e14d789dbc33f37 @@ -0,0 +1,17 @@ +-----BEGIN O----- +----(END /!----6( + 7;!(;)-----END /O!:--- +---BEGIN O----- +----(END /!---'U('(:(!/;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!- +:(';'(;)- +(!:):"PZg:; :'::0!))v*Ǿ:--BEGIN 6;!(;)-- +----END /!----- +- +kqU;!:O'U|:؎8*:;s(f!;;)--*---- +----BEGIN O----- +----(END /!-----BEGIN 6 +j- +;!(;)-- +----EN- +6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/892155ce92d4c3293f48e6fc2097336ba882a0ad b/fuzz/read_pem_corpus/892155ce92d4c3293f48e6fc2097336ba882a0ad new file mode 100644 index 0000000000..fa326656de --- /dev/null +++ b/fuzz/read_pem_corpus/892155ce92d4c3293f48e6fc2097336ba882a0ad @@ -0,0 +1,8 @@ +-:($X: +m---BEGIN )a':':!;'R):u ;:rM'**;)=*;:)O(h!;:;'*0'!:;:((:;*()'(!E(:*t;;::;:!:(''`'O:!*:(&((')V`;'m\:!(@!(*:']A *:a!*)((;!2'):::)**g*!r;S()(;(*(;)*:(;c(!)!':)a':':!;'R):u ;:rM'**;)=*;::5;*j(';*(X) -x +-----BEGIN )'*;'))!':----- + 8x +x + = +-----END )'*;'))!':----- +---BEGIN )a':':!;'R):u ;:rM'**;)=*;:)O(h!;:;'*0'!:ˏ(:;:;(*()'(!E(:*t;;::;:!:(''`'O:!*:(&((')V`;'m\:!(@!(*:']A *:a!*)((;!0'):*::)*g*!r;S()( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/894e092b7fd9f4e0a5911ca106e097d3833d3491 b/fuzz/read_pem_corpus/894e092b7fd9f4e0a5911ca106e097d3833d3491 new file mode 100644 index 0000000000..3c9e422ec7 --- /dev/null +++ b/fuzz/read_pem_corpus/894e092b7fd9f4e0a5911ca106e097d3833d3491 @@ -0,0 +1,3 @@ +Nh'):!X;*:):;!)l;'O2)+'*:):($X: +-----BEGIN !*!((4!ΰ)ϫ((D:(!(W;:w:*S;((':*:((`:(6 !; *(:'3@;2!(J`!:(() )'9:(B)J m!Y(!;)T!);*P)Nh'):!X;*:):;!)l;'O2Nh'):!X;*:)k*!*D'a[!ʬ*#'&:;!)l;)+*;Nh''*:):($X: +-----BEGIN !*!'O2)+'*:) \ No newline at end of file diff --git a/fuzz/read_pem_corpus/8c07d6299f33fee89ab0c82e92e06cd558ade60f b/fuzz/read_pem_corpus/8c07d6299f33fee89ab0c82e92e06cd558ade60f new file mode 100644 index 0000000000..1322c288dd --- /dev/null +++ b/fuzz/read_pem_corpus/8c07d6299f33fee89ab0c82e92e06cd558ade60f @@ -0,0 +1,14 @@ +-----BEGIN :T!(!*!*z:'*:Ͱ:!m*O*;:) +O*;:) + :(/!;!;7();':['H 'G)MG'yO )o(*(*-------END :) +-----BEGINO*;:) + + + :(/!;!;O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('1)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-7();';['H('G/!;!;6();':(;)MG'yO )o(*(*----- +-----END O*;;)''D;:f(;w:; \ No newline at end of file diff --git a/fuzz/read_pem_corpus/8e07fb01e0cfa23caddb6b0280c03d0ae2bac57e b/fuzz/read_pem_corpus/8e07fb01e0cfa23caddb6b0280c03d0ae2bac57e new file mode 100644 index 0000000000..715ec1ccbf Binary files /dev/null and b/fuzz/read_pem_corpus/8e07fb01e0cfa23caddb6b0280c03d0ae2bac57e differ diff --git a/fuzz/read_pem_corpus/92207925db84106af0167e887696d936aa41e785 b/fuzz/read_pem_corpus/92207925db84106af0167e887696d936aa41e785 new file mode 100644 index 0000000000..e5afad418d --- /dev/null +++ b/fuzz/read_pem_corpus/92207925db84106af0167e887696d936aa41e785 @@ -0,0 +1,5 @@ +-----BEGIN O----- +----(END /!-----BEGI 6;!(;)-----END /!--- + + +6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/94514c5c092afe2f8295dc193d506f16c6ea82c1 b/fuzz/read_pem_corpus/94514c5c092afe2f8295dc193d506f16c6ea82c1 new file mode 100644 index 0000000000..66aec936f4 Binary files /dev/null and b/fuzz/read_pem_corpus/94514c5c092afe2f8295dc193d506f16c6ea82c1 differ diff --git a/fuzz/read_pem_corpus/956c8cf1db9220ac8004eb9a75e3ebc1df33a33f b/fuzz/read_pem_corpus/956c8cf1db9220ac8004eb9a75e3ebc1df33a33f new file mode 100644 index 0000000000..eb4f595171 Binary files /dev/null and b/fuzz/read_pem_corpus/956c8cf1db9220ac8004eb9a75e3ebc1df33a33f differ diff --git a/fuzz/read_pem_corpus/97c5565f723c0e49787fdec9ed15354760fcb1e6 b/fuzz/read_pem_corpus/97c5565f723c0e49787fdec9ed15354760fcb1e6 new file mode 100644 index 0000000000..eabac816f9 Binary files /dev/null and b/fuzz/read_pem_corpus/97c5565f723c0e49787fdec9ed15354760fcb1e6 differ diff --git a/fuzz/read_pem_corpus/9832fea1fe1c8b575790f59f98404fb61672a3f3 b/fuzz/read_pem_corpus/9832fea1fe1c8b575790f59f98404fb61672a3f3 new file mode 100644 index 0000000000..033a272388 --- /dev/null +++ b/fuzz/read_pem_corpus/9832fea1fe1c8b575790f59f98404fb61672a3f3 @@ -0,0 +1,5 @@ +-----BEGIN O----- +----(END /!-----BE-----END GI 6;!(;)-----END /!--- + +- +6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/9940bd2f440a8c1e07dba6476c219349afeae711 b/fuzz/read_pem_corpus/9940bd2f440a8c1e07dba6476c219349afeae711 new file mode 100644 index 0000000000..009adb9feb --- /dev/null +++ b/fuzz/read_pem_corpus/9940bd2f440a8c1e07dba6476c219349afeae711 @@ -0,0 +1,12 @@ +-----BEGIN O----- +----(END /!-----BEGI 7;!(;)-----END /O!:--- +---BEGIN O----- +----(END /!---'U('(:(!/;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!::(';'(;)(!:):"PZg;:; :'::7!))vǾ:--BEGIN 6;!(;)-- +----END /!----- +- +kqU;O!:'U|:؎8*:;s(f!;;)--*---- +----BEGIN O----- +----(END /!-----BEGIN 6 +j- +;!(;)-----END 6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/9d1e6ed2fc4b095a2ccb4e695241c91d4b194be5 b/fuzz/read_pem_corpus/9d1e6ed2fc4b095a2ccb4e695241c91d4b194be5 new file mode 100644 index 0000000000..44917bba48 Binary files /dev/null and b/fuzz/read_pem_corpus/9d1e6ed2fc4b095a2ccb4e695241c91d4b194be5 differ diff --git a/fuzz/read_pem_corpus/a2bc14d4be3bb4f4deb93ddaa77224db305158af b/fuzz/read_pem_corpus/a2bc14d4be3bb4f4deb93ddaa77224db305158af new file mode 100644 index 0000000000..e0e223d069 Binary files /dev/null and b/fuzz/read_pem_corpus/a2bc14d4be3bb4f4deb93ddaa77224db305158af differ diff --git a/fuzz/read_pem_corpus/a75abe0b4dd03dc232f9192666d6adb369beffca b/fuzz/read_pem_corpus/a75abe0b4dd03dc232f9192666d6adb369beffca new file mode 100644 index 0000000000..d10f2f60f2 --- /dev/null +++ b/fuzz/read_pem_corpus/a75abe0b4dd03dc232f9192666d6adb369beffca @@ -0,0 +1,5 @@ +-----vBEGIN --+---'---+------/ + +-----BEGIN --+---'---+------- + + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/a92c58dfadb8195fbd90c70b4dc576986dbb7c46 b/fuzz/read_pem_corpus/a92c58dfadb8195fbd90c70b4dc576986dbb7c46 new file mode 100644 index 0000000000..23a5038790 Binary files /dev/null and b/fuzz/read_pem_corpus/a92c58dfadb8195fbd90c70b4dc576986dbb7c46 differ diff --git a/fuzz/read_pem_corpus/aa82ef4cf1c3c2d7dd7811803227cc87d2429b3c b/fuzz/read_pem_corpus/aa82ef4cf1c3c2d7dd7811803227cc87d2429b3c new file mode 100644 index 0000000000..d84db471e7 Binary files /dev/null and b/fuzz/read_pem_corpus/aa82ef4cf1c3c2d7dd7811803227cc87d2429b3c differ diff --git a/fuzz/read_pem_corpus/ad49ff8fb9ff95a8f110b15702f8209df64f8fad b/fuzz/read_pem_corpus/ad49ff8fb9ff95a8f110b15702f8209df64f8fad new file mode 100644 index 0000000000..99dd9ff640 --- /dev/null +++ b/fuzz/read_pem_corpus/ad49ff8fb9ff95a8f110b15702f8209df64f8fad @@ -0,0 +1,14 @@ +-----BEGIN O----- +----(END /!-----BEGI 7;!(;)-----END /O!:--- +-----END O-=--- +----(END /!---'U('(:(!/;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!- +:(';'(;)- +(!:):"PZg;:; :'::7!))v*Ǿ:--BEGIN 6;!(;)-- +----END /!----- +- +kqU;!:O'U|:؎9*:;s(f!;;)------ +----BEGIN O----- +----(END /!-----BEGIN 6 +j- +;!(;)-----END 6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/af9207c320f7400ba18dea62fd4af98330ba260b b/fuzz/read_pem_corpus/af9207c320f7400ba18dea62fd4af98330ba260b new file mode 100644 index 0000000000..45332baf9e --- /dev/null +++ b/fuzz/read_pem_corpus/af9207c320f7400ba18dea62fd4af98330ba260b @@ -0,0 +1,3 @@ +-----BEGIN x:*****f(~'!5 ) );'*E-----B----- +-----END f(~'!5 ) C;'*E;:;h0G;G('!*l*)!:!:;'4C*ֈ3:)((#(':(''u*!!x +;!;) \ No newline at end of file diff --git a/fuzz/read_pem_corpus/b034864020154378b78a11122c8f61f81e8009ce b/fuzz/read_pem_corpus/b034864020154378b78a11122c8f61f81e8009ce new file mode 100644 index 0000000000..eb2588976d Binary files /dev/null and b/fuzz/read_pem_corpus/b034864020154378b78a11122c8f61f81e8009ce differ diff --git a/fuzz/read_pem_corpus/b178eadb35af688d045ba6bc400396ae0fc7c9b9 b/fuzz/read_pem_corpus/b178eadb35af688d045ba6bc400396ae0fc7c9b9 new file mode 100644 index 0000000000..b66e0af33a --- /dev/null +++ b/fuzz/read_pem_corpus/b178eadb35af688d045ba6bc400396ae0fc7c9b9 @@ -0,0 +1,6 @@ +-----BEGIN O!:'U('((/!;!;O!:'U('((/!;!;3();':('H('G)MG'yO )O(*----- +-----BEGIN :(*:!:O!O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*----- +*:!------ +----BEIN *;:) +N O!:'U('((!;!;6();':('H(%G)MG'yO :)o(*(*;:):'U('O!:'U(*:!::(';'(;'(:(/)(!;!;(:(/!;!;6();-6();O!-: \ No newline at end of file diff --git a/fuzz/read_pem_corpus/b709f3412c5fb9a0b38a69eee59620a5c3990385 b/fuzz/read_pem_corpus/b709f3412c5fb9a0b38a69eee59620a5c3990385 new file mode 100644 index 0000000000..6c2f8068b8 --- /dev/null +++ b/fuzz/read_pem_corpus/b709f3412c5fb9a0b38a69eee59620a5c3990385 @@ -0,0 +1,8 @@ +-:($X: +----BEGIN )a':':!;'R):u ;:rM'**;)=*;:)O(h!;:;'*0'!:;:((:;*()'(!E(:*t;;::;:!:(''`'O:!*:(&((')V`;'m\:!(@!(*:']A *:a!*)((;!2'):::)**g*!r;S()(;(*(;)*:(;c(!)!':)a':':!;'R):u ;:rM'**;)=*;::5;*j(';*(X) -x +-----BEGIN )'*;'))!':----- + x +x + x +-----END )'*;'))!':----- +---BEGIN )a':':!;'R):u ;:rM'**;)=*;:)O(h!;:;'*0'!:ˏ(:;(:;*()'(!E(:*t;;::;:!:(''`'O:!*:(&((')V`;'m\:!(@!(*:']A *:a!*)((;!0'):*::)*g*!r;S()( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/b92f0f72b6839f6c7ac10f4c663765b89e1fa513 b/fuzz/read_pem_corpus/b92f0f72b6839f6c7ac10f4c663765b89e1fa513 new file mode 100644 index 0000000000..5393ba082b --- /dev/null +++ b/fuzz/read_pem_corpus/b92f0f72b6839f6c7ac10f4c663765b89e1fa513 @@ -0,0 +1,2 @@ +-----BEGIN O----- +'U('(:(/!-----BEGIN 6;!(;)'U('(:(/!;!;;':(6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/bc205ed015bb01de66b5a6b5a631d167c8077a5c b/fuzz/read_pem_corpus/bc205ed015bb01de66b5a6b5a631d167c8077a5c new file mode 100644 index 0000000000..0fa1d3d735 Binary files /dev/null and b/fuzz/read_pem_corpus/bc205ed015bb01de66b5a6b5a631d167c8077a5c differ diff --git a/fuzz/read_pem_corpus/c0348b5dd7aaf73888372a5a6abef82bd0df97b9 b/fuzz/read_pem_corpus/c0348b5dd7aaf73888372a5a6abef82bd0df97b9 new file mode 100644 index 0000000000..4471d0e6fb --- /dev/null +++ b/fuzz/read_pem_corpus/c0348b5dd7aaf73888372a5a6abef82bd0df97b9 @@ -0,0 +1,18 @@ +-----BEGIN O----- +----(END /!-- +---6( + 7;!(;)-----END /O!:--- +---BEGIN O----- +----(END /!---'U('(:(!/;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!- +:(';'(;)- +(!:):"PZg:; :'::0!))v*Ǿ:--BEGIN 6;!(;)-- +----END /!----- +- +kqU;!:O'U|:؎8*:;s(f!;;)--*---- +----BEGIN O----- +----(END /!-----BEGIN 6 +j- +;!(;)-- +----EN- +6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/c0596e573f43d2bd5a5d038bf4bd7d073141ddf0 b/fuzz/read_pem_corpus/c0596e573f43d2bd5a5d038bf4bd7d073141ddf0 new file mode 100644 index 0000000000..1588358370 --- /dev/null +++ b/fuzz/read_pem_corpus/c0596e573f43d2bd5a5d038bf4bd7d073141ddf0 @@ -0,0 +1,16 @@ +------ +----- +----BEGIN 6( + +----N!(ED /-----BEGI 6;!(;)--'-8-END - +---BEGIN O----- +----(END--=--END -----BEGIN O----- +----(END /!-----BEGIN 6;!(;)-----END //!-----!;BE-----END GI 5;!(;)-----END /!--- + +- +6/!--!----- +6(- + +- +6((- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/c45f49452fcdf531f2bcfd100645c535e5b71205 b/fuzz/read_pem_corpus/c45f49452fcdf531f2bcfd100645c535e5b71205 new file mode 100644 index 0000000000..887d05d15c --- /dev/null +++ b/fuzz/read_pem_corpus/c45f49452fcdf531f2bcfd100645c535e5b71205 @@ -0,0 +1 @@ +O \ No newline at end of file diff --git a/fuzz/read_pem_corpus/c504659b0454be5eef0594da6a952f8daf347929 b/fuzz/read_pem_corpus/c504659b0454be5eef0594da6a952f8daf347929 new file mode 100644 index 0000000000..e5a9f0514e --- /dev/null +++ b/fuzz/read_pem_corpus/c504659b0454be5eef0594da6a952f8daf347929 @@ -0,0 +1 @@ +-----B-EGIN f( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/c7e4b7f4c3bbc7c6ed4e3366d1d4c16ed44952f1 b/fuzz/read_pem_corpus/c7e4b7f4c3bbc7c6ed4e3366d1d4c16ed44952f1 new file mode 100644 index 0000000000..4b26afa737 Binary files /dev/null and b/fuzz/read_pem_corpus/c7e4b7f4c3bbc7c6ed4e3366d1d4c16ed44952f1 differ diff --git a/fuzz/read_pem_corpus/caf489bb8f6f48e35b95032b2824ca0ffc77d26a b/fuzz/read_pem_corpus/caf489bb8f6f48e35b95032b2824ca0ffc77d26a new file mode 100644 index 0000000000..b30a845eb6 Binary files /dev/null and b/fuzz/read_pem_corpus/caf489bb8f6f48e35b95032b2824ca0ffc77d26a differ diff --git a/fuzz/read_pem_corpus/cc8ceeebb230ca237479e0c3dacafbb5524222e1 b/fuzz/read_pem_corpus/cc8ceeebb230ca237479e0c3dacafbb5524222e1 new file mode 100644 index 0000000000..fe47159b6a --- /dev/null +++ b/fuzz/read_pem_corpus/cc8ceeebb230ca237479e0c3dacafbb5524222e1 @@ -0,0 +1,20 @@ +-6( + +----- +----BEGI) 6( + +----N!(ED /-----BEGI 6;!(;)--'-8-END - +---BEGIN O----- +----(END--=--END -----BEGIN O----- +----(END /!---GB-E-IN 3;!(;)-----END //!-----!;BE-----END GI 5;!(;)-----END ----------BEGIN O---------BEGIN O----- +---- +'U('(:( +/!--- + +- +7/!--!----- +6/!---O!:'U('(- + +(:(/!;!;6();':(- +6((- +'H'G)MG'yO )o(*(*;:)*;!::(';'(; )(!:):"PZw;:P; :'::7!))vǾ:kqU;|:8*a;s(f! \ No newline at end of file diff --git a/fuzz/read_pem_corpus/cf1b3d1ed204deed6c62f41d0e706ee47bc802e0 b/fuzz/read_pem_corpus/cf1b3d1ed204deed6c62f41d0e706ee47bc802e0 new file mode 100644 index 0000000000..b7c794bef2 --- /dev/null +++ b/fuzz/read_pem_corpus/cf1b3d1ed204deed6c62f41d0e706ee47bc802e0 @@ -0,0 +1,7 @@ +O*;:) +-----BEGIN :(/!;!;6();':['H('G)MG'yO )o(*(*----- +O*;:) + +----BEGIN O!:'U('((/!;!;6();'8('H('G)MG'O!*;:) +:(-/!;!;6();':('H('G)MG'yO-----BEGIN----::(O*;:) +;(j-/!;!;6();':('; \ No newline at end of file diff --git a/fuzz/read_pem_corpus/cfc3b1348ca73b8c02d9aed715d1e0681326888c b/fuzz/read_pem_corpus/cfc3b1348ca73b8c02d9aed715d1e0681326888c new file mode 100644 index 0000000000..f994166032 --- /dev/null +++ b/fuzz/read_pem_corpus/cfc3b1348ca73b8c02d9aed715d1e0681326888c @@ -0,0 +1 @@ +O!:'U('((/!;!;6();'8('H('G)MG'yO )o(*(*;O!:'U('((/!;!;6();'8('H('G)MG'yO )o:)O!:'U(*:!::(';'(;'(:(/))(-----BEGIN (/!;!;6();':('!;!;H('G)MG'yO*o( )(*;:()**(*;:)O!:'U(*:!::(';'(;'(:(:!::(';'/))(-----BEGIN (/!;!;6();':('!;!;H('G)MG(6;)(!:):'yO*o( )(*;:)*:!::(';'(6;)(!:):"PZw;:P; :'::7!))vǾ:kqU;|:؎8"PZw;:P; :'*:;s(f!;;)j:*:::7!))vǾ:kqU;|:؎8*:;s(f!; \ No newline at end of file diff --git a/fuzz/read_pem_corpus/d4f0a19ece82b78c82c81eae5b49dc662c6f4a89 b/fuzz/read_pem_corpus/d4f0a19ece82b78c82c81eae5b49dc662c6f4a89 new file mode 100644 index 0000000000..cc15e7f405 Binary files /dev/null and b/fuzz/read_pem_corpus/d4f0a19ece82b78c82c81eae5b49dc662c6f4a89 differ diff --git a/fuzz/read_pem_corpus/d959c647c6a5ea641fec147b0de36187a9d2f8c5 b/fuzz/read_pem_corpus/d959c647c6a5ea641fec147b0de36187a9d2f8c5 new file mode 100644 index 0000000000..cae86a1d87 Binary files /dev/null and b/fuzz/read_pem_corpus/d959c647c6a5ea641fec147b0de36187a9d2f8c5 differ diff --git a/fuzz/read_pem_corpus/de2fb44503aca3f82d5466a9489c0735324b214d b/fuzz/read_pem_corpus/de2fb44503aca3f82d5466a9489c0735324b214d new file mode 100644 index 0000000000..10df3f6206 Binary files /dev/null and b/fuzz/read_pem_corpus/de2fb44503aca3f82d5466a9489c0735324b214d differ diff --git a/fuzz/read_pem_corpus/df9fe7d51a89ee267034a2834025f71505d4a421 b/fuzz/read_pem_corpus/df9fe7d51a89ee267034a2834025f71505d4a421 new file mode 100644 index 0000000000..f5951adb1d --- /dev/null +++ b/fuzz/read_pem_corpus/df9fe7d51a89ee267034a2834025f71505d4a421 @@ -0,0 +1,7 @@ +-----BEGIN )a':':!;'R):u ;:rM----- +--* +(!a!*)(-)--BEGIN N )a':':--* +* +(!a!*)(-)--BEGIN N )!;'* +---BEGIN )a':':!;'R):u::rR)M')a':':!a':':--!;'* +---BEGIN )a':':!;'R):u::rR)M')a':':!;'R):u ;;'R):u:rM' *;:rM'* \ No newline at end of file diff --git a/fuzz/read_pem_corpus/e1a6c4096b145ced5362ede6ffedbc49d16ba57e b/fuzz/read_pem_corpus/e1a6c4096b145ced5362ede6ffedbc49d16ba57e new file mode 100644 index 0000000000..2afaa7cef3 --- /dev/null +++ b/fuzz/read_pem_corpus/e1a6c4096b145ced5362ede6ffedbc49d16ba57e @@ -0,0 +1,4 @@ +-----BEGIN O----- +----(END /!-----BEGIN 6;!(;)-----END /!----- +- +6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/e207960b1761ba95e7544b9d924459c56e2c4695 b/fuzz/read_pem_corpus/e207960b1761ba95e7544b9d924459c56e2c4695 new file mode 100644 index 0000000000..f45de5f651 Binary files /dev/null and b/fuzz/read_pem_corpus/e207960b1761ba95e7544b9d924459c56e2c4695 differ diff --git a/fuzz/read_pem_corpus/e3344ef8d734471ef90b16c719cb0f11af2ce743 b/fuzz/read_pem_corpus/e3344ef8d734471ef90b16c719cb0f11af2ce743 new file mode 100644 index 0000000000..4e5586e5cf --- /dev/null +++ b/fuzz/read_pem_corpus/e3344ef8d734471ef90b16c719cb0f11af2ce743 @@ -0,0 +1,3 @@ +-----BEGIN )a':':!;'R):u ;:rM----- +--* +(!a!*)(-)--BEGIN N )--a \ No newline at end of file diff --git a/fuzz/read_pem_corpus/e45a6df435a1cecae6547f6dcde626a7e706434c b/fuzz/read_pem_corpus/e45a6df435a1cecae6547f6dcde626a7e706434c new file mode 100644 index 0000000000..349cbf1933 --- /dev/null +++ b/fuzz/read_pem_corpus/e45a6df435a1cecae6547f6dcde626a7e706434c @@ -0,0 +1,8 @@ +-:($X: +----BEGIN )a':':!;'R):u ;:rM'**;)=*;:)O(h!;:;'*0'!:;:((:;*()'(!E(:*t;;::;:!:(''`'O:!*:(&((')V`;'m\:!(@!(*:']A *:a!*)((;!2'):::)**g*!r;S()(;(*(;)*:(;c(!)!':)a':':!;'R):u ;:rM'**;)=*;::5;*j(';*(X) -x +-----BEGIN )'*;'))!':----- + 8x +x + x +-----END )'*;'))!':----- +---BEGIN )a':':!;'R):u ;:rM'**;)=*;:)O(h!;:;'*0'!:ˏ(:;(:;*()'(!E(:*t;;::;:!:(''`'O:!*:(&((')V`;'m\:!(@!(*:']A *:a!*)((;!0'):*::)*g*!r;S()( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/e7ef91e03a3aa8bd53b2466a2207a5028185678f b/fuzz/read_pem_corpus/e7ef91e03a3aa8bd53b2466a2207a5028185678f new file mode 100644 index 0000000000..7885083307 Binary files /dev/null and b/fuzz/read_pem_corpus/e7ef91e03a3aa8bd53b2466a2207a5028185678f differ diff --git a/fuzz/read_pem_corpus/ebcae74985ccc7905a3800c0db2723392cfd2f2c b/fuzz/read_pem_corpus/ebcae74985ccc7905a3800c0db2723392cfd2f2c new file mode 100644 index 0000000000..dc16e558f8 Binary files /dev/null and b/fuzz/read_pem_corpus/ebcae74985ccc7905a3800c0db2723392cfd2f2c differ diff --git a/fuzz/read_pem_corpus/ed31baee70d3b705762e808e494b4debf604c5fb b/fuzz/read_pem_corpus/ed31baee70d3b705762e808e494b4debf604c5fb new file mode 100644 index 0000000000..0a71a8eac9 --- /dev/null +++ b/fuzz/read_pem_corpus/ed31baee70d3b705762e808e494b4debf604c5fb @@ -0,0 +1,31 @@ +-----BEGIN O----- +----(END /!----G +( + 7-- +--BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN :4'----- +G +UU-- +--BEGIN :4'----- +G +UU -----BEGIN 24'/---- +-----BEGIN :4'----- +G +UU QG +wFUG + fbwFUU QG +wFU QG +wFUG + fbwFUU QG +wFU fbwFUUU G +bwFU f +bwFU U fbwFUU f +bwFU U fbU fbwF fUG + fbwFU f fTwFTU fbwFUfbwFUU f +bwFU U fbwFUU;!(;)-----EN /O!:--- +---BE- NI-GO--- +---* + f +bwFU U fbU fbw-----BEG-F fU \ No newline at end of file diff --git a/fuzz/read_pem_corpus/ee06965764fdf6769657e744a61efe7d60d085fb b/fuzz/read_pem_corpus/ee06965764fdf6769657e744a61efe7d60d085fb new file mode 100644 index 0000000000..cc7aeba88b --- /dev/null +++ b/fuzz/read_pem_corpus/ee06965764fdf6769657e744a61efe7d60d085fb @@ -0,0 +1 @@ +O! \ No newline at end of file diff --git a/fuzz/read_pem_corpus/f123c08d0a46b72fa8989296e82e7aa25ebf16f8 b/fuzz/read_pem_corpus/f123c08d0a46b72fa8989296e82e7aa25ebf16f8 new file mode 100644 index 0000000000..e530a1278e --- /dev/null +++ b/fuzz/read_pem_corpus/f123c08d0a46b72fa8989296e82e7aa25ebf16f8 @@ -0,0 +1,7 @@ +-----BEGIN --+---'-----vBEGIN --+---'---+------/ + +-----+---------BEGIN --+---'---- + ++------- + + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/f18ebc593b87baa03b5e003b7540577001ba6aca b/fuzz/read_pem_corpus/f18ebc593b87baa03b5e003b7540577001ba6aca new file mode 100644 index 0000000000..fe29dff66c Binary files /dev/null and b/fuzz/read_pem_corpus/f18ebc593b87baa03b5e003b7540577001ba6aca differ diff --git a/fuzz/read_pem_corpus/f1903c6e205ba7b902e53b07e08890ec8179cbd5 b/fuzz/read_pem_corpus/f1903c6e205ba7b902e53b07e08890ec8179cbd5 new file mode 100644 index 0000000000..628e26765e --- /dev/null +++ b/fuzz/read_pem_corpus/f1903c6e205ba7b902e53b07e08890ec8179cbd5 @@ -0,0 +1 @@ +'*:'*:-'----BEGIN*:'*: \ No newline at end of file diff --git a/fuzz/read_pem_corpus/f3f2959361766dbfafbb2f99a4f60c920001386e b/fuzz/read_pem_corpus/f3f2959361766dbfafbb2f99a4f60c920001386e new file mode 100644 index 0000000000..47ebb5b436 --- /dev/null +++ b/fuzz/read_pem_corpus/f3f2959361766dbfafbb2f99a4f60c920001386e @@ -0,0 +1,6 @@ +------ +----BEGIN O--------- +----BEGIN O----- +----(END /!-----BEGIN 6;!(;)------- +--END --(END /!-----BEGIN 6;!(;)--/!----- +-- \ No newline at end of file diff --git a/fuzz/read_pem_corpus/f72115838630c70a067e89b98615357fcf19d058 b/fuzz/read_pem_corpus/f72115838630c70a067e89b98615357fcf19d058 new file mode 100644 index 0000000000..ce9b7f8e67 --- /dev/null +++ b/fuzz/read_pem_corpus/f72115838630c70a067e89b98615357fcf19d058 @@ -0,0 +1,45 @@ +-----BEGIN O----- +-( +-(END /!----G +( + (-- +( +BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN :4'----- +G +UU-- +--BEGIN :4'G +----- +G +UU -----BEGIN 24'/---- +-----BEGIN :4'----- +G +UU-----BEGIN O----- +-( +-(END /!----G +( + (-- +( +BEGIN :4'----- +G +UU -----BEGIN :4'/---- +-----BEIN QG +wF:4'----- +G +UU-- +--BEGIN :4'G +----- +G +UU -----BEGIN 24'/---- +-----BEGIN :4'----- +G +UU QG +wFUG + fbwFUU QG +wFU UQG +wFUG + fbwFUU QG +wFU fG + b \ No newline at end of file diff --git a/fuzz/read_pem_corpus/f9f61f03681250b015a00df3010b89d2d776d8fc b/fuzz/read_pem_corpus/f9f61f03681250b015a00df3010b89d2d776d8fc new file mode 100644 index 0000000000..7643d8eb58 Binary files /dev/null and b/fuzz/read_pem_corpus/f9f61f03681250b015a00df3010b89d2d776d8fc differ diff --git a/fuzz/read_pem_corpus/fad7e4071afc1e4f441e2cb65cf9b0da37dcd74e b/fuzz/read_pem_corpus/fad7e4071afc1e4f441e2cb65cf9b0da37dcd74e new file mode 100644 index 0000000000..a6b2ddb603 --- /dev/null +++ b/fuzz/read_pem_corpus/fad7e4071afc1e4f441e2cb65cf9b0da37dcd74e @@ -0,0 +1,2 @@ +'---+----- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/fb36b0ce1600b9399d552eab916600c239be5ad5 b/fuzz/read_pem_corpus/fb36b0ce1600b9399d552eab916600c239be5ad5 new file mode 100644 index 0000000000..56195cbdd5 Binary files /dev/null and b/fuzz/read_pem_corpus/fb36b0ce1600b9399d552eab916600c239be5ad5 differ diff --git a/fuzz/read_pem_corpus/fb64fef6ea2f835804b69ae3d21fb2cac7e4973f b/fuzz/read_pem_corpus/fb64fef6ea2f835804b69ae3d21fb2cac7e4973f new file mode 100644 index 0000000000..00294ef9f0 --- /dev/null +++ b/fuzz/read_pem_corpus/fb64fef6ea2f835804b69ae3d21fb2cac7e4973f @@ -0,0 +1,9 @@ +-----BEGIN O----- +----(END /!-----BEGI 7;!(;)-----END /O!:-----BEGIN O----- +----(END /!---'U('(:(/!;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!::(';'(;)(!:):"PZg;:P; :'::7!))vǾ:--BEGIN 6;!(;)-----END /!----- +- +kqU;O!:'U|:؎8*:;s(f!;;)------ +----BEGIN O----- +----(END /!-----BEGIN 6- +j*:;!(;)-----END 6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/fb6d4702bcb98df173527a5f08d5ac829adb2f9f b/fuzz/read_pem_corpus/fb6d4702bcb98df173527a5f08d5ac829adb2f9f new file mode 100644 index 0000000000..cc3cbef272 --- /dev/null +++ b/fuzz/read_pem_corpus/fb6d4702bcb98df173527a5f08d5ac829adb2f9f @@ -0,0 +1,15 @@ +-----BEGIN O----- +----(END /!----6( + 7;!(;)-----END /O!:--- +---BEGIN O----- +----(END /!---'U('(:(!/;!;6();':('H('G)MG'yO- + )o(*(*;:)*:!- +:(';'(;)- +(!:):"PZg;:; :'::7!))v*Ǿ:--BEGIN 6;!(;)-- +----END /!----- +- +kqU;!:O'U|:؎8*:;s(f!;;)--*---- +----BEGIN O----- +----(END /!-----BEGIN 6 +j- +;!(;)-----END 6( \ No newline at end of file diff --git a/fuzz/read_pem_corpus/fd1cc706033976b86a93d2b0c74b15bb2f31fccf b/fuzz/read_pem_corpus/fd1cc706033976b86a93d2b0c74b15bb2f31fccf new file mode 100644 index 0000000000..06f32836da --- /dev/null +++ b/fuzz/read_pem_corpus/fd1cc706033976b86a93d2b0c74b15bb2f31fccf @@ -0,0 +1,18 @@ +-6( + +----- +----BEGIN 6( + +----N!(ED /-----BEGI 6;!(;)--'-8-END - +---BEGIN O----- +----(END--=--END -----BEGIN O----- +----(END /!-----BEGIN 7;!(;)-----END //!-----!;BE-----END GI 5;!(;)-----END ----- +/!--- + +- +7/!--!----- +6(- + +- +6((- + \ No newline at end of file diff --git a/fuzz/read_pem_corpus/ff7dcdb0fc13ddea6e82cac7bf3a0414cb772ded b/fuzz/read_pem_corpus/ff7dcdb0fc13ddea6e82cac7bf3a0414cb772ded new file mode 100644 index 0000000000..88fd2b0315 Binary files /dev/null and b/fuzz/read_pem_corpus/ff7dcdb0fc13ddea6e82cac7bf3a0414cb772ded differ diff --git a/include/openssl/base64.h b/include/openssl/base64.h index f28e7ddb53..4bf3888c01 100644 --- a/include/openssl/base64.h +++ b/include/openssl/base64.h @@ -87,15 +87,16 @@ OPENSSL_EXPORT int EVP_EncodedLength(size_t *out_len, size_t len); /* Decoding */ -/* EVP_DecodedLength sets |*out_len| to the maximum number of bytes - * that will be needed to call |EVP_DecodeBase64| on an input of - * length |len|. */ +/* EVP_DecodedLength sets |*out_len| to the maximum number of bytes that will + * be needed to call |EVP_DecodeBase64| on an input of length |len|. It returns + * one on success or zero if |len| is not a valid length for a base64-encoded + * string. */ OPENSSL_EXPORT int EVP_DecodedLength(size_t *out_len, size_t len); /* EVP_DecodeBase64 decodes |in_len| bytes from base64 and writes * |*out_len| bytes to |out|. |max_out| is the size of the output * buffer. If it is not enough for the maximum output size, the - * operation fails. */ + * operation fails. It returns one on success or zero on error. */ OPENSSL_EXPORT int EVP_DecodeBase64(uint8_t *out, size_t *out_len, size_t max_out, const uint8_t *in, size_t in_len); @@ -105,9 +106,7 @@ OPENSSL_EXPORT int EVP_DecodeBase64(uint8_t *out, size_t *out_len, * * OpenSSL provides a streaming base64 implementation, however its behavior is * very specific to PEM. It is also very lenient of invalid input. Use of any of - * these functions is thus deprecated. - * - * TODO(davidben): Import upstream's rewrite that rejects the invalid input. */ + * these functions is thus deprecated. */ /* EVP_EncodeInit initialises |*ctx|, which is typically stack * allocated, for an encoding operation. @@ -159,21 +158,25 @@ OPENSSL_EXPORT int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, uint8_t *out, * * WARNING: EVP_DecodeBlock's return value does not take padding into * account. It also strips leading whitespace and trailing - * whitespace. */ + * whitespace and minuses. */ OPENSSL_EXPORT int EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len); struct evp_encode_ctx_st { - unsigned num; /* number saved in a partial encode/decode */ - unsigned length; /* The length is either the output line length - * (in input bytes) or the shortest input line - * length that is ok. Once decoding begins, - * the length is adjusted up each time a longer - * line is decoded */ - uint8_t enc_data[80]; /* data to encode */ - unsigned line_num; /* number read on current line */ - int expect_nl; + /* data_used indicates the number of bytes of |data| that are valid. When + * encoding, |data| will be filled and encoded as a lump. When decoding, only + * the first four bytes of |data| will be used. */ + unsigned data_used; + uint8_t data[48]; + + /* eof_seen indicates that the end of the base64 data has been seen when + * decoding. Only whitespace can follow. */ + char eof_seen; + + /* error_encountered indicates that invalid base64 data was found. This will + * cause all future calls to fail. */ + char error_encountered; };