11 static const char encoding_table[] = {
12 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
13 'I',
'J',
'K',
'L',
'M',
'N',
'O',
'P',
14 'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
15 'Y',
'Z',
'a',
'b',
'c',
'd',
'e',
'f',
16 'g',
'h',
'i',
'j',
'k',
'l',
'm',
'n',
17 'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
18 'w',
'x',
'y',
'z',
'0',
'1',
'2',
'3',
19 '4',
'5',
'6',
'7',
'8',
'9',
'+',
'/' };
21 static const unsigned char decoding_table[256] = {
22 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
23 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
24 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f,
25 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
26 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
27 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00,
28 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28,
29 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00,
30 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
31 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
36 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
37 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
47 uint8_t*
b64e(
const char *
string){
48 uint32_t len = ((
strlen(
string)));
51 uint8_t *encoded =
nullptr;
53 for (i = 0; i < len - 2; i += 3) {
54 *p++ = encoding_table[(
string[i] >> 2) & 0x3F];
55 *p++ = encoding_table[((
string[i] & 0x3) << 4) | ((int) (
string[i + 1] & 0xF0) >> 4)];
56 *p++ = encoding_table[((
string[i + 1] & 0xF) << 2) | ((int) (
string[i + 2] & 0xC0) >> 6)];
57 *p++ = encoding_table[
string[i + 2] & 0x3F];
60 *p++ = encoding_table[(
string[i] >> 2) & 0x3F];
62 *p++ = encoding_table[((
string[i] & 0x3) << 4)];
65 *p++ = encoding_table[((
string[i] & 0x3) << 4) |
66 ((int) (
string[i + 1] & 0xF0) >> 4)];
67 *p++ = encoding_table[((
string[i + 1] & 0xF) << 2)];
82 uint8_t*
b64d(
const char *data) {
83 size_t decode_size =
strlen(data);
85 if (decode_size % 4 != 0){
89 size_t output_length = decode_size / 4 * 3;
91 if (data[decode_size - 1] ==
'=') (output_length)--;
92 if (data[decode_size - 2] ==
'=') (output_length)--;
94 uint8_t* decoded_data = (uint8_t*)kmalloc(output_length*3);
96 if (decoded_data == 0){
100 for (
size_t i = 0, j = 0; i < decode_size;) {
101 uint32_t sextet_a = data[i] ==
'=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
102 uint32_t sextet_b = data[i] ==
'=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
103 uint32_t sextet_c = data[i] ==
'=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
104 uint32_t sextet_d = data[i] ==
'=' ? 0 & i++ : decoding_table[(uint8_t)data[i++]];
105 uint32_t triple = (sextet_a << 3 * 6)
106 + (sextet_b << 2 * 6)
107 + (sextet_c << 1 * 6)
108 + (sextet_d << 0 * 6);
110 if (j < output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF;
111 if (j < output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF;
112 if (j < output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF;
114 decoded_data[output_length] =
'\0';
uint8_t * b64e(const char *string)
Кодирует строку в Base64.
uint8_t * b64d(const char *data)
Декодирует строку Base64.
size_t strlen(const char *str)
Возращает длину строки