/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.encoding.crypto.SimpleAES"]){
dojo._hasResource["dojox.encoding.crypto.SimpleAES"]=true;
dojo.provide("dojox.encoding.crypto.SimpleAES");
dojo.require("dojox.encoding.base64");
dojo.require("dojox.encoding.crypto._base");
(function(){
var _1=[99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22];
var _2=[[0,0,0,0],[1,0,0,0],[2,0,0,0],[4,0,0,0],[8,0,0,0],[16,0,0,0],[32,0,0,0],[64,0,0,0],[128,0,0,0],[27,0,0,0],[54,0,0,0]];
function _3(_4,w){
var Nb=4;
var Nr=w.length/Nb-1;
var _5=[[],[],[],[]];
for(var i=0;i<4*Nb;i++){
_5[i%4][Math.floor(i/4)]=_4[i];
}
_5=_6(_5,w,0,Nb);
for(var _7=1;_7<Nr;_7++){
_5=_8(_5,Nb);
_5=_9(_5,Nb);
_5=_a(_5,Nb);
_5=_6(_5,w,_7,Nb);
}
_5=_8(_5,Nb);
_5=_9(_5,Nb);
_5=_6(_5,w,Nr,Nb);
var _b=new Array(4*Nb);
for(var i=0;i<4*Nb;i++){
_b[i]=_5[i%4][Math.floor(i/4)];
}
return _b;
};
function _8(s,Nb){
for(var r=0;r<4;r++){
for(var c=0;c<Nb;c++){
s[r][c]=_1[s[r][c]];
}
}
return s;
};
function _9(s,Nb){
var t=new Array(4);
for(var r=1;r<4;r++){
for(var c=0;c<4;c++){
t[c]=s[r][(c+r)%Nb];
}
for(var c=0;c<4;c++){
s[r][c]=t[c];
}
}
return s;
};
function _a(s,Nb){
for(var c=0;c<4;c++){
var a=new Array(4);
var b=new Array(4);
for(var i=0;i<4;i++){
a[i]=s[i][c];
b[i]=s[i][c]&128?s[i][c]<<1^283:s[i][c]<<1;
}
s[0][c]=b[0]^a[1]^b[1]^a[2]^a[3];
s[1][c]=a[0]^b[1]^a[2]^b[2]^a[3];
s[2][c]=a[0]^a[1]^b[2]^a[3]^b[3];
s[3][c]=a[0]^b[0]^a[1]^a[2]^b[3];
}
return s;
};
function _6(_c,w,_d,Nb){
for(var r=0;r<4;r++){
for(var c=0;c<Nb;c++){
_c[r][c]^=w[_d*4+c][r];
}
}
return _c;
};
function _e(_f){
var Nb=4;
var Nk=_f.length/4;
var Nr=Nk+6;
var w=new Array(Nb*(Nr+1));
var _10=new Array(4);
for(var i=0;i<Nk;i++){
var r=[_f[4*i],_f[4*i+1],_f[4*i+2],_f[4*i+3]];
w[i]=r;
}
for(var i=Nk;i<(Nb*(Nr+1));i++){
w[i]=new Array(4);
for(var t=0;t<4;t++){
_10[t]=w[i-1][t];
}
if(i%Nk==0){
_10=_11(_12(_10));
for(var t=0;t<4;t++){
_10[t]^=_2[i/Nk][t];
}
}else{
if(Nk>6&&i%Nk==4){
_10=_11(_10);
}
}
for(var t=0;t<4;t++){
w[i][t]=w[i-Nk][t]^_10[t];
}
}
return w;
};
function _11(w){
for(var i=0;i<4;i++){
w[i]=_1[w[i]];
}
return w;
};
function _12(w){
w[4]=w[0];
for(var i=0;i<4;i++){
w[i]=w[i+1];
}
return w;
};
function _13(_14,_15,_16){
if(!(_16==128||_16==192||_16==256)){
return "";
}
var _17=_16/8;
var _18=new Array(_17);
for(var i=0;i<_17;i++){
_18[i]=_15.charCodeAt(i)&255;
}
var key=_3(_18,_e(_18));
key=key.concat(key.slice(0,_17-16));
var _19=16;
var _1a=new Array(_19);
var _1b=(new Date()).getTime();
for(var i=0;i<4;i++){
_1a[i]=(_1b>>>i*8)&255;
}
for(var i=0;i<4;i++){
_1a[i+4]=(_1b/4294967296>>>i*8)&255;
}
var _1c=_e(key);
var _1d=Math.ceil(_14.length/_19);
var _1e=new Array(_1d);
for(var b=0;b<_1d;b++){
for(var c=0;c<4;c++){
_1a[15-c]=(b>>>c*8)&255;
}
for(var c=0;c<4;c++){
_1a[15-c-4]=(b/4294967296>>>c*8);
}
var _1f=_3(_1a,_1c);
var _20=b<_1d-1?_19:(_14.length-1)%_19+1;
var ct="";
for(var i=0;i<_20;i++){
var _21=_14.charCodeAt(b*_19+i);
var _22=_21^_1f[i];
ct+=((_22<16)?"0":"")+_22.toString(16);
}
_1e[b]=ct;
}
var _23="";
for(var i=0;i<8;i++){
_23+=((_1a[i]<16)?"0":"")+_1a[i].toString(16);
}
return _23+" "+_1e.join(" ");
};
function _24(s){
var ret=[];
s.replace(/(..)/g,function(str){
ret.push(parseInt(str,16));
});
return ret;
};
function _25(_26,_27,_28){
if(!(_28==128||_28==192||_28==256)){
return "";
}
var _29=_28/8;
var _2a=new Array(_29);
for(var i=0;i<_29;i++){
_2a[i]=_27.charCodeAt(i)&255;
}
var _2b=_e(_2a);
var key=_3(_2a,_2b);
key=key.concat(key.slice(0,_29-16));
var _2c=_e(key);
_26=_26.split(" ");
var _2d=16;
var _2e=new Array(_2d);
var _2f=_26[0];
_2e=_24(_2f);
var _30=new Array(_26.length-1);
for(var b=1;b<_26.length;b++){
for(var c=0;c<4;c++){
_2e[15-c]=((b-1)>>>c*8)&255;
}
for(var c=0;c<4;c++){
_2e[15-c-4]=((b/4294967296-1)>>>c*8)&255;
}
var _31=_3(_2e,_2c);
var pt="";
var tmp=_24(_26[b]);
for(var i=0;i<tmp.length;i++){
var _32=_26[b].charCodeAt(i);
var _33=tmp[i]^_31[i];
pt+=String.fromCharCode(_33);
}
_30[b-1]=pt;
}
return _30.join("");
};
function _34(str){
return str.replace(/[\0\t\n\v\f\r\xa0!-]/g,function(c){
return "!"+c.charCodeAt(0)+"!";
});
};
function _35(str){
return str.replace(/!\d\d?\d?!/g,function(c){
return String.fromCharCode(c.slice(1,-1));
});
};
dojox.encoding.crypto.SimpleAES=new (function(){
this.encrypt=function(_36,key){
return _13(_36,key,256);
};
this.decrypt=function(_37,key){
return _25(_37,key,256);
};
})();
})();
}
