jbe@499: #include jbe@499: #include jbe@499: #include "moonhash_sha3.c" jbe@499: jbe@499: void moonhash_push_hex(lua_State *L, unsigned char *buf, int len) { jbe@499: int i; jbe@499: unsigned char n; jbe@499: char str[2*len+1]; jbe@499: for (i=0; i> 4; jbe@499: str[2*i+0] = n + ((n < 10) ? '0' : ('a' - 10)); jbe@499: n = buf[i] & 0x0f; jbe@499: str[2*i+1] = n + ((n < 10) ? '0' : ('a' - 10)); jbe@499: } jbe@499: str[2*len] = 0; jbe@499: lua_pushstring(L, str); jbe@499: } jbe@499: jbe@499: typedef void (*moonhash_sha3_fptr)(const uint8_t *, uint64_t, uint8_t *); jbe@499: typedef void (*moonhash_shake_fptr)(const uint8_t *, uint64_t, uint8_t *, uint64_t); jbe@499: jbe@499: int moonhash_sha3(lua_State *L, moonhash_sha3_fptr hashfunc, int len) { jbe@499: const char *input; jbe@499: size_t inputlen; jbe@499: unsigned char output[len]; jbe@499: input = luaL_checklstring(L, 1, &inputlen); jbe@499: hashfunc((const uint8_t *)input, inputlen, output); jbe@499: moonhash_push_hex(L, output, len); jbe@499: return 1; jbe@499: } jbe@499: jbe@499: int moonhash_sha3_224(lua_State *L) { jbe@499: return moonhash_sha3(L, FIPS202_SHA3_224, 224/8); jbe@499: } jbe@499: int moonhash_sha3_256(lua_State *L) { jbe@499: return moonhash_sha3(L, FIPS202_SHA3_256, 256/8); jbe@499: } jbe@499: int moonhash_sha3_384(lua_State *L) { jbe@499: return moonhash_sha3(L, FIPS202_SHA3_384, 384/8); jbe@499: } jbe@499: int moonhash_sha3_512(lua_State *L) { jbe@499: return moonhash_sha3(L, FIPS202_SHA3_512, 512/8); jbe@499: } jbe@499: jbe@499: int moonhash_shake(lua_State *L, moonhash_shake_fptr shakefunc, int len) { jbe@499: const char *input; jbe@499: size_t inputlen; jbe@499: unsigned char output[len]; jbe@499: input = luaL_checklstring(L, 1, &inputlen); jbe@499: shakefunc((const uint8_t *)input, inputlen, output, len); jbe@499: moonhash_push_hex(L, output, len); jbe@499: return 1; jbe@499: } jbe@499: jbe@499: int moonhash_shake128_128(lua_State *L) { jbe@499: return moonhash_shake(L, FIPS202_SHAKE128, 128/8); jbe@499: } jbe@499: jbe@499: static const struct luaL_Reg moonhash_module_functions[] = { jbe@499: {"sha3_224", moonhash_sha3_224}, jbe@499: {"sha3_256", moonhash_sha3_256}, jbe@499: {"sha3_384", moonhash_sha3_384}, jbe@499: {"sha3_512", moonhash_sha3_512}, jbe@499: {"shake128_128", moonhash_shake128_128}, jbe@499: {NULL, NULL} jbe@499: }; jbe@499: jbe@499: int luaopen_moonhash(lua_State *L) { jbe@499: lua_newtable(L); jbe@499: luaL_setfuncs(L, moonhash_module_functions, 0); jbe@499: return 1; jbe@499: }