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