43static unsigned char *
b64_decode(
const char * data,
size_t * out_len) {
44 static const int b64_decode_table[] = {
45 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
46 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55,
47 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
48 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32,
49 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1};
51 size_t in_len = strlen(data);
55 *out_len = in_len / 4 * 3;
56 if (data[in_len - 1] ==
'=')
58 if (data[in_len - 2] ==
'=')
61 unsigned char * out = (
unsigned char *)malloc(*out_len);
65 for (
size_t i = 0, j = 0; i < in_len;) {
66 int sextet_a = b64_decode_table[(
unsigned char)data[i++]];
67 int sextet_b = b64_decode_table[(
unsigned char)data[i++]];
68 int sextet_c = b64_decode_table[(
unsigned char)data[i++]];
69 int sextet_d = b64_decode_table[(
unsigned char)data[i++]];
71 if (sextet_a == -1 || sextet_b == -1 || (data[i - 2] !=
'=' && sextet_c == -1) ||
72 (data[i - 1] !=
'=' && sextet_d == -1)) {
77 unsigned int triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) + (sextet_c << 1 * 6) + (sextet_d << 0 * 6);
80 out[j++] = (triple >> 2 * 8) & 0xFF;
82 out[j++] = (triple >> 1 * 8) & 0xFF;
84 out[j++] = (triple >> 0 * 8) & 0xFF;