diff --git a/src/lua/crypto.lua b/src/lua/crypto.lua index 8191c75591556358e8a6fcb69661dd564aa56d67..b6b2d654072ecd558699c00f86bbd179dea26525 100644 --- a/src/lua/crypto.lua +++ b/src/lua/crypto.lua @@ -1,6 +1,6 @@ -- crypto.lua (internal file) -local ffi = require 'ffi' +local ffi = require('ffi') local buffer = require('buffer') ffi.cdef[[ @@ -354,6 +354,12 @@ for class, digest in pairs(hmacs) do return res end }) + hmac_api[class .. '_hex'] = function (key, str) + if type(str) ~= 'string' then + error("Usage: hmac."..class.."_hex(key, string)") + end + return string.hex(hmac_api[class](key, str)) + end end hmac_api = setmetatable(hmac_api, diff --git a/src/lua/digest.lua b/src/lua/digest.lua index 57d04719d909b9a81146bd71870430cdda1bb083..c86acacd7cc2b37d757d7d65dc0cc8f8c28a53ba 100644 --- a/src/lua/digest.lua +++ b/src/lua/digest.lua @@ -1,6 +1,6 @@ -- digest.lua (internal file) -local ffi = require 'ffi' +local ffi = require('ffi') local crypto = require('crypto') ffi.cdef[[ @@ -39,16 +39,6 @@ local digest_shortcuts = { md4 = 'MD4', } -local hexres = ffi.new('char[129]') - -local function str_to_hex(r) - for i = 0, r:len() - 1 do - ffi.C.snprintf(hexres + i * 2, 3, "%02x", - ffi.cast('unsigned char', r:byte(i + 1))) - end - return ffi.string(hexres, r:len() * 2) -end - local PMurHash local PMurHash_methods = { @@ -190,7 +180,7 @@ local m = { error("Usage: digest.sha1_hex(string)") end local r = ffi.C.SHA1internal(str, #str, nil) - return str_to_hex(ffi.string(r, 20)) + return string.hex(ffi.string(r, 20)) end, guava = function(state, buckets) @@ -217,7 +207,7 @@ for digest, name in pairs(digest_shortcuts) do if type(str) ~= 'string' then error('Usage: digest.'..digest..'_hex(string)') end - return str_to_hex(crypto.digest[digest](str)) + return string.hex(crypto.digest[digest](str)) end end diff --git a/src/lua/string.lua b/src/lua/string.lua index 0eca339ace421cd770258d1067e3837f17e21d50..775da2eb51c218075adbf4be0f624ad027133a6a 100644 --- a/src/lua/string.lua +++ b/src/lua/string.lua @@ -278,6 +278,20 @@ local function string_endswith(inp, tail, _start, _end) return memcmp(c_char_ptr(inp) + _start, c_char_ptr(tail), tail_len) == 0 end +local function string_hex(inp) + if type(inp) ~= 'string' then + error(err_string_arg:format(1, 'string.hex', 'string', type(inp)), 2) + end + local len = inp:len() * 2 + local res = ffi.new('char[?]', len + 1) + + local uinp = ffi.cast('const unsigned char *', inp) + for i = 0, inp:len() - 1 do + ffi.C.snprintf(res + i * 2, 3, "%02x", ffi.cast('unsigned', uinp[i])) + end + return ffi.string(res, len) +end + -- It'll automatically set string methods, too. local string = require('string') string.split = string_split @@ -286,3 +300,4 @@ string.rjust = string_rjust string.center = string_center string.startswith = string_startswith string.endswith = string_endswith +string.hex = string_hex