From: Vsevolod Stakhov Date: Fri, 10 Jun 2016 08:27:25 +0000 (+0100) Subject: [Feature] Add function to generate random hex string X-Git-Tag: 1.3.0~383 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=42c732f32a45f4f3dbea262eff6b251a839eab15;p=rspamd.git [Feature] Add function to generate random hex string --- diff --git a/src/libutil/util.c b/src/libutil/util.c index 4ce90ba06..212cb7f1b 100644 --- a/src/libutil/util.c +++ b/src/libutil/util.c @@ -1875,6 +1875,25 @@ randombytes (guchar *buf, guint64 len) ottery_rand_bytes (buf, (size_t)len); } +void +rspamd_random_hex (guchar *buf, guint64 len) +{ + static const gchar hexdigests[16] = "0123456789abcdef"; + gint64 i; + + g_assert (len > 0); + + ottery_rand_bytes (buf, (len / 2.0 + 0.5)); + + for (i = (gint64)len - 1; i >= 0; i -= 2) { + buf[i] = hexdigests[buf[i / 2] & 0xf]; + + if (i > 0) { + buf[i - 1] = hexdigests[(buf[i / 2] >> 4) & 0xf]; + } + } +} + void rspamd_ptr_array_free_hard (gpointer p) diff --git a/src/libutil/util.h b/src/libutil/util.h index 48e91cb4f..5c0e82a0d 100644 --- a/src/libutil/util.h +++ b/src/libutil/util.h @@ -404,6 +404,13 @@ void rspamd_deinit_libs (struct rspamd_external_libs_ctx *ctx); */ guint64 rspamd_hash_seed (void); +/** + * Returns random hex string of the specified length + * @param buf + * @param len + */ +void rspamd_random_hex (guchar *buf, guint64 len); + /** * Return jittered time value */ diff --git a/src/lua/lua_util.c b/src/lua/lua_util.c index a5b5eac84..272e39463 100644 --- a/src/lua/lua_util.c +++ b/src/lua/lua_util.c @@ -324,6 +324,15 @@ LUA_FUNCTION_DEF (util, create_file); */ LUA_FUNCTION_DEF (util, close_file); +/** + * @function util.random_hex(size) + * Returns random hex string of the specified size + * + * @param {number} len length of desired string in bytes + * @return {string} string with random hex digests + */ +LUA_FUNCTION_DEF (util, random_hex); + static const struct luaL_reg utillib_f[] = { LUA_INTERFACE_DEF (util, create_event_base), LUA_INTERFACE_DEF (util, load_rspamd_config), @@ -358,6 +367,7 @@ static const struct luaL_reg utillib_f[] = { LUA_INTERFACE_DEF (util, unlock_file), LUA_INTERFACE_DEF (util, create_file), LUA_INTERFACE_DEF (util, close_file), + LUA_INTERFACE_DEF (util, random_hex), {NULL, NULL} }; @@ -1470,6 +1480,26 @@ lua_util_close_file (lua_State *L) return 1; } +static gint +lua_util_random_hex (lua_State *L) +{ + gchar *buf; + gint buflen; + + buflen = lua_tonumber (L, 1); + + if (buflen <= 0) { + return luaL_error (L, "invalid arguments"); + } + + buf = g_malloc (buflen); + rspamd_random_hex (buf, buflen); + lua_pushlstring (L, buf, buflen); + g_free (buf); + + return 1; +} + static gint lua_load_util (lua_State * L) {