41 #define MAX_BASE64_LINE_LENGTH 76 56 const char *
base64_map =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefghijklmnopqrstuvwxyz" "0123456789+/";
64 const char from_base64_table[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -2, -2, -2, -2, -1, -1, -1, -1,
66 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
68 -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
70 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
72 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
74 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
76 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
78 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, -1, -1,
79 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
80 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -2, -1, -1, -1, -1, -1,
81 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
82 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
83 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
84 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
85 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
91 static int base64_encode_local (
const unsigned char *src,
int src_len,
unsigned char *dest);
92 static int base64_remove_space (
const unsigned char *src,
int src_len,
unsigned char *dest,
int *dst_len);
129 const char *pos =
NULL;
156 int i, j, chunk_count, chunk_num, dst_len;
157 unsigned char d1, d2, d3, d4;
158 bool tail_chunk_flag;
169 if ((src_len & 0x3) != 0)
176 chunk_num = src_len / 4;
185 memset (ppchunk, 0, chunk_num *
sizeof (
BASE64_CHUNK *));
187 tail_chunk_flag =
false;
188 i = chunk_count = dst_len = 0;
189 while (chunk_count < chunk_num)
227 ppchunk[chunk_count] = chk;
232 if ((chunk_count + 1) != chunk_num)
241 tail_chunk_flag =
true;
247 if (tail_chunk_flag ==
true)
260 *chunk_num_out = chunk_count;
261 *dst_len_out = dst_len;
340 char decode_bytes[3];
347 while (i < chunk_num)
355 decode_bytes[0] = (d >> 16) & 0xff;
356 decode_bytes[1] = (d >> 8) & 0xff;
357 decode_bytes[2] = (d >> 0) & 0xff;
363 memcpy (dest, decode_bytes, copy_num);
387 base64_decode (
const unsigned char *src,
int src_len,
unsigned char **dest,
int *dest_len)
390 int len_no_space, real_dest_len, chunk_num = 0;
391 unsigned char *str_no_space =
NULL;
392 unsigned char *real_dest =
NULL;
404 if (str_no_space ==
NULL)
414 if (len_no_space == 0)
430 if (real_dest ==
NULL)
436 real_dest[real_dest_len] =
'\0';
442 *dest_len = real_dest_len;
448 if (str_no_space !=
NULL)
474 int nbytes, backspace_bytes_need, total_bytes;
478 nbytes = (src_len + 2) / 3 * 4;
484 --backspace_bytes_need;
487 total_bytes = nbytes + backspace_bytes_need;
502 base64_encode (
const unsigned char *src,
int src_len,
unsigned char **dest,
int *dest_len)
506 unsigned char *dest_p =
NULL;
526 dest_p[encode_len] =
'\0';
529 *dest_len = encode_len;
558 const unsigned char *
p;
560 int i, encoded_len, fill, line_break_count;
565 line_break_count = 0;
574 dest[encoded_len++] =
'\n';
575 line_break_count = 0;
582 if (src_len >= (i + 1))
588 if (src_len >= (i + 1))
595 dest[encoded_len++] =
base64_map[(d >> 18) & 0x3f];
596 dest[encoded_len++] =
base64_map[(d >> 12) & 0x3f];
597 dest[encoded_len++] = (fill > 1) ?
'=' :
base64_map[(d >> 6) & 0x3f];
598 dest[encoded_len++] = (fill > 0) ?
'=' :
base64_map[(d >> 0) & 0x3f];
600 line_break_count += 4;
619 for (i = 0; i < chunk_num; ++
i)
621 if (ppchunk[i] !=
NULL)
static int base64_remove_space(const unsigned char *src, int src_len, unsigned char *dest, int *dst_len)
#define MAX_BASE64_LINE_LENGTH
int base64_decode(const unsigned char *src, int src_len, unsigned char **dest, int *dest_len)
const char from_base64_table[]
static bool char_is_invalid(unsigned char ch)
static int base64_decode_chunk(unsigned char *dest, int chunk_num, BASE64_CHUNK **ppchunk)
static int find_base64(unsigned char ch)
#define ER_OUT_OF_VIRTUAL_MEMORY
static bool char_is_padding(unsigned char ch)
static void free_base64_chunk(BASE64_CHUNK **ppchunk, int chunk_num)
#define db_private_free_and_init(thrd, ptr)
#define db_private_free(thrd, ptr)
#define db_private_alloc(thrd, size)
static int base64_encode_local(const unsigned char *src, int src_len, unsigned char *dest)
int base64_encode(const unsigned char *src, int src_len, unsigned char **dest, int *dest_len)
static int get_base64_encode_len(int src_len)
static int base64_partition_into_chunk(const unsigned char *src, int src_len, int *chunk_num, int *dst_len, BASE64_CHUNK ***pppchunk)