webmcp

annotate 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
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 }

Impressum / About Us