TestSuite.add(new YAHOO.tool.TestCase({ | |
test_DES_initialPermutation : function() { | |
// the initial permutation is | |
var ip = [ 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, | |
4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, | |
8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, | |
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 ]; | |
var st = Crypto.DES._state; | |
for ( var i = 0; i < 64; i++) { | |
// set the IP(i)'th bit | |
var m = [ 0, 0, 0, 0, 0, 0, 0, 0 ]; | |
var b = ip[i]; | |
var b0 = (b - 1); | |
var i0 = Math.floor(b0 / 8); | |
var b1 = b0 % 8; | |
var b2 = 7 - b1; | |
var b3 = 1 << b2; | |
m[i0] += b3; | |
st.initialPerm(m, 0); | |
// check the i'th bit is set | |
if (i < 32) { | |
b3 = 1 << (31 - i); | |
Assert.areEqual(st.lhs, b3, "LHS should be " + b3 + " for bit " | |
+ i + ", not " + st.lhs); | |
Assert.areEqual(st.rhs, 0, "RHS should be 0 for bit " + i | |
+ " not " + st.rhs); | |
} else { | |
b3 = 1 << (63 - i); | |
Assert.areEqual(st.rhs, b3, "RHS should be " + b3 + " for bit " | |
+ i + ", not " + st.rhs); | |
Assert.areEqual(st.lhs, 0, "LHS should be 0 for bit " + i | |
+ " not " + st.lhs); | |
} | |
} | |
}, | |
test_DES_finalPermutation : function() { | |
var st = Crypto.DES._state; | |
for ( var i = 0; i < 64; i++) { | |
// set the i'th bit | |
var m = [ 0, 0, 0, 0, 0, 0, 0, 0 ]; | |
var n = [ 0, 0, 0, 0, 0, 0, 0, 0 ]; | |
var b = i; | |
var b0 = (b - 1); | |
var i0 = Math.floor(b0 / 8); | |
var b1 = b0 % 8; | |
var b2 = 7 - b1; | |
var b3 = 1 << b2; | |
m[i0] += b3; | |
st.initialPerm(m, 0); | |
var t = st.lhs; | |
st.lhs = st.rhs; | |
st.rhs = t; | |
st.finalPerm(n, 0); | |
// final perm has undone the initial perm | |
for ( var j = 0; j < 8; j++) { | |
Assert.areEqual(m[j], n[j], "Byte " + j + " is set to " + n[j] | |
+ ". Should be " + m[j] + " for bit " + i); | |
} | |
} | |
}, | |
test_DES_encrypt : function() { | |
var data = [ "AAAAAAAAAAA=", "AAAAAAAAAAA=", "jKZN6cGxI6c=", | |
"HpSCM+JYRqY=", "iqiQm3ZGgVs=", "oCZZDeifj0Y=", "15Lu8Iv9KxU=", | |
"z+Ibdv1Cpl8=", "nn7ZDOyzaaY=", "cevpCdQ6hSI=", "IZxIZK4RgRI=", | |
"e3N98AabZ7E=", "2nuDqakGmuY=", "xqAwR/FDmJU=", "G7KNuqVOgI0=", | |
"8EhcepqRvVQ=", "4Sw9+HTtT4E=", "1FZCOo1nOus=", "a9Og6fJD7Ls=", | |
"9KU7pGI5Gck=", "W2tJ6nY07ks=", "+VZIswj4o70=", "pehFx9We6Vs=", | |
"d3WxvPeGVi0=", "qlfmQNQFVQI=", "xC67lYhojPg=", "ktr+s0xD14U=", | |
"jiE9gsTzn/E=", "jNHSttCDWIc=", "6xNmlFELedY=", "mx6G2NDgfMM=", | |
"KGwiHszK/4Q=", "vnG3uyxF2r0=", "1CZPTcv7pss=", "eSIFj9s9zPM=", | |
"g572tn8UFrA=", "qC4a2vybd+s=", "FhBq707g8uQ=", "8YZwdQJvx7g=", | |
"l/fe4O3OAXU=", "lCNsU14s6/E=", "yrnaHmjVMuY=", "G6dk5YJv+GU=", | |
"Bup1aGBSNRk=", "WsNpfPgZKmA=", "xWdjBkwa9vY=", "xw7YMTa36AE=", | |
"rg4GNEds9sg=", "pXi88R+TX90=", "dpPheQhmBwE=", "1hMLz2taJ1c=", | |
"704ZC+FvjvA=", "QQT1zTRpKqI=", "+Z9GLDBwmrA=", "2q0oDqUce98=", | |
"ZiwGsoI+5mU=", "s683ebMdciI=", "y9i6l/eM+lc=", "9w6gFJzahdI=", | |
"tiPWEQmWAPo=", "skNsEXkuFQ0=", "3SdLGLzvrXo=", "z9TGKQUdE5k=", | |
"tGWgfK7wQeQ=", "HjkobqdrYdg=", "HB/7Hbznrl0=", "CpKEcRV2qcI=", | |
"YigUsNlg+5Q=", "q++752WuwbA=", "KPvsX3nCQtk=", "srDtGgHPQU8=", | |
"/hzYXWY3Q08=", "IURcKIf621k=", "g+zdc6/+9xo=", "ccNsHGYeb7Q=", | |
"SUSojaAIN3U=", "8/sQwktkjrg=", "5B+VaNB+y1M=", "G+G0wfA6i7w=", | |
"UUtcWUk++fo=", "xVBcjnvZPGo=", "XSLog78uOiw=", "4z0kvppilow=", | |
"a09xSM0eaRw=", "guSIbAedl4M=", "4kCrd2XvnYU=", "pIq2fDcUg4s=", | |
"Ts1rN0XciDM=", "yYoQgPbSIEY=", "RDsN+DvyifA=", "wGZoMJQrukQ=", | |
"zgrluPZeUy4=", "m0EiR5pnMmo=", "K4RKd/YadZs=", "sEyhdNxaEQE=", | |
"2PKN0T4VQ2w=", "pVWSNfWkBAQ=", "s1SvmKNJbIk=", "WNcYBRzmkrk=", | |
"pc2XSGrNSFw=", "6LdnNb3W6ws=", "uA/e1OZ6BKA=", "5zzMZJzZ5PY=", | |
"snSRUUaeM9o=", "Zu9SM1bf2g4=", "k0gfjYx1kEc=", "hE/ocX3EQDs=", | |
"DlOcB+iUTks=", "nZ46go5axec=", "77clg28QpaY=", "32OmPfNVOWo=", | |
"bgyayhtLiMQ=", "23lE6vR9TOU=", "UO0ez9vOY40=", "xNu7TOV3pZI=", | |
"FL93y996tRE=", "gnnowxva+xQ=", "1pn/cSyipZs=", "CCXSCHBDUys=", | |
"e5oMZRvAHdY=", "u6yHGVCPQkQ=", "zuohBg0SVTA=", "9jEneIdOehU=", | |
"C1vUmKahdto=", "antTJDEWhJ0=", "tB1j3YF0SGc=", "xikV2o6qrN4=", | |
"T9j746RmlSg=", "qP4PcaQuQJE=", "dLSXsMRJUgY=", "JKjAOOxibFU=", | |
"AFXN6ahfb74=", "jmOJePdtYCc=", "y+1rVgM4na0=", "GPh5aMMcmVs=", | |
"HKWzapfKkmk=", "nqvV8El8Rlo=", "jTbMKji3N7A=", "nosw/fNWQOw=", | |
"+/at2bwWVFY=", "qoT4f2OMAYU=", "MPePoYIqVEQ=", "AkDWLmXlrIE=", | |
"4n2Jj9ZnWzs=", "6KzD/YBKBx4=", "ndGgARXX718=", "n4g7yLYyDN4=", | |
"ggCr0bw88Q4=", "wM0531FsfAY=", "HsbYYaX2OUE=", "P/R8bbBzDng=", | |
"8SntzIrTzag=", "/RyRQI1zr4Q=" ]; | |
for ( var i = 0; i < data.length; i += 3) { | |
var key = Crypto.util.base64ToBytes(data[i]); | |
var inp = Crypto.util.base64ToBytes(data[i + 1]); | |
var out = Crypto.util.base64ToBytes(data[i + 2]); | |
Crypto.DES._init(key); | |
Crypto.DES._encryptblock(inp, 0); | |
Assert.areEqual(inp.toString(), out.toString()); | |
} | |
}, | |
test_DES_encrypt_decrypt : function() { | |
for(var i=0;i<100;i++) { | |
var key = Crypto.util.randomBytes(8); | |
var inp = Crypto.util.randomBytes(8); | |
Crypto.DES._init(key); | |
var out = inp.slice(0); | |
Crypto.DES._encryptblock(out, 0); | |
Crypto.DES._decryptblock(out, 0); | |
Assert.areEqual(inp.toString(), out.toString(), | |
"DES E(D(x) failed: " + inp.toString() + " became " | |
+ out.toString()); | |
Assert.areEqual(inp.toString(), Crypto.DES.decrypt(Crypto.DES.encrypt(inp.slice(0), key), key, { asBytes: true }).toString()); | |
} | |
} | |
})); |