diff --git a/lib.nas b/lib.nas index cad887a..696f3b1 100644 --- a/lib.nas +++ b/lib.nas @@ -267,6 +267,11 @@ var assert=func(condition,message="assertion failed!"){ die(message); } +# md5 +var md5=func(str){ + return __builtin_md5(str); +} + var io= { SEEK_SET:0, diff --git a/module/libmd5.nas b/module/libmd5.nas deleted file mode 100644 index 8eb68bb..0000000 --- a/module/libmd5.nas +++ /dev/null @@ -1,10 +0,0 @@ -import("lib.nas"); - -var md5=func(){ - var lib=dylib.dlopen("./module/libmd5"~(os.platform()=="windows"?".dll":".so")); - var sym=dylib.dlsym(lib,"nas_md5"); - var call=dylib.dlcall; - return func(s){ - return call(sym,s); - }; -}(); \ No newline at end of file diff --git a/module/makefile b/module/makefile index a532c15..a61f2de 100644 --- a/module/makefile +++ b/module/makefile @@ -15,17 +15,9 @@ libkey.dll: keyboard.cpp g++ -c -O3 keyboard.cpp -fPIC -o keyboard.o -static g++ -shared -o libkey.dll keyboard.o -static -libmd5.so: md5.cpp - clang++ -c -O3 md5.cpp -fPIC -o md5.o - clang++ -shared -o libmd5.so md5.o - rm md5.o -libmd5.dll: md5.cpp - g++ -c -O3 md5.cpp -fPIC -o md5.o -static - g++ -shared -o libmd5.dll md5.o -static - clean: rm *.o *.so *.dll *.dylib -all: libfib.so libkey.so libmd5.so +all: libfib.so libkey.so @ echo "build done" -mingw-all: libfib.dll libkey.dll libmd5.dll +mingw-all: libfib.dll libkey.dll @ echo "build done" \ No newline at end of file diff --git a/module/md5.cpp b/module/md5.cpp deleted file mode 100644 index 2998e6e..0000000 --- a/module/md5.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "../nasal.h" - -uint32_t strlength; -uint32_t* add(std::string str) -{ - uint32_t num=((str.length()+8)/64)+1; - uint32_t *strByte=new uint32_t[num*16]; - strlength=num*16; - for (uint32_t i=0;i>2]|=(str[i])<<((i%4)*8); - strByte[str.length()>>2]|=0x80<<(((str.length()%4))*8); - strByte[num*16-2]=str.length()*8; - return strByte; -} -std::string changeHex(int a) -{ - const char str16[]="0123456789abcdef"; - std::string str=""; - for(int i=0;i<4;i++) - { - std::string str1=""; - int b=((a>>i*8)%(1<<8))&0xff; - for (int j = 0; j < 2; j++) - { - str1.insert(0,1,str16[b%16]); - b=b/16; - } - str+=str1; - } - return str; -} -std::string md5(std::string source) -{ - // uint32_t(abs(sin(i+1))*(2pow32)) - const uint32_t k[]={ - 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501, - 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821, - 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8, - 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a, - 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70, - 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665, - 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1, - 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391 - }; - // left shift - const uint32_t s[]={ - 7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22, - 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20, - 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23, - 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21 - }; - // index - const uint32_t idx[]={ - 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // g=i - 1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12, // g=(5*i+1)%16; - 5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2, // g=(3*i+5)%16; - 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 // g=(7*i)%16; - }; - uint32_t atmp=0x67452301,btmp=0xefcdab89; - uint32_t ctmp=0x98badcfe,dtmp=0x10325476; - - uint32_t *strByte=add(source); -#define shift(x,n) (((x)<<(n))|((x)>>(32-(n)))) // cycle left shift -#define F(x,y,z) (((x)&(y))|((~x)&(z))) -#define G(x,y,z) (((x)&(z))|((y)&(~z))) -#define H(x,y,z) ((x)^(y)^(z)) -#define I(x,y,z) ((y)^((x)|(~z))) - for(uint32_t i=0;i& args,nasal_gc& gc){ - if(!args.size()) - return builtin_err("md5","lack arguments"); - nasal_ref str=args[0]; - if(str.type!=vm_str) - return builtin_err("md5","\"str\" must be a string"); - nasal_ref res=gc.alloc(vm_str); - res.str()=md5(str.str()); - return res; -} \ No newline at end of file diff --git a/nasal_builtin.h b/nasal_builtin.h index 14829ef..f3b73b3 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -86,6 +86,7 @@ nas_native(builtin_dlclose); nas_native(builtin_dlcall); nas_native(builtin_platform); nas_native(builtin_gc); +nas_native(builtin_md5); nasal_ref builtin_err(const char* func_name,std::string info) { @@ -178,6 +179,7 @@ struct {"__builtin_dlcall", builtin_dlcall }, {"__builtin_platform",builtin_platform}, {"__builtin_gc", builtin_gc }, + {"__builtin_md5", builtin_md5 }, {nullptr, nullptr } }; @@ -1222,4 +1224,98 @@ nasal_ref builtin_gc(nasal_ref* local,nasal_gc& gc) gc.sweep(); return nil; } + +// md5 related functions +std::string tohex(uint32_t num) +{ + const char str16[]="0123456789abcdef"; + std::string str=""; + for(uint32_t i=0;i<4;i++,num>>=8) + { + std::string tmp=""; + for(uint32_t j=0,b=num&0xff;j<2;j++,b>>=4) + tmp.insert(0,1,str16[b&0xf]); + str+=tmp; + } + return str; +} +std::string md5(std::string& source) +{ + std::vector buff; + uint32_t num=((source.length()+8)>>6)+1; + uint32_t buffsize=num<<4; + buff.resize(buffsize,0); + for(uint32_t i=0;i>2]|=(source[i])<<((i&0x3)<<3); + buff[source.length()>>2]|=0x80<<(((source.length()%4))<<3); + buff[buffsize-2]=(source.length()<<3)&0xffffffff; + buff[buffsize-1]=((source.length()<<3)>>32)&0xffffffff; + + // uint32_t(abs(sin(i+1))*(2pow32)) + const uint32_t k[]={ + 0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501, + 0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821, + 0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8, + 0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a, + 0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70, + 0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665, + 0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1, + 0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391 + }; + + // left shift bits + const uint32_t s[]={ + 7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22, + 5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20, + 4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23, + 6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21 + }; + + // index + const uint32_t idx[]={ + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, // g=i + 1,6,11,0,5,10,15,4,9,14,3,8,13,2,7,12, // g=(5*i+1)%16; + 5,8,11,14,1,4,7,10,13,0,3,6,9,12,15,2, // g=(3*i+5)%16; + 0,7,14,5,12,3,10,1,8,15,6,13,4,11,2,9 // g=(7*i)%16; + }; + +#define shift(x,n) (((x)<<(n))|((x)>>(32-(n)))) // cycle left shift +#define md5f(x,y,z) (((x)&(y))|((~x)&(z))) +#define md5g(x,y,z) (((x)&(z))|((y)&(~z))) +#define md5h(x,y,z) ((x)^(y)^(z)) +#define md5i(x,y,z) ((y)^((x)|(~z))) + + uint32_t atmp=0x67452301,btmp=0xefcdab89; + uint32_t ctmp=0x98badcfe,dtmp=0x10325476; + for(uint32_t i=0;i