Created
January 21, 2015 20:03
-
-
Save YellowAfterlife/6c28e241f4d2a4daaff6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var HxOverrides = function() { }; | |
HxOverrides.cca = function(s,index) { | |
var x = s.charCodeAt(index); | |
if(x != x) return undefined; | |
return x; | |
}; | |
var Main = function() { }; | |
Main.utf2ints = function(v,r) { | |
if(r == null) r = []; else r.splice(0,r.length); | |
var i = -1; | |
var l = v.length; | |
var c; | |
while(++i < l) { | |
c = HxOverrides.cca(v,i); | |
r.push(c & 255); | |
r.push(c >> 8 & 255); | |
} | |
return r; | |
}; | |
var org = {}; | |
org.ascrypt = {}; | |
org.ascrypt.AES = function() { }; | |
org.ascrypt.AES.encrypt = function(key,bytes,mode,iv) { | |
if(mode == null) mode = "ecb"; | |
var kl = key.length; | |
if((kl != 16?kl != 24:false)?kl != 32:false) throw org.ascrypt.AES.ERROR_KEY; | |
if(bytes.length % 16 != 0) throw org.ascrypt.AES.ERROR_BLOCK; | |
var k = key.slice(); | |
var b = bytes.slice(); | |
org.ascrypt.AES.isrtab = []; | |
org.ascrypt.AES.isbox = []; | |
org.ascrypt.AES.xtime = []; | |
var _g = 0; | |
while(_g < 256) { | |
var i = _g++; | |
org.ascrypt.AES.isbox[org.ascrypt.AES.sbox[i]] = i; | |
} | |
var _g1 = 0; | |
while(_g1 < 16) { | |
var j = _g1++; | |
org.ascrypt.AES.isrtab[org.ascrypt.AES.srtab[j]] = j; | |
} | |
var _g2 = 0; | |
while(_g2 < 128) { | |
var k1 = _g2++; | |
org.ascrypt.AES.xtime[k1] = k1 << 1; | |
org.ascrypt.AES.xtime[128 + k1] = k1 << 1 ^ 27; | |
} | |
var kl1 = k.length; | |
var ks = 0; | |
var rcon = 1; | |
switch(kl1) { | |
case 16: | |
ks = 176; | |
break; | |
case 24: | |
ks = 208; | |
break; | |
case 32: | |
ks = 240; | |
break; | |
} | |
var i1 = kl1; | |
while(i1 < ks) { | |
var t = k.slice(i1 - 4,i1); | |
if(i1 % kl1 == 0) { | |
t = [org.ascrypt.AES.sbox[t[1]] ^ rcon,org.ascrypt.AES.sbox[t[2]],org.ascrypt.AES.sbox[t[3]],org.ascrypt.AES.sbox[t[0]]]; | |
if((rcon <<= 1) >= 256) rcon ^= 283; | |
} else if(kl1 > 24?i1 % kl1 == 16:false) t = [org.ascrypt.AES.sbox[t[0]],org.ascrypt.AES.sbox[t[1]],org.ascrypt.AES.sbox[t[2]],org.ascrypt.AES.sbox[t[3]]]; | |
var j1 = 0; | |
while(j1 < 4) { | |
k[i1 + j1] = k[i1 + j1 - kl1] ^ t[j1]; | |
j1++; | |
} | |
i1 += 4; | |
} | |
var _g3 = mode.toLowerCase(); | |
switch(_g3) { | |
case org.ascrypt.common.OperationMode.ECB: | |
var tmp; | |
var encrypt = org.ascrypt.AES.ie; | |
var r = []; | |
var l = b.length; | |
var i2 = 0; | |
while(i2 < l) { | |
r = r.concat(encrypt(k,b.slice(i2,i2 + 16))); | |
i2 += 16; | |
} | |
tmp = r; | |
return tmp; | |
case org.ascrypt.common.OperationMode.CBC: | |
var tmp1; | |
var encrypt1 = org.ascrypt.AES.ie; | |
var iv1 = iv.slice(); | |
var r1 = []; | |
var l1 = b.length; | |
var i3 = 0; | |
while(i3 < l1) { | |
var _g4 = 0; | |
while(_g4 < 16) { | |
var j2 = _g4++; | |
b[i3 + j2] ^= iv1[j2]; | |
} | |
r1 = r1.concat(encrypt1(k,b.slice(i3,i3 + 16))); | |
iv1 = r1.slice(i3,i3 + 16); | |
i3 += 16; | |
} | |
tmp1 = r1; | |
return tmp1; | |
case org.ascrypt.common.OperationMode.CTR: | |
var tmp2; | |
var encrypt2 = org.ascrypt.AES.ie; | |
var iv2 = iv.slice(); | |
var bl = b.length; | |
var e = []; | |
var x = iv2.slice(); | |
var i4 = 0; | |
while(i4 < bl) { | |
e = encrypt2(k,x); | |
var _g5 = 0; | |
while(_g5 < 16) { | |
var j3 = _g5++; | |
b[i4 + j3] ^= e[j3]; | |
} | |
var l2 = 15; | |
while(l2 >= 0) { | |
--l2; | |
x[l2]++; | |
if(x[l2] != 0) break; | |
} | |
i4 += 16; | |
} | |
tmp2 = b; | |
return tmp2; | |
case org.ascrypt.common.OperationMode.NONE: | |
var tmp3; | |
var b1 = b.slice(); | |
var i5 = 16; | |
var l3 = k.length; | |
var r2 = k.slice(0,16); | |
var _g6 = 0; | |
while(_g6 < 16) { | |
var i6 = _g6++; | |
b1[i6] ^= r2[i6]; | |
} | |
while(i5 < l3 - 16) { | |
var b2 = org.ascrypt.AES.sbox; | |
var _g7 = 0; | |
while(_g7 < 16) { | |
var i7 = _g7++; | |
b1[i7] = b2[b1[i7]]; | |
} | |
var t1 = org.ascrypt.AES.srtab; | |
var h = b1.slice(); | |
var _g8 = 0; | |
while(_g8 < 16) { | |
var i8 = _g8++; | |
b1[i8] = h[t1[i8]]; | |
} | |
var i9 = 0; | |
while(i9 < 16) { | |
var s0 = b1[i9]; | |
var s1 = b1[i9 + 1]; | |
var s2 = b1[i9 + 2]; | |
var s3 = b1[i9 + 3]; | |
var h1 = s0 ^ s1 ^ s2 ^ s3; | |
b1[i9] ^= h1 ^ org.ascrypt.AES.xtime[s0 ^ s1]; | |
b1[i9 + 1] ^= h1 ^ org.ascrypt.AES.xtime[s1 ^ s2]; | |
b1[i9 + 2] ^= h1 ^ org.ascrypt.AES.xtime[s2 ^ s3]; | |
b1[i9 + 3] ^= h1 ^ org.ascrypt.AES.xtime[s3 ^ s0]; | |
i9 += 4; | |
} | |
var r3 = k.slice(i5,i5 + 16); | |
var _g9 = 0; | |
while(_g9 < 16) { | |
var i10 = _g9++; | |
b1[i10] ^= r3[i10]; | |
} | |
i5 += 16; | |
} | |
var b3 = org.ascrypt.AES.sbox; | |
var _g10 = 0; | |
while(_g10 < 16) { | |
var i11 = _g10++; | |
b1[i11] = b3[b1[i11]]; | |
} | |
var t2 = org.ascrypt.AES.srtab; | |
var h2 = b1.slice(); | |
var _g11 = 0; | |
while(_g11 < 16) { | |
var i12 = _g11++; | |
b1[i12] = h2[t2[i12]]; | |
} | |
var r4 = k.slice(i5,i5 + 16); | |
var _g12 = 0; | |
while(_g12 < 16) { | |
var i13 = _g12++; | |
b1[i13] ^= r4[i13]; | |
} | |
tmp3 = b1; | |
return tmp3; | |
default: | |
throw org.ascrypt.AES.ERROR_MODE; | |
} | |
}; | |
org.ascrypt.AES.decrypt = function(key,bytes,mode,iv) { | |
if(mode == null) mode = "ecb"; | |
var kl = key.length; | |
if((kl != 16?kl != 24:false)?kl != 32:false) throw org.ascrypt.AES.ERROR_KEY; | |
if(bytes.length % 16 != 0) throw org.ascrypt.AES.ERROR_BLOCK; | |
var k = key.slice(); | |
var b = bytes.slice(); | |
org.ascrypt.AES.isrtab = []; | |
org.ascrypt.AES.isbox = []; | |
org.ascrypt.AES.xtime = []; | |
var _g = 0; | |
while(_g < 256) { | |
var i = _g++; | |
org.ascrypt.AES.isbox[org.ascrypt.AES.sbox[i]] = i; | |
} | |
var _g1 = 0; | |
while(_g1 < 16) { | |
var j = _g1++; | |
org.ascrypt.AES.isrtab[org.ascrypt.AES.srtab[j]] = j; | |
} | |
var _g2 = 0; | |
while(_g2 < 128) { | |
var k1 = _g2++; | |
org.ascrypt.AES.xtime[k1] = k1 << 1; | |
org.ascrypt.AES.xtime[128 + k1] = k1 << 1 ^ 27; | |
} | |
var kl1 = k.length; | |
var ks = 0; | |
var rcon = 1; | |
switch(kl1) { | |
case 16: | |
ks = 176; | |
break; | |
case 24: | |
ks = 208; | |
break; | |
case 32: | |
ks = 240; | |
break; | |
} | |
var i1 = kl1; | |
while(i1 < ks) { | |
var t = k.slice(i1 - 4,i1); | |
if(i1 % kl1 == 0) { | |
t = [org.ascrypt.AES.sbox[t[1]] ^ rcon,org.ascrypt.AES.sbox[t[2]],org.ascrypt.AES.sbox[t[3]],org.ascrypt.AES.sbox[t[0]]]; | |
if((rcon <<= 1) >= 256) rcon ^= 283; | |
} else if(kl1 > 24?i1 % kl1 == 16:false) t = [org.ascrypt.AES.sbox[t[0]],org.ascrypt.AES.sbox[t[1]],org.ascrypt.AES.sbox[t[2]],org.ascrypt.AES.sbox[t[3]]]; | |
var j1 = 0; | |
while(j1 < 4) { | |
k[i1 + j1] = k[i1 + j1 - kl1] ^ t[j1]; | |
j1++; | |
} | |
i1 += 4; | |
} | |
var _g3 = mode.toLowerCase(); | |
switch(_g3) { | |
case org.ascrypt.common.OperationMode.ECB: | |
var tmp; | |
var decrypt = org.ascrypt.AES.id; | |
var r = []; | |
var l = b.length; | |
var i2 = 0; | |
while(i2 < l) { | |
r = r.concat(decrypt(k,b.slice(i2,i2 + 16))); | |
i2 += 16; | |
} | |
tmp = r; | |
return tmp; | |
case org.ascrypt.common.OperationMode.CBC: | |
var tmp1; | |
var decrypt1 = org.ascrypt.AES.id; | |
var iv1 = iv.slice(); | |
var l1 = b.length; | |
var t1; | |
var r1 = []; | |
var i3 = 0; | |
while(i3 < l1) { | |
t1 = b.slice(i3,i3 + 16); | |
r1 = r1.concat(decrypt1(k,t1)); | |
var _g4 = 0; | |
while(_g4 < 16) { | |
var j2 = _g4++; | |
r1[i3 + j2] ^= iv1[j2]; | |
} | |
iv1 = t1.slice(0,16); | |
i3 += 16; | |
} | |
tmp1 = r1; | |
return tmp1; | |
case org.ascrypt.common.OperationMode.CTR: | |
var tmp2; | |
var encrypt = org.ascrypt.AES.ie; | |
var iv2 = iv.slice(); | |
var bl = b.length; | |
var e = []; | |
var x = iv2.slice(); | |
var i4 = 0; | |
while(i4 < bl) { | |
e = encrypt(k,x); | |
var _g5 = 0; | |
while(_g5 < 16) { | |
var j3 = _g5++; | |
b[i4 + j3] ^= e[j3]; | |
} | |
var l2 = 15; | |
while(l2 >= 0) { | |
--l2; | |
x[l2]++; | |
if(x[l2] != 0) break; | |
} | |
i4 += 16; | |
} | |
tmp2 = b; | |
return tmp2; | |
case org.ascrypt.common.OperationMode.NONE: | |
var tmp3; | |
var b1 = b.slice(); | |
var l3 = k.length; | |
var i5 = l3 - 32; | |
var r2 = k.slice(l3 - 16,l3); | |
var _g6 = 0; | |
while(_g6 < 16) { | |
var i6 = _g6++; | |
b1[i6] ^= r2[i6]; | |
} | |
var t2 = org.ascrypt.AES.isrtab; | |
var h = b1.slice(); | |
var _g7 = 0; | |
while(_g7 < 16) { | |
var i7 = _g7++; | |
b1[i7] = h[t2[i7]]; | |
} | |
var b2 = org.ascrypt.AES.isbox; | |
var _g8 = 0; | |
while(_g8 < 16) { | |
var i8 = _g8++; | |
b1[i8] = b2[b1[i8]]; | |
} | |
while(i5 >= 16) { | |
var r3 = k.slice(i5,i5 + 16); | |
var _g9 = 0; | |
while(_g9 < 16) { | |
var i9 = _g9++; | |
b1[i9] ^= r3[i9]; | |
} | |
var i10 = 0; | |
while(i10 < 16) { | |
var s0 = b1[i10]; | |
var s1 = b1[i10 + 1]; | |
var s2 = b1[i10 + 2]; | |
var s3 = b1[i10 + 3]; | |
var h1 = s0 ^ s1 ^ s2 ^ s3; | |
var xh = org.ascrypt.AES.xtime[h1]; | |
var h11 = org.ascrypt.AES.xtime[org.ascrypt.AES.xtime[xh ^ s0 ^ s2]] ^ h1; | |
var h2 = org.ascrypt.AES.xtime[org.ascrypt.AES.xtime[xh ^ s1 ^ s3]] ^ h1; | |
b1[i10] ^= h11 ^ org.ascrypt.AES.xtime[s0 ^ s1]; | |
b1[i10 + 1] ^= h2 ^ org.ascrypt.AES.xtime[s1 ^ s2]; | |
b1[i10 + 2] ^= h11 ^ org.ascrypt.AES.xtime[s2 ^ s3]; | |
b1[i10 + 3] ^= h2 ^ org.ascrypt.AES.xtime[s3 ^ s0]; | |
i10 += 4; | |
} | |
var t3 = org.ascrypt.AES.isrtab; | |
var h3 = b1.slice(); | |
var _g10 = 0; | |
while(_g10 < 16) { | |
var i11 = _g10++; | |
b1[i11] = h3[t3[i11]]; | |
} | |
var b3 = org.ascrypt.AES.isbox; | |
var _g11 = 0; | |
while(_g11 < 16) { | |
var i12 = _g11++; | |
b1[i12] = b3[b1[i12]]; | |
} | |
i5 -= 16; | |
} | |
var r4 = k.slice(0,16); | |
var _g12 = 0; | |
while(_g12 < 16) { | |
var i13 = _g12++; | |
b1[i13] ^= r4[i13]; | |
} | |
tmp3 = b1; | |
return tmp3; | |
default: | |
throw org.ascrypt.AES.ERROR_MODE; | |
} | |
}; | |
org.ascrypt.AES.init = function() { | |
org.ascrypt.AES.isrtab = []; | |
org.ascrypt.AES.isbox = []; | |
org.ascrypt.AES.xtime = []; | |
var _g = 0; | |
while(_g < 256) { | |
var i = _g++; | |
org.ascrypt.AES.isbox[org.ascrypt.AES.sbox[i]] = i; | |
} | |
var _g1 = 0; | |
while(_g1 < 16) { | |
var j = _g1++; | |
org.ascrypt.AES.isrtab[org.ascrypt.AES.srtab[j]] = j; | |
} | |
var _g2 = 0; | |
while(_g2 < 128) { | |
var k = _g2++; | |
org.ascrypt.AES.xtime[k] = k << 1; | |
org.ascrypt.AES.xtime[128 + k] = k << 1 ^ 27; | |
} | |
}; | |
org.ascrypt.AES.sb = function(s,b) { | |
var _g = 0; | |
while(_g < 16) { | |
var i = _g++; | |
s[i] = b[s[i]]; | |
} | |
}; | |
org.ascrypt.AES.ark = function(s,r) { | |
var _g = 0; | |
while(_g < 16) { | |
var i = _g++; | |
s[i] ^= r[i]; | |
} | |
}; | |
org.ascrypt.AES.sr = function(s,t) { | |
var h = s.slice(); | |
var _g = 0; | |
while(_g < 16) { | |
var i = _g++; | |
s[i] = h[t[i]]; | |
} | |
}; | |
org.ascrypt.AES.ek = function(k) { | |
var kl = k.length; | |
var ks = 0; | |
var rcon = 1; | |
switch(kl) { | |
case 16: | |
ks = 176; | |
break; | |
case 24: | |
ks = 208; | |
break; | |
case 32: | |
ks = 240; | |
break; | |
} | |
var i = kl; | |
while(i < ks) { | |
var t = k.slice(i - 4,i); | |
if(i % kl == 0) { | |
t = [org.ascrypt.AES.sbox[t[1]] ^ rcon,org.ascrypt.AES.sbox[t[2]],org.ascrypt.AES.sbox[t[3]],org.ascrypt.AES.sbox[t[0]]]; | |
if((rcon <<= 1) >= 256) rcon ^= 283; | |
} else if(kl > 24?i % kl == 16:false) t = [org.ascrypt.AES.sbox[t[0]],org.ascrypt.AES.sbox[t[1]],org.ascrypt.AES.sbox[t[2]],org.ascrypt.AES.sbox[t[3]]]; | |
var j = 0; | |
while(j < 4) { | |
k[i + j] = k[i + j - kl] ^ t[j]; | |
j++; | |
} | |
i += 4; | |
} | |
}; | |
org.ascrypt.AES.ie = function(k,ob) { | |
var b = ob.slice(); | |
var i = 16; | |
var l = k.length; | |
var r = k.slice(0,16); | |
var _g = 0; | |
while(_g < 16) { | |
var i1 = _g++; | |
b[i1] ^= r[i1]; | |
} | |
while(i < l - 16) { | |
var b1 = org.ascrypt.AES.sbox; | |
var _g1 = 0; | |
while(_g1 < 16) { | |
var i2 = _g1++; | |
b[i2] = b1[b[i2]]; | |
} | |
var t = org.ascrypt.AES.srtab; | |
var h = b.slice(); | |
var _g2 = 0; | |
while(_g2 < 16) { | |
var i3 = _g2++; | |
b[i3] = h[t[i3]]; | |
} | |
var i4 = 0; | |
while(i4 < 16) { | |
var s0 = b[i4]; | |
var s1 = b[i4 + 1]; | |
var s2 = b[i4 + 2]; | |
var s3 = b[i4 + 3]; | |
var h1 = s0 ^ s1 ^ s2 ^ s3; | |
b[i4] ^= h1 ^ org.ascrypt.AES.xtime[s0 ^ s1]; | |
b[i4 + 1] ^= h1 ^ org.ascrypt.AES.xtime[s1 ^ s2]; | |
b[i4 + 2] ^= h1 ^ org.ascrypt.AES.xtime[s2 ^ s3]; | |
b[i4 + 3] ^= h1 ^ org.ascrypt.AES.xtime[s3 ^ s0]; | |
i4 += 4; | |
} | |
var r1 = k.slice(i,i + 16); | |
var _g3 = 0; | |
while(_g3 < 16) { | |
var i5 = _g3++; | |
b[i5] ^= r1[i5]; | |
} | |
i += 16; | |
} | |
var b2 = org.ascrypt.AES.sbox; | |
var _g4 = 0; | |
while(_g4 < 16) { | |
var i6 = _g4++; | |
b[i6] = b2[b[i6]]; | |
} | |
var t1 = org.ascrypt.AES.srtab; | |
var h2 = b.slice(); | |
var _g5 = 0; | |
while(_g5 < 16) { | |
var i7 = _g5++; | |
b[i7] = h2[t1[i7]]; | |
} | |
var r2 = k.slice(i,i + 16); | |
var _g6 = 0; | |
while(_g6 < 16) { | |
var i8 = _g6++; | |
b[i8] ^= r2[i8]; | |
} | |
return b; | |
}; | |
org.ascrypt.AES.id = function(k,ob) { | |
var b = ob.slice(); | |
var l = k.length; | |
var i = l - 32; | |
var r = k.slice(l - 16,l); | |
var _g = 0; | |
while(_g < 16) { | |
var i1 = _g++; | |
b[i1] ^= r[i1]; | |
} | |
var t = org.ascrypt.AES.isrtab; | |
var h = b.slice(); | |
var _g1 = 0; | |
while(_g1 < 16) { | |
var i2 = _g1++; | |
b[i2] = h[t[i2]]; | |
} | |
var b1 = org.ascrypt.AES.isbox; | |
var _g2 = 0; | |
while(_g2 < 16) { | |
var i3 = _g2++; | |
b[i3] = b1[b[i3]]; | |
} | |
while(i >= 16) { | |
var r1 = k.slice(i,i + 16); | |
var _g3 = 0; | |
while(_g3 < 16) { | |
var i4 = _g3++; | |
b[i4] ^= r1[i4]; | |
} | |
var i5 = 0; | |
while(i5 < 16) { | |
var s0 = b[i5]; | |
var s1 = b[i5 + 1]; | |
var s2 = b[i5 + 2]; | |
var s3 = b[i5 + 3]; | |
var h1 = s0 ^ s1 ^ s2 ^ s3; | |
var xh = org.ascrypt.AES.xtime[h1]; | |
var h11 = org.ascrypt.AES.xtime[org.ascrypt.AES.xtime[xh ^ s0 ^ s2]] ^ h1; | |
var h2 = org.ascrypt.AES.xtime[org.ascrypt.AES.xtime[xh ^ s1 ^ s3]] ^ h1; | |
b[i5] ^= h11 ^ org.ascrypt.AES.xtime[s0 ^ s1]; | |
b[i5 + 1] ^= h2 ^ org.ascrypt.AES.xtime[s1 ^ s2]; | |
b[i5 + 2] ^= h11 ^ org.ascrypt.AES.xtime[s2 ^ s3]; | |
b[i5 + 3] ^= h2 ^ org.ascrypt.AES.xtime[s3 ^ s0]; | |
i5 += 4; | |
} | |
var t1 = org.ascrypt.AES.isrtab; | |
var h3 = b.slice(); | |
var _g4 = 0; | |
while(_g4 < 16) { | |
var i6 = _g4++; | |
b[i6] = h3[t1[i6]]; | |
} | |
var b2 = org.ascrypt.AES.isbox; | |
var _g5 = 0; | |
while(_g5 < 16) { | |
var i7 = _g5++; | |
b[i7] = b2[b[i7]]; | |
} | |
i -= 16; | |
} | |
var r2 = k.slice(0,16); | |
var _g6 = 0; | |
while(_g6 < 16) { | |
var i8 = _g6++; | |
b[i8] ^= r2[i8]; | |
} | |
return b; | |
}; | |
org.ascrypt.AES.mc = function(s) { | |
var i = 0; | |
while(i < 16) { | |
var s0 = s[i]; | |
var s1 = s[i + 1]; | |
var s2 = s[i + 2]; | |
var s3 = s[i + 3]; | |
var h = s0 ^ s1 ^ s2 ^ s3; | |
s[i] ^= h ^ org.ascrypt.AES.xtime[s0 ^ s1]; | |
s[i + 1] ^= h ^ org.ascrypt.AES.xtime[s1 ^ s2]; | |
s[i + 2] ^= h ^ org.ascrypt.AES.xtime[s2 ^ s3]; | |
s[i + 3] ^= h ^ org.ascrypt.AES.xtime[s3 ^ s0]; | |
i += 4; | |
} | |
}; | |
org.ascrypt.AES.mci = function(s) { | |
var i = 0; | |
while(i < 16) { | |
var s0 = s[i]; | |
var s1 = s[i + 1]; | |
var s2 = s[i + 2]; | |
var s3 = s[i + 3]; | |
var h = s0 ^ s1 ^ s2 ^ s3; | |
var xh = org.ascrypt.AES.xtime[h]; | |
var h1 = org.ascrypt.AES.xtime[org.ascrypt.AES.xtime[xh ^ s0 ^ s2]] ^ h; | |
var h2 = org.ascrypt.AES.xtime[org.ascrypt.AES.xtime[xh ^ s1 ^ s3]] ^ h; | |
s[i] ^= h1 ^ org.ascrypt.AES.xtime[s0 ^ s1]; | |
s[i + 1] ^= h2 ^ org.ascrypt.AES.xtime[s1 ^ s2]; | |
s[i + 2] ^= h1 ^ org.ascrypt.AES.xtime[s2 ^ s3]; | |
s[i + 3] ^= h2 ^ org.ascrypt.AES.xtime[s3 ^ s0]; | |
i += 4; | |
} | |
}; | |
org.ascrypt.AES.check = function(k,b) { | |
var kl = k.length; | |
if((kl != 16?kl != 24:false)?kl != 32:false) throw org.ascrypt.AES.ERROR_KEY; | |
if(b.length % 16 != 0) throw org.ascrypt.AES.ERROR_BLOCK; | |
}; | |
org.ascrypt.common = {}; | |
org.ascrypt.common.OperationMode = function() { }; | |
org.ascrypt.utilities = {}; | |
org.ascrypt.utilities.CBC = function() { }; | |
org.ascrypt.utilities.CBC.encrypt = function(key,bytes,size,encrypt,iv) { | |
var r = []; | |
var l = bytes.length; | |
var i = 0; | |
while(i < l) { | |
var _g = 0; | |
while(_g < size) { | |
var j = _g++; | |
bytes[i + j] ^= iv[j]; | |
} | |
r = r.concat(encrypt(key,bytes.slice(i,i + size))); | |
iv = r.slice(i,i + size); | |
i += size; | |
} | |
return r; | |
}; | |
org.ascrypt.utilities.CBC.decrypt = function(key,bytes,size,decrypt,iv) { | |
var l = bytes.length; | |
var t; | |
var r = []; | |
var i = 0; | |
while(i < l) { | |
t = bytes.slice(i,i + size); | |
r = r.concat(decrypt(key,t)); | |
var _g = 0; | |
while(_g < size) { | |
var j = _g++; | |
r[i + j] ^= iv[j]; | |
} | |
iv = t.slice(0,size); | |
i += size; | |
} | |
return r; | |
}; | |
org.ascrypt.utilities.CTR = function() { }; | |
org.ascrypt.utilities.CTR.encrypt = function(key,bytes,size,encrypt,iv) { | |
var tmp; | |
var bl = bytes.length; | |
var e = []; | |
var x = iv.slice(); | |
var i = 0; | |
while(i < bl) { | |
e = encrypt(key,x); | |
var _g = 0; | |
while(_g < size) { | |
var j = _g++; | |
bytes[i + j] ^= e[j]; | |
} | |
var l = size - 1; | |
while(l >= 0) { | |
--l; | |
x[l]++; | |
if(x[l] != 0) break; | |
} | |
i += size; | |
} | |
tmp = bytes; | |
return tmp; | |
}; | |
org.ascrypt.utilities.CTR.decrypt = function(key,bytes,size,encrypt,iv) { | |
var tmp; | |
var bl = bytes.length; | |
var e = []; | |
var x = iv.slice(); | |
var i = 0; | |
while(i < bl) { | |
e = encrypt(key,x); | |
var _g = 0; | |
while(_g < size) { | |
var j = _g++; | |
bytes[i + j] ^= e[j]; | |
} | |
var l = size - 1; | |
while(l >= 0) { | |
--l; | |
x[l]++; | |
if(x[l] != 0) break; | |
} | |
i += size; | |
} | |
tmp = bytes; | |
return tmp; | |
}; | |
org.ascrypt.utilities.CTR.core = function(k,b,s,c,v) { | |
var bl = b.length; | |
var e = []; | |
var x = v.slice(); | |
var i = 0; | |
while(i < bl) { | |
e = c(k,x); | |
var _g = 0; | |
while(_g < s) { | |
var j = _g++; | |
b[i + j] ^= e[j]; | |
} | |
var l = s - 1; | |
while(l >= 0) { | |
--l; | |
x[l]++; | |
if(x[l] != 0) break; | |
} | |
i += s; | |
} | |
return b; | |
}; | |
org.ascrypt.utilities.ECB = function() { }; | |
org.ascrypt.utilities.ECB.encrypt = function(key,bytes,size,encrypt) { | |
var tmp; | |
var r = []; | |
var l = bytes.length; | |
var i = 0; | |
while(i < l) { | |
r = r.concat(encrypt(key,bytes.slice(i,i + size))); | |
i += size; | |
} | |
tmp = r; | |
return tmp; | |
}; | |
org.ascrypt.utilities.ECB.decrypt = function(key,bytes,size,decrypt) { | |
var tmp; | |
var r = []; | |
var l = bytes.length; | |
var i = 0; | |
while(i < l) { | |
r = r.concat(decrypt(key,bytes.slice(i,i + size))); | |
i += size; | |
} | |
tmp = r; | |
return tmp; | |
}; | |
org.ascrypt.utilities.ECB.core = function(k,b,s,c) { | |
var r = []; | |
var l = b.length; | |
var i = 0; | |
while(i < l) { | |
r = r.concat(c(k,b.slice(i,i + s))); | |
i += s; | |
} | |
return r; | |
}; | |
org.ascrypt.AES.ERROR_KEY = "Invalid key size. Key size needs to be either 128, 192 or 256 bits.\n"; | |
org.ascrypt.AES.ERROR_MODE = "Invalid mode of operation. Supported modes are ECB, CBC, CTR or NONE.\n"; | |
org.ascrypt.AES.ERROR_BLOCK = "Invalid block size. Block size is fixed at 128 bits.\n"; | |
org.ascrypt.AES.srtab = [0,5,10,15,4,9,14,3,8,13,2,7,12,1,6,11]; | |
org.ascrypt.AES.sbox = [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]; | |
org.ascrypt.common.OperationMode.ECB = "ecb"; | |
org.ascrypt.common.OperationMode.CBC = "cbc"; | |
org.ascrypt.common.OperationMode.CTR = "ctr"; | |
org.ascrypt.common.OperationMode.NONE = "none"; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment