summaryrefslogtreecommitdiff
path: root/source/luametatex/source/luarest/lmtmd5lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/luametatex/source/luarest/lmtmd5lib.c')
-rw-r--r--source/luametatex/source/luarest/lmtmd5lib.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/source/luametatex/source/luarest/lmtmd5lib.c b/source/luametatex/source/luarest/lmtmd5lib.c
new file mode 100644
index 000000000..2355b53ce
--- /dev/null
+++ b/source/luametatex/source/luarest/lmtmd5lib.c
@@ -0,0 +1,88 @@
+/*
+ See license.txt in the root of this project.
+*/
+
+# include <ctype.h>
+
+# include <utilmd5.h>
+# include <utiliof.h>
+# include <utilbasexx.h>
+
+# include "luametatex.h"
+
+/*
+# define wrapped_md5(message,len,output) md5_digest(message,len,(unsigned char *) output, 0)
+
+static int md5lib_sum(lua_State *L)
+{
+ char buf[16];
+ size_t l;
+ const char *message = luaL_checklstring(L, 1, &l);
+ wrapped_md5(message, l, buf);
+ lua_pushlstring(L, buf, 16L);
+ return 1;
+}
+
+static int md5lib_hex(lua_State *L)
+{
+ char buf[16];
+ char hex[32];
+ iof *inp = iof_filter_string_reader(buf, 16);
+ iof *out = iof_filter_string_writer(hex, 32);
+ size_t l;
+ const char *message = luaL_checklstring(L, 1, &l);
+ wrapped_md5(message, l, buf);
+ base16_encode_lc(inp, out);
+ lua_pushlstring(L, hex, iof_size(out));
+ iof_free(inp);
+ iof_free(out);
+ return 1;
+}
+
+static int md5lib_HEX(lua_State *L)
+{
+ char buf[16];
+ char hex[32];
+ iof *inp = iof_filter_string_reader(buf, 16);
+ iof *out = iof_filter_string_writer(hex, 32);
+ size_t l;
+ const char *message = luaL_checklstring(L, 1, &l);
+ wrapped_md5(message, l, buf);
+ base16_encode_uc(inp, out);
+ lua_pushlstring(L, hex, iof_size(out));
+ iof_free(inp);
+ iof_free(out);
+ return 1;
+}
+*/
+
+# define MD5_RESULT_LENGTH (MD5_STRING_LENGTH-1)
+
+# define md5_body(MD5_LENGTH, CONVERSION, RESULT_LENGTH) do { \
+ if (lua_type(L, 1) == LUA_TSTRING) { \
+ uint8_t result[MD5_LENGTH]; \
+ size_t size = 0; \
+ const char *data = lua_tolstring(L, 1, &size); \
+ md5_digest(data, size, (unsigned char *) result, CONVERSION); \
+ lua_pushlstring(L, (const char *)result, RESULT_LENGTH); \
+ return 1; \
+ } \
+ return 0; \
+} while (0)
+
+static int md5lib_sum(lua_State *L) { md5_body(MD5_DIGEST_LENGTH, MD5_BYTES, MD5_DIGEST_LENGTH); }
+static int md5lib_hex(lua_State *L) { md5_body(MD5_STRING_LENGTH, MD5_LCHEX, MD5_RESULT_LENGTH); }
+static int md5lib_HEX(lua_State *L) { md5_body(MD5_STRING_LENGTH, MD5_UCHEX, MD5_RESULT_LENGTH); }
+
+static struct luaL_Reg md5lib_function_list[] = {
+ { "sum", md5lib_sum },
+ { "hex", md5lib_hex },
+ { "HEX", md5lib_HEX },
+ { NULL, NULL },
+};
+
+int luaopen_md5(lua_State *L) {
+ lua_newtable(L);
+ luaL_setfuncs(L, md5lib_function_list, 0);
+ return 1;
+}