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

Impressum / About Us