39 lines
1002 B
Lua
39 lines
1002 B
Lua
local ffi = require('ffi')
|
|
local crypto = ffi.load("crypto.so.1.1", true)
|
|
local ffi_string = ffi.string
|
|
|
|
ffi.cdef[[
|
|
char *MD5(const char *d, size_t n, char *md);
|
|
int EVP_DecodeBlock(unsigned char *t, const unsigned char *f, int n);
|
|
int EVP_EncodeBlock(unsigned char *t, const unsigned char *f, int n);
|
|
]]
|
|
|
|
local _M = { version = 0.2 }
|
|
|
|
function string.tohex(str)
|
|
return (str:gsub('.', function (c)
|
|
return string.format('%02X', string.byte(c))
|
|
end))
|
|
end
|
|
|
|
function _M.md5(data)
|
|
local buf = ffi.new("char[16]")
|
|
crypto.MD5(data, #data, buf)
|
|
return ffi_string(buf):tohex()
|
|
end
|
|
|
|
function _M.decode_base64(data)
|
|
local len = #data - #data/4
|
|
local buf = ffi.new("unsigned char["..len.."]")
|
|
len = crypto.EVP_DecodeBlock(buf, data, #data)
|
|
return ffi_string(buf, len - 1)
|
|
end
|
|
|
|
function _M.encode_base64(data)
|
|
local len = #data + #data/4
|
|
local buf = ffi.new("unsigned char["..len.."]")
|
|
len = crypto.EVP_EncodeBlock(buf, data, #data)
|
|
return ffi_string(buf, len - 1)
|
|
end
|
|
|
|
return _M |