From 42d119c77371e384dbba332f9be25358ca629b2f Mon Sep 17 00:00:00 2001 From: wipedlife Date: Sat, 26 Jun 2021 03:02:01 +0300 Subject: [PATCH] libgmp lua pre init --- .gitignore | 1 + config.h | 3 + config.h.in | 3 + configure | 39 +++++++++++++ libbacteria/Makefile.am | 2 +- libbacteria/assets/gmp.c | 28 ++++++++- libbacteria/lua/afirst.c | 2 + libbacteria/lua/libgmp.c | 113 +++++++++++++++++++++++++++++++++++++ libbacteria/lua/libgmp.h | 50 ++++++++++++++++ src/Example.jpg | Bin 47254 -> 0 bytes src/luasubmodules/init.lua | 112 ++++++++++++++++++++---------------- 11 files changed, 300 insertions(+), 53 deletions(-) create mode 100644 libbacteria/lua/libgmp.c create mode 100644 libbacteria/lua/libgmp.h delete mode 100644 src/Example.jpg diff --git a/.gitignore b/.gitignore index db22438..72a5dd9 100644 --- a/.gitignore +++ b/.gitignore @@ -52,3 +52,4 @@ m4/lt~obsolete.m4 # (which is called by configure script)) Makefile src/Example.jpg +Example.jpg diff --git a/config.h b/config.h index 21b5317..be6d700 100644 --- a/config.h +++ b/config.h @@ -28,6 +28,9 @@ /* Define to 1 if you have the `gd' library (-lgd). */ #define HAVE_LIBGD 1 +/* Define to 1 if you have the `gmp' library (-lgmp). */ +#define HAVE_LIBGMP 1 + /* Define to 1 if you have the `iniparser' library (-liniparser). */ #define HAVE_LIBINIPARSER 1 diff --git a/config.h.in b/config.h.in index 8aa3462..5cf039f 100644 --- a/config.h.in +++ b/config.h.in @@ -27,6 +27,9 @@ /* Define to 1 if you have the `gd' library (-lgd). */ #undef HAVE_LIBGD +/* Define to 1 if you have the `gmp' library (-lgmp). */ +#undef HAVE_LIBGMP + /* Define to 1 if you have the `iniparser' library (-liniparser). */ #undef HAVE_LIBINIPARSER diff --git a/configure b/configure index f9490de..bbbc17a 100755 --- a/configure +++ b/configure @@ -4322,6 +4322,45 @@ _ACEOF fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lgmp" >&5 +$as_echo_n "checking for main in -lgmp... " >&6; } +if ${ac_cv_lib_gmp_main+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lgmp $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_gmp_main=yes +else + ac_cv_lib_gmp_main=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gmp_main" >&5 +$as_echo "$ac_cv_lib_gmp_main" >&6; } +if test "x$ac_cv_lib_gmp_main" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBGMP 1 +_ACEOF + + LIBS="-lgmp $LIBS" + +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lz" >&5 $as_echo_n "checking for main in -lz... " >&6; } if ${ac_cv_lib_z_main+:} false; then : diff --git a/libbacteria/Makefile.am b/libbacteria/Makefile.am index 144ee0b..f05ba40 100644 --- a/libbacteria/Makefile.am +++ b/libbacteria/Makefile.am @@ -2,7 +2,7 @@ AUTOMAKE_OPTIONS = subdir-objects lib_LIBRARIES = libbacteria.a libbacteria_a_SOURCES = cryptocoins.c cryptocoins.h json_rpc.c macros.h\ - lua/afirst.c lua/libcrypto.c lua/libjson.c lua/libencdec.c lua/libimages.c \ + lua/afirst.c lua/libcrypto.c lua/libjson.c lua/libencdec.c lua/libimages.c lua/libgmp.c \ encdec/async/x25519.c encdec/sync/AES.c \ images/images.c libbacteria_a_CFLAGS = -g -I /usr/include/luajit-2.1/ -I$(topdir)/libbacteria/ -I$(topdir)/luasql/src -L$(topdir)/luasql/src -I/usr/include/lua5.1/ diff --git a/libbacteria/assets/gmp.c b/libbacteria/assets/gmp.c index e47ab4b..7bc54ce 100644 --- a/libbacteria/assets/gmp.c +++ b/libbacteria/assets/gmp.c @@ -1,17 +1,39 @@ #include #include + + +void mul(mpz_t result, const mpz_t param, unsigned long n){ + unsigned long i; + mpz_mul_ui(result, param, n); + for(i = 1; i +//static void gmpZToBuf(mpz_t v, char * buf, size_t bufSize){ +// gmp_snprintf(buf, bufSize, "%Zd", v); +//} + +int luaopen_liblgmp(lua_State *L){ + luaL_openlib(L, "lgmp", lgmp, 0); + return 1; +} + +/*Integer*/ +#define GETMP(prefix,name,where)\ + mp##prefix * l##name = (mp##prefix *)lua_touserdata(L, where); + +INITLUAFUNC(mpz_init){ + mpz_t * rt = malloc(sizeof(mpz_t) * 1); + mpz_init(*rt); + lua_pushlightuserdata(L, rt); + return 1; +} + +INITLUAFUNC(mpz_init_str){ + mpz_t * rt = malloc(sizeof(mpz_t) * 1); + const char * val = (const char*)luaL_checkstring(L, 2); + mpz_init_set_str(*rt,val,0); + lua_pushlightuserdata(L, rt); + return 1; +} + +INITLUAFUNC(mpz_add){ + GETMP(z_t, a,1); + GETMP(z_t, b,2); + GETMP(z_t, c,3); + mpz_add(*la,*lb,*lc); + return 0; +} + +INITLUAFUNC(mpz_add_ui){ + GETMP(z_t, a,1); + GETMP(z_t, b,2); + int c = luaL_checknumber(L,3); + mpz_add_ui(*la,*lb,c); + return 0; +} + +INITLUAFUNC(mpz_getstr){ + GETMP(z_t, a,1); + int c = luaL_checknumber(L,2); + char buf[c]; + gmp_snprintf(buf,c, "%Zd", *la); + lua_pushstring(L,buf); + return 1; +} + +INITLUAFUNC(mpz_clear){ + GETMP(z_t, a,1); + if( *la == NULL )luaL_error(L,"Invalid mpz pointer"); + mpz_clear(*la); + free(la); + return 0; +} + +/*Float*/ +INITLUAFUNC(mpf_init){ + +} + +INITLUAFUNC(mpf_add){ + +} + +INITLUAFUNC(mpf_add_ui){ + +} + +INITLUAFUNC(mpf_getstr){ + +} + +INITLUAFUNC(mpf_init_str){ + +} + +INITLUAFUNC(mpf_clear){ + +} + + +/*Rational*/ + +INITLUAFUNC(mpq_init){ + +} + +INITLUAFUNC(mpq_add){ + +} + +INITLUAFUNC(mpq_add_ui){ + +} +INITLUAFUNC(mpq_init_str){ + +} + +INITLUAFUNC(mpq_getstr){ + +} + +INITLUAFUNC(mpq_clear){ + +} diff --git a/libbacteria/lua/libgmp.h b/libbacteria/lua/libgmp.h new file mode 100644 index 0000000..d03eb85 --- /dev/null +++ b/libbacteria/lua/libgmp.h @@ -0,0 +1,50 @@ +#pragma once +#include"lua.h" +#include + + INITLUAFUNC(mpz_init); + INITLUAFUNC(mpz_init_str); + INITLUAFUNC(mpz_getstr); + INITLUAFUNC(mpz_add); + INITLUAFUNC(mpz_add_ui); + INITLUAFUNC(mpz_clear); + + INITLUAFUNC(mpf_init); + INITLUAFUNC(mpf_add); + INITLUAFUNC(mpf_add_ui); + INITLUAFUNC(mpf_getstr); + INITLUAFUNC(mpf_init_str); + INITLUAFUNC(mpf_clear); + + INITLUAFUNC(mpq_init); + INITLUAFUNC(mpq_add); + INITLUAFUNC(mpq_add_ui); + INITLUAFUNC(mpq_getstr); + INITLUAFUNC(mpq_init_str); + INITLUAFUNC(mpq_clear); + +static const struct luaL_reg lgmp [] = { + LUAPAIR(mpz_init) + LUAPAIR(mpz_init_str) + LUAPAIR(mpz_getstr) + LUAPAIR(mpz_add) + LUAPAIR(mpz_add_ui) + LUAPAIR(mpz_clear) + + LUAPAIR(mpf_init) + LUAPAIR(mpf_add) + LUAPAIR(mpf_add_ui) + LUAPAIR(mpf_getstr) + LUAPAIR(mpf_init_str) + LUAPAIR(mpf_clear) + + LUAPAIR(mpq_init) + LUAPAIR(mpq_add) + LUAPAIR(mpq_add_ui) + LUAPAIR(mpq_getstr) + LUAPAIR(mpq_init_str) + LUAPAIR(mpq_clear) + {NULL,NULL} +}; + +int luaopen_liblgmp(lua_State *L); diff --git a/src/Example.jpg b/src/Example.jpg deleted file mode 100644 index c4c879772fb6d4e29b58e2449f68c382083a83bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47254 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 diff --git a/src/luasubmodules/init.lua b/src/luasubmodules/init.lua index 540b46a..4cbf3d6 100644 --- a/src/luasubmodules/init.lua +++ b/src/luasubmodules/init.lua @@ -34,17 +34,20 @@ local function check_leak_memory(fcoin,scoin) --print(tmp) print(tmp['result']) end ---tgst=cryptocoins.gettable(t,'tgst') ---tdash=cryptocoins.gettable(t,'tdash') -tgst = bacteria.coins['tgst'] -tdash = bacteria.coins['tdash'] -check_leak_memory(tgst,tdash) + +local function CryptocoinsTest() + --tgst=cryptocoins.gettable(t,'tgst') + --tdash=cryptocoins.gettable(t,'tdash') + tgst = bacteria.coins['tgst'] + tdash = bacteria.coins['tdash'] + check_leak_memory(tgst,tdash) --- example in luasubmodules/bencdec.lua ---key,iv=bacteria_aes.genKeyIV() + -- example in luasubmodules/bencdec.lua + --key,iv=bacteria_aes.genKeyIV() +end + -msg="Hello AES_ECB, AES_CBC, ChaCha20! " local function addChar(ch,time) ret="" while time > 0 do @@ -53,10 +56,7 @@ local function addChar(ch,time) end return ret end -msg=msg .. addChar("s",666) -b=bacteria_aes.new() --("mysmallkey") -- ("mykey","myiv") 32,16 bytes ---print("key:", b:getKey(), "IV: ",b:getIV()) local function checkAllTypes(b,msg) -- b:encrypt(msg) -- b:decrypt( b:getAESData_rawEnc() ) @@ -83,50 +83,57 @@ local function checkAllTypes(b,msg) end -print("AES check!") -checkAllTypes(b,"is example message aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasdjasdjkfsdfjasdfjiaodfasdfjiasdijfasidfadfiaojsdijfoasdfiaojsdfiojasdfijasdfuhasdufhasdiufhasidufashdfiasudhfiasudhfiuasdfihuSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFSDJKFASDJFASJDFQJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") -print("\n\n\n\n\n\n\n\n\n\nx25519 + AES check!\n\n\n\n\n\n\n\n\n\n") -k1 = bacteria_aes:newKeyPair() -k2 = bacteria_aes:newKeyPair() -k1:initKeyPair() -k2:initKeyPair() -pub1 = k1:getPubKey() -pub2 = k2:getPubKey() -priv2 = k2:getPrivKey() +local function EncDecTest() + msg="Hello AES_ECB, AES_CBC, ChaCha20! " + msg=msg .. addChar("s",666) + + b=bacteria_aes.new() --("mysmallkey") -- ("mykey","myiv") 32,16 bytes + --print("key:", b:getKey(), "IV: ",b:getIV()) + print("AES check!") + checkAllTypes(b,"is example message aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasdjasdjkfsdfjasdfjiaodfasdfjiasdijfasidfadfiaojsdijfoasdfiaojsdfiojasdfijasdfuhasdufhasdiufhasidufashdfiasudhfiasudhfiuasdfihuSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFSDJKFASDJFASJDFQJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") + print("\n\n\n\n\n\n\n\n\n\nx25519 + AES check!\n\n\n\n\n\n\n\n\n\n") + k1 = bacteria_aes:newKeyPair() + k2 = bacteria_aes:newKeyPair() + k1:initKeyPair() + k2:initKeyPair() + pub1 = k1:getPubKey() + pub2 = k2:getPubKey() + priv2 = k2:getPrivKey() -print("Pub1: ", string.tohex(pub1), string.fromhex(string.tohex(pub1)) == pub1 ) -print("Pub2: ", string.tohex(pub2), string.fromhex(string.tohex(pub2)) == pub2 ) + print("Pub1: ", string.tohex(pub1), string.fromhex(string.tohex(pub1)) == pub1 ) + print("Pub2: ", string.tohex(pub2), string.fromhex(string.tohex(pub2)) == pub2 ) -k3 = bacteria_aes:newKeyPair() -k3:initKeyPair(pub2,priv2) ---print("Pub1: ", pub1) ---print("Priv2: ", priv2) ---print("Pub2: ", pub2) + k3 = bacteria_aes:newKeyPair() + k3:initKeyPair(pub2,priv2) + --print("Pub1: ", pub1) + --print("Priv2: ", priv2) + --print("Pub2: ", pub2) -pub3 = k3:getPubKey() -priv3 = k3:getPrivKey() + pub3 = k3:getPubKey() + priv3 = k3:getPrivKey() ---print("Pub3: ", pub3) ---print("Priv3: ", priv3) + --print("Pub3: ", pub3) + --print("Priv3: ", priv3) -shared0=k1:getSharedKey(pub2) -shared1=k2:getSharedKey(pub1) -shared2=k3:getSharedKey(pub1) ---print("Shared0:", shared0) ---print("Shared1:", shared1) + shared0=k1:getSharedKey(pub2) + shared1=k2:getSharedKey(pub1) + shared2=k3:getSharedKey(pub1) + --print("Shared0:", shared0) + --print("Shared1:", shared1) -aes1=bacteria_aes:new(shared0, "123456789012345") -aes=bacteria_aes:new(shared1, "123456789012345") -aes1:encrypt("TestMsg W10013291825328197ASHFASDF8932ASDF8532BUSAFD893251BSDFA78532BFW783125HBSFAD789aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasdjasdjkfsdfjasdfjiaodfasdfjiasdijfasidfadfiaojsdijfoasdfiaojsdfiojasdfijasdfuhasdufhasdiufhasidufashdfiasudhfiasudhfiuasdfihuSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFSDJKFASDJFASJDFQJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") ---print("Encrypted") -aes:decrypt(aes1:getAESData_rawEnc()) -aesdata_dec,saesdata_dec=aes:getAESData_dec() -print("Decrypted: ", aesdata_dec) + aes1=bacteria_aes:new(shared0, "123456789012345") + aes=bacteria_aes:new(shared1, "123456789012345") + aes1:encrypt("TestMsg W10013291825328197ASHFASDF8932ASDF8532BUSAFD893251BSDFA78532BFW783125HBSFAD789aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafasdjasdjkfsdfjasdfjiaodfasdfjiasdijfasidfadfiaojsdijfoasdfiaojsdfiojasdfijasdfuhasdufhasdiufhasidufashdfiasudhfiasudhfiuasdfihuSOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOFSDJKFASDJFASJDFQJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA") + --print("Encrypted") + aes:decrypt(aes1:getAESData_rawEnc()) + aesdata_dec,saesdata_dec=aes:getAESData_dec() + print("Decrypted: ", aesdata_dec) -k1.clear() -k2.clear() -k3.clear() + k1.clear() + k2.clear() + k3.clear() +end local function checkGD(width,height,quality) width = width or 120 @@ -171,7 +178,14 @@ local function checkGD(width,height,quality) --print((c), "size: ",s) images.gdFree(img) end -checkGD(120,120,100) - +--CryptocoinsTest() +--checkGD(120,120,100) +--EncDecTest() +print("GMP") +myZ = lgmp.mpz_init() +lgmp.mpz_add_ui(myZ,myZ, 1024) +lgmp.mpz_add_ui(myZ,myZ, 4201) +print("New value is:",lgmp.mpz_getstr(myZ, 128)) +lgmp.mpz_clear(myZ)