smr/src/libcrypto.c

65 lines
1.3 KiB
C

/*
borrowed sha3 implementation from https://keccak.team
*/
#ifdef BUILD_PROD
#include <luajit.h>
#endif
#include <lauxlib.h>
#include <lua.h>
#include <lualib.h>
#include "libcrypto.h"
#include "keccak.h"
/*
sha3(data::string)::string
*/
int
lsha3(lua_State *L){
size_t len;
unsigned char out[64];
const unsigned char *data = (const unsigned char*)luaL_checklstring(L,-1,&len);
lua_pop(L,1);
printf("All data gotten, about to hash\n");
FIPS202_SHA3_512(data, len, out);
printf("Finished hashing\n");
lua_pushlstring(L,(char*)out,64);
printf("Finished pushing string to lua\n");
return 1;
}
/*
string xor
sxor(a::string, b::string)::string
*/
int
lsxor(lua_State *L){
size_t la,lb;
const char *a = luaL_checklstring(L,-1,&la);
const char *b = luaL_checklstring(L,-2,&lb);
size_t outsize = la > lb ? la : lb;
size_t loopsize = la > lb ? lb : la;
const char *shorter = la > lb ? b : a;
const char *longer = la > lb ? a : b;
char out[outsize];
size_t i;
for(i = 0; i < loopsize; i++)
out[i] = shorter[i] ^ longer[i];
for(;i < outsize; i++)
out[i] = longer[i];
lua_pushlstring(L,out,outsize);
return 1;
}
static const luaL_Reg crypto_funcs[] = {
{"sha3", lsha3},
{"sxor", lsxor},
{NULL,NULL}
};
void
load_crypto_libs(lua_State *L){
lua_getglobal(L,"_G");
luaL_register(L,NULL,crypto_funcs);
lua_pop(L,1);
}