]> source.dussan.org Git - rspamd.git/commitdiff
[Feature] Support multiple base32 alphabets
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 9 Apr 2020 16:13:12 +0000 (17:13 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 9 Apr 2020 16:13:12 +0000 (17:13 +0100)
17 files changed:
cmake/Toolset.cmake
src/libcryptobox/keypair.c
src/libserver/cfg_rcl.c
src/libserver/fuzzy_backend/fuzzy_backend_redis.c
src/libserver/maps/map.c
src/libserver/monitored.c
src/libstat/backends/sqlite3_backend.c
src/libstat/learn_cache/redis_cache.c
src/libstat/stat_process.c
src/libutil/printf.c
src/libutil/rrd.c
src/libutil/str_util.c
src/libutil/str_util.h
src/libutil/upstream.c
src/lua/lua_cryptobox.c
src/lua/lua_util.c
src/rspamadm/pw.c

index 9a2cb751ea831bf30d348f137b5dc1b1d570e41c..638dca9e1628110f0a0cc5b8c157bca65982950a 100644 (file)
@@ -143,7 +143,7 @@ if (COMPILER_GCC)
             CHECK_C_COMPILER_FLAG(-fanalyzer SUPPORT_FANALYZER)
             if (SUPPORT_FANALYZER)
                 set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -fanalyzer")
-                set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fanalyzer")
+                #set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fanalyzer")
             endif()
         endif ()
         set (CMAKE_C_FLAGS_DEBUG           "${CMAKE_C_FLAGS_DEBUG} -O0 ${COMPILER_DEBUG_FLAGS}")
index a2f2aab126a0c62baa41a05896733ab6d1f707c5..49daba06cc5b956749d693747286c9092b14ef58 100644 (file)
@@ -546,7 +546,7 @@ rspamd_keypair_print_component (guchar *data, gsize datalen,
                g_string_set_size (res, res->len + b32_len);
                res->len -= b32_len;
                olen = rspamd_encode_base32_buf (data, datalen, res->str + res->len,
-                               res->len + b32_len - 1);
+                               res->len + b32_len - 1, RSPAMD_BASE32_DEFAULT);
 
                if (olen > 0) {
                        res->len += olen;
index 22af95d80a9d2ac6be7bec315353a44144f75232..ff256c413aadb3bd30d036f170624b705477ca04 100644 (file)
@@ -3783,7 +3783,7 @@ rspamd_config_calculate_cksum (struct rspamd_config *cfg)
        ucl_object_emit_full (cfg->rcl_obj, UCL_EMIT_MSGPACK,
                        &f, cfg->config_comments);
        rspamd_cryptobox_hash_final (&hs, cksumbuf);
-       cfg->checksum = rspamd_encode_base32 (cksumbuf, sizeof (cksumbuf));
+       cfg->checksum = rspamd_encode_base32 (cksumbuf, sizeof (cksumbuf), RSPAMD_BASE32_DEFAULT);
        /* Also change the tag of cfg pool to be equal to the checksum */
        rspamd_strlcpy (cfg->cfg_pool->tag.uid, cfg->checksum,
                        MIN (sizeof (cfg->cfg_pool->tag.uid), strlen (cfg->checksum)));
index 6a51831a71fa4823ee9395d02e7a46c182a284a2..d1e3e75329383649bbcc30c0102d4f5900d62a27 100644 (file)
@@ -283,7 +283,7 @@ rspamd_fuzzy_backend_init_redis (struct rspamd_fuzzy_backend *bk,
        }
 
        rspamd_cryptobox_hash_final (&st, id_hash);
-       backend->id = rspamd_encode_base32 (id_hash, sizeof (id_hash));
+       backend->id = rspamd_encode_base32 (id_hash, sizeof (id_hash), RSPAMD_BASE32_DEFAULT);
 
        return backend;
 }
index a832adc4fa6544619ee52cbcaeca68c74b6d8cb0..b0801cbf3bcec7f4523242ccdf132526aaa55e18 100644 (file)
@@ -2582,7 +2582,7 @@ rspamd_map_calculate_hash (struct rspamd_map *map)
        }
 
        rspamd_cryptobox_hash_final (&st, cksum);
-       cksum_encoded = rspamd_encode_base32 (cksum, sizeof (cksum));
+       cksum_encoded = rspamd_encode_base32 (cksum, sizeof (cksum), RSPAMD_BASE32_DEFAULT);
        rspamd_strlcpy (map->tag, cksum_encoded, sizeof (map->tag));
        g_free (cksum_encoded);
 }
