fix bug in test/md5.nas & add test file md5compare.nas
This commit is contained in:
parent
dd7740f1fd
commit
7a939b417d
2
makefile
2
makefile
|
@ -25,6 +25,8 @@ test:nasal
|
||||||
@ ./nasal -op -t test/loop.nas
|
@ ./nasal -op -t test/loop.nas
|
||||||
@ ./nasal -op -t -d test/mandel.nas
|
@ ./nasal -op -t -d test/mandel.nas
|
||||||
@ ./nasal -op -t -d test/mandelbrot.nas
|
@ ./nasal -op -t -d test/mandelbrot.nas
|
||||||
|
@ ./nasal -op -t -d -o test/md5.nas
|
||||||
|
-@ ./nasal -op -t -d -o test/md5compare.nas
|
||||||
-@ ./nasal -op -d test/module_test.nas
|
-@ ./nasal -op -d test/module_test.nas
|
||||||
@ ./nasal -op -e test/nasal_test.nas
|
@ ./nasal -op -e test/nasal_test.nas
|
||||||
@ ./nasal -op -t -d test/pi.nas
|
@ ./nasal -op -t -d test/pi.nas
|
||||||
|
|
|
@ -50,6 +50,7 @@ var testfile=[
|
||||||
"test/mandel.nas ",
|
"test/mandel.nas ",
|
||||||
"test/mandelbrot.nas ",
|
"test/mandelbrot.nas ",
|
||||||
"test/md5.nas ",
|
"test/md5.nas ",
|
||||||
|
"test/md5compare.nas ",
|
||||||
"test/module_test.nas ",
|
"test/module_test.nas ",
|
||||||
"test/nasal_test.nas ",
|
"test/nasal_test.nas ",
|
||||||
"test/pi.nas ",
|
"test/pi.nas ",
|
||||||
|
@ -69,8 +70,10 @@ var testfile=[
|
||||||
var module=[
|
var module=[
|
||||||
"module/fib.cpp ",
|
"module/fib.cpp ",
|
||||||
"module/keyboard.cpp ",
|
"module/keyboard.cpp ",
|
||||||
|
"module/md5.cpp ",
|
||||||
"module/libfib.nas ",
|
"module/libfib.nas ",
|
||||||
"module/libkey.nas "
|
"module/libkey.nas ",
|
||||||
|
"module/libmd5.nas "
|
||||||
];
|
];
|
||||||
|
|
||||||
var getname=func(s){
|
var getname=func(s){
|
||||||
|
|
92
test/md5.nas
92
test/md5.nas
|
@ -4,7 +4,7 @@ import("lib.nas");
|
||||||
var check=func(x){
|
var check=func(x){
|
||||||
return x-int(x/0x100000000)*0x100000000;
|
return x-int(x/0x100000000)*0x100000000;
|
||||||
}
|
}
|
||||||
var bits_and=func(x,y){
|
var u32_bits_and=func(x,y){
|
||||||
x=check(x);
|
x=check(x);
|
||||||
y=check(y);
|
y=check(y);
|
||||||
var (res,op)=(0,1);
|
var (res,op)=(0,1);
|
||||||
|
@ -17,7 +17,7 @@ var bits_and=func(x,y){
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
var bits_or=func(x,y){
|
var u32_bits_or=func(x,y){
|
||||||
x=check(x);
|
x=check(x);
|
||||||
y=check(y);
|
y=check(y);
|
||||||
var (res,op)=(0,1);
|
var (res,op)=(0,1);
|
||||||
|
@ -30,7 +30,7 @@ var bits_or=func(x,y){
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
var bits_xor=func(x,y){
|
var u32_bits_xor=func(x,y){
|
||||||
x=check(x);
|
x=check(x);
|
||||||
y=check(y);
|
y=check(y);
|
||||||
var (res,op)=(0,1);
|
var (res,op)=(0,1);
|
||||||
|
@ -43,7 +43,7 @@ var bits_xor=func(x,y){
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
var bits_not=func(x){
|
var u32_bits_not=func(x){
|
||||||
x=check(x);
|
x=check(x);
|
||||||
var (res,op)=(0,1);
|
var (res,op)=(0,1);
|
||||||
for(var i=0;i<32;i+=1){
|
for(var i=0;i<32;i+=1){
|
||||||
|
@ -60,14 +60,15 @@ var hex32str=func(num){
|
||||||
for(var i=0;i<4;i+=1){
|
for(var i=0;i<4;i+=1){
|
||||||
var tmp="";
|
var tmp="";
|
||||||
for(var j=0;j<2;j+=1){
|
for(var j=0;j<2;j+=1){
|
||||||
tmp=chr(ch[bits_and(num,0x0f)])~tmp;
|
tmp=chr(ch[u32_bits_and(num,0x0f)])~tmp;
|
||||||
num=int(num/16);
|
num=int(num/16);
|
||||||
}
|
}
|
||||||
res~=tmp;
|
res~=tmp;
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
var md5=func(s){
|
|
||||||
|
var _md5=func(s){
|
||||||
|
|
||||||
var K=[
|
var K=[
|
||||||
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
|
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
|
||||||
|
@ -107,31 +108,31 @@ var md5=func(s){
|
||||||
return int(num);
|
return int(num);
|
||||||
}
|
}
|
||||||
var rol=func(num,cx){
|
var rol=func(num,cx){
|
||||||
return bits_or(l(num,cx),r(num,32-cx));
|
return u32_bits_or(l(num,cx),r(num,32-cx));
|
||||||
}
|
}
|
||||||
# round 1
|
# round 1
|
||||||
var F=func(x,y,z){
|
var F=func(x,y,z){
|
||||||
return bits_or(
|
return u32_bits_or(
|
||||||
bits_and(x,y),
|
u32_bits_and(x,y),
|
||||||
bits_and(bits_not(x),z)
|
u32_bits_and(u32_bits_not(x),z)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
# round 2
|
# round 2
|
||||||
var G=func(x,y,z){
|
var G=func(x,y,z){
|
||||||
return bits_or(
|
return u32_bits_or(
|
||||||
bits_and(x,z),
|
u32_bits_and(x,z),
|
||||||
bits_and(y,bits_not(z))
|
u32_bits_and(y,u32_bits_not(z))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
# round 3
|
# round 3
|
||||||
var H=func(x,y,z){
|
var H=func(x,y,z){
|
||||||
return bits_xor(bits_xor(x,y),z);
|
return u32_bits_xor(u32_bits_xor(x,y),z);
|
||||||
}
|
}
|
||||||
# round 4
|
# round 4
|
||||||
var I=func(x,y,z){
|
var I=func(x,y,z){
|
||||||
return bits_xor(
|
return u32_bits_xor(
|
||||||
y,
|
y,
|
||||||
bits_or(x,bits_not(z))
|
u32_bits_or(x,u32_bits_not(z))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,10 +167,8 @@ var md5=func(s){
|
||||||
}
|
}
|
||||||
var (tmp,cnt,t)=([],0,0);
|
var (tmp,cnt,t)=([],0,0);
|
||||||
foreach(var i;res){
|
foreach(var i;res){
|
||||||
if(!cnt)
|
if(!cnt) t=i;
|
||||||
t=i;
|
else t=t*2+i;
|
||||||
else
|
|
||||||
t=t*2+i;
|
|
||||||
cnt+=1;
|
cnt+=1;
|
||||||
if(cnt==8){
|
if(cnt==8){
|
||||||
cnt=0;
|
cnt=0;
|
||||||
|
@ -210,55 +209,56 @@ var md5=func(s){
|
||||||
for(var i=0;i<size(res);i+=16){
|
for(var i=0;i<size(res);i+=16){
|
||||||
var (f,a,b,c,d)=(0,A,B,C,D);
|
var (f,a,b,c,d)=(0,A,B,C,D);
|
||||||
for(var j=0;j<64;j+=1){
|
for(var j=0;j<64;j+=1){
|
||||||
if(j<16){
|
if(j<16) f=F(b,c,d);
|
||||||
f=F(b,c,d);
|
elsif(j<32) f=G(b,c,d);
|
||||||
}elsif(j<32){
|
elsif(j<48) f=H(b,c,d);
|
||||||
f=G(b,c,d);
|
else f=I(b,c,d);
|
||||||
}elsif(j<48){
|
(a,b,c,d)=(d,check(b+rol(a+f+K[j]+res[i+idx[j]],S[j])),b,c);
|
||||||
f=H(b,c,d);
|
|
||||||
}else{
|
|
||||||
f=I(b,c,d);
|
|
||||||
}
|
}
|
||||||
|
(A,B,C,D)=(check(a+A),check(b+B),check(c+C),check(d+D));
|
||||||
var tmp=d;
|
|
||||||
d=c;
|
|
||||||
c=b;
|
|
||||||
b=check(b+rol(a+f+K[j]+res[idx[j]],S[j]));
|
|
||||||
a=tmp;
|
|
||||||
}
|
|
||||||
A=check(a+A);
|
|
||||||
B=check(b+B);
|
|
||||||
C=check(c+C);
|
|
||||||
D=check(d+D);
|
|
||||||
}
|
}
|
||||||
return hex32str(A)~hex32str(B)~hex32str(C)~hex32str(D);
|
return hex32str(A)~hex32str(B)~hex32str(C)~hex32str(D);
|
||||||
}
|
}
|
||||||
|
|
||||||
func(){
|
# check if md5 runs correctly
|
||||||
|
var md5check=func(){
|
||||||
var test_set=[
|
var test_set=[
|
||||||
|
"md5",
|
||||||
"github.com",
|
"github.com",
|
||||||
"helloworld",
|
"helloworld",
|
||||||
"abc",
|
"abc",
|
||||||
"https://www.github.com/ValKmjolnir/Nasal-Interpreter",
|
"https://www.github.com/ValKmjolnir/Nasal-Interpreter",
|
||||||
"https://github.com/andyross/nasal",
|
"https://github.com/andyross/nasal",
|
||||||
"var (lower32,higher32)=(check(len),check(len/math.pow(2,32)));",
|
"var (lower32,higher32)=(check(len),check(len/math.pow(2,32)));",
|
||||||
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
|
"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890",
|
||||||
|
"let the bass kick",
|
||||||
|
"f499377c9ae8454c6c8a21ddba7f00de5817fccdc611333ed004d826abb17f4efdacad297f72956e0619002cecffc8e3d18d9b03b082f3cb114bc29173954043",
|
||||||
|
"you are our last hope"
|
||||||
];
|
];
|
||||||
var result=[
|
var result=[
|
||||||
|
"1bc29b36f623ba82aaf6724fd3b16718",
|
||||||
"99cd2175108d157588c04758296d1cfc",
|
"99cd2175108d157588c04758296d1cfc",
|
||||||
"fc5e038d38a57032085441e7fe7010b0",
|
"fc5e038d38a57032085441e7fe7010b0",
|
||||||
"900150983cd24fb0d6963f7d28e17f72",
|
"900150983cd24fb0d6963f7d28e17f72",
|
||||||
"6b3a7bbc2240046c4fb1b0b3a4ed8181",
|
"6b3a7bbc2240046c4fb1b0b3a4ed8181",
|
||||||
"14a6afca5f3a7b239c56b5a9678c428e",
|
"14a6afca5f3a7b239c56b5a9678c428e",
|
||||||
"f499377c9ae8454c6c8a21ddba7f00de",
|
"f499377c9ae8454c6c8a21ddba7f00de",
|
||||||
"fdacad297f72956e0619002cecffc8e3"
|
"fdacad297f72956e0619002cecffc8e3",
|
||||||
|
"16eadccb9799dfb4c1ca512f40638bbb",
|
||||||
|
"a7916c5ce54e73b7ddf6a286b36d976d",
|
||||||
|
"ec6d5b197ba019db23c719112f3f70b7"
|
||||||
];
|
];
|
||||||
forindex(var i;test_set)
|
forindex(var i;test_set){
|
||||||
if(cmp(md5(test_set[i]),result[i]))
|
var res=_md5(test_set[i]);
|
||||||
|
if(cmp(res,result[i]))
|
||||||
println(
|
println(
|
||||||
"md5 cannot work:\n",
|
"md5 cannot work:\n",
|
||||||
" test \""~test_set[i]~"\"\n",
|
" test \""~test_set[i]~"\"\n",
|
||||||
" result \""~result[i]~"\"\n",
|
" result \""~result[i]~"\"\n",
|
||||||
" but get \""~md5(test_set[i])~"\"\n"
|
" but get \""~res~"\"\n"
|
||||||
);
|
);
|
||||||
}();
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# check when loading md5.nas
|
||||||
|
md5check();
|
|
@ -0,0 +1,16 @@
|
||||||
|
import("lib.nas");
|
||||||
|
import("module/libmd5.nas");
|
||||||
|
import("test/md5.nas");
|
||||||
|
|
||||||
|
var ch="0123456789abcdef+_*/\'\".,;:<>!@#$%^&*()-=\\|[]{}";
|
||||||
|
|
||||||
|
for(var i=1;i<1024;i+=1){
|
||||||
|
var s="";
|
||||||
|
for(var j=0;j<i;j+=1){
|
||||||
|
s~=chr(ch[int(rand()*size(ch))]);
|
||||||
|
}
|
||||||
|
var res=!cmp(md5(s),_md5(s));
|
||||||
|
if(!res){
|
||||||
|
println("error: ",i);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue