Add sha1 to lua utils. (#6563)

This commit is contained in:
Rob Blanckaert 2017-10-30 00:18:18 -07:00 committed by Loïc Blot
parent a95e0d1876
commit 65c5539035
4 changed files with 40 additions and 0 deletions

View File

@ -630,6 +630,9 @@ Minetest namespace reference
version entirely. To check for the presence of engine features, test version entirely. To check for the presence of engine features, test
whether the functions exported by the wanted features exist. For example: whether the functions exported by the wanted features exist. For example:
`if minetest.check_for_falling then ... end`. `if minetest.check_for_falling then ... end`.
* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
* `data`: string of data to hash
* `raw`: return raw bytes instead of hex digits, default: false
### Logging ### Logging
* `minetest.debug(...)` * `minetest.debug(...)`

View File

@ -2391,6 +2391,9 @@ Strings that need to be translated can contain several escapes, preceded by `@`.
version entirely. To check for the presence of engine features, test version entirely. To check for the presence of engine features, test
whether the functions exported by the wanted features exist. For example: whether the functions exported by the wanted features exist. For example:
`if minetest.check_for_falling then ... end`. `if minetest.check_for_falling then ... end`.
* `minetest.sha1(data, [raw])`: returns the sha1 hash of data
* `data`: string of data to hash
* `raw`: return raw bytes instead of hex digits, default: false
### Logging ### Logging
* `minetest.debug(...)` * `minetest.debug(...)`

View File

@ -37,6 +37,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/base64.h" #include "util/base64.h"
#include "config.h" #include "config.h"
#include "version.h" #include "version.h"
#include "util/hex.h"
#include "util/sha1.h"
#include <algorithm> #include <algorithm>
@ -423,6 +425,32 @@ int ModApiUtil::l_get_version(lua_State *L)
return 1; return 1;
} }
int ModApiUtil::l_sha1(lua_State *L)
{
NO_MAP_LOCK_REQUIRED;
size_t size;
const char *data = luaL_checklstring(L, 1, &size);
bool hex = !lua_isboolean(L, 2) || !lua_toboolean(L, 2);
// Compute actual checksum of data
std::string data_sha1;
{
SHA1 ctx;
ctx.addBytes(data, size);
unsigned char *data_tmpdigest = ctx.getDigest();
data_sha1.assign((char*) data_tmpdigest, 20);
free(data_tmpdigest);
}
if (hex) {
std::string sha1_hex = hex_encode(data_sha1);
lua_pushstring(L, sha1_hex.c_str());
} else {
lua_pushlstring(L, data_sha1.data(), data_sha1.size());
}
return 1;
}
void ModApiUtil::Initialize(lua_State *L, int top) void ModApiUtil::Initialize(lua_State *L, int top)
{ {
@ -455,6 +483,7 @@ void ModApiUtil::Initialize(lua_State *L, int top)
API_FCT(decode_base64); API_FCT(decode_base64);
API_FCT(get_version); API_FCT(get_version);
API_FCT(sha1);
LuaSettings::create(L, g_settings, g_settings_path); LuaSettings::create(L, g_settings, g_settings_path);
lua_setfield(L, top, "settings"); lua_setfield(L, top, "settings");
@ -478,6 +507,7 @@ void ModApiUtil::InitializeClient(lua_State *L, int top)
API_FCT(decode_base64); API_FCT(decode_base64);
API_FCT(get_version); API_FCT(get_version);
API_FCT(sha1);
} }
void ModApiUtil::InitializeAsync(lua_State *L, int top) void ModApiUtil::InitializeAsync(lua_State *L, int top)
@ -503,6 +533,7 @@ void ModApiUtil::InitializeAsync(lua_State *L, int top)
API_FCT(decode_base64); API_FCT(decode_base64);
API_FCT(get_version); API_FCT(get_version);
API_FCT(sha1);
LuaSettings::create(L, g_settings, g_settings_path); LuaSettings::create(L, g_settings, g_settings_path);
lua_setfield(L, top, "settings"); lua_setfield(L, top, "settings");

View File

@ -92,6 +92,9 @@ private:
// get_version() // get_version()
static int l_get_version(lua_State *L); static int l_get_version(lua_State *L);
// sha1(string, raw)
static int l_sha1(lua_State *L);
public: public:
static void Initialize(lua_State *L, int top); static void Initialize(lua_State *L, int top);
static void InitializeAsync(lua_State *L, int top); static void InitializeAsync(lua_State *L, int top);