diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-06-08 09:41:16 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-06-08 09:41:16 +0100 |
commit | 767de7806fce1f39500419749605043a6935943f (patch) | |
tree | 3e06ceea15cbf7310e6bcb901f0d04d6eef8cee0 /src | |
parent | fc128a6dcde3b7758e4f7391ff2b064f37276e8f (diff) | |
download | rspamd-767de7806fce1f39500419749605043a6935943f.tar.gz rspamd-767de7806fce1f39500419749605043a6935943f.zip |
[Minor] Lua_cryptobox: Allow to define output hash length
Diffstat (limited to 'src')
-rw-r--r-- | src/lua/lua_cryptobox.c | 60 |
1 files changed, 52 insertions, 8 deletions
diff --git a/src/lua/lua_cryptobox.c b/src/lua/lua_cryptobox.c index cb531a5e1..300c33793 100644 --- a/src/lua/lua_cryptobox.c +++ b/src/lua/lua_cryptobox.c @@ -1321,14 +1321,25 @@ lua_cryptobox_hash_hex (lua_State *L) LUA_TRACE_POINT; struct rspamd_lua_cryptobox_hash *h = lua_check_cryptobox_hash (L, 1); guchar out[rspamd_cryptobox_HASHBYTES], - out_hex[rspamd_cryptobox_HASHBYTES * 2 + 1]; + out_hex[rspamd_cryptobox_HASHBYTES * 2 + 1], *r; guint dlen; if (h && !h->is_finished) { memset (out_hex, 0, sizeof (out_hex)); lua_cryptobox_hash_finish (h, out, &dlen); - rspamd_encode_hex_buf (out, dlen, out_hex, sizeof (out_hex)); + r = out; + + if (lua_isnumber (L, 2)) { + guint lim = lua_tonumber (L, 2); + + if (lim < dlen) { + r += dlen - lim; + dlen = lim; + } + } + + rspamd_encode_hex_buf (r, dlen, out_hex, sizeof (out_hex)); lua_pushstring (L, out_hex); } @@ -1350,13 +1361,24 @@ lua_cryptobox_hash_base32 (lua_State *L) LUA_TRACE_POINT; struct rspamd_lua_cryptobox_hash *h = lua_check_cryptobox_hash (L, 1); guchar out[rspamd_cryptobox_HASHBYTES], - out_b32[rspamd_cryptobox_HASHBYTES * 2]; + out_b32[rspamd_cryptobox_HASHBYTES * 2], *r; guint dlen; if (h && !h->is_finished) { memset (out_b32, 0, sizeof (out_b32)); lua_cryptobox_hash_finish (h, out, &dlen); - rspamd_encode_base32_buf (out, dlen, out_b32, sizeof (out_b32)); + r = out; + + if (lua_isnumber (L, 2)) { + guint lim = lua_tonumber (L, 2); + + if (lim < dlen) { + r += dlen - lim; + dlen = lim; + } + } + + rspamd_encode_base32_buf (r, dlen, out_b32, sizeof (out_b32)); lua_pushstring (L, out_b32); h->is_finished = TRUE; } @@ -1377,13 +1399,24 @@ lua_cryptobox_hash_base64 (lua_State *L) { LUA_TRACE_POINT; struct rspamd_lua_cryptobox_hash *h = lua_check_cryptobox_hash (L, 1); - guchar out[rspamd_cryptobox_HASHBYTES], *b64; + guchar out[rspamd_cryptobox_HASHBYTES], *b64, *r; gsize len; guint dlen; if (h && !h->is_finished) { lua_cryptobox_hash_finish (h, out, &dlen); - b64 = rspamd_encode_base64 (out, dlen, 0, &len); + r = out; + + if (lua_isnumber (L, 2)) { + guint lim = lua_tonumber (L, 2); + + if (lim < dlen) { + r += dlen - lim; + dlen = lim; + } + } + + b64 = rspamd_encode_base64 (r, dlen, 0, &len); lua_pushlstring (L, b64, len); g_free (b64); h->is_finished = TRUE; @@ -1405,12 +1438,23 @@ lua_cryptobox_hash_bin (lua_State *L) { LUA_TRACE_POINT; struct rspamd_lua_cryptobox_hash *h = lua_check_cryptobox_hash (L, 1); - guchar out[rspamd_cryptobox_HASHBYTES]; + guchar out[rspamd_cryptobox_HASHBYTES], *r; guint dlen; if (h && !h->is_finished) { lua_cryptobox_hash_finish (h, out, &dlen); - lua_pushlstring (L, out, dlen); + r = out; + + if (lua_isnumber (L, 2)) { + guint lim = lua_tonumber (L, 2); + + if (lim < dlen) { + r += dlen - lim; + dlen = lim; + } + } + + lua_pushlstring (L, r, dlen); h->is_finished = TRUE; } else { |