Diffstat (limited to 'frontend/beta/js/Clipperz/Crypto/AES.js') (more/less context) (ignore whitespace changes)
-rw-r--r-- | frontend/beta/js/Clipperz/Crypto/AES.js | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/frontend/beta/js/Clipperz/Crypto/AES.js b/frontend/beta/js/Clipperz/Crypto/AES.js index 7ddda3e..a5c63fb 100644 --- a/frontend/beta/js/Clipperz/Crypto/AES.js +++ b/frontend/beta/js/Clipperz/Crypto/AES.js @@ -1,406 +1,404 @@ /* -Copyright 2008-2011 Clipperz Srl +Copyright 2008-2013 Clipperz Srl -This file is part of Clipperz Community Edition. -Clipperz Community Edition is an online password manager. +This file is part of Clipperz, the online password manager. For further information about its features and functionalities please refer to http://www.clipperz.com. -* Clipperz Community Edition is free software: you can redistribute - it and/or modify it under the terms of the GNU Affero General Public - License as published by the Free Software Foundation, either version - 3 of the License, or (at your option) any later version. +* Clipperz is free software: you can redistribute it and/or modify it + under the terms of the GNU Affero General Public License as published + by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -* Clipperz Community Edition is distributed in the hope that it will - be useful, but WITHOUT ANY WARRANTY; without even the implied - warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +* Clipperz is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. * You should have received a copy of the GNU Affero General Public - License along with Clipperz Community Edition. If not, see - <http://www.gnu.org/licenses/>. + License along with Clipperz. If not, see http://www.gnu.org/licenses/. */ try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { throw "Clipperz.Crypto.AES depends on Clipperz.ByteArray!"; } // Dependency commented to avoid a circular reference //try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { // throw "Clipperz.Crypto.AES depends on Clipperz.Crypto.PRNG!"; //} if (typeof(Clipperz.Crypto.AES) == 'undefined') { Clipperz.Crypto.AES = {}; } //############################################################################# Clipperz.Crypto.AES.DeferredExecutionContext = function(args) { args = args || {}; this._key = args.key; this._message = args.message; this._result = args.message.clone(); this._nonce = args.nonce; this._messageLength = this._message.length(); this._messageArray = this._message.arrayValues(); this._resultArray = this._result.arrayValues(); this._nonceArray = this._nonce.arrayValues(); this._executionStep = 0; return this; } Clipperz.Crypto.AES.DeferredExecutionContext.prototype = MochiKit.Base.update(null, { 'key': function() { return this._key; }, 'message': function() { return this._message; }, 'messageLength': function() { return this._messageLength; }, 'result': function() { return new Clipperz.ByteArray(this.resultArray()); }, 'nonce': function() { return this._nonce; }, 'messageArray': function() { return this._messageArray; }, 'resultArray': function() { return this._resultArray; }, 'nonceArray': function() { return this._nonceArray; }, 'elaborationChunkSize': function() { return Clipperz.Crypto.AES.DeferredExecution.chunkSize; }, 'executionStep': function() { return this._executionStep; }, 'setExecutionStep': function(aValue) { this._executionStep = aValue; }, 'pause': function(aValue) { return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue); }, //----------------------------------------------------------------------------- __syntaxFix__: "syntax fix" }); //############################################################################# Clipperz.Crypto.AES.Key = function(args) { args = args || {}; this._key = args.key; this._keySize = args.keySize || this.key().length(); if (this.keySize() == 128/8) { this._b = 176; this._numberOfRounds = 10; } else if (this.keySize() == 256/8) { this._b = 240; this._numberOfRounds = 14; } else { MochiKit.Logging.logError("AES unsupported key size: " + (this.keySize() * 8) + " bits"); throw Clipperz.Crypto.AES.exception.UnsupportedKeySize; } this._stretchedKey = null; return this; } Clipperz.Crypto.AES.Key.prototype = MochiKit.Base.update(null, { 'asString': function() { return "Clipperz.Crypto.AES.Key (" + this.key().toHexString() + ")"; }, //----------------------------------------------------------------------------- 'key': function() { return this._key; }, 'keySize': function() { return this._keySize; }, 'b': function() { return this._b; }, 'numberOfRounds': function() { return this._numberOfRounds; }, //========================================================================= 'keyScheduleCore': function(aWord, aRoundConstantsIndex) { var result; var sbox; sbox = Clipperz.Crypto.AES.sbox(); result = [ sbox[aWord[1]] ^ Clipperz.Crypto.AES.roundConstants()[aRoundConstantsIndex], sbox[aWord[2]], sbox[aWord[3]], sbox[aWord[0]] ]; return result; }, //----------------------------------------------------------------------------- 'xorWithPreviousStretchValues': function(aKey, aWord, aPreviousWordIndex) { var result; var i,c; result = []; c = 4; for (i=0; i<c; i++) { result[i] = aWord[i] ^ aKey.byteAtIndex(aPreviousWordIndex + i); } return result; }, //----------------------------------------------------------------------------- 'sboxShakeup': function(aWord) { var result; var sbox; var i,c; result = []; sbox = Clipperz.Crypto.AES.sbox(); c =4; for (i=0; i<c; i++) { result[i] = sbox[aWord[i]]; } return result; }, //----------------------------------------------------------------------------- 'stretchKey': function(aKey) { var currentWord; var keyLength; var previousStretchIndex; var i,c; keyLength = aKey.length(); previousStretchIndex = keyLength - this.keySize(); currentWord = [ aKey.byteAtIndex(keyLength - 4), aKey.byteAtIndex(keyLength - 3), aKey.byteAtIndex(keyLength - 2), aKey.byteAtIndex(keyLength - 1) ]; currentWord = this.keyScheduleCore(currentWord, keyLength / this.keySize()); if (this.keySize() == 256/8) { c = 8; } else if (this.keySize() == 128/8){ c = 4; } for (i=0; i<c; i++) { if (i == 4) { // fifth streatch word currentWord = this.sboxShakeup(currentWord); } currentWord = this.xorWithPreviousStretchValues(aKey, currentWord, previousStretchIndex + (i*4)); aKey.appendBytes(currentWord); } return aKey; }, //----------------------------------------------------------------------------- 'stretchedKey': function() { if (this._stretchedKey == null) { var stretchedKey; stretchedKey = this.key().clone(); while (stretchedKey.length() < this.keySize()) { stretchedKey.appendByte(0); } while (stretchedKey.length() < this.b()) { stretchedKey = this.stretchKey(stretchedKey); } this._stretchedKey = stretchedKey.split(0, this.b()); } return this._stretchedKey; }, //========================================================================= __syntaxFix__: "syntax fix" }); //############################################################################# Clipperz.Crypto.AES.State = function(args) { args = args || {}; this._data = args.block; this._key = args.key; return this; } Clipperz.Crypto.AES.State.prototype = MochiKit.Base.update(null, { 'key': function() { return this._key; }, //----------------------------------------------------------------------------- 'data': function() { return this._data; }, 'setData': function(aValue) { this._data = aValue; }, //========================================================================= 'addRoundKey': function(aRoundNumber) { // each byte of the state is combined with the round key; each round key is derived from the cipher key using a key schedule. var data; var stretchedKey; var firstStretchedKeyIndex; var i,c; data = this.data(); stretchedKey = this.key().stretchedKey(); firstStretchedKeyIndex = aRoundNumber * (128/8); c = 128/8; for (i=0; i<c; i++) { data[i] = data[i] ^ stretchedKey.byteAtIndex(firstStretchedKeyIndex + i); } }, //----------------------------------------------------------------------------- 'subBytes': function() { // a non-linear substitution step where each byte is replaced with another according to a lookup table. var i,c; var data; var sbox; data = this.data(); sbox = Clipperz.Crypto.AES.sbox(); c = 16; for (i=0; i<c; i++) { data[i] = sbox[data[i]]; } }, //----------------------------------------------------------------------------- 'shiftRows': function() { // a transposition step where each row of the state is shifted cyclically a certain number of steps. var newValue; var data; var shiftMapping; var i,c; newValue = new Array(16); data = this.data(); shiftMapping = Clipperz.Crypto.AES.shiftRowMapping(); // [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; c = 16; for (i=0; i<c; i++) { newValue[i] = data[shiftMapping[i]]; } for (i=0; i<c; i++) { data[i] = newValue[i]; } }, //----------------------------------------------------------------------------- /* 'mixColumnsWithValues': function(someValues) { var result; var a; var i,c; c = 4; result = []; a = []; for (i=0; i<c; i++) { a[i] = []; a[i][1] = someValues[i] if ((a[i][1] & 0x80) == 0x80) { a[i][2] = (a[i][1] << 1) ^ 0x11b; } else { a[i][2] = a[i][1] << 1; } a[i][3] = a[i][2] ^ a[i][1]; } for (i=0; i<c; i++) { var x; x = Clipperz.Crypto.AES.mixColumnsMatrix()[i]; result[i] = a[0][x[0]] ^ a[1][x[1]] ^ a[2][x[2]] ^ a[3][x[3]]; } return result; }, 'mixColumns': function() { // a mixing operation which operates on the columns of the state, combining the four bytes in each column using a linear transformation. var data; var i, c; data = this.data(); c = 4; for(i=0; i<c; i++) { var blockIndex; var mixedValues; blockIndex = i * 4; mixedValues = this.mixColumnsWithValues([ data[blockIndex + 0], data[blockIndex + 1], data[blockIndex + 2], data[blockIndex + 3]]); data[blockIndex + 0] = mixedValues[0]; data[blockIndex + 1] = mixedValues[1]; data[blockIndex + 2] = mixedValues[2]; data[blockIndex + 3] = mixedValues[3]; } }, |