20#include "mbedtls/base64.h"
26 size_t dlen = ((src_len + 2) / 3) * 4 + 1;
27 mbedtls_base64_encode((
unsigned char *)dst, dlen, &olen, src, src_len);
33 size_t src_len = strlen(src);
35 size_t dlen = (src_len / 4) * 3 + 3;
36 int ret = mbedtls_base64_decode(dst, dlen, &olen,
37 (
const unsigned char *)src, src_len);
38 return (ret == 0) ? olen : 0;
46static const char B64_TABLE[] =
47 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
49void base64_encode(
const uint8_t *src,
size_t src_len,
char *dst)
53 while (i + 2 < src_len)
55 uint32_t v = ((uint32_t)src[i] << 16)
56 | ((uint32_t)src[i+1] << 8)
58 dst[j++] = B64_TABLE[(v >> 18) & 0x3F];
59 dst[j++] = B64_TABLE[(v >> 12) & 0x3F];
60 dst[j++] = B64_TABLE[(v >> 6) & 0x3F];
61 dst[j++] = B64_TABLE[(v ) & 0x3F];
67 uint32_t v = (uint32_t)src[i] << 16;
69 v |= (uint32_t)src[i+1] << 8;
71 dst[j++] = B64_TABLE[(v >> 18) & 0x3F];
72 dst[j++] = B64_TABLE[(v >> 12) & 0x3F];
73 dst[j++] = (i + 1 < src_len) ? B64_TABLE[(v >> 6) & 0x3F] :
'=';
80static int b64_val(
char c)
82 if (c >=
'A' && c <=
'Z')
return c -
'A';
83 if (c >=
'a' && c <=
'z')
return c -
'a' + 26;
84 if (c >=
'0' && c <=
'9')
return c -
'0' + 52;
85 if (c ==
'+')
return 62;
86 if (c ==
'/')
return 63;
87 if (c ==
'=')
return 0;
97 int a = b64_val(src[0]);
98 int b = (src[1]) ? b64_val(src[1]) : -1;
99 int c = (src[2]) ? b64_val(src[2]) : -1;
100 int d = (src[3]) ? b64_val(src[3]) : -1;
102 if (a < 0 || b < 0 || c < 0 || d < 0)
105 dst[out++] = (uint8_t)((a << 2) | (b >> 4));
106 if (src[2] && src[2] !=
'=')
107 dst[out++] = (uint8_t)((b << 4) | (c >> 2));
108 if (src[3] && src[3] !=
'=')
109 dst[out++] = (uint8_t)((c << 6) | d);
void base64_encode(const uint8_t *src, size_t src_len, char *dst)
Encode src_len bytes of src as Base64.
size_t base64_decode(const char *src, uint8_t *dst)
Decode a null-terminated Base64 string.