--- loncom/auth/londes.js 2002/03/23 11:59:22 1.5 +++ loncom/auth/londes.js 2002/03/23 20:40:57 1.6 @@ -3,7 +3,7 @@ // Encryption Routines according to Data Encryption Standard DES // Federal Information Processing Standards Publication 46-2 (1993 Dec 30) // -// $Id: londes.js,v 1.5 2002/03/23 11:59:22 www Exp $ +// $Id: londes.js,v 1.6 2002/03/23 20:40:57 www Exp $ // // Copyright Michigan State University Board of Trustees // @@ -28,7 +28,7 @@ // http://www.lon-capa.org/ // // JavaScript Implementation by Gerd Kortemeyer -// 1997,06/27/00,06/28,03/23/02 Gerd Kortemeyer +// 1997,06/27/00,06/28 Gerd Kortemeyer // Global variables @@ -68,25 +68,6 @@ var b3=0; // Text variable var text=""; - -// Function to AND with bit i - -function andbit(value,i) { - return value&bit[i]; -} - -// General OR function - -function orvalue(a,b) { - return a|b; -} - -// Function to OR with bit i - -function orbit(value,i) { - return orvalue(value,bit[i]); -} - // Initialize table arrays and perform self test function init() { @@ -147,104 +128,6 @@ function init() { etarr[i]=parseInt(et.substring(i*2,i*2+2)); } -// Selftest - window.status="Self test"; - -// Primitive test, "Cryptography: A New Dimension in Computer Security" -// C.H. Meyer, S.M. Matyas, John Wiley and Sons, 1982, pg. 160 - - uextkey=0x1234567; - lextkey=orbit(0x9abcdef,31); - ublock=uextkey; - lblock=lextkey; - ip(); - if (hexstring(lv)!='cc00ccff') { alert("IP failed: lv."); } - if (hexstring(rv)!='f0aaf0aa') { alert("IP failed: rv."); } - initkeys(); - if (hexstring(uk[1])!='000b0267') { alert("Key generation failed: uk"); } - if (hexstring(lk[1])!='009b49a5') { alert("Key generation failed: lk"); } - stage(1); - if (hexstring(uexpand)!='007a1555') { alert("E failed: u"); } - if (hexstring(lexpand)!='007a1555') { alert("E failed: l"); } - if (hexstring(rv)!='921c209c') { alert("Stage 1 failed"); } - -// According to National Bureau of Standards, Special Publication 500-20, -// "Validating the Correctness of Hardware Implementations of the -// NBS Data Encryption Standard", Rev. Sep. 1980. - -// PC-1 and PC-2 test - ublock=0; - lblock=0; - uextkey=0x1010101; - lextkey=0x1010102; - initkeys(); - encrypt(); - var st=hexstring(ublock); - st+=hexstring(lblock); - if (st!="869efd7f9f265a09") { - st+=": failed PC-1 and PC-2 test!"; - alert(st); - } - window.status="Self test ."; - -// According to NBS 500-20 IP and E test - ublock=orbit(0x66b40b4,28); - lblock=orbit(0xaba4bd6,30); - uextkey=0x1010101; - lextkey=0x1010101; - initkeys(); - encrypt(); - var st=hexstring(ublock); - st+=hexstring(lblock); - if (st!="0000000000000001") { - st+=": failed IP and E test!"; - alert(st); - } - window.status="Self test .."; - -// According to NBS 500-20 ptest - ublock=0; - lblock=0; - uextkey=orbit(0x29116,28); - lextkey=orbit(orbit(0x8100101,28),31); - initkeys(); - encrypt(); - var st=hexstring(ublock); - st+=hexstring(lblock); - if (st!="1aeac39a61f0a464") { - st+=": failed ptest!"; - alert(st); - } - window.status="Self test ..."; - -// According to NBS 500-20 S-box test - ublock=orbit(orbit(0x553228,28),29); - lblock=orbit(orbit(0xd6f295a,29),30); - var orgu=ublock; - var orgl=lblock; - uextkey=orbit(0xc587f1c,28); - lextkey=orbit(0x3924fef,28); - initkeys(); - encrypt(); - var st=hexstring(ublock); - st+=hexstring(lblock); - if (st!="63fac0d034d9f793") { - st+=": failed S-box test!"; - alert(st); - } - window.status="Self test ...."; - -// Decryption test - decrypt(); - if (ublock!=orgu) { alert("Decryption failed for ublock."); } - if (lblock!=orgl) { alert("Decryption failed for lblock."); } - window.status="Self test ....."; - -// Reset keys - - uextkey=0; - lextkey=0; - window.status="Ready."; } @@ -255,7 +138,7 @@ function hexstring(i) { var hchr="0123456789abcdef"; for (var k=28; k>=0; k=k-4) { j=0; - for (var m=0; m<=3; m++) { if (andbit(i,k+m)!=0) { j=orbit(j,m); } } + for (var m=0; m<=3; m++) { if ((i&bit[k+m])!=0) { j=j|bit[m]; } } hstr+=hchr.substring(j,j+1); } return(hstr); @@ -264,7 +147,7 @@ function hexstring(i) { // Shift a 28-bit register one time function shift(sreg) { - var bit27=andbit(sreg,0)<<27; + var bit27=(sreg&bit[0])<<27; return (sreg>>1)|bit27; } @@ -291,15 +174,15 @@ function initkeys() { for (var i=0; i<=27;i++) { bt=parseInt(celements.substring(i*2,i*2+2)); if (bt<=32) { - if (andbit(uextkey,31-(bt-1)) != 0) { c=orbit(c,i); } + if ((uextkey & bit[31-(bt-1)]) != 0) { c=c|bit[i]; } } else { - if (andbit(lextkey,31-(bt-33)) != 0) { c=orbit(c,i); } + if ((lextkey & bit[31-(bt-33)]) != 0) { c=c|bit[i]; } } bt=parseInt(delements.substring(i*2,i*2+2)); if (bt<=32) { - if (andbit(uextkey,31-(bt-1)) != 0) { d=orbit(d,i); } + if ((uextkey & bit[31-(bt-1)]) != 0) { d=d|bit[i]; } } else { - if (andbit(lextkey,31-(bt-33)) != 0) { d=orbit(d,i); } + if ((lextkey & bit[31-(bt-33)]) != 0) { d=d|bit[i]; } } } // Initialize the k vectors @@ -315,8 +198,8 @@ function initkeys() { uk[i]=0; lk[i]=0; for (j=0; j<=23;j++) { - if (andbit(d,ukarr[j]-29)!=0) { lk[i]=orbit(lk[i],23-j); } - if (andbit(c,lkarr[j]-1)!=0) { uk[i]=orbit(uk[i],23-j); } + if ((d&bit[ukarr[j]-29])!=0) { lk[i]=lk[i]|bit[23-j]; } + if ((c&bit[lkarr[j]-1])!=0) { uk[i]=uk[i]|bit[23-j]; } } } } @@ -330,14 +213,14 @@ function ip() { for (var i=0; i<=31;i++) { bt=riparr[i]; if (bt<=32) { - if (andbit(lblock,bt-1) != 0) { rv=orbit(rv,i); } + if ((lblock & bit[bt-1]) != 0) { rv=rv|bit[i]; } } else { - if (andbit(ublock,bt-33) != 0) { rv=orbit(rv,i); } + if ((ublock & bit[bt-33]) != 0) { rv=rv|bit[i]; } } if (bt<=33) { - if (andbit(lblock,bt-2) != 0) { lv=orbit(lv,i); } + if ((lblock & bit[bt-2]) != 0) { lv=lv|bit[i]; } } else { - if (andbit(ublock,bt-34) != 0) { lv=orbit(lv,i); } + if ((ublock & bit[bt-34]) != 0) { lv=lv|bit[i]; } } } } @@ -350,11 +233,11 @@ function invip() { lblock=0; for (var i=0; i<=15;i++) { bt=liiparr[i]; - if (andbit(rv,bt-1) != 0) { lblock=orbit(lblock,i*2); } - if (andbit(lv,bt-1) != 0) { lblock=orbit(lblock,i*2+1); } + if ((rv & bit[bt-1]) != 0) { lblock=lblock|bit[i*2]; } + if ((lv & bit[bt-1]) != 0) { lblock=lblock|bit[i*2+1]; } bt=uiiparr[i]; - if (andbit(rv,bt-1) != 0) { ublock=orbit(ublock,i*2); } - if (andbit(lv,bt-1) != 0) { ublock=orbit(ublock,i*2+1); } + if ((rv & bit[bt-1]) != 0) { ublock=ublock|bit[i*2]; } + if ((lv & bit[bt-1]) != 0) { ublock=ublock|bit[i*2+1]; } } } @@ -366,11 +249,11 @@ function expand() { lexpand=0; for (var i=0; i<=23; i++) { bt=etarr[i]; - if (andbit(rv,bt-1)!=0) { lexpand=orbit(lexpand,i); } + if (rv & bit[bt-1]) { lexpand=lexpand|bit[i]; } } for (i=24; i<=47; i++) { bt=etarr[i]; - if (andbit(rv,bt-1)!=0) { uexpand=orbit(uexpand,i-24); } + if (rv & bit[bt-1]) { uexpand=uexpand|bit[i-24]; } } } @@ -380,7 +263,7 @@ function permute() { var prv=rv; rv=0; for (var i=0; i<=31; i++) { - if (andbit(prv,31-(pparr[i]-1))!=0) { rv=orbit(rv,31-i); } + if ((prv&bit[31-(pparr[i]-1)])!=0) { rv=rv|bit[31-i]; } } } @@ -395,25 +278,25 @@ function stage(si) { for (var ki=42;ki>=24;ki=ki-6) { rv=rv<<4; var i=0; - if (andbit(uadd,ki-24)!=0) { i=orbit(i,0); } - if (andbit(uadd,ki-19)!=0) { i=orbit(i,1); } + if ((uadd&bit[ki-24])!=0) { i=i|bit[0]; } + if ((uadd&bit[ki-19])!=0) { i=i|bit[1]; } var j=0; for (var kj=0; kj<=3; kj++) { - if (andbit(uadd,ki-23+kj)!=0) { j=orbit(j,kj); } + if ((uadd&bit[ki-23+kj])!=0) { j=j|bit[kj]; } } - rv=orvalue(rv,sbarr[ks*64+i*16+j]); + rv=rv|sbarr[ks*64+i*16+j]; ks++; } for (var ki=18;ki>=0;ki=ki-6) { rv=rv<<4; var i=0; - if (andbit(ladd,ki) !=0) { i=orbit(i,0); } - if (andbit(ladd,ki+5)!=0) { i=orbit(i,1); } + if ((ladd&bit[ki] )!=0) { i=i|bit[0]; } + if ((ladd&bit[ki+5])!=0) { i=i|bit[1]; } var j=0; for (var kj=0; kj<=3; kj++) { - if (andbit(ladd,ki+1+kj)!=0) { j=orbit(j,kj); } + if ((ladd&bit[ki+1+kj])!=0) { j=j|bit[kj]; } } - rv=orvalue(rv,sbarr[ks*64+i*16+j]); + rv=rv|sbarr[ks*64+i*16+j]; ks++; } permute();