CKAES_license=' Copyright CertainKey Inc. 2001-2010\n'+'\n'+' Use of this JavaScript/HTML/Java code on any website without written\n'+' permission of CertainKey Inc. is strictly prohibited.\n'+'\n'+' Contact sales@certainkey.com for reasonable licensing.\n';CKAES=function(){this.erase=function(){for(var i=0;i<exp.length;i++)exp[i]=0;exp=null;};this.init=function(){if(CKAES.ready)return;CKAES.ready=true;var multx2=function(a){return(a>0x7f)? 0x11b^(a<<1):(a<<1);},rol8=function(n){return(n>>>24)|(n<<8);},multx=function(a,b){var i,ret;ret=0;for(i=0;i<8;i++){ret=((b&1)==1)? ret^a : ret;a=(a>0x7f)? 0x11b^(a<<1):(a<<1);b>>>=1;}return ret;};CKAES.Rcon=[];CKAES.Rcon[0]=1;for(var i=1;i<30;i++)CKAES.Rcon[i]=multx2(CKAES.Rcon[i-1]);var sbox='637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16'.split(''),z='0123456789abcdef';CKAES.S=[];for(var i=0;i<256;i++)CKAES.S[i]=(z.indexOf(sbox[2*i])<<4)| z.indexOf(sbox[2*i+1]);CKAES.T=[[],[],[],[]];for(var i=0;i<256;i++){var a=CKAES.S[i]&0xff;CKAES.T[3][i]=rol8(CKAES.T[2][i]=rol8(CKAES.T[1][i]=rol8(CKAES.T[0][i]=((multx2(a)^a)<<24)|(a<<16)|(a<<8)| multx2(a))));}if(!CKAES.selfTest())CKAES.ready=false;};this.init();this.keySched=function(exp,key){this.init();var i,t,rconIndex=0,S=function(n,s){return(CKAES.S[(n>>s)&0xff]&0xff)<<s;};for(i=0;i<CKAES.Nk;i++)exp[i]=key[i];for(i=CKAES.Nk;i<(CKAES.Nb*(CKAES.Nr+1));i++){t=exp[i-1];if(i%CKAES.Nk==0){t=(t>>>8)|(t<<24);t=S(t,24)| S(t,16)| S(t,8)| S(t);t^=CKAES.Rcon[rconIndex++];}else if(i%CKAES.Nk==4&&CKAES.Nk==8){t=S(t,24)| S(t,16)| S(t,8)| S(t);}exp[i]=exp[i-CKAES.Nk]^t;}rconIndex=t=0;};this.encrypt=function(pt,exp){this.init();var i;for(i=0;i<4;i++)pt[i]^=exp[i];for(i=1;i<CKAES.Nr;i++)this.round(pt,exp,i*CKAES.Nb);this.finalRound(pt,exp,CKAES.Nr*CKAES.Nb);};this.round=function(pt,rnd,idx){var ct=[pt[0],pt[1],pt[2],pt[3]],T=function(t,n,s){return CKAES.T[t][(n>>(t*8))&0xff];};pt[0]=rnd[idx+0]^T(0,ct[0])^T(1,ct[1])^T(2,ct[2])^T(3,ct[3]);pt[1]=rnd[idx+1]^T(0,ct[1])^T(1,ct[2])^T(2,ct[3])^T(3,ct[0]);pt[2]=rnd[idx+2]^T(0,ct[2])^T(1,ct[3])^T(2,ct[0])^T(3,ct[1]);pt[3]=rnd[idx+3]^T(0,ct[3])^T(1,ct[0])^T(2,ct[1])^T(3,ct[2]);ct[0]=ct[1]=ct[2]=ct[3]=0;};this.finalRound=function(pt,rnd,idx){var ct=[0,0,0,0],S=function(n,s){return(CKAES.S[(n>>s)&0xff]&0xff)<<s;};ct[0]=S(pt[0],0)| S(pt[1],8)| S(pt[2],16)| S(pt[3],24);ct[1]=S(pt[1],0)| S(pt[2],8)| S(pt[3],16)| S(pt[0],24);ct[2]=S(pt[2],0)| S(pt[3],8)| S(pt[0],16)| S(pt[1],24);ct[3]=S(pt[3],0)| S(pt[0],8)| S(pt[1],16)| S(pt[2],24);for(var i=0;i<4;i++){pt[i]=ct[i]^rnd[idx+i];ct[i]=0;}};};CKAES.Nk=4;CKAES.Nb=4;CKAES.Nr=(CKAES.Nk==8 ? 14 :(CKAES.Nk==6 ? 12 : 10));CKAES.KEYSCHED_SIZE=CKAES.Nb *(CKAES.Nr+1);CKAES.selfTest=function(){var hex2int=function(ret,arg){var t=0,i,idx,min;var tab='0123456789abcdef';min=CKAES.Nk<ret.length ? CKAES.Nk : ret.length;for(i=0;i<min;i++)ret[i]=0;for(i=0;i<arg.length;i++){if((idx=tab.indexOf(arg.charAt(i)))==-1)continue;t<<=4;t|=idx;if((i%8)==7)ret[i>>3]=t;}return(arg.length >(CKAES.Nk*8));};var aes=new CKAES();var b=[],k=[],c=[],exp=[];hex2int(b,'00000000000000000000000000000000');hex2int(k,'8d296e43780e42bacc6a512bc41e5dc9');hex2int(c,'42cdf9ff51c9fef2f9cb441a3d354792');aes.keySched(exp,k);aes.encrypt(b,exp);return(b[0]==c[0]&&b[1]==c[1]&&b[2]==c[2]&&b[3]==c[3]);};CKBASE64=new Object();CKBASE64.inv;CKBASE64.tab=null;CKBASE64.Init=CKBASE64_Init;function CKBASE64_Init(){if(CKBASE64.tab!=null)return true;CKBASE64.tab=[];CKBASE64.inv=[];var i,alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";for(i=0;i<alpha.length;i++)CKBASE64.tab[i]=alpha.charAt(i);for(i=0;i<256;i++)CKBASE64.inv[i]=-1;for(i=0;i<alpha.length;i++)CKBASE64.inv[alpha.charCodeAt(i)]=i;if(!CKBASE64.selfTest()){CKBASE64.tab=null;return false;}return true;}CKBASE64.selfTest=CKBASE64_selfTest;function CKBASE64_selfTest(){if(!CKBASE64.Init())return false;var i,t=[],r=[],enc,m=0xffffffff;for(i=0;i<16;i++)t[i]=Math.floor(Math.random()*m)&m;enc=CKBASE64.encodeInt(t);r=CKBASE64.decodeInt(enc);for(i=0;i<16;i++){if(t[i]!=r[i]){alert("CKBase64.selfTest()failed."+t[i]+"\n"+r[i]);return false;}}return true;}CKBASE64.encodeInt=CKBASE64_encodeInt;function CKBASE64_encodeInt(iarr,splitter){var i,j,v,barr=[];for(i=0,j=0;i<iarr.length;i++,j+=4){v=iarr[i];barr[j+3]=v&0xff;v>>>=8;barr[j+2]=v&0xff;v>>>=8;barr[j+1]=v&0xff;v>>>=8;barr[j]=v&0xff;}return CKBASE64.encode(barr,splitter);}CKBASE64.decodeInt=CKBASE64_decodeInt;function CKBASE64_decodeInt(str){var i,v=0,o=0,ret=[],barr=CKBASE64.decode(str);for(i=0;i<barr.length;i++){v=(v<<8)|(barr[i]&0xff);if(i%4==3){ret[o++]=v;v=0;}}return ret;}CKBASE64.encode=CKBASE64_encode;function CKBASE64_encode(barr,splitter){CKBASE64.Init();var i,j,v,carry=0,ret='',quad,trip,tmp,k=0;for(i=0,j=0;i<barr.length;i+=3){quad=false;trip=false;v=barr[i]&0xff;v<<=8;if((i+1)< barr.length){v|=barr[i+1]&0xff;trip=true;}v<<=8;if((i+2)< barr.length){v|=(0xff&barr[i+2]);quad=true;}tmp=CKBASE64.tab[(quad ?(v&0x3f): 64)];v>>=6;tmp=CKBASE64.tab[(trip ?(v&0x3f): 64)]+tmp;v>>=6;tmp=CKBASE64.tab[v&0x3f]+tmp;v>>=6;tmp=CKBASE64.tab[v&0x3f]+tmp;ret+=tmp;if(splitter!=null&&(k+=4)==64){ret+=splitter;k=0;}}return ret;}CKBASE64.decode=CKBASE64_decode;function CKBASE64_decode(str){CKBASE64.Init();var i,v,shift=0,accum=0,out=0,ret=[];for(i=0;i<str.length;i++){v=CKBASE64.inv[str.charCodeAt(i)];if(v >=0){accum<<=6;shift+=6;accum|=v;if(shift >=8){shift-=8;ret[out++]=((accum>>shift)&0xff);}}}return ret;}function CKSHA256(){this.LICENSE='Copyright CertainKey Inc. 2001-2010.  No unauthorized use permitted.';this.PADDING='\200';for(var i=1;i<128;i++)this.PADDING+='\000';this.K=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2];this.xform=function(S,I){var rol=function(x,n){return(x<<n)|(x>>>(32-n));},F=function(x){return(x+4294967296)%4294967296;},a,b,c,d,e,f,g,h,t1,t2,W=[],i;W[15]=0;for(i=0;i<16;i++){t1=(I[(4*i)]&0xff);t1<<=8;t1|=(I[(4*i)+1]&0xff);t1<<=8;t1|=(I[(4*i)+2]&0xff);t1<<=8;t1|=(I[(4*i)+3]&0xff);W[i]=t1;}for(i=16;i<64;i++){t1=W[i-15];t1=rol(t1,25)^rol(t1,14)^(t1>>>3);t2=W[i-2];t2=rol(t2,15)^rol(t2,13)^(t2>>>10);W[i]=F(t2+W[i-7]+t1+W[i-16]);}a=S[0];b=S[1];c=S[2];d=S[3];e=S[4];f=S[5];g=S[6];h=S[7];for(i=0;i<64;i++){t1=F((rol(e,26)^rol(e,21)^rol(e,7))+((e&f)^(~e&g))+h+this.K[i]+W[i]);t2=F((rol(a,30)^rol(a,19)^rol(a,10))+((a&b)^(a&c)^(b&c)));h=g;g=f;f=e;e=F(d+t1);d=c;c=b;b=a;a=F(t1+t2);}S[0]=F(S[0]+a);S[1]=F(S[1]+b);S[2]=F(S[2]+c);S[3]=F(S[3]+d);S[4]=F(S[4]+e);S[5]=F(S[5]+f);S[6]=F(S[6]+g);S[7]=F(S[7]+h);for(i=0;i<64;i++)W[i]=0;a=b=c=d=e=f=g=h=t1=t2=0;};this.Init=function(){CKSHA256.selfTest();this.count=[0,0];this.state=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19];this.buf=[];for(var i=0;i<128;i++)this.buf[i]=0;};this.Init();this.Update=function(I,ILen){var i,j,index,partLen,temp=[];temp[4*16-1]=0;index=((this.count[0]>>>3)&0x3f);if(ILen==null)ILen=I.length;if((this.count[0]+=(ILen<<3))<(ILen<<3)){this.count[1]++;this.count[1]+=(ILen>>>29);}partLen=64-index;if(ILen >=partLen){for(j=0;j<partLen;j++)this.buf[index+j]=I.charCodeAt(j);this.xform(this.state,this.buf);for(i=partLen;i+63<ILen;i+=64){for(j=0;j<4*16;j++)temp[j]=I.charCodeAt(i+j);this.xform(this.state,temp);}for(j=0;j<4*16;j++)temp[j]=0;index=0;}else{i=0;}for(j=0;j<ILen-i;j++){this.buf[index+j]=I.charCodeAt(i+j);}};this.Final=function(D){var t,i,tmp=[0,0,0,0,0,0,0,0];this.FinalInt(tmp);for(i=0;i<8;i++){t=tmp[i];D[4*i+3]=(t&0xff);t>>>=8;D[4*i+2]=(t&0xff);t>>>=8;D[4*i+1]=(t&0xff);t>>>=8;D[4*i]=(t&0xff);}};this.FinalInt=function(D){var bits='',index,padLen,t,i,bite=function(n){return String.fromCharCode(n&0xff)};t=this.count[1];bits+=bite(t>>>24);bits+=bite(t>>>16);bits+=bite(t>>>8);bits+=bite(t);t=this.count[0];bits+=bite(t>>>24);bits+=bite(t>>>16);bits+=bite(t>>>8);bits+=bite(t);index=(this.count[0]>>>3)&0x3f;padLen=(index < 56)?(56-index):((64+56)-index);this.Update(this.PADDING,padLen);this.Update(bits,8);for(i=0;i<8;i++){D[i]=this.state[i];this.state[i]=0;}this.count[0]=this.count[1]=0;for(i=0;i<128;i++)this.buf[i]=0;};this.digest=function(I,Ilen){this.Init();this.Update(I,Ilen);var ret=[];this.Final(ret);return ret;};this.digestInt=function(I,Ilen){this.Init();this.Update(I,Ilen);var ret=[];this.FinalInt(ret);return ret;};};CKSHA256.ready=false;CKSHA256.selfTest=function(){if(CKSHA256.ready)return;CKSHA256.ready=true;var hex8=function(n){return hex_(n,8);};var hex=function(n){return hex_(n,2);};var hex_=function(n,l){var ret='',z='0123456789abcdef'.split('');for(var i=0;i<l;i++){ret=z[n&0xf]+ret;n>>>=4;}return ret;};var res=[],i,str=['abc','abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'],ans=['ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad','248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1'];res[8*4-1]=0;for(i=0;i<8*4;i++)res[i]=0;md=new CKSHA256();for(t=0;t<str.length;t++){md.Init();md.Update(str[t],str[t].length);md.Final(res);X='';for(i=0;i<8*4;i++)X+=hex(res[i]);if(X.indexOf(ans[t])!=0){alert('SHA-256 KAT test failed!!!\n'+X+'\n'+ans[t]);CKSHA256.ready=false;return 'SHA-256 KAT test failed.';}}return 'SHA-256 KAT test passed.';};var clearOnceArr=new Object();document.clearOnce=function(elem){if(!clearOnceArr[elem.name])elem.value='';clearOnceArr[elem.name]=1;};CKBASE64.selfTest();CKSHA256.selfTest();CKAES.selfTest();window.onkeypress=function(e){setTimeout('document.process();',100);};document.process=function(){var key=[];CKSHA256.Init();CKSHA256.Update(document.imsec.pass.value,document.imsec.pass.value.length);CKSHA256.FinalInt(key);var keystr='';for(var i=0;i<4;i++)keystr+=hx(key[i]);document.getElementById('key').innerHTML=keystr;var exp=[];CKAES.keySched(exp,key);document.processEncrypt(exp);document.processDecrypt(exp);};document.processDecrypt=function(exp){var parts=document.imsec.inputCT.value.split(':');if(parts.length!=4)return document.getElementById('plaintext').innerHTML='Invalid IMSec packet';document.getElementById('plaintext').innerHTML='Processing...';var len=parts[0],ivstr=parts[1],macstr=parts[2],ctstr=parts[3];var zeros=[0,0,0,0],tmp=[0,0,0,0],pt=[],cbc=[0,0,0,0],mac=[];var iv=(ivstr=='')? zeros : CKBASE64.decodeInt(ivstr);var ct=CKBASE64.decodeInt(ctstr);if(macstr!=''){mac=CKBASE64.decodeInt(macstr);for(var i=0;i<iv.length;i++)cbc[i]=iv[i];}for(var i=0;i<ct.length;i+=4){for(var j=0;j<4;j++)tmp[j]=iv[j];CKAES.encrypt(tmp,exp);for(var j=0;j<4;j++){pt[i+j]=ct[i+j]^tmp[j];cbc[j]^=pt[i+j];}if(macstr!='')CKAES.encrypt(cbc,exp);for(var j=0;j<4;j++)if(++iv[j]!=0)break;}var ret='';for(var i=0;i<len;i++)ret+=String.fromCharCode((pt[Math.floor(i/4)]>>(24-(i%4)*8))&0xff);var macok=true;for(var i=0;i<mac.length;i++)if(mac[i]!=cbc[i])macok=false;if(macok){document.getElementById('plaintext').innerHTML='<xmp>'+ret+'</xmp>';}else{document.getElementById('plaintext').innerHTML='<font color=red>MAC failed. Message has been altered or incorrect password used!</font>';}};document.processEncrypt=function(exp){var useMAC=document.imsec.useMAC.checked;var useMACn=document.imsec.useMACn.value;var useIV=document.imsec.useIV.checked;var useIVn=document.imsec.useIVn.value;var pt=[],ct=[],iv=[0,0,0,0],tmp=[0,0,0,0],cbc=[0,0,0,0];var ivstr='';if(useIV){for(var i=0;i<useIVn;i++){cbc[i]=iv[i]=Math.floor(Math.random()* 0x100000000);ivstr+=hx(iv[i]);}}document.getElementById('iv').innerHTML=ivstr;if(useIV){var tmp=[];for(var i=0;i<useIVn;i++)tmp[i]=iv[i];ivstr=CKBASE64.encodeInt(tmp,'');}var ptstr=document.imsec.inputPT.value;document.imsec.inputPTn.value=ptstr.length;for(var i=0,j=0,t=0;i<ptstr.length;i++){t<<=8;t|=ptstr.charCodeAt(i);if((i%4)==3){pt[j++]=t;}}if((i%=4)!=0){t<<=(4-i)* 8;pt[j++]=t;}for(var i=0;i<pt.length;i+=4){for(var j=0;j<4;j++)tmp[j]=iv[j];CKAES.encrypt(tmp,exp);for(var j=0;j<4;j++){ct[i+j]=pt[i+j]^tmp[j];cbc[j]^=pt[i+j];}if(useMAC){CKAES.encrypt(cbc,exp);}for(var j=0;j<4;j++)if(++iv[j]!=0)break;}var cbcstr='';if(useMAC)for(var i=0;i<useMACn;i++)cbcstr+=hx(cbc[i]);document.getElementById('cbc').innerHTML=cbcstr;var ctstr='',macstr='';if(useMAC){var tmp=[];for(var i=0;i<useMACn;i++)tmp[i]=cbc[i];macstr=CKBASE64.encodeInt(tmp,'');}ctstr=ptstr.length+':'+ivstr+':'+macstr+':'+CKBASE64.encodeInt(ct,'');for(var i=0;i<3;i++)ctstr=ctstr.replace('=','').replace('=','');var ctstr2='';for(var i=0;i<=ctstr.length;i+=32)ctstr2+=ctstr.substring(i,i+32)+'\n';document.imsec.ciphertext.value=ctstr2;document.imsec.ciphertextn.value=ctstr2.length;};