|
|
@@ -642,54 +642,139 @@ rspamd_encode_base32 (const guchar *in, gsize inlen, enum rspamd_base32_type typ |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
static const guchar b32_dec[] = { |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0x12, 0xff, 0x19, 0x1a, 0x1b, 0x1e, 0x1d, |
|
|
|
0x07, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0x18, 0x01, 0x0c, 0x03, 0x08, 0x05, 0x06, |
|
|
|
0x1c, 0x15, 0x09, 0x0a, 0xff, 0x0b, 0x02, 0x10, |
|
|
|
0x0d, 0x0e, 0x04, 0x16, 0x11, 0x13, 0xff, 0x14, |
|
|
|
0x0f, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0x18, 0x01, 0x0c, 0x03, 0x08, 0x05, 0x06, |
|
|
|
0x1c, 0x15, 0x09, 0x0a, 0xff, 0x0b, 0x02, 0x10, |
|
|
|
0x0d, 0x0e, 0x04, 0x16, 0x11, 0x13, 0xff, 0x14, |
|
|
|
0x0f, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
|
|
|
static const guchar b32_dec_zbase[] = { |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0x12, 0xff, 0x19, 0x1a, 0x1b, 0x1e, 0x1d, |
|
|
|
0x07, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0x18, 0x01, 0x0c, 0x03, 0x08, 0x05, 0x06, |
|
|
|
0x1c, 0x15, 0x09, 0x0a, 0xff, 0x0b, 0x02, 0x10, |
|
|
|
0x0d, 0x0e, 0x04, 0x16, 0x11, 0x13, 0xff, 0x14, |
|
|
|
0x0f, 0x00, 0x17, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
|
|
|
}; |
|
|
|
static const guchar b32_dec_bleach[] = { |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0x0f, 0xff, 0x0a, 0x11, 0x15, 0x14, 0x1a, 0x1e, |
|
|
|
0x07, 0x05, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0x1d, 0xff, 0x18, 0x0d, 0x19, 0x09, 0x08, |
|
|
|
0x17, 0xff, 0x12, 0x16, 0x1f, 0x1b, 0x13, 0xff, |
|
|
|
0x01, 0x00, 0x03, 0x10, 0x0b, 0x1c, 0x0c, 0x0e, |
|
|
|
0x06, 0x04, 0x02, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff |
|
|
|
}; |
|
|
|
static const guchar b32_dec_rfc[] = { |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, |
|
|
|
0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, |
|
|
|
0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, |
|
|
|
0x17, 0x18, 0x19, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
gint |
|
|
|
rspamd_decode_base32_buf (const gchar *in, gsize inlen, |
|
|
|
guchar *out, gsize outlen) |
|
|
|
rspamd_decode_base32_buf (const gchar *in, gsize inlen, guchar *out, gsize outlen, |
|
|
|
enum rspamd_base32_type type) |
|
|
|
{ |
|
|
|
guchar *o, *end, decoded; |
|
|
|
guchar c; |
|
|
|
guint acc = 0U; |
|
|
|
guint processed_bits = 0; |
|
|
|
gsize i; |
|
|
|
const guchar *b32_dec; |
|
|
|
|
|
|
|
end = out + outlen; |
|
|
|
o = out; |
|
|
|
|
|
|
|
switch (type) { |
|
|
|
case RSPAMD_BASE32_DEFAULT: |
|
|
|
b32_dec = b32_dec_zbase; |
|
|
|
break; |
|
|
|
case RSPAMD_BASE32_BLEACH: |
|
|
|
b32_dec = b32_dec_bleach; |
|
|
|
break; |
|
|
|
case RSPAMD_BASE32_RFC: |
|
|
|
b32_dec = b32_dec_rfc; |
|
|
|
break; |
|
|
|
default: |
|
|
|
g_assert_not_reached (); |
|
|
|
abort (); |
|
|
|
} |
|
|
|
|
|
|
|
for (i = 0; i < inlen; i ++) { |
|
|
|
c = (guchar)in[i]; |
|
|
|
|
|
|
@@ -718,8 +803,9 @@ rspamd_decode_base32_buf (const gchar *in, gsize inlen, |
|
|
|
return (o - out); |
|
|
|
} |
|
|
|
|
|
|
|
guchar* |
|
|
|
rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen) |
|
|
|
guchar * |
|
|
|
rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen, |
|
|
|
enum rspamd_base32_type type) |
|
|
|
{ |
|
|
|
guchar *res; |
|
|
|
|
|
|
@@ -728,7 +814,8 @@ rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen) |
|
|
|
|
|
|
|
res = g_malloc (allocated_len); |
|
|
|
|
|
|
|
olen = rspamd_decode_base32_buf (in, inlen, res, allocated_len - 1); |
|
|
|
olen = rspamd_decode_base32_buf (in, inlen, res, allocated_len - 1, |
|
|
|
type); |
|
|
|
|
|
|
|
if (olen >= 0) { |
|
|
|
res[olen] = '\0'; |