summaryrefslogtreecommitdiff
path: root/src/server/base64.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/base64.c')
-rw-r--r--src/server/base64.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/server/base64.c b/src/server/base64.c
new file mode 100644
index 0000000..3400cfb
--- /dev/null
+++ b/src/server/base64.c
@@ -0,0 +1,27 @@
+static const char b64[] =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ "0123456789+/";
+
+void base64_encode(
+ const unsigned char *in,
+ size_t len,
+ char *out
+) {
+ size_t i, j = 0;
+
+ for (i = 0; i < len; i += 3) {
+ unsigned v = in[i] << 16;
+
+ if (i + 1 < len) v |= in[i + 1] << 8;
+ if (i + 2 < len) v |= in[i + 2];
+
+ out[j++] = b64[(v >> 18) & 63];
+ out[j++] = b64[(v >> 12) & 63];
+
+ out[j++] = (i + 1 < len) ? b64[(v >> 6) & 63] : '=';
+ out[j++] = (i + 2 < len) ? b64[v & 63] : '=';
+ }
+
+ out[j] = 0;
+}