rev |
line source |
jbe@499
|
1 #include <lua.h>
|
jbe@499
|
2 #include <lauxlib.h>
|
jbe@499
|
3 #include "moonhash_sha3.c"
|
jbe@499
|
4
|
jbe@499
|
5 void moonhash_push_hex(lua_State *L, unsigned char *buf, int len) {
|
jbe@499
|
6 int i;
|
jbe@499
|
7 unsigned char n;
|
jbe@499
|
8 char str[2*len+1];
|
jbe@499
|
9 for (i=0; i<len; i++) {
|
jbe@499
|
10 n = buf[i] >> 4;
|
jbe@499
|
11 str[2*i+0] = n + ((n < 10) ? '0' : ('a' - 10));
|
jbe@499
|
12 n = buf[i] & 0x0f;
|
jbe@499
|
13 str[2*i+1] = n + ((n < 10) ? '0' : ('a' - 10));
|
jbe@499
|
14 }
|
jbe@499
|
15 str[2*len] = 0;
|
jbe@499
|
16 lua_pushstring(L, str);
|
jbe@499
|
17 }
|
jbe@499
|
18
|
jbe@499
|
19 typedef void (*moonhash_sha3_fptr)(const uint8_t *, uint64_t, uint8_t *);
|
jbe@499
|
20 typedef void (*moonhash_shake_fptr)(const uint8_t *, uint64_t, uint8_t *, uint64_t);
|
jbe@499
|
21
|
jbe@499
|
22 int moonhash_sha3(lua_State *L, moonhash_sha3_fptr hashfunc, int len) {
|
jbe@499
|
23 const char *input;
|
jbe@499
|
24 size_t inputlen;
|
jbe@499
|
25 unsigned char output[len];
|
jbe@499
|
26 input = luaL_checklstring(L, 1, &inputlen);
|
jbe@499
|
27 hashfunc((const uint8_t *)input, inputlen, output);
|
jbe@499
|
28 moonhash_push_hex(L, output, len);
|
jbe@499
|
29 return 1;
|
jbe@499
|
30 }
|
jbe@499
|
31
|
jbe@499
|
32 int moonhash_sha3_224(lua_State *L) {
|
jbe@499
|
33 return moonhash_sha3(L, FIPS202_SHA3_224, 224/8);
|
jbe@499
|
34 }
|
jbe@499
|
35 int moonhash_sha3_256(lua_State *L) {
|
jbe@499
|
36 return moonhash_sha3(L, FIPS202_SHA3_256, 256/8);
|
jbe@499
|
37 }
|
jbe@499
|
38 int moonhash_sha3_384(lua_State *L) {
|
jbe@499
|
39 return moonhash_sha3(L, FIPS202_SHA3_384, 384/8);
|
jbe@499
|
40 }
|
jbe@499
|
41 int moonhash_sha3_512(lua_State *L) {
|
jbe@499
|
42 return moonhash_sha3(L, FIPS202_SHA3_512, 512/8);
|
jbe@499
|
43 }
|
jbe@499
|
44
|
jbe@499
|
45 int moonhash_shake(lua_State *L, moonhash_shake_fptr shakefunc, int len) {
|
jbe@499
|
46 const char *input;
|
jbe@499
|
47 size_t inputlen;
|
jbe@499
|
48 unsigned char output[len];
|
jbe@499
|
49 input = luaL_checklstring(L, 1, &inputlen);
|
jbe@499
|
50 shakefunc((const uint8_t *)input, inputlen, output, len);
|
jbe@499
|
51 moonhash_push_hex(L, output, len);
|
jbe@499
|
52 return 1;
|
jbe@499
|
53 }
|
jbe@499
|
54
|
jbe@499
|
55 int moonhash_shake128_128(lua_State *L) {
|
jbe@499
|
56 return moonhash_shake(L, FIPS202_SHAKE128, 128/8);
|
jbe@499
|
57 }
|
jbe@499
|
58
|
jbe@499
|
59 static const struct luaL_Reg moonhash_module_functions[] = {
|
jbe@499
|
60 {"sha3_224", moonhash_sha3_224},
|
jbe@499
|
61 {"sha3_256", moonhash_sha3_256},
|
jbe@499
|
62 {"sha3_384", moonhash_sha3_384},
|
jbe@499
|
63 {"sha3_512", moonhash_sha3_512},
|
jbe@499
|
64 {"shake128_128", moonhash_shake128_128},
|
jbe@499
|
65 {NULL, NULL}
|
jbe@499
|
66 };
|
jbe@499
|
67
|
jbe@499
|
68 int luaopen_moonhash(lua_State *L) {
|
jbe@499
|
69 lua_newtable(L);
|
jbe@499
|
70 luaL_setfuncs(L, moonhash_module_functions, 0);
|
jbe@499
|
71 return 1;
|
jbe@499
|
72 }
|