}
-gchar *
-rspamd_encode_base64 (const guchar *in, gsize inlen, gint str_len, gsize *outlen)
+static gchar *
+rspamd_encode_base64_common (const guchar *in, gsize inlen, gint str_len,
+ gsize *outlen, gboolean fold)
{
#define CHECK_SPLIT \
do { if (str_len > 0 && cols >= str_len) { \
*o++ = '\r'; \
*o++ = '\n'; \
+ if (fold) *o++ = '\t'; \
cols = 0; \
} } \
while (0)
if (str_len > 0) {
g_assert (str_len > 8);
- allocated_len += (allocated_len / str_len + 1) * 2 + 1;
+ allocated_len += (allocated_len / str_len + 1) * (fold ? 3 : 2) + 1;
}
out = g_malloc (allocated_len);
*o++ = '\r';
*o++ = '\n';
+ if (fold) {
+ *o ++ = '\t';
+ }
/* Remaining bytes */
while (shift >= 16) {
return out;
}
+gchar *
+rspamd_encode_base64 (const guchar *in, gsize inlen, gint str_len,
+ gsize *outlen)
+{
+ return rspamd_encode_base64_common (in, inlen, str_len, outlen, FALSE);
+}
+
+gchar *
+rspamd_encode_base64_fold (const guchar *in, gsize inlen, gint str_len,
+ gsize *outlen)
+{
+ return rspamd_encode_base64_common (in, inlen, str_len, outlen, TRUE);
+}
+
gsize
rspamd_decode_url (gchar *dst, const gchar *src, gsize size)
{
gchar * rspamd_encode_base64 (const guchar *in, gsize inlen, gint str_len,
gsize *outlen);
+/**
+ * Encode and fold string using base64 encoding
+ * @param in input
+ * @param inlen input length
+ * @param str_len maximum string length (if <= 0 then no lines are split)
+ * @return freshly allocated base64 encoded value or NULL if input is invalid
+ */
+gchar * rspamd_encode_base64_fold (const guchar *in, gsize inlen, gint str_len,
+ gsize *outlen);
+
/**
* Decode URL encoded string in-place and return new length of a string, src and dst are NULL terminated
* @param dst