+/** @brief Convert a binary string to base64
+ * @param s Bytes to convert
+ * @param ns Number of bytes to convert
+ * @return Encoded data
+ *
+ * This function does not attempt to split up lines.
+ */
+char *mime_to_base64(const uint8_t *s, size_t ns) {
+ struct dynstr d[1];
+
+ dynstr_init(d);
+ while(ns >= 3) {
+ /* Input bytes with output bits: AAAAAABB BBBBCCCC CCDDDDDD */
+ /* Output bytes with input bits: 000000 001111 111122 222222 */
+ dynstr_append(d, mime_base64_table[s[0] >> 2]);
+ dynstr_append(d, mime_base64_table[((s[0] & 3) << 4)
+ + (s[1] >> 4)]);
+ dynstr_append(d, mime_base64_table[((s[1] & 15) << 2)
+ + (s[2] >> 6)]);
+ dynstr_append(d, mime_base64_table[s[2] & 63]);
+ ns -= 3;
+ s += 3;
+ }
+ if(ns > 0) {
+ dynstr_append(d, mime_base64_table[s[0] >> 2]);
+ switch(ns) {
+ case 1:
+ dynstr_append(d, mime_base64_table[(s[0] & 3) << 4]);
+ dynstr_append(d, '=');
+ dynstr_append(d, '=');
+ break;
+ case 2:
+ dynstr_append(d, mime_base64_table[((s[0] & 3) << 4)
+ + (s[1] >> 4)]);
+ dynstr_append(d, mime_base64_table[(s[1] & 15) << 2]);
+ dynstr_append(d, '=');
+ break;
+ }
+ }
+ dynstr_terminate(d);
+ return d->vec;
+}
+