8#include "../nyx_node_internal.h"
12static const char BASE64_ENCODE_TABLE[] = {
13 'A',
'B',
'C',
'D',
'E',
'F',
'G',
'H',
'I',
'J',
'K',
'L',
'M',
14 'N',
'O',
'P',
'Q',
'R',
'S',
'T',
'U',
'V',
'W',
'X',
'Y',
'Z',
15 'a',
'b',
'c',
'd',
'e',
'f',
'g',
'h',
'i',
'j',
'k',
'l',
'm',
16 'n',
'o',
'p',
'q',
'r',
's',
't',
'u',
'v',
'w',
'x',
'y',
'z',
17 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
23static const unsigned char BASE64_DECODE_TABLE[] = {
24 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
25 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
26 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
27 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
28 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
29 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
30 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
31 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
38 if(size == 0x00 || buff == NULL)
50 size_t len = 4 * ((size + 2) / 3);
56 size_t div = size / 3;
57 size_t mod = size % 3;
59 const unsigned char *p = buff;
64 for(
size_t i = 0; i < div; i++)
67 ((uint32_t) p[0] << 16)
69 ((uint32_t) p[1] << 8)
71 ((uint32_t) p[2] << 0)
74 *q++ = BASE64_ENCODE_TABLE[(triple >> 18) & 0x3F];
75 *q++ = BASE64_ENCODE_TABLE[(triple >> 12) & 0x3F];
76 *q++ = BASE64_ENCODE_TABLE[(triple >> 6) & 0x3F];
77 *q++ = BASE64_ENCODE_TABLE[(triple >> 0) & 0x3F];
87 ((uint32_t) p[0] << 16)
89 ((uint32_t) p[1] << 8)
92 *q++ = BASE64_ENCODE_TABLE[(triple >> 18) & 0x3F];
93 *q++ = BASE64_ENCODE_TABLE[(triple >> 12) & 0x3F];
94 *q++ = BASE64_ENCODE_TABLE[(triple >> 6) & 0x3F];
100 ((uint32_t) p[0] << 16)
103 *q++ = BASE64_ENCODE_TABLE[(triple >> 18) & 0x3F];
104 *q++ = BASE64_ENCODE_TABLE[(triple >> 12) & 0x3F];
127 if(len == 0x00 || str == NULL)
139 size_t pad = (size_t) (str[len - 1] ==
'=')
141 (size_t) (str[len - 2] ==
'=')
146 size_t size = (len / 4) * 3 - pad;
152 size_t blocks = (len / 4) - (
157 unsigned char *q = buff;
161 for(
size_t i = 0; i < blocks; i++)
164 ((uint32_t) BASE64_DECODE_TABLE[(int) p[0]] << 18)
166 ((uint32_t) BASE64_DECODE_TABLE[(int) p[1]] << 12)
168 ((uint32_t) BASE64_DECODE_TABLE[(int) p[2]] << 6)
170 ((uint32_t) BASE64_DECODE_TABLE[(int) p[3]] << 0)
173 *q++ = (triple >> 16) & 0xFF;
174 *q++ = (triple >> 8) & 0xFF;
175 *q++ = (triple >> 0) & 0xFF;
185 ((uint32_t) BASE64_DECODE_TABLE[(int) p[0]] << 18)
187 ((uint32_t) BASE64_DECODE_TABLE[(int) p[1]] << 12)
189 ((uint32_t) BASE64_DECODE_TABLE[(int) p[2]] << 6)
192 *q++ = (triple >> 16) & 0xFF;
193 *q++ = (triple >> 8) & 0xFF;
198 ((uint32_t) BASE64_DECODE_TABLE[(int) p[0]] << 18)
200 ((uint32_t) BASE64_DECODE_TABLE[(int) p[1]] << 12)
203 *q++ = (triple >> 16) & 0xFF;
#define STR_t
Alias for const char *.
__NYX_NULLABLE__ buff_t nyx_memory_alloc(__NYX_ZEROABLE__ size_t size)
Similar to libc malloc except that a memory overflow causes the node to stop.
#define buff_t
Alias for void *.
#define BUFF_t
Alias for const void *.
#define str_t
Alias for char *.
__NYX_NULLABLE__ str_t nyx_base64_encode(__NYX_NULLABLE__ size_t *result_len, __NYX_ZEROABLE__ size_t size, __NYX_NULLABLE__ BUFF_t buff)
Encodes a buffer using the Base64 algorithm.
__NYX_NULLABLE__ buff_t nyx_base64_decode(__NYX_NULLABLE__ size_t *result_size, __NYX_ZEROABLE__ size_t len, __NYX_NULLABLE__ STR_t str)
Decodes a string using the Base64 algorithm.