react / wstein / node_modules / browserify / node_modules / crypto-browserify / node_modules / browserify-aes / aes.js
80540 views// based on the aes implimentation in triple sec1// https://github.com/keybase/triplesec23// which is in turn based on the one from crypto-js4// https://code.google.com/p/crypto-js/56var uint_max = Math.pow(2, 32)7function fixup_uint32 (x) {8var ret, x_pos9ret = x > uint_max || x < 0 ? (x_pos = Math.abs(x) % uint_max, x < 0 ? uint_max - x_pos : x_pos) : x10return ret11}12function scrub_vec (v) {13for (var i = 0; i < v.length; v++) {14v[i] = 015}16return false17}1819function Global () {20this.SBOX = []21this.INV_SBOX = []22this.SUB_MIX = [[], [], [], []]23this.INV_SUB_MIX = [[], [], [], []]24this.init()25this.RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]26}2728Global.prototype.init = function () {29var d, i, sx, t, x, x2, x4, x8, xi, _i30d = (function () {31var _i, _results32_results = []33for (i = _i = 0; _i < 256; i = ++_i) {34if (i < 128) {35_results.push(i << 1)36} else {37_results.push((i << 1) ^ 0x11b)38}39}40return _results41})()42x = 043xi = 044for (i = _i = 0; _i < 256; i = ++_i) {45sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4)46sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x6347this.SBOX[x] = sx48this.INV_SBOX[sx] = x49x2 = d[x]50x4 = d[x2]51x8 = d[x4]52t = (d[sx] * 0x101) ^ (sx * 0x1010100)53this.SUB_MIX[0][x] = (t << 24) | (t >>> 8)54this.SUB_MIX[1][x] = (t << 16) | (t >>> 16)55this.SUB_MIX[2][x] = (t << 8) | (t >>> 24)56this.SUB_MIX[3][x] = t57t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100)58this.INV_SUB_MIX[0][sx] = (t << 24) | (t >>> 8)59this.INV_SUB_MIX[1][sx] = (t << 16) | (t >>> 16)60this.INV_SUB_MIX[2][sx] = (t << 8) | (t >>> 24)61this.INV_SUB_MIX[3][sx] = t62if (x === 0) {63x = xi = 164} else {65x = x2 ^ d[d[d[x8 ^ x2]]]66xi ^= d[d[xi]]67}68}69return true70}7172var G = new Global()7374AES.blockSize = 4 * 47576AES.prototype.blockSize = AES.blockSize7778AES.keySize = 256 / 87980AES.prototype.keySize = AES.keySize8182function bufferToArray (buf) {83var len = buf.length / 484var out = new Array(len)85var i = -186while (++i < len) {87out[i] = buf.readUInt32BE(i * 4)88}89return out90}91function AES (key) {92this._key = bufferToArray(key)93this._doReset()94}9596AES.prototype._doReset = function () {97var invKsRow, keySize, keyWords, ksRow, ksRows, t98keyWords = this._key99keySize = keyWords.length100this._nRounds = keySize + 6101ksRows = (this._nRounds + 1) * 4102this._keySchedule = []103for (ksRow = 0; ksRow < ksRows; ksRow++) {104this._keySchedule[ksRow] = ksRow < keySize ? keyWords[ksRow] : (t = this._keySchedule[ksRow - 1], (ksRow % keySize) === 0 ? (t = (t << 8) | (t >>> 24), t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | G.SBOX[t & 0xff], t ^= G.RCON[(ksRow / keySize) | 0] << 24) : keySize > 6 && ksRow % keySize === 4 ? t = (G.SBOX[t >>> 24] << 24) | (G.SBOX[(t >>> 16) & 0xff] << 16) | (G.SBOX[(t >>> 8) & 0xff] << 8) | G.SBOX[t & 0xff] : void 0, this._keySchedule[ksRow - keySize] ^ t)105}106this._invKeySchedule = []107for (invKsRow = 0; invKsRow < ksRows; invKsRow++) {108ksRow = ksRows - invKsRow109t = this._keySchedule[ksRow - (invKsRow % 4 ? 0 : 4)]110this._invKeySchedule[invKsRow] = invKsRow < 4 || ksRow <= 4 ? t : G.INV_SUB_MIX[0][G.SBOX[t >>> 24]] ^ G.INV_SUB_MIX[1][G.SBOX[(t >>> 16) & 0xff]] ^ G.INV_SUB_MIX[2][G.SBOX[(t >>> 8) & 0xff]] ^ G.INV_SUB_MIX[3][G.SBOX[t & 0xff]]111}112return true113}114115AES.prototype.encryptBlock = function (M) {116M = bufferToArray(new Buffer(M))117var out = this._doCryptBlock(M, this._keySchedule, G.SUB_MIX, G.SBOX)118var buf = new Buffer(16)119buf.writeUInt32BE(out[0], 0)120buf.writeUInt32BE(out[1], 4)121buf.writeUInt32BE(out[2], 8)122buf.writeUInt32BE(out[3], 12)123return buf124}125126AES.prototype.decryptBlock = function (M) {127M = bufferToArray(new Buffer(M))128var temp = [M[3], M[1]]129M[1] = temp[0]130M[3] = temp[1]131var out = this._doCryptBlock(M, this._invKeySchedule, G.INV_SUB_MIX, G.INV_SBOX)132var buf = new Buffer(16)133buf.writeUInt32BE(out[0], 0)134buf.writeUInt32BE(out[3], 4)135buf.writeUInt32BE(out[2], 8)136buf.writeUInt32BE(out[1], 12)137return buf138}139140AES.prototype.scrub = function () {141scrub_vec(this._keySchedule)142scrub_vec(this._invKeySchedule)143scrub_vec(this._key)144}145146AES.prototype._doCryptBlock = function (M, keySchedule, SUB_MIX, SBOX) {147var ksRow, s0, s1, s2, s3, t0, t1, t2, t3148149s0 = M[0] ^ keySchedule[0]150s1 = M[1] ^ keySchedule[1]151s2 = M[2] ^ keySchedule[2]152s3 = M[3] ^ keySchedule[3]153ksRow = 4154for (var round = 1; round < this._nRounds; round++) {155t0 = SUB_MIX[0][s0 >>> 24] ^ SUB_MIX[1][(s1 >>> 16) & 0xff] ^ SUB_MIX[2][(s2 >>> 8) & 0xff] ^ SUB_MIX[3][s3 & 0xff] ^ keySchedule[ksRow++]156t1 = SUB_MIX[0][s1 >>> 24] ^ SUB_MIX[1][(s2 >>> 16) & 0xff] ^ SUB_MIX[2][(s3 >>> 8) & 0xff] ^ SUB_MIX[3][s0 & 0xff] ^ keySchedule[ksRow++]157t2 = SUB_MIX[0][s2 >>> 24] ^ SUB_MIX[1][(s3 >>> 16) & 0xff] ^ SUB_MIX[2][(s0 >>> 8) & 0xff] ^ SUB_MIX[3][s1 & 0xff] ^ keySchedule[ksRow++]158t3 = SUB_MIX[0][s3 >>> 24] ^ SUB_MIX[1][(s0 >>> 16) & 0xff] ^ SUB_MIX[2][(s1 >>> 8) & 0xff] ^ SUB_MIX[3][s2 & 0xff] ^ keySchedule[ksRow++]159s0 = t0160s1 = t1161s2 = t2162s3 = t3163}164t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]165t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]166t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]167t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]168return [169fixup_uint32(t0),170fixup_uint32(t1),171fixup_uint32(t2),172fixup_uint32(t3)173]174}175176exports.AES = AES177178179