diff --git a/src/lua/digest.lua b/src/lua/digest.lua index 3fcf4384476e1410fada7883d08862cd32e98c50..f957fb9305e7ce223935fc48b85491d20c045237 100644 --- a/src/lua/digest.lua +++ b/src/lua/digest.lua @@ -1,4 +1,4 @@ --- box.digest.lua (internal file) +-- digest.lua (internal file) do @@ -13,6 +13,7 @@ ffi.cdef[[ unsigned char *SHA384(const unsigned char *d, size_t n,unsigned char *md); unsigned char *SHA512(const unsigned char *d, size_t n,unsigned char *md); unsigned char *MD4(const unsigned char *d, size_t n, unsigned char *md); + unsigned char *SHA1internal(const unsigned char *d, size_t n, unsigned char *md); /* from openssl/md5.h */ unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); @@ -28,7 +29,19 @@ ffi.cdef[[ local ssl if ssl == nil then - pcall(function() ssl = ffi.load('ssl') end) + local variants = { + 'libssl.so.1.0.0', + 'libssl.so.0.9.8', + 'libssl.so', + 'ssl', + } + + for _, libname in pairs(variants) do + pcall(function() ssl = ffi.load(libname) end) + if ssl ~= nil then + break + end + end end @@ -43,6 +56,16 @@ local def = { md4 = { 'MD4', 16 } } +local hexres = ffi.new('char[129]') + +local function tohex(r, size) + for i = 0, size - 1 do + ffi.C.snprintf(hexres + i * 2, 3, "%02x", + ffi.cast('unsigned int', r[i])) + end + return ffi.string(hexres, size * 2) +end + local m = { crc32 = function(str) if str == nil then @@ -60,11 +83,10 @@ local m = { str = tostring(str) end return ffi.C.crc32_calc(tonumber(crc), str, string.len(str)) - end + end, } if ssl ~= nil then - local hexres = ffi.new('char[129]') for pname, df in pairs(def) do local hfunction = df[1] @@ -87,12 +109,7 @@ if ssl ~= nil then str = tostring(str) end local r = ssl[hfunction](str, string.len(str), nil) - - for i = 0, hsize - 1 do - ffi.C.snprintf(hexres + i * 2, 3, "%02x", - ffi.cast('unsigned int', r[i])) - end - return ffi.string(hexres, hsize * 2) + return tohex(r, hsize) end end else