24static const char B64_TABLE[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
33 while (i + 2 < src_len)
35 uint32_t v = ((uint32_t)src[i] << 16) | ((uint32_t)src[i + 1] << 8) | (uint32_t)src[i + 2];
36 dst[j++] = B64_TABLE[(v >> 18) & 0x3F];
37 dst[j++] = B64_TABLE[(v >> 12) & 0x3F];
38 dst[j++] = B64_TABLE[(v >> 6) & 0x3F];
39 dst[j++] = B64_TABLE[(v) & 0x3F];
46 uint32_t v = (uint32_t)src[i] << 16;
48 v |= (uint32_t)src[i + 1] << 8;
50 dst[j++] = B64_TABLE[(v >> 18) & 0x3F];
51 dst[j++] = B64_TABLE[(v >> 12) & 0x3F];
52 dst[j++] = (i + 1 < src_len) ? B64_TABLE[(v >> 6) & 0x3F] :
'=';
62#include "mbedtls/base64.h"
67 size_t src_len = strnlen(src, ((dst_cap + 2) / 3) * 4 + 4);
70 int ret = mbedtls_base64_decode(dst, dst_cap, &olen, (
const unsigned char *)src, src_len);
71 return (ret == 0) ? olen : 0;
77static int b64_val(
char c)
79 if (c >=
'A' && c <=
'Z')
81 if (c >=
'a' && c <=
'z')
83 if (c >=
'0' && c <=
'9')
94size_t base64_decode(
const char *src, uint8_t *dst,
size_t dst_cap)
106 if (!c1 || !c2 || !c3)
116 bool pad2 = (c2 ==
'=');
117 bool pad3 = (c3 ==
'=');
120 if ((pad2 || pad3) && src[4] !=
'\0')
123 int c = pad2 ? 0 : b64_val(c2);
124 int d = pad3 ? 0 : b64_val(c3);
132 dst[out++] = (uint8_t)((a << 2) | (b >> 4));
137 dst[out++] = (uint8_t)((b << 4) | (c >> 2));
143 dst[out++] = (uint8_t)((c << 6) | d);
167 for (
size_t i = 0; dst[i]; i++)
182static int base64url_val(
char c)
184 if (c >=
'A' && c <=
'Z')
186 if (c >=
'a' && c <=
'z')
188 if (c >=
'0' && c <=
'9')
205 for (
size_t i = 0; i < src_len; i++)
209 int v = base64url_val(src[i]);
212 acc = (acc << 6) | (uint32_t)v;
219 dst[o++] = (uint8_t)((acc >> bits) & 0xFF);
void base64_encode(const uint8_t *src, size_t src_len, char *dst)
Encode src_len bytes of src as Base64.
size_t base64url_decode(const char *src, size_t src_len, uint8_t *dst, size_t dst_cap)
Decode src_len characters of base64url (RFC 4648 section 5, '-'/'_' alphabet; an '=' ends the input).
size_t base64_decode(const char *src, uint8_t *dst, size_t dst_cap)
Decode a null-terminated Base64 string.
size_t base64url_encode(const uint8_t *src, size_t src_len, char *dst)
Encode src_len bytes as base64url (RFC 4648 section 5): '-' / '_' in place of '+' / '/',...