--- loncom/auth/londes.js 2002/03/23 10:34:48 1.3 +++ loncom/auth/londes.js 2002/03/23 11:59:22 1.5 @@ -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.3 2002/03/23 10:34:48 www Exp $ +// $Id: londes.js,v 1.5 2002/03/23 11:59:22 www Exp $ // // Copyright Michigan State University Board of Trustees // @@ -75,10 +75,16 @@ 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 value|bit[i]; + return orvalue(value,bit[i]); } // Initialize table arrays and perform self test @@ -141,6 +147,104 @@ 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."; } @@ -297,7 +401,7 @@ function stage(si) { for (var kj=0; kj<=3; kj++) { if (andbit(uadd,ki-23+kj)!=0) { j=orbit(j,kj); } } - rv=rv|sbarr[ks*64+i*16+j]; + rv=orvalue(rv,sbarr[ks*64+i*16+j]); ks++; } for (var ki=18;ki>=0;ki=ki-6) { @@ -309,7 +413,7 @@ function stage(si) { for (var kj=0; kj<=3; kj++) { if (andbit(ladd,ki+1+kj)!=0) { j=orbit(j,kj); } } - rv=rv|sbarr[ks*64+i*16+j]; + rv=orvalue(rv,sbarr[ks*64+i*16+j]); ks++; } permute();