webmcp
diff libraries/moonhash/moonhash.c @ 499:b36e366bba2b
Added SHA-3 hashing functions (using compact Keccak code)
author | jbe |
---|---|
date | Sun Aug 13 03:22:48 2017 +0200 (2017-08-13) |
parents | |
children | 83b3882dc31b |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/libraries/moonhash/moonhash.c Sun Aug 13 03:22:48 2017 +0200 1.3 @@ -0,0 +1,72 @@ 1.4 +#include <lua.h> 1.5 +#include <lauxlib.h> 1.6 +#include "moonhash_sha3.c" 1.7 + 1.8 +void moonhash_push_hex(lua_State *L, unsigned char *buf, int len) { 1.9 + int i; 1.10 + unsigned char n; 1.11 + char str[2*len+1]; 1.12 + for (i=0; i<len; i++) { 1.13 + n = buf[i] >> 4; 1.14 + str[2*i+0] = n + ((n < 10) ? '0' : ('a' - 10)); 1.15 + n = buf[i] & 0x0f; 1.16 + str[2*i+1] = n + ((n < 10) ? '0' : ('a' - 10)); 1.17 + } 1.18 + str[2*len] = 0; 1.19 + lua_pushstring(L, str); 1.20 +} 1.21 + 1.22 +typedef void (*moonhash_sha3_fptr)(const uint8_t *, uint64_t, uint8_t *); 1.23 +typedef void (*moonhash_shake_fptr)(const uint8_t *, uint64_t, uint8_t *, uint64_t); 1.24 + 1.25 +int moonhash_sha3(lua_State *L, moonhash_sha3_fptr hashfunc, int len) { 1.26 + const char *input; 1.27 + size_t inputlen; 1.28 + unsigned char output[len]; 1.29 + input = luaL_checklstring(L, 1, &inputlen); 1.30 + hashfunc((const uint8_t *)input, inputlen, output); 1.31 + moonhash_push_hex(L, output, len); 1.32 + return 1; 1.33 +} 1.34 + 1.35 +int moonhash_sha3_224(lua_State *L) { 1.36 + return moonhash_sha3(L, FIPS202_SHA3_224, 224/8); 1.37 +} 1.38 +int moonhash_sha3_256(lua_State *L) { 1.39 + return moonhash_sha3(L, FIPS202_SHA3_256, 256/8); 1.40 +} 1.41 +int moonhash_sha3_384(lua_State *L) { 1.42 + return moonhash_sha3(L, FIPS202_SHA3_384, 384/8); 1.43 +} 1.44 +int moonhash_sha3_512(lua_State *L) { 1.45 + return moonhash_sha3(L, FIPS202_SHA3_512, 512/8); 1.46 +} 1.47 + 1.48 +int moonhash_shake(lua_State *L, moonhash_shake_fptr shakefunc, int len) { 1.49 + const char *input; 1.50 + size_t inputlen; 1.51 + unsigned char output[len]; 1.52 + input = luaL_checklstring(L, 1, &inputlen); 1.53 + shakefunc((const uint8_t *)input, inputlen, output, len); 1.54 + moonhash_push_hex(L, output, len); 1.55 + return 1; 1.56 +} 1.57 + 1.58 +int moonhash_shake128_128(lua_State *L) { 1.59 + return moonhash_shake(L, FIPS202_SHAKE128, 128/8); 1.60 +} 1.61 + 1.62 +static const struct luaL_Reg moonhash_module_functions[] = { 1.63 + {"sha3_224", moonhash_sha3_224}, 1.64 + {"sha3_256", moonhash_sha3_256}, 1.65 + {"sha3_384", moonhash_sha3_384}, 1.66 + {"sha3_512", moonhash_sha3_512}, 1.67 + {"shake128_128", moonhash_shake128_128}, 1.68 + {NULL, NULL} 1.69 +}; 1.70 + 1.71 +int luaopen_moonhash(lua_State *L) { 1.72 + lua_newtable(L); 1.73 + luaL_setfuncs(L, moonhash_module_functions, 0); 1.74 + return 1; 1.75 +}