index 2566511294e5756e19c19b0f9b6eda0795d0dd0d..54bf5c5080e92a36084c4e6b6e797dd5eb5f61d1 100644 (file)
@@ -558,7 +558,7 @@ rspamd_monitored_create_ (struct rspamd_monitored_ctx *ctx,
        rspamd_cryptobox_hash_update (&st, m->url, strlen (m->url));
        rspamd_cryptobox_hash_update (&st, loc, strlen (loc));
        rspamd_cryptobox_hash_final (&st, cksum);
-       cksum_encoded = rspamd_encode_base32 (cksum, sizeof (cksum));
+       cksum_encoded = rspamd_encode_base32 (cksum, sizeof (cksum), RSPAMD_BASE32_DEFAULT);
        rspamd_strlcpy (m->tag, cksum_encoded, sizeof (m->tag));
 
        if (g_hash_table_lookup (ctx->helts, m->tag) != NULL) {
index 38f296177fe199e82e9d53324c006637bbb9607f..1ddfa6f17adfffe609d3c0e946a68b65ef787717 100644 (file)
@@ -502,7 +502,7 @@ rspamd_sqlite3_opendb (rspamd_mempool_t *pool,
                tk_conf = tokenizer->get_config (pool, stcf->clcf->tokenizer, &sz);
 
                /* Encode to base32 */
-               tok_conf_encoded = rspamd_encode_base32 (tk_conf, sz);
+               tok_conf_encoded = rspamd_encode_base32 (tk_conf, sz, RSPAMD_BASE32_DEFAULT);
 
                if (rspamd_sqlite3_run_prstmt (pool, bk->sqlite, bk->prstmt,
                                RSPAMD_STAT_BACKEND_SAVE_TOKENIZER,
index bdf83f858591fb2f557cf1b22085d67bdc371bf6..73a72a6141c5063056c5bb5185cc5692a4e4bca4 100644 (file)
@@ -225,7 +225,7 @@ rspamd_stat_cache_redis_generate_id (struct rspamd_task *task)
        b32out = rspamd_mempool_alloc (task->task_pool,
                        sizeof (out) * 8 / 5 + 3);
        i = rspamd_encode_base32_buf (out, sizeof (out), b32out,
-                       sizeof (out) * 8 / 5 + 2);
+                       sizeof (out) * 8 / 5 + 2, RSPAMD_BASE32_DEFAULT);
 
        if (i > 0) {
                /* Zero terminate */
index 93287dc68fe1416f7de4e9868df988ec118b693c..aed588073e88bb1a771e107970f0adf2ac69c3cd 100644 (file)
@@ -180,7 +180,7 @@ rspamd_stat_process_tokenize (struct rspamd_stat_ctx *st_ctx,
        }
 
        rspamd_cryptobox_hash_final (&hst, hout);
-       b32_hout = rspamd_encode_base32 (hout, sizeof (hout));
+       b32_hout = rspamd_encode_base32 (hout, sizeof (hout), RSPAMD_BASE32_DEFAULT);
        /*
         * We need to strip it to 32 characters providing ~160 bits of
         * hash distribution
index 972d34e82593c1617a56c524b9fed410c801fc65..ed15d1389b03de1ae8f43d593d7276fffb65e453 100644 (file)
@@ -815,7 +815,7 @@ rspamd_vprintf_common (rspamd_printf_append_func func,
                                                }
                                        }
 
-                                       b32buf = rspamd_encode_base32 (p, slen);
+                                       b32buf = rspamd_encode_base32 (p, slen, RSPAMD_BASE32_DEFAULT);
 
                                        if (b32buf) {
                                                RSPAMD_PRINTF_APPEND (b32buf, strlen (b32buf));
index 9208c71da9443af9df8cc41a7e581e7cbc1902f8..a270d87c642c722f86cb5f17635c0a631af0868f 100644 (file)
@@ -346,7 +346,7 @@ rspamd_rrd_calculate_checksum (struct rspamd_rrd_file *file)
 
                rspamd_cryptobox_hash_final (&st, sigbuf);
 
-               file->id = rspamd_encode_base32 (sigbuf, sizeof (sigbuf));
+               file->id = rspamd_encode_base32 (sigbuf, sizeof (sigbuf), RSPAMD_BASE32_DEFAULT);
        }
 }
 
index 4c16cb6851cc4b0b0bbca1342f2702b4671a6bf8..473e68782ef861b42616235781522e2c568e04b8 100644 (file)
@@ -539,10 +539,11 @@ rspamd_str_pool_copy (gconstpointer data, gpointer ud)
  */
 
 gint
-rspamd_encode_base32_buf (const guchar *in, gsize inlen, gchar *out,
-               gsize outlen)
+rspamd_encode_base32_buf (const guchar *in, gsize inlen, gchar *out, gsize outlen,
+               enum rspamd_base32_type type)
 {
-       static const char b32[]="ybndrfg8ejkmcpqxot1uwisza345h769";
+       static const char b32_default[] = "ybndrfg8ejkmcpqxot1uwisza345h769",
+               b32_bleach[] = "qpzry9x8gf2tvdw0s3jn54khce6mua7l", *b32;
        gchar *o, *end;
        gsize i;
        gint remain = -1, x;
@@ -550,6 +551,18 @@ rspamd_encode_base32_buf (const guchar *in, gsize inlen, gchar *out,
        end = out + outlen;
        o = out;
 
+       switch (type) {
+       case RSPAMD_BASE32_DEFAULT:
+               b32 = b32_default;
+               break;
+       case RSPAMD_BASE32_BLEACH:
+               b32 = b32_bleach;
+               break;
+       default:
+               g_assert_not_reached ();
+               abort ();
+       }
+
        for (i = 0; i < inlen && o < end - 1; i++) {
                switch (i % 5) {
                case 0:
@@ -603,14 +616,15 @@ rspamd_encode_base32_buf (const guchar *in, gsize inlen, gchar *out,
 }
 
 gchar *
-rspamd_encode_base32 (const guchar *in, gsize inlen)
+rspamd_encode_base32 (const guchar *in, gsize inlen, enum rspamd_base32_type type)
 {
        gsize allocated_len = inlen * 8 / 5 + 2;
        gchar *out;
        gint outlen;
 
        out = g_malloc (allocated_len);
-       outlen = rspamd_encode_base32_buf (in, inlen, out, allocated_len - 1);
+       outlen = rspamd_encode_base32_buf (in, inlen, out,
+                       allocated_len - 1, type);
 
        if (outlen >= 0) {
                out[outlen] = 0;
index 22643176b1a77913efd40985346f7cc0274f8477..e7e5532c389a408163943e9538b2aa08149633fb 100644 (file)
@@ -143,36 +143,43 @@ gboolean rspamd_strtoul (const gchar *s, gsize len, gulong *value);
 gpointer rspamd_str_pool_copy (gconstpointer data, gpointer ud);
 
 /**
- * Encode string using base32 encoding
+ * Encode string using hex encoding
  * @param in input
  * @param inlen input length
  * @return freshly allocated base32 encoding of a specified string
  */
-gchar *rspamd_encode_base32 (const guchar *in, gsize inlen);
+gchar *rspamd_encode_hex (const guchar *in, gsize inlen);
 
 /**
- * Decode string using base32 encoding
+ * Decode string using hex encoding
  * @param in input
  * @param inlen input length
  * @return freshly allocated base32 decoded value or NULL if input is invalid
  */
-guchar *rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen);
+guchar *rspamd_decode_hex (const gchar *in, gsize inlen);
+
+enum rspamd_base32_type {
+       RSPAMD_BASE32_DEFAULT = 0,
+       RSPAMD_BASE32_ZBASE = 0,
+       RSPAMD_BASE32_BLEACH
+};
 
 /**
- * Encode string using hex encoding
+ * Encode string using base32 encoding
  * @param in input
  * @param inlen input length
  * @return freshly allocated base32 encoding of a specified string
  */
-gchar *rspamd_encode_hex (const guchar *in, gsize inlen);
+gchar *rspamd_encode_base32 (const guchar *in, gsize inlen,
+               enum rspamd_base32_type type);
 
 /**
- * Decode string using hex encoding
+ * Decode string using base32 encoding
  * @param in input
  * @param inlen input length
  * @return freshly allocated base32 decoded value or NULL if input is invalid
  */
-guchar *rspamd_decode_hex (const gchar *in, gsize inlen);
+guchar *rspamd_decode_base32 (const gchar *in, gsize inlen, gsize *outlen);
 
 /**
  * Encode string using base32 encoding
@@ -183,7 +190,7 @@ guchar *rspamd_decode_hex (const gchar *in, gsize inlen);
  * @return encoded len if `outlen` is enough to encode `inlen`
  */
 gint rspamd_encode_base32_buf (const guchar *in, gsize inlen, gchar *out,
-                                                          gsize outlen);
+               gsize outlen, enum rspamd_base32_type type);
 
 /**
  * Decode string using base32 encoding
index 65cbca10594eaf7d5760406b884b0961cb6a975e..6acf420ea1ccca859d152e4d4762473712784310 100644 (file)
@@ -1130,8 +1130,8 @@ rspamd_upstreams_add_upstream (struct upstream_list *ups, const gchar *str,
        guint h = rspamd_cryptobox_fast_hash (upstream->name,
                        strlen (upstream->name), 0);
        memset (upstream->uid, 0, sizeof (upstream->uid));
-       rspamd_encode_base32_buf ((const guchar *)&h, sizeof (h),
-                       upstream->uid, sizeof (upstream->uid) - 1);
+       rspamd_encode_base32_buf ((const guchar *) &h, sizeof (h),
+                       upstream->uid, sizeof (upstream->uid) - 1, RSPAMD_BASE32_DEFAULT);
 
        msg_debug_upstream ("added upstream %s (%s)", upstream->name,
                        upstream->flags & RSPAMD_UPSTREAM_FLAG_NORESOLVE ? "numeric ip" : "DNS name");
index 48d66895c51278638dda4dbecade99017481ee3b..71c4655f42f0f21c930c38273a537d7711676a9b 100644 (file)
@@ -839,7 +839,7 @@ lua_cryptobox_signature_base32 (lua_State *L)
        gchar *encoded;
 
        if (sig) {
-               encoded = rspamd_encode_base32 (sig->str, sig->len);
+               encoded = rspamd_encode_base32 (sig->str, sig->len, RSPAMD_BASE32_DEFAULT);
                lua_pushstring (L, encoded);
                g_free (encoded);
        }
@@ -1392,7 +1392,7 @@ lua_cryptobox_hash_base32 (lua_State *L)
                        }
                }
 
-               rspamd_encode_base32_buf (r, dlen, out_b32, sizeof (out_b32));
+               rspamd_encode_base32_buf (r, dlen, out_b32, sizeof (out_b32), RSPAMD_BASE32_DEFAULT);
                lua_pushstring (L, out_b32);
                h->is_finished = TRUE;
        }
@@ -2247,8 +2247,8 @@ lua_cryptobox_pbkdf (lua_State *L)
                        salt, pbkdf->salt_len, key, pbkdf->key_len, pbkdf->complexity,
                        pbkdf->type);
 
-       encoded_salt = rspamd_encode_base32 (salt, pbkdf->salt_len);
-       encoded_key = rspamd_encode_base32 (key, pbkdf->key_len);
+       encoded_salt = rspamd_encode_base32 (salt, pbkdf->salt_len, RSPAMD_BASE32_DEFAULT);
+       encoded_key = rspamd_encode_base32 (key, pbkdf->key_len, RSPAMD_BASE32_DEFAULT);
 
        result = g_string_new ("");
        rspamd_printf_gstring (result, "$%d$%s$%s", pbkdf->id, encoded_salt,
index 91cc18800851812c0061fbe3de7d1b37753ea380..e18bc3efbf960cfbdc24568607dae0c84b0d0de9 100644 (file)
@@ -1175,7 +1175,7 @@ lua_util_encode_base32 (lua_State *L)
                lua_pushnil (L);
        }
        else {
-               out = rspamd_encode_base32 (s, inlen);
+               out = rspamd_encode_base32 (s, inlen, RSPAMD_BASE32_DEFAULT);
 
                if (out != NULL) {
                        t = lua_newuserdata (L, sizeof (*t));
index 0fea5c3590bce04eea1e543e4f32de634b978b29..7fe9d4a33f21d0d3003e9e443474891ed624e420 100644 (file)
@@ -134,8 +134,8 @@ rspamadm_pw_encrypt (char *password)
                        salt, pbkdf->salt_len, key, pbkdf->key_len, pbkdf->complexity,
                        pbkdf->type);
 
-       encoded_salt = rspamd_encode_base32 (salt, pbkdf->salt_len);
-       encoded_key = rspamd_encode_base32 (key, pbkdf->key_len);
+       encoded_salt = rspamd_encode_base32 (salt, pbkdf->salt_len, RSPAMD_BASE32_DEFAULT);
+       encoded_key = rspamd_encode_base32 (key, pbkdf->key_len, RSPAMD_BASE32_DEFAULT);
 
        result = g_string_new ("");
        rspamd_printf_gstring (result, "$%d$%s$%s", pbkdf->id, encoded_salt,