Replace base64 decoding.

This code has caused a long history of problems. This change rewrites it
completely with something that is, hopefully, much simplier and robust
and adds more testing.

Change-Id: Ibeef51f9386afd95d5b73316e451eb3a2d7ec4e0
Reviewed-on: https://boringssl-review.googlesource.com/8033
Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
Adam Langley 2016-05-20 10:51:48 -07:00 committed by Adam Langley
parent 1cb405d96b
commit d09175ffe3
126 changed files with 1397 additions and 369 deletions

View File

@ -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: The recommended values of `max_len` for each test are:
| Test | `max_len` value | | Test | `max_len` value |
|-----------|-----------------| |------------|-----------------|
| `cert` | 3072 | | `cert` | 3072 |
| `client` | 20000 | | `client` | 20000 |
| `pkcs8` | 2048 | | `pkcs8` | 2048 |
| `privkey` | 2048 | | `privkey` | 2048 |
| `server` | 4096 | | `server` | 4096 |
| `spki` | 1024 | | `spki` | 1024 |
| `read_pem` | 512 |
These were determined by rounding up the length of the largest case in the corpus. These were determined by rounding up the length of the largest case in the corpus.

View File

@ -60,61 +60,42 @@
#include <limits.h> #include <limits.h>
#include <string.h> #include <string.h>
#include <openssl/type_check.h>
/* Encoding. */
static const unsigned char data_bin2ascii[65] = static const unsigned char data_bin2ascii[65] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
#define conv_bin2ascii(a) (data_bin2ascii[(a) & 0x3f]) #define conv_bin2ascii(a) (data_bin2ascii[(a) & 0x3f])
/* 64 char lines OPENSSL_COMPILE_ASSERT(sizeof(((EVP_ENCODE_CTX *)(NULL))->data) % 3 == 0,
* pad input with 0 data_length_must_be_multiple_of_base64_chunk_size);
* 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 int EVP_EncodedLength(size_t *out_len, size_t len) {
* 0xF1 is ignore but next needs to be 0xF0 (for \r\n processing). if (len + 2 < len) {
* 0xF2 is EOF return 0;
* 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,
};
static uint8_t conv_ascii2bin(uint8_t a) {
if (a >= 128) {
return 0xFF;
} }
return data_ascii2bin[a]; 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;
} }
void EVP_EncodeInit(EVP_ENCODE_CTX *ctx) { void EVP_EncodeInit(EVP_ENCODE_CTX *ctx) {
ctx->length = 48; memset(ctx, 0, sizeof(EVP_ENCODE_CTX));
ctx->num = 0;
ctx->line_num = 0;
} }
void EVP_EncodeUpdate(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len, 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; return;
} }
assert(ctx->length <= sizeof(ctx->enc_data)); assert(ctx->data_used < sizeof(ctx->data));
assert(ctx->num < ctx->length);
if (ctx->length - ctx->num > in_len) { if (sizeof(ctx->data) - ctx->data_used > in_len) {
memcpy(&ctx->enc_data[ctx->num], in, in_len); memcpy(&ctx->data[ctx->data_used], in, in_len);
ctx->num += in_len; ctx->data_used += in_len;
return; return;
} }
if (ctx->num != 0) { if (ctx->data_used != 0) {
size_t todo = ctx->length - ctx->num; const size_t todo = sizeof(ctx->data) - ctx->data_used;
memcpy(&ctx->enc_data[ctx->num], in, todo); memcpy(&ctx->data[ctx->data_used], in, todo);
in += todo; in += todo;
in_len -= 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 += encoded;
*(out++) = '\n'; *(out++) = '\n';
*out = '\0'; *out = '\0';
total = encoded + 1; total = encoded + 1;
} }
while (in_len >= ctx->length) { while (in_len >= sizeof(ctx->data)) {
size_t encoded = EVP_EncodeBlock(out, in, ctx->length); size_t encoded = EVP_EncodeBlock(out, in, sizeof(ctx->data));
in += ctx->length; in += sizeof(ctx->data);
in_len -= ctx->length; in_len -= sizeof(ctx->data);
out += encoded; out += encoded;
*(out++) = '\n'; *(out++) = '\n';
*out = '\0'; *out = '\0';
if (total + encoded + 1 < total) {
*out_len = 0;
return;
}
total += encoded + 1; total += encoded + 1;
} }
if (in_len != 0) { 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; *out_len = total;
} }
void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len) { void EVP_EncodeFinal(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len) {
unsigned ret = 0; if (ctx->data_used == 0) {
*out_len = 0;
if (ctx->num != 0) { return;
ret = EVP_EncodeBlock(out, ctx->enc_data, ctx->num);
out[ret++] = '\n';
out[ret] = '\0';
ctx->num = 0;
} }
*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) { 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; return ret;
} }
/* Decoding. */
int EVP_DecodedLength(size_t *out_len, size_t len) { int EVP_DecodedLength(size_t *out_len, size_t len) {
if (len % 4 != 0) { if (len % 4 != 0) {
return 0; return 0;
} }
*out_len = (len / 4) * 3; *out_len = (len / 4) * 3;
return 1; return 1;
} }
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;
}
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;
}
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;
}
return 1;
}
int EVP_DecodeUpdate(EVP_ENCODE_CTX *ctx, uint8_t *out, int *out_len,
const uint8_t *in, size_t in_len) {
*out_len = 0;
if (ctx->error_encountered) {
return -1;
}
size_t bytes_out = 0, i;
for (i = 0; i < in_len; i++) {
const char c = in[i];
switch (c) {
case ' ':
case '\t':
case '\r':
case '\n':
continue;
}
if (base64_ascii_to_bin(c) == 0xff || ctx->eof_seen) {
ctx->error_encountered = 1;
return -1;
}
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;
}
ctx->data_used = 0;
bytes_out += num_bytes_resulting;
out += num_bytes_resulting;
if (num_bytes_resulting < 3) {
ctx->eof_seen = 1;
}
}
}
if (bytes_out > INT_MAX) {
ctx->error_encountered = 1;
*out_len = 0;
return -1;
}
*out_len = bytes_out;
if (ctx->eof_seen) {
return 0;
}
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;
}
return 1;
}
int EVP_DecodeBase64(uint8_t *out, size_t *out_len, size_t max_out, int EVP_DecodeBase64(uint8_t *out, size_t *out_len, size_t max_out,
const uint8_t *in, size_t in_len) { const uint8_t *in, size_t in_len) {
uint8_t a, b, c, d; *out_len = 0;
size_t pad_len = 0, len = 0, max_len, i;
uint32_t l;
if (!EVP_DecodedLength(&max_len, in_len) || max_out < max_len) { if (in_len % 4 != 0) {
return 0; return 0;
} }
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) { for (i = 0; i < in_len; i += 4) {
a = conv_ascii2bin(*(in++)); size_t num_bytes_resulting;
b = conv_ascii2bin(*(in++));
if (i + 4 == in_len && in[1] == '=') { if (!base64_decode_quad(out, &num_bytes_resulting, &in[i])) {
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)) {
return 0; return 0;
} }
l = ((((uint32_t)a) << 18L) | (((uint32_t)b) << 12L) |
(((uint32_t)c) << 6L) | (((uint32_t)d))); bytes_out += num_bytes_resulting;
*(out++) = (uint8_t)(l >> 16L) & 0xff; out += num_bytes_resulting;
if (pad_len < 2) { if (num_bytes_resulting != 3 && i != in_len - 4) {
*(out++) = (uint8_t)(l >> 8L) & 0xff; return 0;
} }
if (pad_len < 1) {
*(out++) = (uint8_t)(l) & 0xff;
}
len += 3 - pad_len;
} }
*out_len = len;
*out_len = bytes_out;
return 1; return 1;
} }
void EVP_DecodeInit(EVP_ENCODE_CTX *ctx) {
ctx->length = 30;
ctx->num = 0;
ctx->line_num = 0;
ctx->expect_nl = 0;
}
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;
}
/* We parse the input data */
for (i = 0; i < in_len; i++) {
/* If the current line is > 80 characters, scream alot */
if (ln >= 80) {
rv = -1;
goto end;
}
/* 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;
}
/* 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;
}
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;
}
}
/* 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++;
}
/* 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;
}
/* 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 (seof >= 0) {
rv = 0;
goto end;
}
out += v;
}
}
rv = 1;
end:
*out_len = ret;
ctx->num = n;
ctx->line_num = ln;
ctx->expect_nl = exp_nl;
return rv;
}
int EVP_DecodeFinal(EVP_ENCODE_CTX *ctx, uint8_t *out, int *outl) {
int i;
*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;
}
ctx->num = 0;
*outl = i;
return 1;
} else {
return 1;
}
}
int EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) { 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++;
src_len--; src_len--;
} }
/* strip off stuff at the end of the line /* Trim newlines, spaces and tabs from the end of the line. */
* ascii2bin values B64_WS, B64_EOLN, B64_EOLN and B64_EOF */ while (src_len > 0) {
while (src_len > 3 && B64_NOT_BASE64(conv_ascii2bin(src[src_len - 1]))) { switch (src[src_len-1]) {
src_len--; case ' ':
case '\t':
case '\r':
case '\n':
src_len--;
continue;
}
break;
} }
if (!EVP_DecodedLength(&dst_len, src_len) || dst_len > INT_MAX) { size_t dst_len;
return -1; if (!EVP_DecodedLength(&dst_len, src_len) ||
} dst_len > INT_MAX ||
if (!EVP_DecodeBase64(dst, &dst_len, dst_len, src, src_len)) { !EVP_DecodeBase64(dst, &dst_len, dst_len, src, src_len)) {
return -1; return -1;
} }
@ -461,21 +436,3 @@ int EVP_DecodeBlock(uint8_t *dst, const uint8_t *src, size_t src_len) {
return dst_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;
}

View File

@ -15,76 +15,203 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <string>
#include <vector>
#include <openssl/base64.h> #include <openssl/base64.h>
#include <openssl/crypto.h> #include <openssl/crypto.h>
#include <openssl/err.h> #include <openssl/err.h>
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 { struct TestVector {
enum encoding_relation relation;
const char *decoded; const char *decoded;
const char *encoded; const char *encoded;
}; };
// Test vectors from RFC 4648. // Test vectors from RFC 4648.
static const TestVector kTestVectors[] = { static const TestVector kTestVectors[] = {
{ "", "" }, {canonical, "", ""},
{ "f" , "Zg==" }, {canonical, "f", "Zg==\n"},
{ "fo", "Zm8=" }, {canonical, "fo", "Zm8=\n"},
{ "foo", "Zm9v" }, {canonical, "foo", "Zm9v\n"},
{ "foob", "Zm9vYg==" }, {canonical, "foob", "Zm9vYg==\n"},
{ "fooba", "Zm9vYmE=" }, {canonical, "fooba", "Zm9vYmE=\n"},
{ "foobar", "Zm9vYmFy" }, {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 const size_t kNumTests = sizeof(kTestVectors) / sizeof(kTestVectors[0]);
static bool TestEncode() { // RemoveNewlines returns a copy of |in| with all '\n' characters removed.
for (size_t i = 0; i < kNumTests; i++) { 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]; const TestVector *t = &kTestVectors[i];
uint8_t out[9]; if (t->relation != canonical) {
size_t len = EVP_EncodeBlock(out, (const uint8_t*)t->decoded, continue;
strlen(t->decoded)); }
if (len != strlen(t->encoded) ||
memcmp(out, t->encoded, len) != 0) { 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<uint8_t> 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", 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 false;
} }
} }
return true; return true;
} }
static bool TestDecode() { static bool TestDecodeBase64() {
uint8_t out[6];
size_t len; size_t len;
for (size_t i = 0; i < kNumTests; i++) { for (unsigned i = 0; i < kNumTests; i++) {
// Test the normal API.
const TestVector *t = &kTestVectors[i]; const TestVector *t = &kTestVectors[i];
size_t expected_len = strlen(t->decoded);
if (!EVP_DecodeBase64(out, &len, sizeof(out), if (t->relation == valid) {
(const uint8_t*)t->encoded, strlen(t->encoded))) { // The non-canonical encodings will generally have odd whitespace etc
fprintf(stderr, "decode(\"%s\") failed\n", t->encoded); // that |EVP_DecodeBase64| will reject.
return false; 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<uint8_t> 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<uint8_t> out_vec(encoded.size());
uint8_t *out = out_vec.data();
// Test that the padding behavior of the deprecated API is preserved. // Test that the padding behavior of the deprecated API is preserved.
int ret = EVP_DecodeBlock(out, (const uint8_t*)t->encoded, int ret =
strlen(t->encoded)); EVP_DecodeBlock(out, (const uint8_t *)encoded.data(), encoded.size());
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "decode(\"%s\") failed\n", t->encoded); fprintf(stderr, "EVP_DecodeBlock(\"%s\") failed\n", t->encoded);
return false; return false;
} }
if (ret % 3 != 0) { if (ret % 3 != 0) {
fprintf(stderr, "EVP_DecodeBlock did not ignore padding\n"); fprintf(stderr, "EVP_DecodeBlock did not ignore padding\n");
return false; return false;
} }
size_t expected_len = strlen(t->decoded);
if (expected_len % 3 != 0) { if (expected_len % 3 != 0) {
ret -= 3 - (expected_len % 3); 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)) { return true;
fprintf(stderr, "Failed to reject invalid characters in the middle.\n"); }
return false;
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<uint8_t> 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<const uint8_t *>(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<unsigned>(total));
return false;
}
}
std::vector<uint8_t> 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<const uint8_t *>(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;
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*)"a=bc", 4)) { return true;
fprintf(stderr, "Failed to reject invalid characters in the middle.\n"); }
return false;
}
if (EVP_DecodeBase64(out, &len, sizeof(out), (const uint8_t*)"abc", 4)) { static bool TestDecodeUpdateStreaming() {
fprintf(stderr, "Failed to reject invalid input length.\n"); for (unsigned test_num = 0; test_num < kNumTests; test_num++) {
return false; const TestVector *t = &kTestVectors[test_num];
if (t->relation == invalid) {
continue;
}
const size_t encoded_len = strlen(t->encoded);
std::vector<uint8_t> 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<const uint8_t *>(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; return true;
@ -117,8 +380,11 @@ static bool TestDecode() {
int main(void) { int main(void) {
CRYPTO_library_init(); CRYPTO_library_init();
if (!TestEncode() || if (!TestEncodeBlock() ||
!TestDecode()) { !TestDecodeBase64() ||
!TestDecodeBlock() ||
!TestDecodeUpdateStreaming() ||
!TestEncodeDecode()) {
return 1; return 1;
} }

View File

@ -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 */ case BIO_CTRL_WPENDING: /* More to write in buffer */
assert(ctx->buf_len >= ctx->buf_off); assert(ctx->buf_len >= ctx->buf_off);
ret = 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; ret = 1;
} else if (ret <= 0) { } else if (ret <= 0) {
ret = BIO_ctrl(b->next_bio, cmd, num, ptr); 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; ctx->tmp_len = 0;
goto again; 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; ctx->buf_off = 0;
EVP_EncodeFinal(&(ctx->base64), (uint8_t *)ctx->buf, &(ctx->buf_len)); EVP_EncodeFinal(&(ctx->base64), (uint8_t *)ctx->buf, &(ctx->buf_len));
/* push out the bytes */ /* push out the bytes */

View File

@ -55,3 +55,12 @@ add_executable(
target_link_libraries(client Fuzzer) target_link_libraries(client Fuzzer)
target_link_libraries(client crypto) target_link_libraries(client crypto)
target_link_libraries(client ssl) target_link_libraries(client ssl)
add_executable(
read_pem
read_pem.cc
)
target_link_libraries(read_pem Fuzzer)
target_link_libraries(read_pem crypto)

36
fuzz/read_pem.cc Normal file
View File

@ -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 <openssl/crypto.h>
#include <openssl/mem.h>
#include <openssl/pem.h>
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;
}

View File

@ -0,0 +1 @@
-----BEGIN O--------

View File

@ -0,0 +1 @@
!

View File

@ -0,0 +1,33 @@
-G
----BEGIN O-----
----(END <20>/!----G
(
7--
--BEGIN :°4'-----
G
UU -----BEGIN :°4'/----
-----BEIN :°4'-----
G
UU--
--BEGIN :°4'-----
G
UU -----BEGIN 2°4'/----
----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

View File

@ -0,0 +1,3 @@
------BEG-*
----BEGIN N è)(!Ìùa!*ì)(ça'‡:':--!;'---BEGIN è)a'‡:'<27>!;'R):u ;qrR)M
*

View File

@ -0,0 +1,7 @@
-
---BEGIN O-----
----(END--=--END <20>/!-----BE-----END GI 5í;!(;)š-----END ç/!---
-
6ôí(-

View File

@ -0,0 +1,8 @@
-----BEGIN O!:š'U('ß(<>/!;!;O!:š'U('ß(<>/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO )O(*<2A>---ç--
-----BEGIN :(*ª:!:ŒO!:š'U('ß(:(ç<>/!;!;6í();-----BEGIN (ç<>/!;!;6í();':(´ò'H('G)':(´'H('G)M˜G¿ëÑ-----BEGIN O!:š'U('ß(<>/!;!;O!:š'U('ß(<>/!;!;3í();':(´'H('G)M˜G¿ëÑ'yO )O(*<2A>---ç--
-----BEGIN :(*ª:!:ŒO!OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*;ò¹:)
¬Ù*ª:!------
----BEIN Ç*Ä;ò¹:)
N O!:š'U('ß(<>!;!;6í();''yO )o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª:!:Œ:(';±×'Ú(;—é)Ð(!:™)¢í:”"P•Z ˆw;:P:(´'H(%G; )

View File

@ -0,0 +1,17 @@
OÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä---------
;ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('G)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(';±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
ÙOÇ*Ä;ò¹:×)
----B--E-6-BG

View File

@ -0,0 +1,17 @@
------
-----
----BEGIN 6í(
----N!(ED <20>/-----BEGI 6í;!(;)š--'-8-END ç-
---BEGIN O-----
----(END--=--END -----BEGIN O-----
----(END <20>/!-----BEGIN 6í;!(;)š-----END ç/<2F>/!-----!;BE-----END GI 5í;!(;)š-----END ç-----
/!---
-
/!--!-----
6í(-
-
6ôí((-

View File

@ -0,0 +1,45 @@
-----BEGIN O-*---
-(
-(END <20>/!----G
(
(--
(
BEGIN :°4'-----
G
UU -----BEGIN :°4'/----
-----BEIN :°4'-----
G
UU--
--BEGIN :°4'G
-----
G
UU -----BEGIN 2°4'/----
-----BEGIN :°4'---=-
G
UU-----BEGIN O-----
-(
-(END <20>/!----G
(
(--
(
BEGIN :°4'-----
G
UU -----BEGIN :°4'/----
-----BEIN QG
wF:°4'-----
G
UU--
--BEGIN :°4'G
-----
G
UU -----BEGIN 2°4'/----
-----BGIN :°4'-----
G
UU QG
wFUG
fbwFUU QG
wFU UQG
wFUG
fbwFUU QG
wFU fG
b

View File

@ -0,0 +1,4 @@
-*
-----BEG--)--BEGIN N è)a'‡:':--!;'*
---BEGIN è)a'‡:':!;'R):u::rR)M'
*

View File

@ -0,0 +1,15 @@
-----BEGIN :T!(!*!*z:'*ô:èÍ°:!m®*ÍÕOÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä-------END ò¹:)
OÇ*Ä;ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )(*<2A>(*ÇÄ-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('1)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(';±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
Ù-----END OÇ*;;)''<27>D;Û…:f(;<3B>w:;Å;V*ÆH

View File

@ -0,0 +1 @@
O!:<3A>'U('ί(<>/!;!;6ν();'8(΄'H('G)M<15>GΏλΡ'yO )o(*<2A>(Η*Δ;ςΉ:)·¬ΩO!:<3A>'U(*<2A>:!:<3A>:(';±Χ'Ϊ(;'ί(:(η<>/)ι)Π(-----BEGIN (η<>/!;!;6ν();':(΄'!;!;H('G)M<15>GΏλΡ'yO*o( )<29>(Η*Δ;ςΉ:)·¬Ω*<2A>:!:<3A>:(';±Χ'Ϊ(6;—ι)Π(!:™)Άν:”"P•Z <5A>w;:P; :':Β:7!)χφ)v<>τΗΎ:kqU;|:Ψ<>8*:;sα(f!;<3B>;)j*::

View File

@ -0,0 +1,3 @@
-----BEGIN x:€**”Á*Ñ**f(À~'!5 ) );á'*EÆþ-----þ----------
-----Eâ::Tð*Ñ**f(À~'!5); Cá'*EÆ;Ÿ:;h0G;G´('!Í*'l*)!:!:;'4¿®ÆC*ˆ3Ÿ:)((#('²:¡('î'uÂ*!!³!;!;)

View File

@ -0,0 +1,14 @@
-----BEGIN O-----
----(END <20>/!-----BEGI 7í;!(;)š-----END ç/O!:š---
-----END O-----
----(END <20>/!---'U('ß(:(ç!/<2F>;!;6í();':(´'H('G)M˜G¿ëÑ'yO-
)o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª:!-
:(';±×'Ú(;—é)-
Ð(!:™)¢í:”"P•Z ˆg;:; :':Â:7!)÷ö)v<>*Ǿ:--BEGIN 6í;!(;)š--
----END ç/!-----
-
kqU;!:Oš'U|:ØŽ9*:;sá(f!;<3B>;)------
----BEGIN O-----
----(END <20>/!-----BEGIN 6í
j-
;!(;)š-----END 6çí(

View File

@ -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Ý!):-

View File

@ -0,0 +1,4 @@
-----BEGIN O-----
----(END <20>/!-----BEGI 2í;!(;)š-----EçDÎ/ !---
-6í(

View File

@ -0,0 +1 @@
<EFBFBD>-

View File

@ -0,0 +1,11 @@
-----BEGIN O----
----N!(ED <20>/-----BEGI 6í;!(;)š----8-END ç-
---BEGIN O-----
----(END--=--END <20>/!-----BE-----END GI 5í;!(;)š-----END ç/!---
-
/!---
-
6ôí((-

View File

@ -0,0 +1,2 @@
-----BEGIN --+ô-----
è

View File

@ -0,0 +1 @@
-----BEGIN

View File

@ -0,0 +1,14 @@
OÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä-------END ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('1)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(';±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
Ù-----END OÇ*;;)''<27>D;Û…:f(;<3B>w:;Å ,Ÿ=*'í<>4>;9:°ç(ñð;'5Ø*iØ)T×;:)Ä

View File

@ -0,0 +1,15 @@
OÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä-------END ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('1)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(';±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
Ù-----END OÇ*;;)''<27>D;Û…:f(;<3B>w:;Å ,Ÿ=*'í<>4>;9:°ç(ñð;'5Ø*iØ)T×;:G

View File

@ -0,0 +1,2 @@
-----BEGIN O-----
----(END------B <20>/!----BEGIN 6í;!(;)š-----END çEGIN ---/!;!6í(-BEGIN Oô

View File

@ -0,0 +1,34 @@
-----BEGIN O-----
-(
-(END <20>/!----G
(
(--
(
BEGIN :°4'-----
G
UU -----BEGIN :°4'/----
-----BEIN :°4'-----
G
UU--
--BEGIN :°4'G
-----
G
UU -----BEGIN 2°4'/----
-----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

View File

@ -0,0 +1,7 @@
-----BEGIN :°4'-----
f uf f -
<EFBFBD>;3;w: ,Ÿ=*'í<>3>;9:5ð;(°'çñØ*iØ)T'fµi'(;n*;;Ñ*?;¯Â-----
-----END :°4'-----
:$;(:!@;L)J))':ýZ:!ã:<3A>.6'y:*'*aíYXX;À‡:Ø()*!;Sß------BEGIN Û…:f(;<3B>w:;Å ,Ÿ=*'í<>3>;9:°ç(ñð;µi'(;
E=BEGI(N-----)GIÔ‚'Ð)*::!!;!²>:r*>!oT#!>;):))†ä¸ :pÑ<70>*òÄ;e÷' *(%ùy¬*'£;*'Ÿ(“<>d'!¥;Õ<>ï;æN 'µi'(;
%i;;)''<27>D;Û…:;;)j':'È;þ;ki!<21>£ûš'!''<27>D;Ûm!!Æ(£'4!$­!0*‘…

View File

@ -0,0 +1,15 @@
-----BEGIN :T!(!*!*z:'*ô:èÍ°:!m®*ÍÕOÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä-------END ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('1)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(';±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
Ù-----END OÇ*;;)''<27>D;Û…:f(;<3B>w:;Å;ì*ÆHŒ-----

View File

@ -0,0 +1,6 @@
OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!ß(<>

View File

@ -0,0 +1,7 @@
-----BEGIN !:T(!*!*z:HŒ-----
F'*ìT!:m®*ÍÕ;ì*ÆÈc:>:ó;}!í;*Z:!;å¼'y<> 'x»'ž`ô)¾*¬a;:!E!Ù*Ë)('---+ô----­
è*)()''*:·E*:1**'¬;øÝ)*(¬;Ë*-----vBEGIN --+ô---'---+ô------/
ìè-----BEGIN --+ô---'---+ô-----è--
èè

View File

@ -0,0 +1,15 @@
--*
--*
BEGIN -*
Ìùa!*ì)(ç-----BE-*
----BEGIN N è--*
--*
BEGIN -*
Ìùa!*ì)(ç-----BE-*
----BEGIN N è)(!Ìùa!*ì)(ça'‡:':--!9'---BEGIN è†)a'-*
Ìùa!*ì)(ç--‰:'<27>!;'R):w (;Rrq)---B)(!Ìùa!*ì)(ça'‡:'E-*
----BEGIN N è:--!9'---BEGIN è†)a')(!-*
ÌùÌ

View File

@ -0,0 +1,5 @@
-----BEGIN --+ô---'------BEGIN --‡+ô---'---+ô-------
èè-----BEGIN :T!(ñ!**z:HŒ_t);ˆú~*Nñ?!:m®*ÍÕ;ì*Æ'----+ô------/

View File

@ -0,0 +1,16 @@
OÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä-------END ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('G)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(';±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
Ù-----END OÇ*×;:)Ĺò
----B--E-6-BG

View File

@ -0,0 +1,2 @@
-----BEGIN O!:š'U('ß(<>/!;!;O!:š'U('ß(<>/!;!;3í();':(´'H('GOÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*)M˜G¿ëÑ'Ä-----

View File

@ -0,0 +1,6 @@
OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('G)M˜G¿ëÑ'OÇ*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(----BEGIN ;(j-ç<>/!;!;6í();':(';±×

View File

@ -0,0 +1,3 @@
-----BEGIN --+ô---'---+ô-------
èè

View File

@ -0,0 +1,33 @@
-6í(
-----
----BEGIN 6í(
----N!(ED <20>/-----BEGI 5í;!(»)š--'-8-END ç-
---BEGIN O-----
----(END--=--E------
-----
----ND -----BEGIN O-----
----(END <20>/!-----BEGIN 6í;!(;)š-----END ç/<2F>/!-----!;BE-----END GI 5í;!(;)š-----END ç/!---
-
6íBEGIN 6í(
----N!(ED <20>/-----BEGI 6í;!(;)š--'-8-END ç-
---BEGIN O-----
---;(END--=--END -----BEGIN O-
---
----(END <20>/!-----BEGIN 6í;!(;)š-----END ç/<2F>/!-----!;BE-----END GI 5í/!--!-----
6í(-;!(;)š-----END ç/!---
-
Ñ6í/!--
-
6ôí((-
!-----
6í(-
-
6ôí((-

View File

@ -0,0 +1 @@
<0F>

View File

@ -0,0 +1,10 @@
-----BEGIN O-----
----(END <20>/!-----BEGI 7í;!(;)š-----END ç/O!:š-----BEGIN O-----
----(END <20>/!---'U('ß(:(ç<>/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-
)o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª:!:Œ:(';±×'Ú(;—é)Ð(!:™)¢í:”"P•Z ˆg;:; :':Â:7!)÷ö)v<>ôǾ:--BEGIN 6í;!(;)š--
----END ç/!-----
-
kqU;O!:š'U|:ØŽ8*:;sá(f!;<3B>;)--*----
----BEGIN O-----
----(END <20>/!-----BEGIN 6í-
j*:;!(;)š-----END 6çí(

View File

@ -0,0 +1,33 @@
-----BEGIN O-----
-(
-(END <20>/!----G
(
7--
(
BEGIN :°4'-----
G
UU -----BEGIN :°4'/----
-----BEIN :°4'-----
G
UU--
--BEGIN :°4'-----
G
UU -----BEGIN 2°4'/----
-----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

View File

@ -0,0 +1,3 @@
-----BEGIN --+ô---'---+ô------/
èè

View File

@ -0,0 +1,14 @@
-----BEGIN :T!(!*!*z:'*ô:èÍ°:!m®*ÍÕOÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä-------END ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('1)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(';±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
Ù-----END OÇ*;;)''<27>D;Û…:f(;<3B>w:;Å;ì*ÆHŒ---

View File

@ -0,0 +1,17 @@
-----BEGIN O-----
----(END <20>/!----6í(
;!(;)š-----END ç/O!:š---
---BEGIN O-----
----(END <20>/!---'U('ß(:(ç!/<2F>;!;6í();':(´'H('G)M˜G¿ëÑ'yO-
)o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª:!-
:(';±×'Ú(;—é)-
Ð(!:™)¢í:”"P•Z ˆg:; :':Â:0!)÷ö)v<>*Ǿ:--BEGIN 6í;!(;)š--
----END ç/!-----
-
kqU;!:Oš'U|:ØŽ8*:;sá(f!;<3B>;)--*----
----BEGIN O-----
----(END <20>/!-----BEGIN 6í
j-
;!(;)š--
----EN-
í(

View File

@ -0,0 +1,8 @@
-:($X:
m---BEGIN è)a'‡:':!;'R):u ;:rM'**;)¡=*ë;Ì:)O(hõ!;Ãú:;'Âþ*0'!:;:Ë((<28>:;*()'(!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()ï(

View File

@ -0,0 +1,3 @@
Nh'ñÍ)<29>:!X;*:¹):;üµû!¨)l;'O2)+'*:†):($X:
-----BEGIN !•*!ø²((4!èΰô)Ï«(œ(«D­:¼(!(ºW;:w:¯*S;((':â*:((`²:(6 !; *(:'3@¶;2!ü(J¹×`!Ÿ:¸õ¶(() )­'<27>9:(Bþ)J ñm!åY(!;)T!);*P)Nh'ñÍ)<29>:!X;*:¹):;üµû!¨)l;'O2Nh'ñÍ)<29>:!X;*:¹)k*!Œ*DÕ'žaÐ[!ʬ*#'&:;üµû!¨)l;)+*Å;öNh'ñ'*:†):($X:
-----BEGIN !•*!'O2)+'*:†)ø²

View File

@ -0,0 +1,14 @@
-----BEGIN :T!(!*!*z:'*ô:èÍ°:!m®*ÍÕOÇ*Ä;ò¹:)
OÇ*Ä;ò¹:)
:(ç<>/!;!;7í();':[´'H 'G)MG¿Ñ'ëyO )o(*<2A>(Ç*Ä-------END ò¹:)
-----BEGIN¬OÇ*Ä;ò¹:)
:(ç<>/!;!;OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('1)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-7í();';[´'H('Gç<47>/!;!;6í();':(;±)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
Ù-----END OÇ*;;)''<27>D;Û…:f(;<3B>w:;Å

View File

@ -0,0 +1,5 @@
-----BEGIN O-----
----(END <20>/!-----BEGI 6í;!(;)š-----END ç/!---
6í(

View File

@ -0,0 +1,5 @@
-----BEGIN O-----
----(END <20>/!-----BE-----END GI 6í;!(;)š-----END ç/!---
-
6ôí(

View File

@ -0,0 +1,12 @@
-----BEGIN O-----
----(END <20>/!-----BEGI 7í;!(;)š-----END ç/O!:š---
---BEGIN O-----
----(END <20>/!---'U('ß(:(ç!/<2F>;!;6í();':(´'H('G)M˜G¿ëÑ'yO-
)o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª:!:Œ:(';±×'Ú(;—é)Ð(!:™)¢í:”"P•Z ˆg;:; :':Â:7!)÷ö)v<>ôǾ:--BEGIN 6í;!(;)š--
----END ç/!-----
-
kqU;O!:š'U|:ØŽ8*:;sá(f!;<3B>;)--*----
----BEGIN O-----
----(END <20>/!-----BEGIN 6í
j-
;!(;)š-----END 6çí(

View File

@ -0,0 +1,5 @@
-----vBEGIN --+ô---'---+ô------/
è-----BEGIN --+ô---'---+ô-----è--
èè

View File

@ -0,0 +1,14 @@
-----BEGIN O-----
----(END <20>/!-----BEGI 7í;!(;)š-----END ç/O!:š---
-----END O-=---
----(END <20>/!---'U('ß(:(ç!/<2F>;!;6í();':(´'H('G)M˜G¿ëÑ'yO-
)o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª:!-
:(';±×'Ú(;—é)-
Ð(!:™)¢í:”"P•Z ˆg;:; :':Â:7!)÷ö)v<>*Ǿ:--BEGIN 6í;!(;)š--
----END ç/!-----
-
kqU;!:Oš'U|:ØŽ9*:;sá(f!;<3B>;)------
----BEGIN O-----
----(END <20>/!-----BEGIN 6í
j-
;!(;)š-----END 6çí(

View File

@ -0,0 +1,3 @@
-----BEGIN x:€**”Á*Ñ**f(À~'!5 ) );á'*EÆþ-----B-----
-----END f(À~'!5 ) C;á'*EÆ;Ÿ:;h0G;G´('!Í*l*)!:!:;'4¿®ÆC*Öˆ3Ÿ:)((#('²:¡('î'uÂ*!!x
;!;)

View File

@ -0,0 +1,6 @@
-----BEGIN O!:š'U('ß(<>/!;!;O!:š'U('ß(<>/!;!;3í();':(´'H('G)M˜G¿ëÑ'yO )O(*<2A>---ç--
-----BEGIN :(*ª:!:ŒO!OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
¬Ù*ª:!------
----BEIN Ç*Ä;ò¹:)
N O!:š'U('ß(<>!;!;6í();':(´'H(%G)M˜G¿ëÑ'yO :)o(*<2A>(Ç*Ä;ò¹:)·:š'U('¬ÙO!:š'U(*ª:!:Œ:(';±×'Ú(;'ß(:(ç<>/—é)Ð(!;!;ß(:(ç<>/!;!;();-6í();O!-:

View File

@ -0,0 +1,8 @@
-:($X:
----BEGIN è)a'‡:':!;'R):u ;:rM'**;)¡=*ë;Ì:)O(hõ!;Ãú:;'Âþ*0'!:;:Ë((<28>:;*()'(!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()ï(

View File

@ -0,0 +1,2 @@
-----BEGIN O-----
'U('ß(:(ç<>/!-----BEGIN 6í;!(;)š'U('ß(:(ç/!;!;;':(´6í(

View File

@ -0,0 +1,18 @@
-----BEGIN O-----
----(END <20>/!--
---6í(
;!(;)š-----END ç/O!:š---
---BEGIN O-----
----(END <20>/!---'U('ß(:(ç!/<2F>;!;6í();':(´'H('G)M˜G¿ëÑ'yO-
)o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª:!-
:(';±×'Ú(;—é)-
Ð(!:™)¢í:”"P•Z ˆg:; :':Â:0!)÷ö)v<>*Ǿ:--BEGIN 6í;!(;)š--
----END ç/!-----
-
kqU;!:Oš'U|:ØŽ8*:;sá(f!;<3B>;)--*----
----BEGIN O-----
----(END <20>/!-----BEGIN 6í
j-
;!(;)š--
----EN-
í(

View File

@ -0,0 +1,16 @@
------
-----
----BEGIN 6í(
----N!(ED <20>/-----BEGI 6í;!(;)š--'-8-END ç-
---BEGIN O-----
----(END--=--END -----BEGIN O-----
----(END <20>/!-----BEGIN 6í;!(;)š-----END ç/<2F>/!-----!;BE-----END GI 5í;!(;)š-----END ç/!---
-
/!--!-----
6í(-
-
6ôí((-

View File

@ -0,0 +1 @@
O<EFBFBD>

View File

@ -0,0 +1 @@
-----B-EGIN f(

View File

@ -0,0 +1,20 @@
-6í(
-----
----BEGI) 6í(
----N!(ED <20>/-----BEGI 6í;!(;)š--'-8-END ç-‰
---BEGIN O-----
----(END--=--END -----BEGIN O-----
----(END <20>/!---GB-E-IN 3í;!(;)š-----END ç/<2F>/!-----!;BE-----END GI 5í;!(;)š-----END ç----------BEGIN O---------BEGIN O-----
----
'U('ß(:(ç
/!---
-
/!--!-----
6<EFBFBD>/!---O!:š'U('í(-
ß(:(ç<>/!;!;6í();':(´-
6ôí((-
'H'G)M˜G¿ëÑ'yO )o(*<2A>(Ç*Ä;ò¹:)·¬Ù*ª;!:Œ:(';±×'Ú(; —é)Ð(!:™)¢í:”"P•Z ˆw;:P; :':Â:7!)÷ö)v<>ôǾ:kqU;|:Ø8*a;sá(f!

View File

@ -0,0 +1,7 @@
OÇ*Ä;ò¹:)
-----BEGIN :(ç<>/!;!;6í();':[´'H('G)MG¿Ñ'ë˜yO )o(*<2A>(Ç*Ä-----
¬ÙOÇ*Ä;ò¹:)
----BEGIN O!:š'U('ß(<>/!;!;6í();'8(´'H('G)M˜G¿ëÑ'OÇ!*Ä;ò¹:)
:(ç<>-/!;!;6í();':(´'H('G)M˜G¿ëÑ'yO-----BEGIN----:Œ:(OÇ*Ä;ò¹:)
;(j-ç<>/!;!;6í();':(';±×

Some files were not shown because too many files have changed in this diff Show More