mirror of
				http://git.whoc.org.uk/git/password-manager.git
				synced 2025-10-31 11:27:34 +01:00 
			
		
		
		
	Updated Copyright claims
- updated reference dates; - removed reference to Community Edition; - normalized logging using Clipperz.log[Warn|Error|Debug]
This commit is contained in:
		
							
								
								
									
										864
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/AES.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										864
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/AES.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,864 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. 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; | ||||
| 	 | ||||
| //	this._elaborationChunkSize = 1024;	//	4096;	//	16384;	//	4096; | ||||
| 	this._elaborationChunks = 10; | ||||
| 	this._pauseTime = 0.02;				//	0.02	//	0.2; | ||||
|  | ||||
| 	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; | ||||
| //		return this._elaborationChunkSize; | ||||
| 		return (this._elaborationChunks * 1024); | ||||
| 	}, | ||||
| 	 | ||||
| 	'executionStep': function() { | ||||
| 		return this._executionStep; | ||||
| 	}, | ||||
| 	 | ||||
| 	'setExecutionStep': function(aValue) { | ||||
| 		this._executionStep = aValue; | ||||
| 	}, | ||||
| 	 | ||||
| 	'tuneExecutionParameters': function (anElapsedTime) { | ||||
| //var originalChunks = this._elaborationChunks; | ||||
| 		if (anElapsedTime > 0) { | ||||
| 			this._elaborationChunks = Math.round(this._elaborationChunks * ((anElapsedTime + 1000)/(anElapsedTime * 2))); | ||||
| 		} | ||||
| //Clipperz.log("tuneExecutionParameters - elapsedTime: " +  anElapsedTime + /*originalChunks,*/ " chunks # " + this._elaborationChunks + " [" + this._executionStep + " / " + this._messageLength + "]"); | ||||
| 	}, | ||||
| 	 | ||||
| 	'pause': function(aValue) { | ||||
| //		return MochiKit.Async.wait(Clipperz.Crypto.AES.DeferredExecution.pauseTime, aValue); | ||||
| 		return MochiKit.Async.wait(this._pauseTime, aValue); | ||||
| 	}, | ||||
| 	 | ||||
| 	'isDone': function () { | ||||
| //console.log("isDone", this.executionStep(), this.messageLength()); | ||||
| 		return (this._executionStep >= this._messageLength); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__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]; | ||||
| 		} | ||||
| 	}, | ||||
| */ | ||||
|  | ||||
| 	'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; | ||||
| 		var a_1; | ||||
| 		var a_2; | ||||
|  | ||||
| 		a_1 = new Array(4); | ||||
| 		a_2 = new Array(4); | ||||
| 		 | ||||
| 		data = this.data(); | ||||
| 		c = 4; | ||||
| 		for(i=0; i<c; i++) { | ||||
| 			var	blockIndex; | ||||
| 			var ii, cc; | ||||
| 			 | ||||
| 			blockIndex = i * 4; | ||||
|  | ||||
| 			cc = 4; | ||||
| 			for (ii=0; ii<cc; ii++) { | ||||
| 				var value; | ||||
| 				 | ||||
| 				value = data[blockIndex + ii]; | ||||
| 				a_1[ii] = value; | ||||
| 				a_2[ii] = (value & 0x80) ? ((value << 1) ^ 0x011b) : (value << 1); | ||||
| 			} | ||||
|  | ||||
| 			data[blockIndex + 0] = a_2[0] ^ a_1[1] ^ a_2[1] ^ a_1[2] ^ a_1[3]; | ||||
| 			data[blockIndex + 1] = a_1[0] ^ a_2[1] ^ a_1[2] ^ a_2[2] ^ a_1[3]; | ||||
| 			data[blockIndex + 2] = a_1[0] ^ a_1[1] ^ a_2[2] ^ a_1[3] ^ a_2[3]; | ||||
| 			data[blockIndex + 3] = a_1[0] ^ a_2[0] ^ a_1[1] ^ a_1[2] ^ a_2[3]; | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	//========================================================================= | ||||
| 	 | ||||
| 	'spinRound': function(aRoundNumber) { | ||||
| 		this.addRoundKey(aRoundNumber); | ||||
| 		this.subBytes(); | ||||
| 		this.shiftRows(); | ||||
| 		this.mixColumns(); | ||||
| 	}, | ||||
|  | ||||
| 	'spinLastRound': function() { | ||||
| 		this.addRoundKey(this.key().numberOfRounds() - 1); | ||||
| 		this.subBytes(); | ||||
| 		this.shiftRows(); | ||||
| 		this.addRoundKey(this.key().numberOfRounds()); | ||||
| 	}, | ||||
|  | ||||
| 	//========================================================================= | ||||
|  | ||||
| 	'encrypt': function() { | ||||
| 		var	i,c; | ||||
|  | ||||
| 		c = this.key().numberOfRounds() - 1; | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			this.spinRound(i); | ||||
| 		} | ||||
|  | ||||
| 		this.spinLastRound(); | ||||
| 	}, | ||||
| 	 | ||||
| 	//========================================================================= | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| Clipperz.Crypto.AES.VERSION = "0.1"; | ||||
| Clipperz.Crypto.AES.NAME = "Clipperz.Crypto.AES"; | ||||
|  | ||||
| MochiKit.Base.update(Clipperz.Crypto.AES, { | ||||
|  | ||||
| //	http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-AES.html | ||||
| //	http://en.wikipedia.org/wiki/Advanced_Encryption_Standard | ||||
| //	http://en.wikipedia.org/wiki/Rijndael_key_schedule  | ||||
| //	http://en.wikipedia.org/wiki/Rijndael_S-box | ||||
| 		 | ||||
| 	'__repr__': function () { | ||||
| 		return "[" + this.NAME + " " + this.VERSION + "]"; | ||||
| 	}, | ||||
|  | ||||
| 	'toString': function () { | ||||
| 		return this.__repr__(); | ||||
| 	}, | ||||
|  | ||||
| 	//============================================================================= | ||||
| 	 | ||||
| 	'_sbox': null, | ||||
| 	'sbox': function() { | ||||
| 		if (Clipperz.Crypto.AES._sbox == null) { | ||||
| 			Clipperz.Crypto.AES._sbox = [ | ||||
| 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, | ||||
| 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, | ||||
| 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, | ||||
| 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, | ||||
| 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, | ||||
| 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, | ||||
| 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, | ||||
| 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, | ||||
| 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, | ||||
| 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, | ||||
| 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, | ||||
| 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, | ||||
| 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, | ||||
| 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, | ||||
| 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, | ||||
| 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 | ||||
| 			]; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.AES._sbox; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	// | ||||
| 	//		0	4	8	12				0	4	8	12 | ||||
| 	//		1	5	9	13		=>		5	9	13	1 | ||||
| 	//		2	6	10	14				10	14	2	6 | ||||
| 	//		3	7	11	15				15	3	7	11 | ||||
| 	// | ||||
| 	'_shiftRowMapping': null, | ||||
| 	'shiftRowMapping': function() { | ||||
| 		if (Clipperz.Crypto.AES._shiftRowMapping == null) { | ||||
| 			Clipperz.Crypto.AES._shiftRowMapping = [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.AES._shiftRowMapping; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_mixColumnsMatrix': null, | ||||
| 	'mixColumnsMatrix': function() { | ||||
| 		if (Clipperz.Crypto.AES._mixColumnsMatrix == null) { | ||||
| 			Clipperz.Crypto.AES._mixColumnsMatrix = [	[2, 3, 1 ,1], | ||||
| 														[1, 2, 3, 1], | ||||
| 														[1, 1, 2, 3], | ||||
| 														[3, 1, 1, 2]   ]; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.AES._mixColumnsMatrix; | ||||
| 	}, | ||||
|  | ||||
| 	'_roundConstants': null, | ||||
| 	'roundConstants': function() { | ||||
| 		if (Clipperz.Crypto.AES._roundConstants == null) { | ||||
| 			Clipperz.Crypto.AES._roundConstants = [ , 1, 2, 4, 8, 16, 32, 64, 128, 27, 54, 108, 216, 171, 77, 154]; | ||||
| //			Clipperz.Crypto.AES._roundConstants = [ , 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a]; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.AES._roundConstants; | ||||
| 	}, | ||||
| 	 | ||||
| 	//============================================================================= | ||||
|  | ||||
| 	'incrementNonce': function(aNonce) { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.AES.incrementNonce"); | ||||
| 		var i; | ||||
| 		var done; | ||||
| 		 | ||||
| 		done = false; | ||||
| 		i = aNonce.length - 1; | ||||
| 		 | ||||
| 		while ((i>=0) && (done == false)) { | ||||
| 			var currentByteValue; | ||||
| 			 | ||||
| 			currentByteValue = aNonce[i]; | ||||
| 			 | ||||
| 			if (currentByteValue == 0xff) { | ||||
| 				aNonce[i] = 0; | ||||
| 				if (i>= 0) { | ||||
| 					i --; | ||||
| 				} else { | ||||
| 					done = true; | ||||
| 				} | ||||
| 			} else { | ||||
| 				aNonce[i] = currentByteValue + 1; | ||||
| 				done = true; | ||||
| 			} | ||||
| 		} | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.AES.incrementNonce"); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'encryptBlock': function(aKey, aBlock) { | ||||
| 		var	result; | ||||
| 		var	state; | ||||
|  | ||||
| 		state = new Clipperz.Crypto.AES.State({block:aBlock, key:aKey}); | ||||
| //is(state.data(), 'before'); | ||||
| 		state.encrypt(); | ||||
| 		result = state.data();  | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'encryptBlocks': function(aKey, aMessage, aNonce) { | ||||
| 		var	result; | ||||
| 		var nonce; | ||||
| 		var self; | ||||
| 		var	messageIndex; | ||||
| 		var	messageLength; | ||||
| 		var blockSize;		 | ||||
| 		 | ||||
| 		self = Clipperz.Crypto.AES; | ||||
| 		blockSize = 128/8; | ||||
| 		messageLength = aMessage.length; | ||||
| 		nonce = aNonce; | ||||
|  | ||||
| 		result = aMessage; | ||||
| 		messageIndex = 0; | ||||
| 		while (messageIndex < messageLength) { | ||||
| 			var encryptedBlock; | ||||
| 			var i,c; | ||||
| 			 | ||||
| 			self.incrementNonce(nonce); | ||||
| 			encryptedBlock = self.encryptBlock(aKey, nonce); | ||||
| 			 | ||||
| 			if ((messageLength - messageIndex) > blockSize) { | ||||
| 				c = blockSize; | ||||
| 			} else { | ||||
| 				c = messageLength - messageIndex; | ||||
| 			} | ||||
| 			 | ||||
| 			for (i=0; i<c; i++) { | ||||
| 				result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i]; | ||||
| 			} | ||||
| 			 | ||||
| 			messageIndex += blockSize; | ||||
| 		} | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'encrypt': function(aKey, someData, aNonce) { | ||||
| 		var result; | ||||
| 		var nonce; | ||||
| 		var	encryptedData; | ||||
| 		var key; | ||||
|  | ||||
| 		key = new Clipperz.Crypto.AES.Key({key:aKey}); | ||||
| 		nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8); | ||||
|  | ||||
| 		encryptedData = Clipperz.Crypto.AES.encryptBlocks(key, someData.arrayValues(), nonce.arrayValues()); | ||||
|  | ||||
| 		result = nonce.appendBytes(encryptedData); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'decrypt': function(aKey, someData) { | ||||
| 		var result; | ||||
| 		var nonce; | ||||
| 		var encryptedData; | ||||
| 		var decryptedData; | ||||
| 		var	dataIterator; | ||||
| 		var key; | ||||
|  | ||||
| 		key = new Clipperz.Crypto.AES.Key({key:aKey}); | ||||
|  | ||||
| 		encryptedData = someData.arrayValues(); | ||||
| 		nonce = encryptedData.slice(0, (128/8)); | ||||
| 		encryptedData = encryptedData.slice(128/8); | ||||
| 		decryptedData = Clipperz.Crypto.AES.encryptBlocks(key, encryptedData, nonce); | ||||
|  | ||||
| 		result = new Clipperz.ByteArray(decryptedData); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//============================================================================= | ||||
|  | ||||
| 	'deferredEncryptExecutionChunk': function(anExecutionContext) { | ||||
| 		var	result; | ||||
| 		var nonce; | ||||
| 		var self; | ||||
| 		var	messageIndex; | ||||
| 		var	messageLength; | ||||
| 		var blockSize;	 | ||||
| 		var executionLimit; | ||||
| 		var startTime, endTime; | ||||
|  | ||||
| 		self = Clipperz.Crypto.AES; | ||||
| 		startTime = new Date(); | ||||
| 		blockSize = 128/8; | ||||
| 		messageLength = anExecutionContext.messageArray().length; | ||||
| 		nonce = anExecutionContext.nonceArray(); | ||||
| 		result = anExecutionContext.resultArray(); | ||||
|  | ||||
| 		messageIndex = anExecutionContext.executionStep(); | ||||
| 		executionLimit = messageIndex + anExecutionContext.elaborationChunkSize(); | ||||
| 		executionLimit = Math.min(executionLimit, messageLength); | ||||
| 		 | ||||
| 		while (messageIndex < executionLimit) { | ||||
| 			var encryptedBlock; | ||||
| 			var i,c; | ||||
| 			 | ||||
| 			self.incrementNonce(nonce); | ||||
| 			encryptedBlock = self.encryptBlock(anExecutionContext.key(), nonce); | ||||
| 			 | ||||
| 			if ((executionLimit - messageIndex) > blockSize) { | ||||
| 				c = blockSize; | ||||
| 			} else { | ||||
| 				c = executionLimit - messageIndex; | ||||
| 			} | ||||
| 			 | ||||
| 			for (i=0; i<c; i++) { | ||||
| 				result[messageIndex + i] = result[messageIndex + i] ^ encryptedBlock[i]; | ||||
| 			} | ||||
| 			 | ||||
| 			messageIndex += blockSize; | ||||
| 		} | ||||
| 		anExecutionContext.setExecutionStep(messageIndex); | ||||
| 		endTime = new Date(); | ||||
| 		anExecutionContext.tuneExecutionParameters(endTime - startTime); | ||||
| 		 | ||||
| 		return anExecutionContext; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| /* | ||||
| 	'deferredEncryptBlocks': function(anExecutionContext) { | ||||
| 		var	deferredResult; | ||||
| 		var	messageSize; | ||||
| 		var i,c; | ||||
| 		 | ||||
| 		messageSize = anExecutionContext.messageLength();		 | ||||
| 		 | ||||
| 		deferredResult = new Clipperz.Async.Deferred("AES.deferredEncryptBloks"); | ||||
|  | ||||
| 		c = Math.ceil(messageSize / anExecutionContext.elaborationChunkSize()); | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptExecutionChunk); | ||||
| 			deferredResult.addMethod(anExecutionContext, 'pause'); | ||||
| 		} | ||||
| 		 | ||||
| 		deferredResult.callback(anExecutionContext); | ||||
| 		 | ||||
| 		return deferredResult; | ||||
| 	}, | ||||
| */ | ||||
|  | ||||
| 	'deferredEncryptBlocks': function(anExecutionContext) { | ||||
| 		var	deferredResult; | ||||
|  | ||||
| 		if (! anExecutionContext.isDone()) { | ||||
| 			deferredResult = Clipperz.Async.callbacks("Clipperz.Crypto.AES.deferredEncryptBloks", [ | ||||
| 				Clipperz.Crypto.AES.deferredEncryptExecutionChunk, | ||||
| 				MochiKit.Base.method(anExecutionContext, 'pause'), | ||||
| 				Clipperz.Crypto.AES.deferredEncryptBlocks | ||||
| 			], {trace:false}, anExecutionContext); | ||||
| 		} else { | ||||
| 			deferredResult = MochiKit.Async.succeed(anExecutionContext); | ||||
| 		} | ||||
| 		 | ||||
| 		return deferredResult; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	 | ||||
| 	'deferredEncrypt': function(aKey, someData, aNonce) { | ||||
| 		var deferredResult; | ||||
| 		var	executionContext; | ||||
| 		var result; | ||||
| 		var nonce; | ||||
| 		var key; | ||||
|  | ||||
| 		key = new Clipperz.Crypto.AES.Key({key:aKey}); | ||||
| 		nonce = aNonce ? aNonce.clone() : Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(128/8); | ||||
|  | ||||
| 		executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:someData, nonce:nonce}); | ||||
|  | ||||
| 		deferredResult = new Clipperz.Async.Deferred("AES.deferredEncrypt"); | ||||
| //deferredResult.addCallback(function (aValue) { console.log(">>> deferredEncrypt"); return aValue; }); | ||||
| 		deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks); | ||||
| 		deferredResult.addCallback(function(anExecutionContext) { | ||||
| 			var result; | ||||
| 			 | ||||
| 			result = anExecutionContext.nonce().clone(); | ||||
| 			result.appendBytes(anExecutionContext.resultArray()); | ||||
|  | ||||
| 			return result; | ||||
| 		}); | ||||
| //deferredResult.addCallback(function (aValue) { console.log("<<< deferredEncrypt"); return aValue; }); | ||||
| 		deferredResult.callback(executionContext) | ||||
|  | ||||
| 		return deferredResult; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'deferredDecrypt': function(aKey, someData) { | ||||
| 		var deferredResult | ||||
| 		var nonce; | ||||
| 		var message; | ||||
| 		var key; | ||||
|  | ||||
| 		key = new Clipperz.Crypto.AES.Key({key:aKey}); | ||||
| 		nonce = someData.split(0, (128/8)); | ||||
| 		message = someData.split(128/8); | ||||
| 		executionContext = new Clipperz.Crypto.AES.DeferredExecutionContext({key:key, message:message, nonce:nonce}); | ||||
|  | ||||
| 		deferredResult = new Clipperz.Async.Deferred("AES.deferredDecrypt"); | ||||
| //deferredResult.addCallback(function (aValue) { console.log(">>> deferredDecrypt"); return aValue; }); | ||||
| 		deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncryptBlocks); | ||||
| 		deferredResult.addCallback(function(anExecutionContext) { | ||||
| 			return anExecutionContext.result(); | ||||
| 		}); | ||||
| //deferredResult.addCallback(function (aValue) { console.log("<<< deferredDecrypt"); return aValue; }); | ||||
| 		deferredResult.callback(executionContext); | ||||
|  | ||||
| 		return deferredResult; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| 	 | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| //Clipperz.Crypto.AES.DeferredExecution = { | ||||
| //	'chunkSize': 16384,	//	4096,	//	1024	4096	8192	16384	32768; | ||||
| //	'pauseTime': 0.02	//	0.2 | ||||
| //} | ||||
|  | ||||
| Clipperz.Crypto.AES.exception = { | ||||
| 	'UnsupportedKeySize':    new MochiKit.Base.NamedError("Clipperz.Crypto.AES.exception.UnsupportedKeySize")  | ||||
| }; | ||||
							
								
								
									
										1847
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/Base.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1847
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/Base.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1755
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/BigInt.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1755
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/BigInt.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1644
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/BigInt_scoped.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1644
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/BigInt_scoped.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1496
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ByteArray.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1496
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ByteArray.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										545
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Curve.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										545
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Curve.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,545 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| //try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { | ||||
| //	throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; | ||||
| //}   | ||||
| if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||||
| if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Curve = function(args) { | ||||
| 	args = args || {}; | ||||
|  | ||||
| 	this._modulus = args.modulus; | ||||
| 	 | ||||
| 	this._a = args.a; | ||||
| 	this._b = args.b; | ||||
| 	this._G = args.G; | ||||
| 	this._r = args.r; | ||||
| 	this._h = args.h; | ||||
|  | ||||
| 	this._finiteField = null; | ||||
| 	 | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Curve.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'asString': function() { | ||||
| 		return "Clipperz.Crypto.ECC.BinaryField.Curve"; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'modulus': function() { | ||||
| 		return this._modulus; | ||||
| 	}, | ||||
| 	 | ||||
| 	'a': function() { | ||||
| 		return this._a; | ||||
| 	}, | ||||
| 	 | ||||
| 	'b': function() { | ||||
| 		return this._b; | ||||
| 	}, | ||||
| 	 | ||||
| 	'G': function() { | ||||
| 		return this._G; | ||||
| 	}, | ||||
| 	 | ||||
| 	'r': function() { | ||||
| 		return this._r; | ||||
| 	}, | ||||
| 	 | ||||
| 	'h': function() { | ||||
| 		return this._h; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'finiteField': function() { | ||||
| 		if (this._finiteField == null) { | ||||
| 			this._finiteField = new Clipperz.Crypto.ECC.BinaryField.FiniteField({modulus:this.modulus()}) | ||||
| 		} | ||||
| 		 | ||||
| 		return this._finiteField; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'negate': function(aPointA) { | ||||
| 		var result; | ||||
|  | ||||
| 		result = new Clipperz.Crypto.ECC.Point({x:aPointA.x(), y:this.finiteField().add(aPointA.y(), aPointA.x())}) | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'add': function(aPointA, aPointB) { | ||||
| 		var result; | ||||
|  | ||||
| //console.log(">>> ECC.BinaryField.Curve.add"); | ||||
| 		if (aPointA.isZero()) { | ||||
| //console.log("--- pointA == zero"); | ||||
| 			result = aPointB; | ||||
| 		} else if (aPointB.isZero()) { | ||||
| //console.log("--- pointB == zero"); | ||||
| 			result = aPointA; | ||||
| 		} else if (	(aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { | ||||
| //console.log("compare A.x - B.x: ", aPointA.x().compare(aPointB.x())); | ||||
| //console.log("compare A.y - B.y: ", (aPointA.y().compare(aPointB.y()) != 0)); | ||||
| //console.log("compare B.x.isZero(): ", aPointB.x().isZero()); | ||||
|  | ||||
| //console.log("--- result = zero"); | ||||
| 			result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); | ||||
| 		} else { | ||||
| //console.log("--- result = ELSE"); | ||||
| 			var	f2m; | ||||
| 			var x, y; | ||||
| 			var lambda; | ||||
| 			var aX, aY, bX, bY; | ||||
| 		 | ||||
| 			aX = aPointA.x()._value; | ||||
| 			aY = aPointA.y()._value; | ||||
| 			bX = aPointB.x()._value; | ||||
| 			bY = aPointB.y()._value; | ||||
|  | ||||
| 			f2m = this.finiteField(); | ||||
| 			 | ||||
| 			if (aPointA.x().compare(aPointB.x()) != 0) { | ||||
| //console.log(" a.x != b.x"); | ||||
| 				lambda =	f2m._fastMultiply( | ||||
| 								f2m._add(aY, bY), | ||||
| 								f2m._inverse(f2m._add(aX, bX)) | ||||
| 							); | ||||
| 				x = f2m._add(this.a()._value, f2m._square(lambda)); | ||||
| 				f2m._overwriteAdd(x, lambda); | ||||
| 				f2m._overwriteAdd(x, aX); | ||||
| 				f2m._overwriteAdd(x, bX); | ||||
| 			} else { | ||||
| //console.log(" a.x == b.x"); | ||||
| 				lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); | ||||
| //console.log(" lambda: " + lambda.asString(16)); | ||||
| 				x = f2m._add(this.a()._value, f2m._square(lambda)); | ||||
| //console.log(" x (step 1): " + x.asString(16)); | ||||
| 				f2m._overwriteAdd(x, lambda); | ||||
| //console.log(" x (step 2): " + x.asString(16)); | ||||
| 			} | ||||
| 			 | ||||
| 			y = f2m._fastMultiply(f2m._add(bX, x), lambda); | ||||
| //console.log(" y (step 1): " + y.asString(16)); | ||||
| 			f2m._overwriteAdd(y, x); | ||||
| //console.log(" y (step 2): " + y.asString(16)); | ||||
| 			f2m._overwriteAdd(y, bY); | ||||
| //console.log(" y (step 3): " + y.asString(16)); | ||||
|  | ||||
| 			result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) | ||||
| 		} | ||||
| //console.log("<<< ECC.BinaryField.Curve.add"); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'addTwice': function(aPointA) { | ||||
| 		return this.add(aPointA, aPointA); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'overwriteAdd': function(aPointA, aPointB) { | ||||
| 		if (aPointA.isZero()) { | ||||
| //			result = aPointB; | ||||
| 			aPointA._x._value = aPointB._x._value; | ||||
| 			aPointA._y._value = aPointB._y._value; | ||||
| 		} else if (aPointB.isZero()) { | ||||
| //			result = aPointA; | ||||
| 		} else if (	(aPointA.x().compare(aPointB.x()) == 0) && ((aPointA.y().compare(aPointB.y()) != 0) || aPointB.x().isZero())) { | ||||
| //			result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); | ||||
| 			aPointA._x = Clipperz.Crypto.ECC.BinaryField.Value.O; | ||||
| 			aPointA._y = Clipperz.Crypto.ECC.BinaryField.Value.O; | ||||
| 		} else { | ||||
| 			var	f2m; | ||||
| 			var x, y; | ||||
| 			var lambda; | ||||
| 			var aX, aY, bX, bY; | ||||
| 		 | ||||
| 			aX = aPointA.x()._value; | ||||
| 			aY = aPointA.y()._value; | ||||
| 			bX = aPointB.x()._value; | ||||
| 			bY = aPointB.y()._value; | ||||
|  | ||||
| 			f2m = this.finiteField(); | ||||
| 			 | ||||
| 			if (aPointA.x().compare(aPointB.x()) != 0) { | ||||
| //console.log(" a.x != b.x"); | ||||
| 				lambda =	f2m._fastMultiply( | ||||
| 								f2m._add(aY, bY), | ||||
| 								f2m._inverse(f2m._add(aX, bX)) | ||||
| 							); | ||||
| 				x = f2m._add(this.a()._value, f2m._square(lambda)); | ||||
| 				f2m._overwriteAdd(x, lambda); | ||||
| 				f2m._overwriteAdd(x, aX); | ||||
| 				f2m._overwriteAdd(x, bX); | ||||
| 			} else { | ||||
| //console.log(" a.x == b.x"); | ||||
| 				lambda = f2m._add(bX, f2m._fastMultiply(bY, f2m._inverse(bX))); | ||||
| //console.log(" lambda: " + lambda.asString(16)); | ||||
| 				x = f2m._add(this.a()._value, f2m._square(lambda)); | ||||
| //console.log(" x (step 1): " + x.asString(16)); | ||||
| 				f2m._overwriteAdd(x, lambda); | ||||
| //console.log(" x (step 2): " + x.asString(16)); | ||||
| 			} | ||||
| 			 | ||||
| 			y = f2m._fastMultiply(f2m._add(bX, x), lambda); | ||||
| //console.log(" y (step 1): " + y.asString(16)); | ||||
| 			f2m._overwriteAdd(y, x); | ||||
| //console.log(" y (step 2): " + y.asString(16)); | ||||
| 			f2m._overwriteAdd(y, bY); | ||||
| //console.log(" y (step 3): " + y.asString(16)); | ||||
|  | ||||
| //			result = new Clipperz.Crypto.ECC.BinaryField.Point({x:new Clipperz.Crypto.ECC.BinaryField.Value(x), y:new Clipperz.Crypto.ECC.BinaryField.Value(y)}) | ||||
| 			aPointA._x._value = x; | ||||
| 			aPointA._y._value = y; | ||||
|  | ||||
| 		} | ||||
| //console.log("<<< ECC.BinaryField.Curve.add"); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'multiply': function(aValue, aPoint) { | ||||
| 		var result; | ||||
|  | ||||
| //console.profile(); | ||||
| 		result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); | ||||
| 		 | ||||
| 		if (aValue.isZero() == false) { | ||||
| 			var k, Q; | ||||
| 			var i; | ||||
| 			var countIndex; countIndex = 0; | ||||
| 			 | ||||
| 			if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { | ||||
| 				k = aValue; | ||||
| 				Q = aPoint; | ||||
| 			} else { | ||||
| MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); | ||||
| 				k = aValue.negate(); | ||||
| 				Q = this.negate(aPoint); | ||||
| 			} | ||||
|  | ||||
| //console.log("k: " + k.toString(16)); | ||||
| //console.log("k.bitSize: " + k.bitSize()); | ||||
| 			for (i=k.bitSize()-1; i>=0; i--) { | ||||
| 				result = this.add(result, result); | ||||
| //				this.overwriteAdd(result, result); | ||||
| 				if (k.isBitSet(i)) { | ||||
| 					result = this.add(result, Q); | ||||
| //					this.overwriteAdd(result, Q); | ||||
| 				} | ||||
| 				 | ||||
| //				if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++; | ||||
| 			} | ||||
| 		} | ||||
| //console.profileEnd(); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'deferredMultiply': function(aValue, aPoint) { | ||||
| 		var deferredResult; | ||||
| 		var result; | ||||
|  | ||||
| MochiKit.Logging.logDebug(">>> deferredMultiply - value: " + aValue + ", point: " + aPoint); | ||||
| //console.profile("ECC.Curve.multiply"); | ||||
| 		deferredResult = new MochiKit.Async.Deferred(); | ||||
| //deferredResult.addCallback(function(res) {console.profile("ECC.Curve.deferredMultiply"); return res;} ); | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 1: " + res); return res;}); | ||||
| 		 | ||||
| 		result = new Clipperz.Crypto.ECC.BinaryField.Point({x:Clipperz.Crypto.ECC.BinaryField.Value.O, y:Clipperz.Crypto.ECC.BinaryField.Value.O}); | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 2: " + res); return res;}); | ||||
|  | ||||
| 		if (aValue.isZero() == false) { | ||||
| 			var k, Q; | ||||
| 			var i; | ||||
| 			var countIndex; countIndex = 0; | ||||
| 			 | ||||
| 			if (aValue.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) > 0) { | ||||
| 				k = aValue; | ||||
| 				Q = aPoint; | ||||
| 			} else { | ||||
| MochiKit.Logging.logError("The Clipperz.Crypto.ECC.BinaryFields.Value does not work with negative values!!!!"); | ||||
| 				k = aValue.negate(); | ||||
| 				Q = this.negate(aPoint); | ||||
| 			} | ||||
|  | ||||
| //console.log("k: " + k.toString(16)); | ||||
| //console.log("k.bitSize: " + k.bitSize()); | ||||
|  | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 3: " + res); return res;}); | ||||
| 			for (i=k.bitSize()-1; i>=0; i--) { | ||||
| //MochiKit.Logging.logDebug("====> " + i); | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 > i = " + i + ": " + res); return res;}); | ||||
| 				deferredResult.addMethod(this, "addTwice"); | ||||
| //#				result = this.add(result, result); | ||||
| //				this.overwriteAdd(result, result); | ||||
| 				if (k.isBitSet(i)) { | ||||
| 					deferredResult.addMethod(this, "add", Q); | ||||
| //#					result = this.add(result, Q); | ||||
| //					this.overwriteAdd(result, Q); | ||||
| 				} | ||||
| 				if (i%20 == 0) {deferredResult.addCallback(MochiKit.Async.wait, 0.1);} | ||||
| 				 | ||||
| //				if (countIndex==100) {console.log("multiply.break"); break;} else countIndex++; | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4 < i = " + i + ": " + res); return res;}); | ||||
| 			} | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 4: " + res); return res;}); | ||||
| 		} | ||||
| //#console.profileEnd(); | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 5: " + res); return res;}); | ||||
| //deferredResult.addBoth(function(res) {console.profileEnd(); return res;}); | ||||
| //deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("# 6: " + res); return res;}); | ||||
| 		deferredResult.callback(result); | ||||
| 		 | ||||
| //#		return result; | ||||
| 		return deferredResult; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| Clipperz.Crypto.ECC.StandardCurves = {}; | ||||
|  | ||||
| MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { | ||||
| /* | ||||
| 	'_K571': null, | ||||
| 	'K571': function() { | ||||
| 		if (Clipperz.Crypto.ECC.StandardCurves._K571 == null) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ | ||||
| 				modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.BinaryField.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.BinaryField.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.BinaryField.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.BinaryField.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) | ||||
| 			}); | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._K571; | ||||
| 	}, | ||||
|  | ||||
|  | ||||
|  | ||||
| 	'_K283': null, | ||||
| 	'K283': function() {	//	f(z) = z^283 + z^12 + z^7 + z^5 + 1 | ||||
| 		if (Clipperz.Crypto.ECC.StandardCurves._K283 == null) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ | ||||
| 				modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.BinaryField.Value('0', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.BinaryField.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.BinaryField.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.BinaryField.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.BinaryField.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.BinaryField.Value('4', 16) | ||||
| 			}); | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._K283; | ||||
| 	}, | ||||
| */ | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_B571': null, | ||||
| 	'B571': function() {	//	f(z) = z^571 + z^10 + z^5 + z^2 + 1 | ||||
| 		if (Clipperz.Crypto.ECC.StandardCurves._B571 == null) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ | ||||
| 				modulus: new Clipperz.Crypto.ECC.BinaryField.Value('80000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000425', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e2221f295de297117b7f3d62f5c6a97ffcb8ceff1cd6ba8ce4a9a18ad84ffabbd8efa59332be7ad6756a66e294afd185a78ff12aa520e4de739baca0c7ffeff7f2955727a', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.BinaryField.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) | ||||
|  | ||||
| //				S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), | ||||
| //				n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) | ||||
| 			}); | ||||
| 			 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			// | ||||
| 			//	Guide to Elliptic Curve Cryptography | ||||
| 			//	Darrel Hankerson, Alfred Menezes, Scott Vanstone | ||||
| 			//	- Pag: 56, Alorithm 2.45 (with a typo!!!) | ||||
| 			//	 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			// | ||||
| 			//		http://www.milw0rm.com/papers/136 | ||||
| 			// | ||||
| 			//		------------------------------------------------------------------------- | ||||
| 			//		  Polynomial Reduction Algorithm Modulo f571  | ||||
| 			//		------------------------------------------------------------------------- | ||||
| 			//		 | ||||
| 			//		  Input:  Polynomial p(x) of degree 1140 or less, stored as  | ||||
| 			//		          an array of 2T machinewords. | ||||
| 			//		  Output: p(x) mod f571(x) | ||||
| 			//		 | ||||
| 			//		  FOR i = T-1, ..., 0 DO | ||||
| 			//		      SET X  := P[i+T] | ||||
| 			//		      P[i]   := P[i]   ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15) | ||||
| 			//		      P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27) | ||||
| 			//		 | ||||
| 			//		  SET X  := P[T-1] >> 27 | ||||
| 			//		  P[0]   := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10) | ||||
| 			//		  P[T-1] := P[T-1] & 0x07ffffff | ||||
| 			//		 | ||||
| 			//		  RETURN P[T-1],...,P[0] | ||||
| 			//		 | ||||
| 			//		------------------------------------------------------------------------- | ||||
| 			//		 | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module; | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) { | ||||
| 				var	result; | ||||
| 				 | ||||
| 				if (aValue.bitSize() > 1140) { | ||||
| 					MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation"); | ||||
| 					result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue); | ||||
| 				} else { | ||||
| 					var	C, T; | ||||
| 					var i; | ||||
| 		 | ||||
| //console.log(">>> binaryField.finiteField.(improved)module"); | ||||
| //					C = aValue.value().slice(0); | ||||
| 					C = aValue._value.slice(0); | ||||
| 					for (i=35; i>=18; i--) { | ||||
| 						T = C[i]; | ||||
| 						C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0); | ||||
| 						C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0); | ||||
| 					} | ||||
| 					T = (C[17] >>> 27); | ||||
| 					C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0); | ||||
| 					C[17] = (C[17] & 0x07ffffff); | ||||
|  | ||||
| 					for(i=18; i<=35; i++) { | ||||
| 						C[i] = 0; | ||||
| 					} | ||||
| 				 | ||||
| 					result = new Clipperz.Crypto.ECC.BinaryField.Value(C); | ||||
| //console.log("<<< binaryField.finiteField.(improved)module"); | ||||
| 				} | ||||
| 			 | ||||
| 				return result; | ||||
| 			}; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._B571; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_B283': null, | ||||
| 	'B283': function() {	//	f(z) = z^283 + z^12 + z^7 + z^5 + 1 | ||||
| 		if (Clipperz.Crypto.ECC.StandardCurves._B283 == null) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ | ||||
| //				modulus: new Clipperz.Crypto.ECC.BinaryField.Value('10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), | ||||
| 				modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.BinaryField.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) | ||||
|  | ||||
| //				S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), | ||||
| //				n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) | ||||
| 			}); | ||||
| 			 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			// | ||||
| 			//	Guide to Elliptic Curve Cryptography | ||||
| 			//	Darrel Hankerson, Alfred Menezes, Scott Vanstone | ||||
| 			//	- Pag: 56, Alorithm 2.43 | ||||
| 			//	 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module; | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) { | ||||
| 				var	result; | ||||
|  | ||||
| 				if (aValue.bitSize() > 564) { | ||||
| 					MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation"); | ||||
| 					result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue); | ||||
| 				} else { | ||||
| 					var	C, T; | ||||
| 					var i; | ||||
| 					 | ||||
| //console.log(">>> binaryField.finiteField.(improved)module"); | ||||
| 					C = aValue._value.slice(0); | ||||
| 					for (i=17; i>=9; i--) { | ||||
| 						T = C[i]; | ||||
| 						C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0); | ||||
| 						C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0); | ||||
| 					} | ||||
| 					T = (C[8] >>> 27); | ||||
| 					C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0); | ||||
| 					C[8] = (C[8] & 0x07ffffff); | ||||
|  | ||||
| 					for(i=9; i<=17; i++) { | ||||
| 						C[i] = 0; | ||||
| 					} | ||||
| 				 | ||||
| 					result = new Clipperz.Crypto.ECC.BinaryField.Value(C); | ||||
| //console.log("<<< binaryField.finiteField.(improved)module"); | ||||
| 				} | ||||
| 				 | ||||
| 				return result; | ||||
| 			}; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._B283; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| @@ -0,0 +1,521 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| //try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { | ||||
| //	throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; | ||||
| //}   | ||||
| if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||||
| if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.FiniteField = function(args) { | ||||
| 	args = args || {}; | ||||
| 	this._modulus = args.modulus; | ||||
|  | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.FiniteField.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'asString': function() { | ||||
| 		return "Clipperz.Crypto.ECC.BinaryField.FiniteField (" + this.modulus().asString() + ")"; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'modulus': function() { | ||||
| 		return this._modulus; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_module': function(aValue) { | ||||
| 		var	result; | ||||
| 		var modulusComparison; | ||||
| //console.log(">>> binaryField.finiteField.(standard)module"); | ||||
| 		 | ||||
| 		modulusComparison = Clipperz.Crypto.ECC.BinaryField.Value._compare(aValue, this.modulus()._value); | ||||
|  | ||||
| 		if (modulusComparison < 0) { | ||||
| 			result = aValue; | ||||
| 		} else if (modulusComparison == 0) { | ||||
| 			result = [0]; | ||||
| 		} else { | ||||
| 			var modulusBitSize; | ||||
| 			var resultBitSize; | ||||
| 			 | ||||
| 			result = aValue; | ||||
|  | ||||
| 			modulusBitSize = this.modulus().bitSize(); | ||||
| 			resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); | ||||
| 			while (resultBitSize >= modulusBitSize) { | ||||
| 				Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this.modulus()._value, resultBitSize - modulusBitSize)); | ||||
| 				resultBitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(result); | ||||
| 			} | ||||
| 		} | ||||
| //console.log("<<< binaryField.finiteField.(standard)module"); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	'module': function(aValue) { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(this._module(aValue._value.slice(0))); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_add': function(a, b) { | ||||
| 		return Clipperz.Crypto.ECC.BinaryField.Value._xor(a, b); | ||||
| 	}, | ||||
|  | ||||
| 	'_overwriteAdd': function(a, b) { | ||||
| 		Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(a, b); | ||||
| 	}, | ||||
| 	 | ||||
| 	'add': function(a, b) { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(this._add(a._value, b._value)); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'negate': function(aValue) { | ||||
| 		return aValue.clone(); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_multiply': function(a, b) { | ||||
| 		var result; | ||||
| 		var valueToXor; | ||||
| 		var i,c; | ||||
|  | ||||
| 		result = [0]; | ||||
| 		valueToXor = b; | ||||
| 		c = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(a); | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			if (Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(a, i) === true) { | ||||
| 				Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, valueToXor); | ||||
| 			} | ||||
| 			valueToXor = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(valueToXor, 1); | ||||
| 		} | ||||
| 		result = this._module(result); | ||||
|  | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	'multiply': function(a, b) { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(this._multiply(a._value, b._value)); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_fastMultiply': function(a, b) { | ||||
| 		var result; | ||||
| 		var B; | ||||
| 		var i,c; | ||||
| 		 | ||||
| 		result = [0]; | ||||
| 		B = b.slice(0);	//	Is this array copy avoidable? | ||||
| 		c = 32; | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			var ii, cc; | ||||
| 			 | ||||
| 			cc = a.length; | ||||
| 			for (ii=0; ii<cc; ii++) { | ||||
| 				if (((a[ii] >>> i) & 0x01) == 1) { | ||||
| 					Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor(result, B, ii); | ||||
| 				} | ||||
| 			} | ||||
| 			 | ||||
| 			if (i < (c-1)) { | ||||
| 				B = Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft(B, 1); | ||||
| 			} | ||||
| 		} | ||||
| 		result = this._module(result); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	'fastMultiply': function(a, b) { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(this._fastMultiply(a._value, b._value)); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	// | ||||
| 	//	Guide to Elliptic Curve Cryptography | ||||
| 	//	Darrel Hankerson, Alfred Menezes, Scott Vanstone | ||||
| 	//	- Pag: 49, Alorithm 2.34 | ||||
| 	//	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_square': function(aValue) { | ||||
| 		var result; | ||||
| 		var value; | ||||
| 		var c,i; | ||||
| 		var precomputedValues; | ||||
| 		 | ||||
| 		value = aValue; | ||||
| 		result = new Array(value.length * 2); | ||||
| 		precomputedValues = Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes; | ||||
| 		 | ||||
| 		c = value.length; | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			result[i*2]  = precomputedValues[(value[i] & 0x000000ff)]; | ||||
| 			result[i*2] |= ((precomputedValues[(value[i] & 0x0000ff00) >>> 8]) << 16); | ||||
|  | ||||
| 			result[i*2 + 1]  = precomputedValues[(value[i] & 0x00ff0000) >>> 16]; | ||||
| 			result[i*2 + 1] |= ((precomputedValues[(value[i] & 0xff000000) >>> 24]) << 16); | ||||
| 		} | ||||
|  | ||||
| 		return this._module(result); | ||||
| 	}, | ||||
| 	 | ||||
| 	'square': function(aValue) { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(this._square(aValue._value)); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_inverse': function(aValue) { | ||||
| 		var	result; | ||||
| 		var b, c; | ||||
| 		var u, v; | ||||
| 		 | ||||
| //		b = Clipperz.Crypto.ECC.BinaryField.Value.I._value; | ||||
| 		b = [1]; | ||||
| //		c = Clipperz.Crypto.ECC.BinaryField.Value.O._value; | ||||
| 		c = [0]; | ||||
| 		u = this._module(aValue); | ||||
| 		v = this.modulus()._value.slice(0); | ||||
| 		 | ||||
| 		while (Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) > 1) { | ||||
| 			var	bitDifferenceSize; | ||||
| 			 | ||||
| 			bitDifferenceSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(u) - Clipperz.Crypto.ECC.BinaryField.Value._bitSize(v); | ||||
| 			if (bitDifferenceSize < 0) { | ||||
| 				var swap; | ||||
| 				 | ||||
| 				swap = u; | ||||
| 				u = v; | ||||
| 				v = swap; | ||||
| 				 | ||||
| 				swap = c; | ||||
| 				c = b; | ||||
| 				b = swap; | ||||
| 				 | ||||
| 				bitDifferenceSize = -bitDifferenceSize; | ||||
| 			} | ||||
|  | ||||
| 			u = this._add(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize)); | ||||
| 			b = this._add(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize)); | ||||
| //			this._overwriteAdd(u, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(v, bitDifferenceSize)); | ||||
| //			this._overwriteAdd(b, Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(c, bitDifferenceSize)); | ||||
| 		} | ||||
|  | ||||
| 		result = this._module(b); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	'inverse': function(aValue) { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(this._inverse(aValue._value)); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.FiniteField.squarePrecomputedBytes = [ | ||||
| 	0x0000,	//	  0 = 0000 0000 -> 0000 0000 0000 0000 | ||||
| 	0x0001,	//	  1 = 0000 0001 -> 0000 0000 0000 0001 | ||||
| 	0x0004,	//	  2 = 0000 0010 -> 0000 0000 0000 0100 | ||||
| 	0x0005,	//	  3 = 0000 0011 -> 0000 0000 0000 0101 | ||||
| 	0x0010,	//	  4 = 0000 0100 -> 0000 0000 0001 0000 | ||||
| 	0x0011,	//	  5 = 0000 0101 -> 0000 0000 0001 0001 | ||||
| 	0x0014,	//	  6 = 0000 0110 -> 0000 0000 0001 0100 | ||||
| 	0x0015,	//	  7 = 0000 0111 -> 0000 0000 0001 0101 | ||||
| 	0x0040,	//	  8 = 0000 1000 -> 0000 0000 0100 0000 | ||||
| 	0x0041,	//	  9 = 0000 1001 -> 0000 0000 0100 0001 | ||||
| 	0x0044,	//	 10 = 0000 1010 -> 0000 0000 0100 0100 | ||||
| 	0x0045,	//	 11 = 0000 1011 -> 0000 0000 0100 0101 | ||||
| 	0x0050,	//	 12 = 0000 1100 -> 0000 0000 0101 0000 | ||||
| 	0x0051,	//	 13 = 0000 1101 -> 0000 0000 0101 0001 | ||||
| 	0x0054,	//	 14 = 0000 1110 -> 0000 0000 0101 0100 | ||||
| 	0x0055,	//	 15 = 0000 1111 -> 0000 0000 0101 0101 | ||||
|  | ||||
| 	0x0100,	//	 16 = 0001 0000 -> 0000 0001 0000 0000 | ||||
| 	0x0101,	//	 17 = 0001 0001 -> 0000 0001 0000 0001 | ||||
| 	0x0104,	//	 18 = 0001 0010 -> 0000 0001 0000 0100 | ||||
| 	0x0105,	//	 19 = 0001 0011 -> 0000 0001 0000 0101 | ||||
| 	0x0110,	//	 20 = 0001 0100 -> 0000 0001 0001 0000 | ||||
| 	0x0111,	//	 21 = 0001 0101 -> 0000 0001 0001 0001 | ||||
| 	0x0114,	//	 22 = 0001 0110 -> 0000 0001 0001 0100 | ||||
| 	0x0115,	//	 23 = 0001 0111 -> 0000 0001 0001 0101 | ||||
| 	0x0140,	//	 24 = 0001 1000 -> 0000 0001 0100 0000 | ||||
| 	0x0141,	//	 25 = 0001 1001 -> 0000 0001 0100 0001 | ||||
| 	0x0144,	//	 26 = 0001 1010 -> 0000 0001 0100 0100 | ||||
| 	0x0145,	//	 27 = 0001 1011 -> 0000 0001 0100 0101 | ||||
| 	0x0150,	//	 28 = 0001 1100 -> 0000 0001 0101 0000 | ||||
| 	0x0151,	//	 28 = 0001 1101 -> 0000 0001 0101 0001 | ||||
| 	0x0154,	//	 30 = 0001 1110 -> 0000 0001 0101 0100 | ||||
| 	0x0155,	//	 31 = 0001 1111 -> 0000 0001 0101 0101 | ||||
|  | ||||
| 	0x0400,	//	 32 = 0010 0000 -> 0000 0100 0000 0000 | ||||
| 	0x0401,	//	 33 = 0010 0001 -> 0000 0100 0000 0001 | ||||
| 	0x0404,	//	 34 = 0010 0010 -> 0000 0100 0000 0100 | ||||
| 	0x0405,	//	 35 = 0010 0011 -> 0000 0100 0000 0101 | ||||
| 	0x0410,	//	 36 = 0010 0100 -> 0000 0100 0001 0000 | ||||
| 	0x0411,	//	 37 = 0010 0101 -> 0000 0100 0001 0001 | ||||
| 	0x0414,	//	 38 = 0010 0110 -> 0000 0100 0001 0100 | ||||
| 	0x0415,	//	 39 = 0010 0111 -> 0000 0100 0001 0101 | ||||
| 	0x0440,	//	 40 = 0010 1000 -> 0000 0100 0100 0000 | ||||
| 	0x0441,	//	 41 = 0010 1001 -> 0000 0100 0100 0001 | ||||
| 	0x0444,	//	 42 = 0010 1010 -> 0000 0100 0100 0100 | ||||
| 	0x0445,	//	 43 = 0010 1011 -> 0000 0100 0100 0101 | ||||
| 	0x0450,	//	 44 = 0010 1100 -> 0000 0100 0101 0000 | ||||
| 	0x0451,	//	 45 = 0010 1101 -> 0000 0100 0101 0001 | ||||
| 	0x0454,	//	 46 = 0010 1110 -> 0000 0100 0101 0100 | ||||
| 	0x0455,	//	 47 = 0010 1111 -> 0000 0100 0101 0101 | ||||
|  | ||||
| 	0x0500,	//	 48 = 0011 0000 -> 0000 0101 0000 0000 | ||||
| 	0x0501,	//	 49 = 0011 0001 -> 0000 0101 0000 0001 | ||||
| 	0x0504,	//	 50 = 0011 0010 -> 0000 0101 0000 0100 | ||||
| 	0x0505,	//	 51 = 0011 0011 -> 0000 0101 0000 0101 | ||||
| 	0x0510,	//	 52 = 0011 0100 -> 0000 0101 0001 0000 | ||||
| 	0x0511,	//	 53 = 0011 0101 -> 0000 0101 0001 0001 | ||||
| 	0x0514,	//	 54 = 0011 0110 -> 0000 0101 0001 0100 | ||||
| 	0x0515,	//	 55 = 0011 0111 -> 0000 0101 0001 0101 | ||||
| 	0x0540,	//	 56 = 0011 1000 -> 0000 0101 0100 0000 | ||||
| 	0x0541,	//	 57 = 0011 1001 -> 0000 0101 0100 0001 | ||||
| 	0x0544,	//	 58 = 0011 1010 -> 0000 0101 0100 0100 | ||||
| 	0x0545,	//	 59 = 0011 1011 -> 0000 0101 0100 0101 | ||||
| 	0x0550,	//	 60 = 0011 1100 -> 0000 0101 0101 0000 | ||||
| 	0x0551,	//	 61 = 0011 1101 -> 0000 0101 0101 0001 | ||||
| 	0x0554,	//	 62 = 0011 1110 -> 0000 0101 0101 0100 | ||||
| 	0x0555,	//	 63 = 0011 1111 -> 0000 0101 0101 0101 | ||||
|  | ||||
| 	0x1000,	//	 64 = 0100 0000 -> 0001 0000 0000 0000 | ||||
| 	0x1001,	//	 65 = 0100 0001 -> 0001 0000 0000 0001 | ||||
| 	0x1004,	//	 66 = 0100 0010 -> 0001 0000 0000 0100 | ||||
| 	0x1005,	//	 67 = 0100 0011 -> 0001 0000 0000 0101 | ||||
| 	0x1010,	//	 68 = 0100 0100 -> 0001 0000 0001 0000 | ||||
| 	0x1011,	//	 69 = 0100 0101 -> 0001 0000 0001 0001 | ||||
| 	0x1014,	//	 70 = 0100 0110 -> 0001 0000 0001 0100 | ||||
| 	0x1015,	//	 71 = 0100 0111 -> 0001 0000 0001 0101 | ||||
| 	0x1040,	//	 72 = 0100 1000 -> 0001 0000 0100 0000 | ||||
| 	0x1041,	//	 73 = 0100 1001 -> 0001 0000 0100 0001 | ||||
| 	0x1044,	//	 74 = 0100 1010 -> 0001 0000 0100 0100 | ||||
| 	0x1045,	//	 75 = 0100 1011 -> 0001 0000 0100 0101 | ||||
| 	0x1050,	//	 76 = 0100 1100 -> 0001 0000 0101 0000 | ||||
| 	0x1051,	//	 77 = 0100 1101 -> 0001 0000 0101 0001 | ||||
| 	0x1054,	//	 78 = 0100 1110 -> 0001 0000 0101 0100 | ||||
| 	0x1055,	//	 79 = 0100 1111 -> 0001 0000 0101 0101 | ||||
|  | ||||
| 	0x1100,	//	 80 = 0101 0000 -> 0001 0001 0000 0000 | ||||
| 	0x1101,	//	 81 = 0101 0001 -> 0001 0001 0000 0001 | ||||
| 	0x1104,	//	 82 = 0101 0010 -> 0001 0001 0000 0100 | ||||
| 	0x1105,	//	 83 = 0101 0011 -> 0001 0001 0000 0101 | ||||
| 	0x1110,	//	 84 = 0101 0100 -> 0001 0001 0001 0000 | ||||
| 	0x1111,	//	 85 = 0101 0101 -> 0001 0001 0001 0001 | ||||
| 	0x1114,	//	 86 = 0101 0110 -> 0001 0001 0001 0100 | ||||
| 	0x1115,	//	 87 = 0101 0111 -> 0001 0001 0001 0101 | ||||
| 	0x1140,	//	 88 = 0101 1000 -> 0001 0001 0100 0000 | ||||
| 	0x1141,	//	 89 = 0101 1001 -> 0001 0001 0100 0001 | ||||
| 	0x1144,	//	 90 = 0101 1010 -> 0001 0001 0100 0100 | ||||
| 	0x1145,	//	 91 = 0101 1011 -> 0001 0001 0100 0101 | ||||
| 	0x1150,	//	 92 = 0101 1100 -> 0001 0001 0101 0000 | ||||
| 	0x1151,	//	 93 = 0101 1101 -> 0001 0001 0101 0001 | ||||
| 	0x1154,	//	 94 = 0101 1110 -> 0001 0001 0101 0100 | ||||
| 	0x1155,	//	 95 = 0101 1111 -> 0001 0001 0101 0101 | ||||
|                                             | ||||
| 	0x1400,	//	 96 = 0110 0000 -> 0001 0100 0000 0000 | ||||
| 	0x1401,	//	 97 = 0110 0001 -> 0001 0100 0000 0001 | ||||
| 	0x1404,	//	 98 = 0110 0010 -> 0001 0100 0000 0100 | ||||
| 	0x1405,	//	 99 = 0110 0011 -> 0001 0100 0000 0101 | ||||
| 	0x1410,	//	100 = 0110 0100 -> 0001 0100 0001 0000 | ||||
| 	0x1411,	//	101 = 0110 0101 -> 0001 0100 0001 0001 | ||||
| 	0x1414,	//	102 = 0110 0110 -> 0001 0100 0001 0100 | ||||
| 	0x1415,	//	103 = 0110 0111 -> 0001 0100 0001 0101 | ||||
| 	0x1440,	//	104 = 0110 1000 -> 0001 0100 0100 0000 | ||||
| 	0x1441,	//	105 = 0110 1001 -> 0001 0100 0100 0001 | ||||
| 	0x1444,	//	106 = 0110 1010 -> 0001 0100 0100 0100 | ||||
| 	0x1445,	//	107 = 0110 1011 -> 0001 0100 0100 0101 | ||||
| 	0x1450,	//	108 = 0110 1100 -> 0001 0100 0101 0000 | ||||
| 	0x1451,	//	109 = 0110 1101 -> 0001 0100 0101 0001 | ||||
| 	0x1454,	//	110 = 0110 1110 -> 0001 0100 0101 0100 | ||||
| 	0x1455,	//	111 = 0110 1111 -> 0001 0100 0101 0101 | ||||
|  | ||||
| 	0x1500,	//	112 = 0111 0000 -> 0001 0101 0000 0000 | ||||
| 	0x1501,	//	113 = 0111 0001 -> 0001 0101 0000 0001 | ||||
| 	0x1504,	//	114 = 0111 0010 -> 0001 0101 0000 0100 | ||||
| 	0x1505,	//	115 = 0111 0011 -> 0001 0101 0000 0101 | ||||
| 	0x1510,	//	116 = 0111 0100 -> 0001 0101 0001 0000 | ||||
| 	0x1511,	//	117 = 0111 0101 -> 0001 0101 0001 0001 | ||||
| 	0x1514,	//	118 = 0111 0110 -> 0001 0101 0001 0100 | ||||
| 	0x1515,	//	119 = 0111 0111 -> 0001 0101 0001 0101 | ||||
| 	0x1540,	//	120 = 0111 1000 -> 0001 0101 0100 0000 | ||||
| 	0x1541,	//	121 = 0111 1001 -> 0001 0101 0100 0001 | ||||
| 	0x1544,	//	122 = 0111 1010 -> 0001 0101 0100 0100 | ||||
| 	0x1545,	//	123 = 0111 1011 -> 0001 0101 0100 0101 | ||||
| 	0x1550,	//	124 = 0111 1100 -> 0001 0101 0101 0000 | ||||
| 	0x1551,	//	125 = 0111 1101 -> 0001 0101 0101 0001 | ||||
| 	0x1554,	//	126 = 0111 1110 -> 0001 0101 0101 0100 | ||||
| 	0x1555,	//	127 = 0111 1111 -> 0001 0101 0101 0101 | ||||
|  | ||||
| 	0x4000,	//	128 = 1000 0000 -> 0100 0000 0000 0000 | ||||
| 	0x4001,	//	129 = 1000 0001 -> 0100 0000 0000 0001 | ||||
| 	0x4004,	//	130 = 1000 0010 -> 0100 0000 0000 0100 | ||||
| 	0x4005,	//	131 = 1000 0011 -> 0100 0000 0000 0101 | ||||
| 	0x4010,	//	132 = 1000 0100 -> 0100 0000 0001 0000 | ||||
| 	0x4011,	//	133 = 1000 0101 -> 0100 0000 0001 0001 | ||||
| 	0x4014,	//	134 = 1000 0110 -> 0100 0000 0001 0100 | ||||
| 	0x4015,	//	135 = 1000 0111 -> 0100 0000 0001 0101 | ||||
| 	0x4040,	//	136 = 1000 1000 -> 0100 0000 0100 0000 | ||||
| 	0x4041,	//	137 = 1000 1001 -> 0100 0000 0100 0001 | ||||
| 	0x4044,	//	138 = 1000 1010 -> 0100 0000 0100 0100 | ||||
| 	0x4045,	//	139 = 1000 1011 -> 0100 0000 0100 0101 | ||||
| 	0x4050,	//	140 = 1000 1100 -> 0100 0000 0101 0000 | ||||
| 	0x4051,	//	141 = 1000 1101 -> 0100 0000 0101 0001 | ||||
| 	0x4054,	//	142 = 1000 1110 -> 0100 0000 0101 0100 | ||||
| 	0x4055,	//	143 = 1000 1111 -> 0100 0000 0101 0101 | ||||
|  | ||||
| 	0x4100,	//	144 = 1001 0000 -> 0100 0001 0000 0000 | ||||
| 	0x4101,	//	145 = 1001 0001 -> 0100 0001 0000 0001 | ||||
| 	0x4104,	//	146 = 1001 0010 -> 0100 0001 0000 0100 | ||||
| 	0x4105,	//	147 = 1001 0011 -> 0100 0001 0000 0101 | ||||
| 	0x4110,	//	148 = 1001 0100 -> 0100 0001 0001 0000 | ||||
| 	0x4111,	//	149 = 1001 0101 -> 0100 0001 0001 0001 | ||||
| 	0x4114,	//	150 = 1001 0110 -> 0100 0001 0001 0100 | ||||
| 	0x4115,	//	151 = 1001 0111 -> 0100 0001 0001 0101 | ||||
| 	0x4140,	//	152 = 1001 1000 -> 0100 0001 0100 0000 | ||||
| 	0x4141,	//	153 = 1001 1001 -> 0100 0001 0100 0001 | ||||
| 	0x4144,	//	154 = 1001 1010 -> 0100 0001 0100 0100 | ||||
| 	0x4145,	//	155 = 1001 1011 -> 0100 0001 0100 0101 | ||||
| 	0x4150,	//	156 = 1001 1100 -> 0100 0001 0101 0000 | ||||
| 	0x4151,	//	157 = 1001 1101 -> 0100 0001 0101 0001 | ||||
| 	0x4154,	//	158 = 1001 1110 -> 0100 0001 0101 0100 | ||||
| 	0x4155,	//	159 = 1001 1111 -> 0100 0001 0101 0101 | ||||
|  | ||||
| 	0x4400,	//	160 = 1010 0000 -> 0100 0100 0000 0000 | ||||
| 	0x4401,	//	161 = 1010 0001 -> 0100 0100 0000 0001 | ||||
| 	0x4404,	//	162 = 1010 0010 -> 0100 0100 0000 0100 | ||||
| 	0x4405,	//	163 = 1010 0011 -> 0100 0100 0000 0101 | ||||
| 	0x4410,	//	164 = 1010 0100 -> 0100 0100 0001 0000 | ||||
| 	0x4411,	//	165 = 1010 0101 -> 0100 0100 0001 0001 | ||||
| 	0x4414,	//	166 = 1010 0110 -> 0100 0100 0001 0100 | ||||
| 	0x4415,	//	167 = 1010 0111 -> 0100 0100 0001 0101 | ||||
| 	0x4440,	//	168 = 1010 1000 -> 0100 0100 0100 0000 | ||||
| 	0x4441,	//	169 = 1010 1001 -> 0100 0100 0100 0001 | ||||
| 	0x4444,	//	170 = 1010 1010 -> 0100 0100 0100 0100 | ||||
| 	0x4445,	//	171 = 1010 1011 -> 0100 0100 0100 0101 | ||||
| 	0x4450,	//	172 = 1010 1100 -> 0100 0100 0101 0000 | ||||
| 	0x4451,	//	173 = 1010 1101 -> 0100 0100 0101 0001 | ||||
| 	0x4454,	//	174 = 1010 1110 -> 0100 0100 0101 0100 | ||||
| 	0x4455,	//	175 = 1010 1111 -> 0100 0100 0101 0101 | ||||
|  | ||||
| 	0x4500,	//	176 = 1011 0000 -> 0100 0101 0000 0000 | ||||
| 	0x4501,	//	177 = 1011 0001 -> 0100 0101 0000 0001 | ||||
| 	0x4504,	//	178 = 1011 0010 -> 0100 0101 0000 0100 | ||||
| 	0x4505,	//	179 = 1011 0011 -> 0100 0101 0000 0101 | ||||
| 	0x4510,	//	180 = 1011 0100 -> 0100 0101 0001 0000 | ||||
| 	0x4511,	//	181 = 1011 0101 -> 0100 0101 0001 0001 | ||||
| 	0x4514,	//	182 = 1011 0110 -> 0100 0101 0001 0100 | ||||
| 	0x4515,	//	183 = 1011 0111 -> 0100 0101 0001 0101 | ||||
| 	0x4540,	//	184 = 1011 1000 -> 0100 0101 0100 0000 | ||||
| 	0x4541,	//	185 = 1011 1001 -> 0100 0101 0100 0001 | ||||
| 	0x4544,	//	186 = 1011 1010 -> 0100 0101 0100 0100 | ||||
| 	0x4545,	//	187 = 1011 1011 -> 0100 0101 0100 0101 | ||||
| 	0x4550,	//	188 = 1011 1100 -> 0100 0101 0101 0000 | ||||
| 	0x4551,	//	189 = 1011 1101 -> 0100 0101 0101 0001 | ||||
| 	0x4554,	//	190 = 1011 1110 -> 0100 0101 0101 0100 | ||||
| 	0x4555,	//	191 = 1011 1111 -> 0100 0101 0101 0101 | ||||
|  | ||||
| 	0x5000,	//	192 = 1100 0000 -> 0101 0000 0000 0000 | ||||
| 	0x5001,	//	193 = 1100 0001 -> 0101 0000 0000 0001 | ||||
| 	0x5004,	//	194 = 1100 0010 -> 0101 0000 0000 0100 | ||||
| 	0x5005,	//	195 = 1100 0011 -> 0101 0000 0000 0101 | ||||
| 	0x5010,	//	196 = 1100 0100 -> 0101 0000 0001 0000 | ||||
| 	0x5011,	//	197 = 1100 0101 -> 0101 0000 0001 0001 | ||||
| 	0x5014,	//	198 = 1100 0110 -> 0101 0000 0001 0100 | ||||
| 	0x5015,	//	199 = 1100 0111 -> 0101 0000 0001 0101 | ||||
| 	0x5040,	//	200 = 1100 1000 -> 0101 0000 0100 0000 | ||||
| 	0x5041,	//	201 = 1100 1001 -> 0101 0000 0100 0001 | ||||
| 	0x5044,	//	202 = 1100 1010 -> 0101 0000 0100 0100 | ||||
| 	0x5045,	//	203 = 1100 1011 -> 0101 0000 0100 0101 | ||||
| 	0x5050,	//	204 = 1100 1100 -> 0101 0000 0101 0000 | ||||
| 	0x5051,	//	205 = 1100 1101 -> 0101 0000 0101 0001 | ||||
| 	0x5054,	//	206 = 1100 1110 -> 0101 0000 0101 0100 | ||||
| 	0x5055,	//	207 = 1100 1111 -> 0101 0000 0101 0101 | ||||
|  | ||||
| 	0x5100,	//	208 = 1101 0000 -> 0101 0001 0000 0000 | ||||
| 	0x5101,	//	209 = 1101 0001 -> 0101 0001 0000 0001 | ||||
| 	0x5104,	//	210 = 1101 0010 -> 0101 0001 0000 0100 | ||||
| 	0x5105,	//	211 = 1101 0011 -> 0101 0001 0000 0101 | ||||
| 	0x5110,	//	212 = 1101 0100 -> 0101 0001 0001 0000 | ||||
| 	0x5111,	//	213 = 1101 0101 -> 0101 0001 0001 0001 | ||||
| 	0x5114,	//	214 = 1101 0110 -> 0101 0001 0001 0100 | ||||
| 	0x5115,	//	215 = 1101 0111 -> 0101 0001 0001 0101 | ||||
| 	0x5140,	//	216 = 1101 1000 -> 0101 0001 0100 0000 | ||||
| 	0x5141,	//	217 = 1101 1001 -> 0101 0001 0100 0001 | ||||
| 	0x5144,	//	218 = 1101 1010 -> 0101 0001 0100 0100 | ||||
| 	0x5145,	//	219 = 1101 1011 -> 0101 0001 0100 0101 | ||||
| 	0x5150,	//	220 = 1101 1100 -> 0101 0001 0101 0000 | ||||
| 	0x5151,	//	221 = 1101 1101 -> 0101 0001 0101 0001 | ||||
| 	0x5154,	//	222 = 1101 1110 -> 0101 0001 0101 0100 | ||||
| 	0x5155,	//	223 = 1101 1111 -> 0101 0001 0101 0101 | ||||
|  | ||||
| 	0x5400,	//	224 = 1110 0000 -> 0101 0100 0000 0000 | ||||
| 	0x5401,	//	225 = 1110 0001 -> 0101 0100 0000 0001 | ||||
| 	0x5404,	//	226 = 1110 0010 -> 0101 0100 0000 0100 | ||||
| 	0x5405,	//	227 = 1110 0011 -> 0101 0100 0000 0101 | ||||
| 	0x5410,	//	228 = 1110 0100 -> 0101 0100 0001 0000 | ||||
| 	0x5411,	//	229 = 1110 0101 -> 0101 0100 0001 0001 | ||||
| 	0x5414,	//	230 = 1110 0110 -> 0101 0100 0001 0100 | ||||
| 	0x5415,	//	231 = 1110 0111 -> 0101 0100 0001 0101 | ||||
| 	0x5440,	//	232 = 1110 1000 -> 0101 0100 0100 0000 | ||||
| 	0x5441,	//	233 = 1110 1001 -> 0101 0100 0100 0001 | ||||
| 	0x5444,	//	234 = 1110 1010 -> 0101 0100 0100 0100 | ||||
| 	0x5445,	//	235 = 1110 1011 -> 0101 0100 0100 0101 | ||||
| 	0x5450,	//	236 = 1110 1100 -> 0101 0100 0101 0000 | ||||
| 	0x5451,	//	237 = 1110 1101 -> 0101 0100 0101 0001 | ||||
| 	0x5454,	//	238 = 1110 1110 -> 0101 0100 0101 0100 | ||||
| 	0x5455,	//	239 = 1110 1111 -> 0101 0100 0101 0101 | ||||
|  | ||||
| 	0x5500,	//	240 = 1111 0000 -> 0101 0101 0000 0000 | ||||
| 	0x5501,	//	241 = 1111 0001 -> 0101 0101 0000 0001 | ||||
| 	0x5504,	//	242 = 1111 0010 -> 0101 0101 0000 0100 | ||||
| 	0x5505,	//	243 = 1111 0011 -> 0101 0101 0000 0101 | ||||
| 	0x5510,	//	244 = 1111 0100 -> 0101 0101 0001 0000 | ||||
| 	0x5511,	//	245 = 1111 0101 -> 0101 0101 0001 0001 | ||||
| 	0x5514,	//	246 = 1111 0110 -> 0101 0101 0001 0100 | ||||
| 	0x5515,	//	247 = 1111 0111 -> 0101 0101 0001 0101 | ||||
| 	0x5540,	//	248 = 1111 1000 -> 0101 0101 0100 0000 | ||||
| 	0x5541,	//	249 = 1111 1001 -> 0101 0101 0100 0001 | ||||
| 	0x5544,	//	250 = 1111 1010 -> 0101 0101 0100 0100 | ||||
| 	0x5545,	//	251 = 1111 1011 -> 0101 0101 0100 0101 | ||||
| 	0x5550,	//	252 = 1111 1100 -> 0101 0101 0101 0000 | ||||
| 	0x5551,	//	253 = 1111 1101 -> 0101 0101 0101 0001 | ||||
| 	0x5554,	//	254 = 1111 1110 -> 0101 0101 0101 0100 | ||||
| 	0x5555	//	255 = 1111 1111 -> 0101 0101 0101 0101 | ||||
| 	 | ||||
| ] | ||||
| @@ -0,0 +1,62 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| //try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { | ||||
| //	throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; | ||||
| //}   | ||||
| if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||||
| if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Point = function(args) { | ||||
| 	args = args || {}; | ||||
| 	this._x = args.x; | ||||
| 	this._y = args.y; | ||||
| 	 | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Point.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'asString': function() { | ||||
| 		return "Clipperz.Crypto.ECC.BinaryField.Point (" + this.x() + ", " + this.y() + ")"; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'x': function() { | ||||
| 		return this._x; | ||||
| 	}, | ||||
| 	 | ||||
| 	'y': function() { | ||||
| 		return this._y; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'isZero': function() { | ||||
| 		return (this.x().isZero() && this.y().isZero()) | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
							
								
								
									
										381
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Value.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										381
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ECC/BinaryField/Value.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,381 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| //try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { | ||||
| //	throw "Clipperz.Crypto.ECC depends on Clipperz.ByteArray!"; | ||||
| //}   | ||||
| if (typeof(Clipperz) == 'undefined') { Clipperz = {}; } | ||||
| if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } | ||||
| if (typeof(Clipperz.Crypto.ECC) == 'undefined') { Clipperz.Crypto.ECC = {}; } | ||||
| if (typeof(Clipperz.Crypto.ECC.BinaryField) == 'undefined') { Clipperz.Crypto.ECC.BinaryField = {}; } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value = function(aValue, aBase, aBitSize) { | ||||
| 	if (aValue.constructor == String) { | ||||
| 		var	value; | ||||
| 		var	stringLength; | ||||
| 		var numberOfWords; | ||||
| 		var	i,c; | ||||
| 	 | ||||
| 		if (aBase != 16) { | ||||
| 			throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; | ||||
| 		} | ||||
|  | ||||
| 		value = aValue.replace(/ /g, ''); | ||||
| 		stringLength = value.length; | ||||
| 		numberOfWords = Math.ceil(stringLength / 8); | ||||
| 		this._value = new Array(numberOfWords); | ||||
| 	 | ||||
| 		c = numberOfWords; | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			var	word; | ||||
| 		 | ||||
| 			if (i < (c-1)) { | ||||
| 				word = parseInt(value.substr(stringLength-((i+1)*8), 8), 16); | ||||
| 			} else { | ||||
| 				word = parseInt(value.substr(0, stringLength-(i*8)), 16); | ||||
| 			} | ||||
| 			 | ||||
| 			this._value[i] = word; | ||||
| 		} | ||||
| 	} else if (aValue.constructor == Array) { | ||||
| 		var itemsToCopy; | ||||
|  | ||||
| 		itemsToCopy = aValue.length; | ||||
| 		while (aValue[itemsToCopy - 1] == 0) { | ||||
| 			itemsToCopy --; | ||||
| 		} | ||||
|  | ||||
| 		this._value = aValue.slice(0, itemsToCopy); | ||||
| 	} else if (aValue.constructor == Number) { | ||||
| 		this._value = [aValue]; | ||||
| 	} else { | ||||
| //		throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType; | ||||
| 	} | ||||
| 	 | ||||
| 	this._bitSize == aBitSize || null; | ||||
|  | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'value': function() { | ||||
| 		return this._value; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	 | ||||
| 	'wordSize': function() { | ||||
| 		return this._value.length | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'clone': function() { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(this._value.slice(0), null, this._bitSize); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'isZero': function() { | ||||
| 		return (this.compare(Clipperz.Crypto.ECC.BinaryField.Value.O) == 0); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'asString': function(aBase) { | ||||
| 		var	result; | ||||
| 		var i,c; | ||||
| 		 | ||||
| 		if (aBase != 16) { | ||||
| 			throw Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase; | ||||
| 		} | ||||
| 		 | ||||
| 		result = ""; | ||||
| 		c = this.wordSize(); | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			var	wordAsString; | ||||
| 			 | ||||
| //			wordAsString = ("00000000" + this.value()[i].toString(16)); | ||||
| 			wordAsString = ("00000000" + this._value[i].toString(16)); | ||||
| 			wordAsString = wordAsString.substring(wordAsString.length - 8); | ||||
| 			result = wordAsString + result; | ||||
| 		} | ||||
| 		 | ||||
| 		result = result.replace(/^(00)*/, ""); | ||||
| 		 | ||||
| 		if (result == "") { | ||||
| 			result = "0"; | ||||
| 		} | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'shiftLeft': function(aNumberOfBitsToShift) { | ||||
| 		//	this method seems like it is never called. :-( | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft(this._value, aNumberOfBitsToShift)); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'bitSize': function() { | ||||
| 		if (this._bitSize == null) { | ||||
| 			this._bitSize = Clipperz.Crypto.ECC.BinaryField.Value._bitSize(this._value); | ||||
| 		} | ||||
|  | ||||
| 		return this._bitSize; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'isBitSet': function(aBitPosition) { | ||||
| 		return Clipperz.Crypto.ECC.BinaryField.Value._isBitSet(this._value, aBitPosition); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'xor': function(aValue) { | ||||
| 		return new Clipperz.Crypto.ECC.BinaryField.Value(Clipperz.Crypto.ECC.BinaryField.Value._xor(this._value, aValue._value)); | ||||
| 	},  | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'compare': function(aValue) { | ||||
| 		return Clipperz.Crypto.ECC.BinaryField.Value._compare(this._value, aValue._value); | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value.O = new Clipperz.Crypto.ECC.BinaryField.Value('0', 16); | ||||
| Clipperz.Crypto.ECC.BinaryField.Value.I = new Clipperz.Crypto.ECC.BinaryField.Value('1', 16); | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value._xor = function(a, b, aFirstItemOffset) { | ||||
| 	var result; | ||||
| 	var resultSize; | ||||
| 	var i,c; | ||||
| 	var firstItemOffset; | ||||
| 	 | ||||
| 	firstItemOffset = aFirstItemOffset || 0; | ||||
| 	resultSize = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset; | ||||
|  | ||||
| 	result = new Array(resultSize); | ||||
| 	 | ||||
| 	c = firstItemOffset; | ||||
| 	for (i=0; i<c; i++) { | ||||
| 		result[i] = a[i]; | ||||
| 	} | ||||
|  | ||||
| 	c = resultSize; | ||||
| 	for (i=firstItemOffset; i<c; i++) { | ||||
| 		result[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0); | ||||
| 	} | ||||
| 	 | ||||
| 	return result; | ||||
| }; | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value._overwriteXor = function(a, b, aFirstItemOffset) { | ||||
| 	var i,c; | ||||
| 	var firstItemOffset; | ||||
| 	 | ||||
| 	firstItemOffset = aFirstItemOffset || 0; | ||||
|  | ||||
| 	c = Math.max((a.length - firstItemOffset), b.length) + firstItemOffset; | ||||
| 	for (i=firstItemOffset; i<c; i++) { | ||||
| 		a[i] = (((a[i] || 0) ^ (b[i - firstItemOffset] || 0)) >>> 0); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value._shiftLeft = function(aWordArray, aNumberOfBitsToShift) { | ||||
| 	var numberOfWordsToShift; | ||||
| 	var	numberOfBitsToShift; | ||||
| 	var result; | ||||
| 	var	overflowValue; | ||||
| 	var nextOverflowValue; | ||||
| 	var	i,c; | ||||
|  | ||||
| 	numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32); | ||||
| 	numberOfBitsToShift = aNumberOfBitsToShift % 32; | ||||
|  | ||||
| 	result = new Array(aWordArray.length + numberOfWordsToShift); | ||||
| 	 | ||||
| 	c = numberOfWordsToShift; | ||||
| 	for (i=0; i<c; i++) { | ||||
| 		result[i] = 0; | ||||
| 	} | ||||
| 	 | ||||
| 	overflowValue = 0; | ||||
| 	nextOverflowValue = 0; | ||||
| 	 | ||||
| 	c = aWordArray.length; | ||||
| 	for (i=0; i<c; i++) { | ||||
| 		var	value; | ||||
| 		var	resultWord; | ||||
|  | ||||
| //		value = this.value()[i]; | ||||
| 		value = aWordArray[i]; | ||||
|  | ||||
| 		if (numberOfBitsToShift > 0) { | ||||
| 			nextOverflowValue = (value >>> (32 - numberOfBitsToShift)); | ||||
| 			value = value & (0xffffffff >>> numberOfBitsToShift); | ||||
| 			resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0); | ||||
| 		} else { | ||||
| 			resultWord = value; | ||||
| 		} | ||||
| 		 | ||||
| 		result[i+numberOfWordsToShift] = resultWord; | ||||
| 		overflowValue = nextOverflowValue; | ||||
| 	} | ||||
|  | ||||
| 	if (overflowValue != 0) { | ||||
| 		result[aWordArray.length + numberOfWordsToShift] = overflowValue; | ||||
| 	} | ||||
|  | ||||
| 	return result; | ||||
| }; | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value._overwriteShiftLeft = function(aWordArray, aNumberOfBitsToShift) { | ||||
| 	var numberOfWordsToShift; | ||||
| 	var	numberOfBitsToShift; | ||||
| 	var result; | ||||
| 	var	overflowValue; | ||||
| 	var	i,c; | ||||
|  | ||||
| 	numberOfWordsToShift = Math.floor(aNumberOfBitsToShift / 32); | ||||
| 	numberOfBitsToShift = aNumberOfBitsToShift % 32; | ||||
|  | ||||
| 	result = new Array(aWordArray.length + numberOfWordsToShift); | ||||
| 	 | ||||
| 	c = numberOfWordsToShift; | ||||
| 	for (i=0; i<c; i++) { | ||||
| 		result[i] = 0; | ||||
| 	} | ||||
| 	 | ||||
| 	overflowValue = 0; | ||||
| 	nextOverflowValue = 0; | ||||
| 	 | ||||
| 	c = aWordArray.length; | ||||
| 	for (i=0; i<c; i++) { | ||||
| 		var	value; | ||||
| 		var	resultWord; | ||||
|  | ||||
| //		value = this.value()[i]; | ||||
| 		value = aWordArray[i]; | ||||
|  | ||||
| 		if (numberOfBitsToShift > 0) { | ||||
| 			var nextOverflowValue; | ||||
| 		 | ||||
| 			nextOverflowValue = (value >>> (32 - numberOfBitsToShift)); | ||||
| 			value = value & (0xffffffff >>> numberOfBitsToShift); | ||||
| 			resultWord = (((value << numberOfBitsToShift) | overflowValue) >>> 0); | ||||
| 		} else { | ||||
| 			resultWord = value; | ||||
| 		} | ||||
| 		 | ||||
| 		result[i+numberOfWordsToShift] = resultWord; | ||||
| 		overflowValue = nextOverflowValue; | ||||
| 	} | ||||
|  | ||||
| 	if (overflowValue != 0) { | ||||
| 		result[aWordArray.length + numberOfWordsToShift] = overflowValue; | ||||
| 	} | ||||
|  | ||||
| 	return result; | ||||
| }; | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value._bitSize = function(aWordArray) { | ||||
| 	var	result; | ||||
| 	var	notNullElements; | ||||
| 	var mostValuableWord; | ||||
| 	var matchingBitsInMostImportantWord; | ||||
| 	var mask; | ||||
| 	var i,c; | ||||
|  | ||||
| 	notNullElements = aWordArray.length; | ||||
| 	 | ||||
| 	if ((aWordArray.length == 1) && (aWordArray[0] == 0)) { | ||||
| 		result = 0; | ||||
| 	} else { | ||||
| 			notNullElements --; | ||||
| 		while((notNullElements > 0) && (aWordArray[notNullElements] == 0)) { | ||||
| 			notNullElements --; | ||||
| 		} | ||||
| 	 | ||||
| 		result = notNullElements * 32; | ||||
| 		mostValuableWord = aWordArray[notNullElements]; | ||||
|  | ||||
| 		matchingBits = 32; | ||||
| 		mask = 0x80000000; | ||||
| 	 | ||||
| 		while ((matchingBits > 0) && ((mostValuableWord & mask) == 0)) { | ||||
| 			matchingBits --; | ||||
| 			mask >>>= 1; | ||||
| 		} | ||||
| 	 | ||||
| 		result += matchingBits; | ||||
| 	} | ||||
| 	 | ||||
| 	return result; | ||||
| }; | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value._isBitSet = function(aWordArray, aBitPosition) { | ||||
| 	var result; | ||||
| 	var	byteIndex; | ||||
| 	var bitIndexInSelectedByte; | ||||
|  | ||||
| 	byteIndex = Math.floor(aBitPosition / 32); | ||||
| 	bitIndexInSelectedByte = aBitPosition % 32; | ||||
| 	 | ||||
| 	if (byteIndex <= aWordArray.length) { | ||||
| 		result = ((aWordArray[byteIndex] & (1 << bitIndexInSelectedByte)) != 0); | ||||
| 	} else { | ||||
| 		result = false; | ||||
| 	} | ||||
|  | ||||
| 	return result; | ||||
| }; | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value._compare = function(a,b) { | ||||
| 	var	result; | ||||
| 	var i,c; | ||||
| 	 | ||||
| 	result = MochiKit.Base.compare(a.length, b.length); | ||||
|  | ||||
| 	c = a.length; | ||||
| 	for (i=0; (i<c) && (result==0); i++) { | ||||
| //console.log("compare[" + c + " - " + i + " - 1] " + this.value()[c-i-1] + ", " + aValue.value()[c-i-1]); | ||||
| //		result = MochiKit.Base.compare(this.value()[c-i-1], aValue.value()[c-i-1]); | ||||
| 		result = MochiKit.Base.compare(a[c-i-1], b[c-i-1]); | ||||
| 	} | ||||
| 	 | ||||
| 	return result; | ||||
| }; | ||||
|  | ||||
|  | ||||
| Clipperz.Crypto.ECC.BinaryField.Value['exception']= { | ||||
| 	'UnsupportedBase':					new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedBase"), | ||||
| 	'UnsupportedConstructorValueType':	new MochiKit.Base.NamedError("Clipperz.Crypto.ECC.BinaryField.Value.exception.UnsupportedConstructorValueType") | ||||
| }; | ||||
							
								
								
									
										234
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ECC/StandardCurves.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/ECC/StandardCurves.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,234 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| //try { if (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) == 'undefined') { throw ""; }} catch (e) { | ||||
| //	throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.BinaryField.Curve!"; | ||||
| //} | ||||
| //try { if (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) == 'undefined') { throw ""; }} catch (e) { | ||||
| //	throw "Clipperz.Crypto.ECC depends on Clipperz.Crypto.ECC.Koblitz.Curve!"; | ||||
| //} | ||||
|  | ||||
| Clipperz.Crypto.ECC.StandardCurves = {}; | ||||
|  | ||||
| MochiKit.Base.update(Clipperz.Crypto.ECC.StandardCurves, { | ||||
|  | ||||
| 	//============================================================================== | ||||
|  | ||||
| 	'_K571': null, | ||||
| 	'K571': function() {	//	f(z) = z^571 + z^10 + z^5 + z^2 + 1 | ||||
| 		if ((Clipperz.Crypto.ECC.StandardCurves._K571 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._K571 = new Clipperz.Crypto.ECC.Koblitz.Curve({ | ||||
| 				modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.Koblitz.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.Koblitz.Value('026eb7a8 59923fbc 82189631 f8103fe4 ac9ca297 0012d5d4 60248048 01841ca4 43709584 93b205e6 47da304d b4ceb08c bbd1ba39 494776fb 988b4717 4dca88c7 e2945283 a01c8972', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.Koblitz.Value('0349dc80 7f4fbf37 4f4aeade 3bca9531 4dd58cec 9f307a54 ffc61efc 006d8a2c 9d4979c0 ac44aea7 4fbebbb9 f772aedc b620b01a 7ba7af1b 320430c8 591984f6 01cd4c14 3ef1c7a3', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), | ||||
| 				primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('02000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 131850e1 f19a63e4 b391a8db 917f4138 b630d84b e5d63938 1e91deb4 5cfe778f 637c1001', 16) | ||||
| 			}); | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._K571; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_K283': null, | ||||
| 	'K283': function() {	//	f(z) = z^283 + z^12 + z^7 + z^5 + 1 | ||||
| 		if ((Clipperz.Crypto.ECC.StandardCurves._K283 == null) && (typeof(Clipperz.Crypto.ECC.Koblitz.Curve) != 'undefined')) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._K283 = new Clipperz.Crypto.ECC.Koblitz.Curve({ | ||||
| 				modulus: new Clipperz.Crypto.ECC.Koblitz.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.Koblitz.Value('0', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.Koblitz.Value('1', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.Koblitz.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.Koblitz.Value('0503213f 78ca4488 3f1a3b81 62f188e5 53cd265f 23c1567a 16876913 b0c2ac24 58492836', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.Koblitz.Value('01ccda38 0f1c9e31 8d90f95d 07e5426f e87e45c0 e8184698 e4596236 4e341161 77dd2259', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.Koblitz.Value('4', 16), | ||||
| 				primeFactor: new Clipperz.Crypto.ECC.Koblitz.Value('01ffffff ffffffff ffffffff ffffffff ffffe9ae 2ed07577 265dff7f 94451e06 1e163c61', 16) | ||||
| 			}); | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._K283; | ||||
| 	}, | ||||
|  | ||||
| 	//============================================================================== | ||||
|  | ||||
| 	'_B571': null, | ||||
| 	'B571': function() {	//	f(z) = z^571 + z^10 + z^5 + z^2 + 1 | ||||
| 		if ((Clipperz.Crypto.ECC.StandardCurves._B571 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B571 = new Clipperz.Crypto.ECC.BinaryField.Curve({ | ||||
| 				modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000425', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.BinaryField.Value('02f40e7e 2221f295 de297117 b7f3d62f 5c6a97ff cb8ceff1 cd6ba8ce 4a9a18ad 84ffabbd 8efa5933 2be7ad67 56a66e29 4afd185a 78ff12aa 520e4de7 39baca0c 7ffeff7f 2955727a', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.BinaryField.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.BinaryField.Value('0303001d 34b85629 6c16c0d4 0d3cd775 0a93d1d2 955fa80a a5f40fc8 db7b2abd bde53950 f4c0d293 cdd711a3 5b67fb14 99ae6003 8614f139 4abfa3b4 c850d927 e1e7769c 8eec2d19', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.BinaryField.Value('037bf273 42da639b 6dccfffe b73d69d7 8c6c27a6 009cbbca 1980f853 3921e8a6 84423e43 bab08a57 6291af8f 461bb2a8 b3531d2f 0485c19b 16e2f151 6e23dd3c 1a4827af 1b8ac15b', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff e661ce18 ff559873 08059b18 6823851e c7dd9ca1 161de93d 5174d66e 8382e9bb 2fe84e47', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) | ||||
|  | ||||
| //				S: new Clipperz.Crypto.ECC.BinaryField.Value('2aa058f73a0e33ab486b0f610410c53a7f132310', 10), | ||||
| //				n: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe661ce18ff55987308059b186823851ec7dd9ca1161de93d5174d66e8382e9bb2fe84e47', 16) | ||||
| 			}); | ||||
| 			 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			// | ||||
| 			//	Guide to Elliptic Curve Cryptography | ||||
| 			//	Darrel Hankerson, Alfred Menezes, Scott Vanstone | ||||
| 			//	- Pag: 56, Alorithm 2.45 (with a typo!!!) | ||||
| 			//	 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			// | ||||
| 			//		http://www.milw0rm.com/papers/136 | ||||
| 			// | ||||
| 			//		------------------------------------------------------------------------- | ||||
| 			//		  Polynomial Reduction Algorithm Modulo f571  | ||||
| 			//		------------------------------------------------------------------------- | ||||
| 			//		 | ||||
| 			//		  Input:  Polynomial p(x) of degree 1140 or less, stored as  | ||||
| 			//		          an array of 2T machinewords. | ||||
| 			//		  Output: p(x) mod f571(x) | ||||
| 			//		 | ||||
| 			//		  FOR i = T-1, ..., 0 DO | ||||
| 			//		      SET X  := P[i+T] | ||||
| 			//		      P[i]   := P[i]   ^ (X<<5) ^ (X<<7) ^ (X<<10) ^ (X<<15) | ||||
| 			//		      P[i+1] := P[i+1] ^ (X>>17) ^ (X>>22) ^ (X>>25) ^ (X>>27) | ||||
| 			//		 | ||||
| 			//		  SET X  := P[T-1] >> 27 | ||||
| 			//		  P[0]   := P[0] ^ X ^ (X<<2) ^ (X<<5) ^ (X<<10) | ||||
| 			//		  P[T-1] := P[T-1] & 0x07ffffff | ||||
| 			//		 | ||||
| 			//		  RETURN P[T-1],...,P[0] | ||||
| 			//		 | ||||
| 			//		------------------------------------------------------------------------- | ||||
| 			//		 | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module; | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().module = function(aValue) { | ||||
| 				var	result; | ||||
| 				 | ||||
| 				if (aValue.bitSize() > 1140) { | ||||
| 					MochiKit.Logging.logWarning("ECC.StandarCurves.B571.finiteField().module: falling back to default implementation"); | ||||
| 					result = Clipperz.Crypto.ECC.StandardCurves._B571.finiteField().slowModule(aValue); | ||||
| 				} else { | ||||
| 					var	C, T; | ||||
| 					var i; | ||||
| 		 | ||||
| //console.log(">>> binaryField.finiteField.(improved)module"); | ||||
| //					C = aValue.value().slice(0); | ||||
| 					C = aValue._value.slice(0); | ||||
| 					for (i=35; i>=18; i--) { | ||||
| 						T = C[i]; | ||||
| 						C[i-18] = (((C[i-18] ^ (T<<5) ^ (T<<7) ^ (T<<10) ^ (T<<15)) & 0xffffffff) >>> 0); | ||||
| 						C[i-17] = ((C[i-17] ^ (T>>>27) ^ (T>>>25) ^ (T>>>22) ^ (T>>>17)) >>> 0); | ||||
| 					} | ||||
| 					T = (C[17] >>> 27); | ||||
| 					C[0] = ((C[0] ^ T ^ ((T<<2) ^ (T<<5) ^ (T<<10)) & 0xffffffff) >>> 0); | ||||
| 					C[17] = (C[17] & 0x07ffffff); | ||||
|  | ||||
| 					for(i=18; i<=35; i++) { | ||||
| 						C[i] = 0; | ||||
| 					} | ||||
| 				 | ||||
| 					result = new Clipperz.Crypto.ECC.BinaryField.Value(C); | ||||
| //console.log("<<< binaryField.finiteField.(improved)module"); | ||||
| 				} | ||||
| 			 | ||||
| 				return result; | ||||
| 			}; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._B571; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'_B283': null, | ||||
| 	'B283': function() {	//	f(z) = z^283 + z^12 + z^7 + z^5 + 1 | ||||
| 		if ((Clipperz.Crypto.ECC.StandardCurves._B283 == null) && (typeof(Clipperz.Crypto.ECC.BinaryField.Curve) != 'undefined')) { | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B283 = new Clipperz.Crypto.ECC.BinaryField.Curve({ | ||||
| 				modulus: new Clipperz.Crypto.ECC.BinaryField.Value('08000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 000010a1', 16), | ||||
| 				a: new Clipperz.Crypto.ECC.BinaryField.Value('1', 16), | ||||
| 				b: new Clipperz.Crypto.ECC.BinaryField.Value('027b680a c8b8596d a5a4af8a 19a0303f ca97fd76 45309fa2 a581485a f6263e31 3b79a2f5', 16), | ||||
| 				G: new Clipperz.Crypto.ECC.BinaryField.Point({ | ||||
| 					x: new Clipperz.Crypto.ECC.BinaryField.Value('05f93925 8db7dd90 e1934f8c 70b0dfec 2eed25b8 557eac9c 80e2e198 f8cdbecd 86b12053', 16), | ||||
| 					y: new Clipperz.Crypto.ECC.BinaryField.Value('03676854 fe24141c b98fe6d4 b20d02b4 516ff702 350eddb0 826779c8 13f0df45 be8112f4', 16) | ||||
| 				}), | ||||
| 				r: new Clipperz.Crypto.ECC.BinaryField.Value('03ffffff ffffffff ffffffff ffffffff ffffef90 399660fc 938a9016 5b042a7c efadb307', 16), | ||||
| 				h: new Clipperz.Crypto.ECC.BinaryField.Value('2', 16) | ||||
| 			}); | ||||
| 			 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			// | ||||
| 			//	Guide to Elliptic Curve Cryptography | ||||
| 			//	Darrel Hankerson, Alfred Menezes, Scott Vanstone | ||||
| 			//	- Pag: 56, Alorithm 2.43 | ||||
| 			//	 | ||||
| 			//----------------------------------------------------------------------------- | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module; | ||||
| 			Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().module = function(aValue) { | ||||
| 				var	result; | ||||
|  | ||||
| 				if (aValue.bitSize() > 564) { | ||||
| 					MochiKit.Logging.logWarning("ECC.StandarCurves.B283.finiteField().module: falling back to default implementation"); | ||||
| 					result = Clipperz.Crypto.ECC.StandardCurves._B283.finiteField().slowModule(aValue); | ||||
| 				} else { | ||||
| 					var	C, T; | ||||
| 					var i; | ||||
| 					 | ||||
| //console.log(">>> binaryField.finiteField.(improved)module"); | ||||
| 					C = aValue._value.slice(0); | ||||
| 					for (i=17; i>=9; i--) { | ||||
| 						T = C[i]; | ||||
| 						C[i-9] = (((C[i-9] ^ (T<<5) ^ (T<<10) ^ (T<<12) ^ (T<<17)) & 0xffffffff) >>> 0); | ||||
| 						C[i-8] = ((C[i-8] ^ (T>>>27) ^ (T>>>22) ^ (T>>>20) ^ (T>>>15)) >>> 0); | ||||
| 					} | ||||
| 					T = (C[8] >>> 27); | ||||
| 					C[0] = ((C[0] ^ T ^ ((T<<5) ^ (T<<7) ^ (T<<12)) & 0xffffffff) >>> 0); | ||||
| 					C[8] = (C[8] & 0x07ffffff); | ||||
|  | ||||
| 					for(i=9; i<=17; i++) { | ||||
| 						C[i] = 0; | ||||
| 					} | ||||
| 				 | ||||
| 					result = new Clipperz.Crypto.ECC.BinaryField.Value(C); | ||||
| //console.log("<<< binaryField.finiteField.(improved)module"); | ||||
| 				} | ||||
| 				 | ||||
| 				return result; | ||||
| 			}; | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.ECC.StandardCurves._B283; | ||||
| 	}, | ||||
|  | ||||
| 	//============================================================================== | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										850
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/PRNG.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										850
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/PRNG.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,850 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; | ||||
| }   | ||||
|  | ||||
| try { if (typeof(Clipperz.Crypto.SHA) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.SHA!"; | ||||
| }   | ||||
|  | ||||
| try { if (typeof(Clipperz.Crypto.AES) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.PRNG depends on Clipperz.Crypto.AES!"; | ||||
| }   | ||||
|  | ||||
| if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { Clipperz.Crypto.PRNG = {}; } | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| Clipperz.Crypto.PRNG.EntropyAccumulator = function(args) { | ||||
| 	args = args || {}; | ||||
| //	MochiKit.Base.bindMethods(this); | ||||
|  | ||||
| 	this._stack = new Clipperz.ByteArray(); | ||||
| 	this._maxStackLengthBeforeHashing = args.maxStackLengthBeforeHashing || 256; | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.PRNG.EntropyAccumulator.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'toString': function() { | ||||
| 		return "Clipperz.Crypto.PRNG.EntropyAccumulator"; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'stack': function() { | ||||
| 		return this._stack; | ||||
| 	}, | ||||
| 	 | ||||
| 	'setStack': function(aValue) { | ||||
| 		this._stack = aValue; | ||||
| 	}, | ||||
|  | ||||
| 	'resetStack': function() { | ||||
| 		this.stack().reset(); | ||||
| 	}, | ||||
| 	 | ||||
| 	'maxStackLengthBeforeHashing': function() { | ||||
| 		return this._maxStackLengthBeforeHashing; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'addRandomByte': function(aValue) { | ||||
| 		this.stack().appendByte(aValue); | ||||
| 				 | ||||
| 		if (this.stack().length() > this.maxStackLengthBeforeHashing()) { | ||||
| 			this.setStack(Clipperz.Crypto.SHA.sha_d256(this.stack())); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| Clipperz.Crypto.PRNG.RandomnessSource = function(args) { | ||||
| 	args = args || {}; | ||||
| 	MochiKit.Base.bindMethods(this); | ||||
|  | ||||
| 	this._generator = args.generator || null; | ||||
| 	this._sourceId = args.sourceId || null; | ||||
| 	this._boostMode = args.boostMode || false; | ||||
| 	 | ||||
| 	this._nextPoolIndex = 0; | ||||
| 	 | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.PRNG.RandomnessSource.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'generator': function() { | ||||
| 		return this._generator; | ||||
| 	}, | ||||
|  | ||||
| 	'setGenerator': function(aValue) { | ||||
| 		this._generator = aValue; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'boostMode': function() { | ||||
| 		return this._boostMode; | ||||
| 	}, | ||||
| 	 | ||||
| 	'setBoostMode': function(aValue) { | ||||
| 		this._boostMode = aValue; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	 | ||||
| 	'sourceId': function() { | ||||
| 		return this._sourceId; | ||||
| 	}, | ||||
|  | ||||
| 	'setSourceId': function(aValue) { | ||||
| 		this._sourceId = aValue; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'nextPoolIndex': function() { | ||||
| 		return this._nextPoolIndex; | ||||
| 	}, | ||||
| 	 | ||||
| 	'incrementNextPoolIndex': function() { | ||||
| 		this._nextPoolIndex = ((this._nextPoolIndex + 1) % this.generator().numberOfEntropyAccumulators()); | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'updateGeneratorWithValue': function(aRandomValue) { | ||||
| 		if (this.generator() != null) { | ||||
| 			this.generator().addRandomByte(this.sourceId(), this.nextPoolIndex(), aRandomValue); | ||||
| 			this.incrementNextPoolIndex(); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
| 	 | ||||
| Clipperz.Crypto.PRNG.TimeRandomnessSource = function(args) { | ||||
| 	args = args || {}; | ||||
| //	MochiKit.Base.bindMethods(this); | ||||
|  | ||||
| 	this._intervalTime = args.intervalTime || 1000; | ||||
| 	 | ||||
| 	Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); | ||||
|  | ||||
| 	this.collectEntropy(); | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.PRNG.TimeRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { | ||||
|  | ||||
| 	'intervalTime': function() { | ||||
| 		return this._intervalTime; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'collectEntropy': function() { | ||||
| 		var	now; | ||||
| 		var	entropyByte; | ||||
| 		var intervalTime; | ||||
| 		now = new Date(); | ||||
| 		entropyByte = (now.getTime() & 0xff); | ||||
| 		 | ||||
| 		intervalTime = this.intervalTime(); | ||||
| 		if (this.boostMode() == true) { | ||||
| 			intervalTime = intervalTime / 9; | ||||
| 		} | ||||
| 		 | ||||
| 		this.updateGeneratorWithValue(entropyByte); | ||||
| 		setTimeout(this.collectEntropy, intervalTime); | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'numberOfRandomBits': function() { | ||||
| 		return 5; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'pollingFrequency': function() { | ||||
| 		return 10; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //***************************************************************************** | ||||
|  | ||||
| Clipperz.Crypto.PRNG.MouseRandomnessSource = function(args) { | ||||
| 	args = args || {}; | ||||
|  | ||||
| 	Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); | ||||
|  | ||||
| 	this._numberOfBitsToCollectAtEachEvent = 4; | ||||
| 	this._randomBitsCollector = 0; | ||||
| 	this._numberOfRandomBitsCollected = 0; | ||||
| 	 | ||||
| 	MochiKit.Signal.connect(document, 'onmousemove', this, 'collectEntropy'); | ||||
|  | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.PRNG.MouseRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'numberOfBitsToCollectAtEachEvent': function() { | ||||
| 		return this._numberOfBitsToCollectAtEachEvent; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'randomBitsCollector': function() { | ||||
| 		return this._randomBitsCollector; | ||||
| 	}, | ||||
|  | ||||
| 	'setRandomBitsCollector': function(aValue) { | ||||
| 		this._randomBitsCollector = aValue; | ||||
| 	}, | ||||
|  | ||||
| 	'appendRandomBitsToRandomBitsCollector': function(aValue) { | ||||
| 		var collectedBits; | ||||
| 		var numberOfRandomBitsCollected; | ||||
| 		 | ||||
| 		numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); | ||||
| 		collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); | ||||
| 		this.setRandomBitsCollector(collectetBits); | ||||
| 		numberOfRandomBitsCollected += this.numberOfBitsToCollectAtEachEvent(); | ||||
| 		 | ||||
| 		if (numberOfRandomBitsCollected == 8) { | ||||
| 			this.updateGeneratorWithValue(collectetBits); | ||||
| 			numberOfRandomBitsCollected = 0; | ||||
| 			this.setRandomBitsCollector(0); | ||||
| 		} | ||||
| 		 | ||||
| 		this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'numberOfRandomBitsCollected': function() { | ||||
| 		return this._numberOfRandomBitsCollected; | ||||
| 	}, | ||||
|  | ||||
| 	'setNumberOfRandomBitsCollected': function(aValue) { | ||||
| 		this._numberOfRandomBitsCollected = aValue; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'collectEntropy': function(anEvent) { | ||||
| 		var mouseLocation; | ||||
| 		var randomBit; | ||||
| 		var mask; | ||||
| 		 | ||||
| 		mask = 0xffffffff >>> (32 - this.numberOfBitsToCollectAtEachEvent()); | ||||
| 		 | ||||
| 		mouseLocation = anEvent.mouse().client; | ||||
| 		randomBit = ((mouseLocation.x ^ mouseLocation.y) & mask); | ||||
| 		this.appendRandomBitsToRandomBitsCollector(randomBit) | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'numberOfRandomBits': function() { | ||||
| 		return 1; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'pollingFrequency': function() { | ||||
| 		return 10; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //***************************************************************************** | ||||
|  | ||||
| Clipperz.Crypto.PRNG.KeyboardRandomnessSource = function(args) { | ||||
| 	args = args || {}; | ||||
| 	Clipperz.Crypto.PRNG.RandomnessSource.call(this, args); | ||||
|  | ||||
| 	this._randomBitsCollector = 0; | ||||
| 	this._numberOfRandomBitsCollected = 0; | ||||
| 	 | ||||
| 	MochiKit.Signal.connect(document, 'onkeypress', this, 'collectEntropy'); | ||||
|  | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.PRNG.KeyboardRandomnessSource.prototype = MochiKit.Base.update(new Clipperz.Crypto.PRNG.RandomnessSource, { | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'randomBitsCollector': function() { | ||||
| 		return this._randomBitsCollector; | ||||
| 	}, | ||||
|  | ||||
| 	'setRandomBitsCollector': function(aValue) { | ||||
| 		this._randomBitsCollector = aValue; | ||||
| 	}, | ||||
|  | ||||
| 	'appendRandomBitToRandomBitsCollector': function(aValue) { | ||||
| 		var collectedBits; | ||||
| 		var numberOfRandomBitsCollected; | ||||
| 		 | ||||
| 		numberOfRandomBitsCollected = this.numberOfRandomBitsCollected(); | ||||
| 		collectetBits = this.randomBitsCollector() | (aValue << numberOfRandomBitsCollected); | ||||
| 		this.setRandomBitsCollector(collectetBits); | ||||
| 		numberOfRandomBitsCollected ++; | ||||
| 		 | ||||
| 		if (numberOfRandomBitsCollected == 8) { | ||||
| 			this.updateGeneratorWithValue(collectetBits); | ||||
| 			numberOfRandomBitsCollected = 0; | ||||
| 			this.setRandomBitsCollector(0); | ||||
| 		} | ||||
| 		 | ||||
| 		this.setNumberOfRandomBitsCollected(numberOfRandomBitsCollected) | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'numberOfRandomBitsCollected': function() { | ||||
| 		return this._numberOfRandomBitsCollected; | ||||
| 	}, | ||||
|  | ||||
| 	'setNumberOfRandomBitsCollected': function(aValue) { | ||||
| 		this._numberOfRandomBitsCollected = aValue; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'collectEntropy': function(anEvent) { | ||||
| /* | ||||
| 		var mouseLocation; | ||||
| 		var randomBit; | ||||
| 		 | ||||
| 		mouseLocation = anEvent.mouse().client; | ||||
| 			 | ||||
| 		randomBit = ((mouseLocation.x ^ mouseLocation.y) & 0x1); | ||||
| 		this.appendRandomBitToRandomBitsCollector(randomBit); | ||||
| */ | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'numberOfRandomBits': function() { | ||||
| 		return 1; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'pollingFrequency': function() { | ||||
| 		return 10; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| Clipperz.Crypto.PRNG.Fortuna = function(args) { | ||||
| 	var	i,c; | ||||
| 	 | ||||
| 	args = args || {}; | ||||
|  | ||||
| 	this._key = args.seed || null; | ||||
| 	if (this._key == null) { | ||||
| 		this._counter = 0; | ||||
| 		this._key = new Clipperz.ByteArray(); | ||||
| 	} else { | ||||
| 		this._counter = 1; | ||||
| 	} | ||||
| 	 | ||||
| 	this._aesKey = null; | ||||
| 	 | ||||
| 	this._firstPoolReseedLevel = args.firstPoolReseedLevel || 32 || 64; | ||||
| 	this._numberOfEntropyAccumulators = args.numberOfEntropyAccumulators || 32; | ||||
| 	 | ||||
| 	this._accumulators = []; | ||||
| 	c = this.numberOfEntropyAccumulators(); | ||||
| 	for (i=0; i<c; i++) { | ||||
| 		this._accumulators.push(new Clipperz.Crypto.PRNG.EntropyAccumulator()); | ||||
| 	} | ||||
|  | ||||
| 	this._randomnessSources = []; | ||||
| 	this._reseedCounter = 0; | ||||
| 	 | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.PRNG.Fortuna.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'toString': function() { | ||||
| 		return "Clipperz.Crypto.PRNG.Fortuna"; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'key': function() { | ||||
| 		return this._key; | ||||
| 	}, | ||||
|  | ||||
| 	'setKey': function(aValue) { | ||||
| 		this._key = aValue; | ||||
| 		this._aesKey = null; | ||||
| 	}, | ||||
| 	 | ||||
| 	'aesKey': function() { | ||||
| 		if (this._aesKey == null) { | ||||
| 			this._aesKey = new Clipperz.Crypto.AES.Key({key:this.key()}); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._aesKey; | ||||
| 	}, | ||||
| 	 | ||||
| 	'accumulators': function() { | ||||
| 		return this._accumulators; | ||||
| 	}, | ||||
| 	 | ||||
| 	'firstPoolReseedLevel': function() { | ||||
| 		return this._firstPoolReseedLevel; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'reseedCounter': function() { | ||||
| 		return this._reseedCounter; | ||||
| 	}, | ||||
|  | ||||
| 	'incrementReseedCounter': function() { | ||||
| 		this._reseedCounter = this._reseedCounter +1; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'reseed': function() { | ||||
| 		var	newKeySeed; | ||||
| 		var reseedCounter; | ||||
| 		var	reseedCounterMask; | ||||
| 		var i, c; | ||||
| 		 | ||||
| 		newKeySeed = this.key(); | ||||
| 		this.incrementReseedCounter(); | ||||
| 		reseedCounter = this.reseedCounter(); | ||||
| 		 | ||||
| 		c = this.numberOfEntropyAccumulators(); | ||||
| 		reseedCounterMask = 0xffffffff >>> (32 - c); | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			if ((i == 0) || ((reseedCounter & (reseedCounterMask >>> (c - i))) == 0)) { | ||||
| 				newKeySeed.appendBlock(this.accumulators()[i].stack()); | ||||
| 				this.accumulators()[i].resetStack(); | ||||
| 			}  | ||||
| 		} | ||||
| 		 | ||||
| 		if (reseedCounter == 1) { | ||||
| 			c = this.randomnessSources().length; | ||||
| 			for (i=0; i<c; i++) { | ||||
| 				this.randomnessSources()[i].setBoostMode(false); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		this.setKey(Clipperz.Crypto.SHA.sha_d256(newKeySeed)); | ||||
| 		if (reseedCounter == 1) { | ||||
| //MochiKit.Logging.logDebug("### PRNG.readyToGenerateRandomBytes"); | ||||
| Clipperz.log("### PRNG.readyToGenerateRandomBytes"); | ||||
| 			MochiKit.Signal.signal(this, 'readyToGenerateRandomBytes'); | ||||
| 		} | ||||
| 		MochiKit.Signal.signal(this, 'reseeded'); | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'isReadyToGenerateRandomValues': function() { | ||||
| 		return this.reseedCounter() != 0; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'entropyLevel': function() { | ||||
| 		return this.accumulators()[0].stack().length() + (this.reseedCounter() * this.firstPoolReseedLevel()); | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'counter': function() { | ||||
| 		return this._counter; | ||||
| 	}, | ||||
| 	 | ||||
| 	'incrementCounter': function() { | ||||
| 		this._counter += 1; | ||||
| 	}, | ||||
| 	 | ||||
| 	'counterBlock': function() { | ||||
| 		var result; | ||||
|  | ||||
| 		result = new Clipperz.ByteArray().appendWords(this.counter(), 0, 0, 0); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'getRandomBlock': function() { | ||||
| 		var result; | ||||
|  | ||||
| 		result = new Clipperz.ByteArray(Clipperz.Crypto.AES.encryptBlock(this.aesKey(), this.counterBlock().arrayValues())); | ||||
| 		this.incrementCounter(); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'getRandomBytes': function(aSize) { | ||||
| 		var result; | ||||
|  | ||||
| 		if (this.isReadyToGenerateRandomValues()) { | ||||
| 			var i,c; | ||||
| 			var newKey; | ||||
| 			 | ||||
| 			result = new Clipperz.ByteArray(); | ||||
| 		 | ||||
| 			c = Math.ceil(aSize / (128 / 8)); | ||||
| 			for (i=0; i<c; i++) { | ||||
| 				result.appendBlock(this.getRandomBlock()); | ||||
| 			} | ||||
|  | ||||
| 			if (result.length() != aSize) { | ||||
| 				result = result.split(0, aSize); | ||||
| 			} | ||||
| 			 | ||||
| 			newKey = this.getRandomBlock().appendBlock(this.getRandomBlock()); | ||||
| 			this.setKey(newKey); | ||||
| 		} else { | ||||
| MochiKit.Logging.logWarning("Fortuna generator has not enough entropy, yet!"); | ||||
| 			throw Clipperz.Crypto.PRNG.exception.NotEnoughEntropy; | ||||
| 		} | ||||
|  | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'addRandomByte': function(aSourceId, aPoolId, aRandomValue) { | ||||
| 		var	selectedAccumulator; | ||||
|  | ||||
| 		selectedAccumulator = this.accumulators()[aPoolId]; | ||||
| 		selectedAccumulator.addRandomByte(aRandomValue); | ||||
|  | ||||
| 		if (aPoolId == 0) { | ||||
| 			MochiKit.Signal.signal(this, 'addedRandomByte') | ||||
| 			if (selectedAccumulator.stack().length() > this.firstPoolReseedLevel()) { | ||||
| 				this.reseed(); | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	 | ||||
| 	'numberOfEntropyAccumulators': function() { | ||||
| 		return this._numberOfEntropyAccumulators; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'randomnessSources': function() { | ||||
| 		return this._randomnessSources; | ||||
| 	}, | ||||
| 	 | ||||
| 	'addRandomnessSource': function(aRandomnessSource) { | ||||
| 		aRandomnessSource.setGenerator(this); | ||||
| 		aRandomnessSource.setSourceId(this.randomnessSources().length); | ||||
| 		this.randomnessSources().push(aRandomnessSource); | ||||
| 		 | ||||
| 		if (this.isReadyToGenerateRandomValues() == false) { | ||||
| 			aRandomnessSource.setBoostMode(true); | ||||
| 		} | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'deferredEntropyCollection': function(aValue) { | ||||
| 		var result; | ||||
|  | ||||
| //MochiKit.Logging.logDebug(">>> PRNG.deferredEntropyCollection"); | ||||
|  | ||||
| 		if (this.isReadyToGenerateRandomValues()) { | ||||
| //MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 1"); | ||||
| 			result = aValue; | ||||
| 		} else { | ||||
| //MochiKit.Logging.logDebug("--- PRNG.deferredEntropyCollection - 2"); | ||||
| 			var deferredResult; | ||||
|  | ||||
| //			Clipperz.NotificationCenter.notify(this, 'updatedProgressState', 'collectingEntropy', true); | ||||
|  | ||||
| 			deferredResult = new Clipperz.Async.Deferred("PRNG.deferredEntropyCollection"); | ||||
| //			deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.1 - PRNG.deferredEntropyCollection - 1: " + res); return res;}); | ||||
| 			deferredResult.addCallback(MochiKit.Base.partial(MochiKit.Async.succeed, aValue)); | ||||
| //			deferredResult.addBoth(function(res) {MochiKit.Logging.logDebug("1.2.2 - PRNG.deferredEntropyCollection - 2: " + res); return res;}); | ||||
| 			MochiKit.Signal.connect(this, | ||||
| 									'readyToGenerateRandomBytes', | ||||
| 									deferredResult, | ||||
| 									'callback'); | ||||
| 									 | ||||
| 			result = deferredResult; | ||||
| 		} | ||||
| //MochiKit.Logging.logDebug("<<< PRNG.deferredEntropyCollection - result: " + result); | ||||
|  | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'fastEntropyAccumulationForTestingPurpose': function() { | ||||
| 		while (! this.isReadyToGenerateRandomValues()) { | ||||
| 			this.addRandomByte(Math.floor(Math.random() * 32), Math.floor(Math.random() * 32), Math.floor(Math.random() * 256)); | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'dump': function(appendToDoc) { | ||||
| 		var tbl; | ||||
| 		var i,c; | ||||
| 		 | ||||
| 		tbl = document.createElement("table"); | ||||
| 		tbl.border = 0; | ||||
| 		with (tbl.style) { | ||||
| 			border = "1px solid lightgrey"; | ||||
| 			fontFamily = 'Helvetica, Arial, sans-serif'; | ||||
| 			fontSize = '8pt'; | ||||
| 			//borderCollapse = "collapse"; | ||||
| 		} | ||||
| 		var hdr = tbl.createTHead(); | ||||
| 		var hdrtr = hdr.insertRow(0); | ||||
| 		// document.createElement("tr"); | ||||
| 		{ | ||||
| 			var ntd; | ||||
| 			 | ||||
| 			ntd = hdrtr.insertCell(0); | ||||
| 			ntd.style.borderBottom = "1px solid lightgrey"; | ||||
| 			ntd.style.borderRight = "1px solid lightgrey"; | ||||
| 			ntd.appendChild(document.createTextNode("#")); | ||||
|  | ||||
| 			ntd = hdrtr.insertCell(1); | ||||
| 			ntd.style.borderBottom = "1px solid lightgrey"; | ||||
| 			ntd.style.borderRight = "1px solid lightgrey"; | ||||
| 			ntd.appendChild(document.createTextNode("s")); | ||||
|  | ||||
| 			ntd = hdrtr.insertCell(2); | ||||
| 			ntd.colSpan = this.firstPoolReseedLevel(); | ||||
| 			ntd.style.borderBottom = "1px solid lightgrey"; | ||||
| 			ntd.style.borderRight = "1px solid lightgrey"; | ||||
| 			ntd.appendChild(document.createTextNode("base values")); | ||||
| 			 | ||||
| 			ntd = hdrtr.insertCell(3); | ||||
| 			ntd.colSpan = 20; | ||||
| 			ntd.style.borderBottom = "1px solid lightgrey"; | ||||
| 			ntd.appendChild(document.createTextNode("extra values")); | ||||
|  | ||||
| 		} | ||||
|  | ||||
| 		c = this.accumulators().length; | ||||
| 		for (i=0; i<c ; i++) { | ||||
| 			var	currentAccumulator; | ||||
| 			var bdytr; | ||||
| 			var bdytd; | ||||
| 			var ii, cc; | ||||
|  | ||||
| 			currentAccumulator = this.accumulators()[i] | ||||
| 			 | ||||
| 			bdytr = tbl.insertRow(true); | ||||
| 			 | ||||
| 			bdytd = bdytr.insertCell(0); | ||||
| 			bdytd.style.borderRight = "1px solid lightgrey"; | ||||
| 			bdytd.style.color = "lightgrey"; | ||||
| 			bdytd.appendChild(document.createTextNode("" + i)); | ||||
|  | ||||
| 			bdytd = bdytr.insertCell(1); | ||||
| 			bdytd.style.borderRight = "1px solid lightgrey"; | ||||
| 			bdytd.style.color = "gray"; | ||||
| 			bdytd.appendChild(document.createTextNode("" + currentAccumulator.stack().length())); | ||||
|  | ||||
|  | ||||
| 			cc = Math.max(currentAccumulator.stack().length(), this.firstPoolReseedLevel()); | ||||
| 			for (ii=0; ii<cc; ii++) { | ||||
| 				var cellText; | ||||
| 				 | ||||
| 				bdytd = bdytr.insertCell(ii + 2); | ||||
| 				 | ||||
| 				if (ii < currentAccumulator.stack().length()) { | ||||
| 					cellText = Clipperz.ByteArray.byteToHex(currentAccumulator.stack().byteAtIndex(ii)); | ||||
| 				} else { | ||||
| 					cellText = "_"; | ||||
| 				} | ||||
| 				 | ||||
| 				if (ii == (this.firstPoolReseedLevel() - 1)) { | ||||
| 					bdytd.style.borderRight = "1px solid lightgrey"; | ||||
| 				} | ||||
| 				 | ||||
| 				bdytd.appendChild(document.createTextNode(cellText)); | ||||
| 			} | ||||
| 			 | ||||
| 		} | ||||
| 		 | ||||
|  | ||||
| 		if (appendToDoc) { | ||||
| 			var ne = document.createElement("div"); | ||||
| 			ne.id = "entropyGeneratorStatus"; | ||||
| 			with (ne.style) { | ||||
| 				fontFamily = "Courier New, monospace"; | ||||
| 				fontSize = "12px"; | ||||
| 				lineHeight = "16px"; | ||||
| 				borderTop = "1px solid black"; | ||||
| 				padding = "10px"; | ||||
| 			} | ||||
| 			if (document.getElementById(ne.id)) { | ||||
| 				MochiKit.DOM.swapDOM(ne.id, ne); | ||||
| 			} else { | ||||
| 				document.body.appendChild(ne); | ||||
| 			} | ||||
| 			ne.appendChild(tbl); | ||||
| 		} | ||||
|  | ||||
| 		return tbl; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| Clipperz.Crypto.PRNG.Random = function(args) { | ||||
| 	args = args || {}; | ||||
| //	MochiKit.Base.bindMethods(this); | ||||
|  | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.PRNG.Random.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'toString': function() { | ||||
| 		return "Clipperz.Crypto.PRNG.Random"; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'getRandomBytes': function(aSize) { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.PRNG.Random.getRandomBytes"); | ||||
| 		var	result; | ||||
| 		var i,c; | ||||
| 		 | ||||
| 		result = new Clipperz.ByteArray() | ||||
| 		c = aSize || 1; | ||||
| 		for (i=0; i<c; i++) { | ||||
| 			result.appendByte((Math.random()*255) & 0xff); | ||||
| 		} | ||||
| 		 | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.PRNG.Random.getRandomBytes"); | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| _clipperz_crypt_prng_defaultPRNG = null; | ||||
|  | ||||
| Clipperz.Crypto.PRNG.defaultRandomGenerator = function() { | ||||
| 	if (_clipperz_crypt_prng_defaultPRNG == null) { | ||||
| 		_clipperz_crypt_prng_defaultPRNG = new Clipperz.Crypto.PRNG.Fortuna(); | ||||
|  | ||||
| 		//............................................................. | ||||
| 		// | ||||
| 		//		TimeRandomnessSource | ||||
| 		// | ||||
| 		//............................................................. | ||||
| 		{ | ||||
| 			var newRandomnessSource; | ||||
| 		 | ||||
| 			newRandomnessSource = new Clipperz.Crypto.PRNG.TimeRandomnessSource({intervalTime:111}); | ||||
| 			_clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); | ||||
| 		} | ||||
|  | ||||
| 		//............................................................. | ||||
| 		// | ||||
| 		//		MouseRandomnessSource | ||||
| 		// | ||||
| 		//............................................................. | ||||
| 		{ | ||||
| 			var	newRandomnessSource; | ||||
| 			 | ||||
| 			newRandomnessSource = new Clipperz.Crypto.PRNG.MouseRandomnessSource(); | ||||
| 			_clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); | ||||
| 		} | ||||
|  | ||||
| 		//............................................................. | ||||
| 		// | ||||
| 		//		KeyboardRandomnessSource | ||||
| 		// | ||||
| 		//............................................................. | ||||
| 		{ | ||||
| 			var	newRandomnessSource; | ||||
| 			 | ||||
| 			newRandomnessSource = new Clipperz.Crypto.PRNG.KeyboardRandomnessSource(); | ||||
| 			_clipperz_crypt_prng_defaultPRNG.addRandomnessSource(newRandomnessSource); | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	return _clipperz_crypt_prng_defaultPRNG; | ||||
| }; | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| Clipperz.Crypto.PRNG.exception =  { | ||||
| 	NotEnoughEntropy: new MochiKit.Base.NamedError("Clipperz.Crypto.PRNG.exception.NotEnoughEntropy")  | ||||
| }; | ||||
|  | ||||
|  | ||||
| MochiKit.DOM.addLoadEvent(Clipperz.Crypto.PRNG.defaultRandomGenerator); | ||||
							
								
								
									
										146
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/RSA.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/RSA.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.RSA depends on Clipperz.Crypto.BigInt!"; | ||||
| }   | ||||
|  | ||||
| if (typeof(Clipperz.Crypto.RSA) == 'undefined') { Clipperz.Crypto.RSA = {}; } | ||||
|  | ||||
| Clipperz.Crypto.RSA.VERSION = "0.1"; | ||||
| Clipperz.Crypto.RSA.NAME = "Clipperz.RSA"; | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| MochiKit.Base.update(Clipperz.Crypto.RSA, { | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'publicKeyWithValues': function (e, d, n) { | ||||
| 		var	result; | ||||
| 		 | ||||
| 		result = {}; | ||||
|  | ||||
| 		if (e.isBigInt) { | ||||
| 			result.e = e; | ||||
| 		} else { | ||||
| 			result.e = new Clipperz.Crypto.BigInt(e, 16); | ||||
| 		} | ||||
| 		 | ||||
| 		if (d.isBigInt) { | ||||
| 			result.d = d; | ||||
| 		} else { | ||||
| 			result.d = new Clipperz.Crypto.BigInt(d, 16); | ||||
| 		} | ||||
| 		 | ||||
| 		if (n.isBigInt) { | ||||
| 			result.n = n; | ||||
| 		} else { | ||||
| 			result.n = new Clipperz.Crypto.BigInt(n, 16); | ||||
| 		} | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	'privateKeyWithValues': function(e, d, n) { | ||||
| 		return Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'encryptUsingPublicKey': function (aKey, aMessage) { | ||||
| 		var	messageValue; | ||||
| 		var	result; | ||||
| 		 | ||||
| 		messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); | ||||
| 		result = messageValue.powerModule(aKey.e, aKey.n); | ||||
| 		 | ||||
| 		return result.asString(16); | ||||
| 	}, | ||||
|  | ||||
| 	//............................................................................. | ||||
|  | ||||
| 	'decryptUsingPublicKey': function (aKey, aMessage) { | ||||
| 		return Clipperz.Crypto.RSA.encryptUsingPublicKey(aKey, aMessage); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'encryptUsingPrivateKey': function (aKey, aMessage) { | ||||
| 		var	messageValue; | ||||
| 		var	result; | ||||
| 		 | ||||
| 		messageValue = new Clipperz.Crypto.BigInt(aMessage, 16); | ||||
| 		result = messageValue.powerModule(aKey.d, aKey.n); | ||||
| 		 | ||||
| 		return result.asString(16); | ||||
| 	}, | ||||
|  | ||||
| 	//............................................................................. | ||||
|  | ||||
| 	'decryptUsingPrivateKey': function (aKey, aMessage) { | ||||
| 		return Clipperz.Crypto.RSA.encryptUsingPrivateKey(aKey, aMessage); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	 | ||||
| 	'generatePublicKey': function(aNumberOfBits) { | ||||
| 		var	result; | ||||
| 		var	e; | ||||
| 		var	d; | ||||
| 		var	n; | ||||
| 		 | ||||
| 		e = new Clipperz.Crypto.BigInt("10001", 16); | ||||
|  | ||||
| 		{ | ||||
| 			var p, q; | ||||
| 			var	phi; | ||||
|  | ||||
| 			do { | ||||
| 				p = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits); | ||||
| 			} while (p.module(e).equals(1)); | ||||
| 			 | ||||
| 			do { | ||||
| 				q = Clipperz.Crypto.BigInt.randomPrime(aNumberOfBits); | ||||
| 			} while ((q.equals(p)) || (q.module(e).equals(1))); | ||||
|  | ||||
| 			n = p.multiply(q); | ||||
| 			phi = (p.subtract(1).multiply(q.subtract(1))); | ||||
| 			d = e.powerModule(-1, phi); | ||||
| 		} | ||||
| 		 | ||||
| 		result = Clipperz.Crypto.RSA.publicKeyWithValues(e, d, n); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
							
								
								
									
										296
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/SHA.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/SHA.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,296 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; | ||||
| }   | ||||
|  | ||||
| if (typeof(Clipperz.Crypto) == 'undefined') { Clipperz.Crypto = {}; } | ||||
| if (typeof(Clipperz.Crypto.SHA) == 'undefined') { Clipperz.Crypto.SHA = {}; } | ||||
|  | ||||
| Clipperz.Crypto.SHA.VERSION = "0.3"; | ||||
| Clipperz.Crypto.SHA.NAME = "Clipperz.Crypto.SHA"; | ||||
|  | ||||
| MochiKit.Base.update(Clipperz.Crypto.SHA, { | ||||
|  | ||||
| 	'__repr__': function () { | ||||
| 		return "[" + this.NAME + " " + this.VERSION + "]"; | ||||
| 	}, | ||||
|  | ||||
| 	'toString': function () { | ||||
| 		return this.__repr__(); | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'rotateRight': function(aValue, aNumberOfBits) { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.SHA.rotateRight"); | ||||
| 		var result; | ||||
| 		 | ||||
| 		result = (aValue >>> aNumberOfBits) | (aValue << (32 - aNumberOfBits)); | ||||
| 		 | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.SHA.rotateRight"); | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	'shiftRight': function(aValue, aNumberOfBits) { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.SHA.shiftRight"); | ||||
| 		var result; | ||||
| 		 | ||||
| 		result = aValue >>> aNumberOfBits; | ||||
| 		 | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.SHA.shiftRight"); | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'safeAdd': function() { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.SHA.safeAdd"); | ||||
| 		var	result; | ||||
| 		var	i, c; | ||||
| 		 | ||||
| 		result = arguments[0]; | ||||
| 		c = arguments.length; | ||||
| 		for (i=1; i<c; i++) { | ||||
| 			var	lowerBytesSum; | ||||
|  | ||||
| 			lowerBytesSum = (result & 0xffff) + (arguments[i] & 0xffff); | ||||
| 			result = (((result >> 16) + (arguments[i] >> 16) + (lowerBytesSum >> 16)) << 16) | (lowerBytesSum & 0xffff); | ||||
| 		} | ||||
| 		 | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.SHA.safeAdd"); | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'sha256_array': function(aValue) { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256_array"); | ||||
| 		var	result; | ||||
| 		var	message; | ||||
| 		var h0, h1, h2, h3, h4, h5, h6, h7; | ||||
| 		var	k; | ||||
| 		var	messageLength; | ||||
| 		var	messageLengthInBits; | ||||
| 		var	_i, _c; | ||||
| 		var charBits; | ||||
| 		var rotateRight; | ||||
| 		var shiftRight; | ||||
| 		var safeAdd; | ||||
| 		var	bytesPerBlock; | ||||
| 		var currentMessageIndex; | ||||
|  | ||||
| 		bytesPerBlock = 512/8; | ||||
| 		rotateRight = Clipperz.Crypto.SHA.rotateRight; | ||||
| 		shiftRight = Clipperz.Crypto.SHA.shiftRight; | ||||
| 		safeAdd = Clipperz.Crypto.SHA.safeAdd; | ||||
| 		 | ||||
| 		charBits = 8; | ||||
| 		 | ||||
| 		h0 = 0x6a09e667; | ||||
| 		h1 = 0xbb67ae85; | ||||
| 		h2 = 0x3c6ef372; | ||||
| 		h3 = 0xa54ff53a; | ||||
| 		h4 = 0x510e527f; | ||||
| 		h5 = 0x9b05688c; | ||||
| 		h6 = 0x1f83d9ab; | ||||
| 		h7 = 0x5be0cd19; | ||||
|  | ||||
| 		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]; | ||||
|  | ||||
| 		message = aValue; | ||||
| 		messageLength = message.length; | ||||
|  | ||||
| 		//Pre-processing: | ||||
| 		message.push(0x80);	//	append a single "1" bit to  message | ||||
|  | ||||
| 		_c = (512 - (((messageLength + 1) * charBits) % 512) - 64) / charBits; | ||||
| 		if (_c < 0) { | ||||
| 			_c = _c + (512 / charBits); | ||||
| 		} | ||||
|  | ||||
| 		for (_i=0; _i<_c; _i++) { | ||||
| 			message.push(0x00);			//	append "0" bits until message length ≡ 448 ≡ -64 (mod 512) | ||||
| 		} | ||||
|  | ||||
| 		messageLengthInBits = messageLength * charBits; | ||||
| 		message.push(0x00);	//	the 4 most high byte are alway 0 as message length is represented with a 32bit value; | ||||
| 		message.push(0x00); | ||||
| 		message.push(0x00); | ||||
| 		message.push(0x00); | ||||
| 		message.push((messageLengthInBits >> 24)	& 0xff); | ||||
| 		message.push((messageLengthInBits >> 16)	& 0xff); | ||||
| 		message.push((messageLengthInBits >> 8)		& 0xff); | ||||
| 		message.push( messageLengthInBits			& 0xff); | ||||
|  | ||||
| 		currentMessageIndex = 0; | ||||
| 		while(currentMessageIndex < message.length) { | ||||
| 			var	w; | ||||
| 			var	a, b, c, d, e, f, g, h; | ||||
|  | ||||
| 			w = Array(64); | ||||
|  | ||||
| 			_c = 16; | ||||
| 			for (_i=0; _i<_c; _i++) { | ||||
| 				var _j; | ||||
| 				 | ||||
| 				_j = currentMessageIndex + _i*4; | ||||
| 				w[_i] = (message[_j] << 24) | (message[_j + 1] << 16) | (message[_j + 2] << 8) | (message[_j + 3] << 0); | ||||
| 			} | ||||
|  | ||||
| 			_c = 64; | ||||
| 			for (_i=16; _i<_c; _i++) { | ||||
| 				var	s0, s1; | ||||
| 				 | ||||
| 				s0 = (rotateRight(w[_i-15], 7)) ^ (rotateRight(w[_i-15], 18)) ^ (shiftRight(w[_i-15], 3)); | ||||
| 				s1 = (rotateRight(w[_i-2], 17)) ^ (rotateRight(w[_i-2], 19)) ^ (shiftRight(w[_i-2], 10)); | ||||
| 				w[_i] = safeAdd(w[_i-16], s0, w[_i-7], s1); | ||||
| 			} | ||||
|  | ||||
| 			a=h0; b=h1; c=h2; d=h3; e=h4; f=h5; g=h6; h=h7; | ||||
|  | ||||
| 			_c = 64; | ||||
| 			for (_i=0; _i<_c; _i++) { | ||||
| 				var s0, s1, ch, maj, t1, t2; | ||||
| 				 | ||||
| 				s0  = (rotateRight(a, 2)) ^ (rotateRight(a, 13)) ^ (rotateRight(a, 22)); | ||||
| 				maj = (a & b) ^ (a & c) ^ (b & c); | ||||
| 				t2  = safeAdd(s0, maj); | ||||
| 				s1  = (rotateRight(e, 6)) ^ (rotateRight(e, 11)) ^ (rotateRight(e, 25)); | ||||
| 				ch  = (e & f) ^ ((~e) & g); | ||||
| 				t1  = safeAdd(h, s1, ch, k[_i], w[_i]); | ||||
|  | ||||
| 				h = g; | ||||
| 				g = f; | ||||
| 				f = e; | ||||
| 				e = safeAdd(d, t1); | ||||
| 				d = c; | ||||
| 				c = b; | ||||
| 				b = a; | ||||
| 				a = safeAdd(t1, t2); | ||||
| 			} | ||||
|  | ||||
| 		    h0 = safeAdd(h0, a); | ||||
| 		    h1 = safeAdd(h1, b); | ||||
| 		    h2 = safeAdd(h2, c); | ||||
| 		    h3 = safeAdd(h3, d); | ||||
| 		    h4 = safeAdd(h4, e); | ||||
| 		    h5 = safeAdd(h5, f); | ||||
| 		    h6 = safeAdd(h6, g); | ||||
| 		    h7 = safeAdd(h7, h); | ||||
| 			 | ||||
| 			currentMessageIndex += bytesPerBlock; | ||||
| 		} | ||||
|  | ||||
| 		result = new Array(256/8); | ||||
| 		result[0]  = (h0 >> 24)	& 0xff; | ||||
| 		result[1]  = (h0 >> 16)	& 0xff; | ||||
| 		result[2]  = (h0 >> 8)	& 0xff; | ||||
| 		result[3]  =  h0		& 0xff; | ||||
|  | ||||
| 		result[4]  = (h1 >> 24)	& 0xff; | ||||
| 		result[5]  = (h1 >> 16)	& 0xff; | ||||
| 		result[6]  = (h1 >> 8)	& 0xff; | ||||
| 		result[7]  =  h1		& 0xff; | ||||
|  | ||||
| 		result[8]  = (h2 >> 24)	& 0xff; | ||||
| 		result[9]  = (h2 >> 16)	& 0xff; | ||||
| 		result[10] = (h2 >> 8)	& 0xff; | ||||
| 		result[11] =  h2		& 0xff; | ||||
| 		 | ||||
| 		result[12] = (h3 >> 24)	& 0xff; | ||||
| 		result[13] = (h3 >> 16)	& 0xff; | ||||
| 		result[14] = (h3 >> 8)	& 0xff; | ||||
| 		result[15] =  h3		& 0xff; | ||||
|  | ||||
| 		result[16] = (h4 >> 24)	& 0xff; | ||||
| 		result[17] = (h4 >> 16)	& 0xff; | ||||
| 		result[18] = (h4 >> 8)	& 0xff; | ||||
| 		result[19] =  h4		& 0xff; | ||||
|  | ||||
| 		result[20] = (h5 >> 24)	& 0xff; | ||||
| 		result[21] = (h5 >> 16)	& 0xff; | ||||
| 		result[22] = (h5 >> 8)	& 0xff; | ||||
| 		result[23] =  h5	 	& 0xff; | ||||
|  | ||||
| 		result[24] = (h6 >> 24)	& 0xff; | ||||
| 		result[25] = (h6 >> 16)	& 0xff; | ||||
| 		result[26] = (h6 >> 8)	& 0xff; | ||||
| 		result[27] =  h6		& 0xff; | ||||
| 			 | ||||
| 		result[28] = (h7 >> 24)	& 0xff; | ||||
| 		result[29] = (h7 >> 16)	& 0xff; | ||||
| 		result[30] = (h7 >> 8)	& 0xff; | ||||
| 		result[31] =  h7		& 0xff; | ||||
| 		 | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256_array"); | ||||
| 		return result; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'sha256': function(aValue) { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.SHA.sha256"); | ||||
| 		var result; | ||||
| 		var resultArray; | ||||
| 		var	valueArray; | ||||
| 		 | ||||
| 		valueArray = aValue.arrayValues(); | ||||
| 		resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray); | ||||
| 		 | ||||
| 		result = new Clipperz.ByteArray(resultArray); | ||||
| 		 | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256"); | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'sha_d256': function(aValue) { | ||||
| //Clipperz.Profile.start("Clipperz.Crypto.SHA.sha_d256"); | ||||
| 		var result; | ||||
| 		var resultArray; | ||||
| 		var	valueArray; | ||||
| 		 | ||||
| 		valueArray = aValue.arrayValues(); | ||||
| 		resultArray = Clipperz.Crypto.SHA.sha256_array(valueArray); | ||||
| 		resultArray = Clipperz.Crypto.SHA.sha256_array(resultArray); | ||||
| 		 | ||||
| 		result = new Clipperz.ByteArray(resultArray); | ||||
| 		 | ||||
| //Clipperz.Profile.stop("Clipperz.Crypto.SHA.sha256"); | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//----------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| 	 | ||||
| }); | ||||
							
								
								
									
										326
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/SRP.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										326
									
								
								frontend/gamma/js/ClipperzCryptoLibrary/SRP.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,326 @@ | ||||
| /* | ||||
|  | ||||
| Copyright 2008-2013 Clipperz Srl | ||||
|  | ||||
| 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 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 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. If not, see http://www.gnu.org/licenses/. | ||||
|  | ||||
| */ | ||||
|  | ||||
| try { if (typeof(Clipperz.ByteArray) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.PRNG depends on Clipperz.ByteArray!"; | ||||
| }   | ||||
|  | ||||
| try { if (typeof(Clipperz.Crypto.BigInt) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.BigInt!"; | ||||
| }   | ||||
|  | ||||
| try { if (typeof(Clipperz.Crypto.PRNG) == 'undefined') { throw ""; }} catch (e) { | ||||
| 	throw "Clipperz.Crypto.SRP depends on Clipperz.Crypto.PRNG!"; | ||||
| }   | ||||
|  | ||||
| if (typeof(Clipperz.Crypto.SRP) == 'undefined') { Clipperz.Crypto.SRP = {}; } | ||||
|  | ||||
| Clipperz.Crypto.SRP.VERSION = "0.1"; | ||||
| Clipperz.Crypto.SRP.NAME = "Clipperz.Crypto.SRP"; | ||||
|  | ||||
| //############################################################################# | ||||
|  | ||||
| MochiKit.Base.update(Clipperz.Crypto.SRP, { | ||||
|  | ||||
| 	'_n': null, | ||||
| 	'_g': null, | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'n': function() { | ||||
| 		if (Clipperz.Crypto.SRP._n == null) { | ||||
| 		 	Clipperz.Crypto.SRP._n = new Clipperz.Crypto.BigInt("115b8b692e0e045692cf280b436735c77a5a9e8a9e7ed56c965f87db5b2a2ece3", 16); | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.SRP._n; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'g': function() { | ||||
| 		if (Clipperz.Crypto.SRP._g == null) { | ||||
| 			Clipperz.Crypto.SRP._g = new Clipperz.Crypto.BigInt(2);	//	eventually 5 (as suggested on the Diffi-Helmann documentation) | ||||
| 		} | ||||
| 		 | ||||
| 		return Clipperz.Crypto.SRP._g; | ||||
| 	}, | ||||
|  | ||||
| 	//----------------------------------------------------------------------------- | ||||
|  | ||||
| 	'exception': { | ||||
| 		'InvalidValue': new MochiKit.Base.NamedError("Clipperz.Crypto.SRP.exception.InvalidValue")  | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
| 	__syntaxFix__: "syntax fix" | ||||
|  | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
| // | ||||
| //		S R P   C o n n e c t i o n     version 1.0 | ||||
| // | ||||
| //============================================================================= | ||||
| Clipperz.Crypto.SRP.Connection = function (args) { | ||||
| 	args = args || {}; | ||||
|  | ||||
| 	this._C = args.C; | ||||
| 	this._P = args.P; | ||||
| 	this.hash = args.hash; | ||||
|  | ||||
| 	this._a = null; | ||||
| 	this._A = null; | ||||
| 	 | ||||
| 	this._s = null; | ||||
| 	this._B = null; | ||||
|  | ||||
| 	this._x = null; | ||||
| 	 | ||||
| 	this._u = null; | ||||
| 	this._K = null; | ||||
| 	this._M1 = null; | ||||
| 	this._M2 = null; | ||||
| 	 | ||||
| 	this._sessionKey = null; | ||||
|  | ||||
| 	return this; | ||||
| } | ||||
|  | ||||
| Clipperz.Crypto.SRP.Connection.prototype = MochiKit.Base.update(null, { | ||||
|  | ||||
| 	'toString': function () { | ||||
| 		return "Clipperz.Crypto.SRP.Connection (username: " + this.username() + "). Status: " + this.statusDescription(); | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'C': function () { | ||||
| 		return this._C; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'P': function () { | ||||
| 		return this._P; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'a': function () { | ||||
| 		if (this._a == null) { | ||||
| 			this._a = new Clipperz.Crypto.BigInt(Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2), 16); | ||||
| //			this._a = new Clipperz.Crypto.BigInt("37532428169486597638072888476611365392249575518156687476805936694442691012367", 10); | ||||
| //MochiKit.Logging.logDebug("SRP a: " + this._a); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._a; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'A': function () { | ||||
| 		if (this._A == null) { | ||||
| 			//	Warning: this value should be strictly greater than zero: how should we perform this check? | ||||
| 			this._A = Clipperz.Crypto.SRP.g().powerModule(this.a(), Clipperz.Crypto.SRP.n()); | ||||
| 			 | ||||
| 			if (this._A.equals(0)) { | ||||
| MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'A' to 0."); | ||||
| 				throw Clipperz.Crypto.SRP.exception.InvalidValue; | ||||
| 			} | ||||
| //MochiKit.Logging.logDebug("SRP A: " + this._A); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._A; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	's': function () { | ||||
| 		return this._s; | ||||
| //MochiKit.Logging.logDebug("SRP s: " + this._S); | ||||
| 	}, | ||||
|  | ||||
| 	'set_s': function(aValue) { | ||||
| 		this._s = aValue; | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'B': function () { | ||||
| 		return this._B; | ||||
| 	}, | ||||
|  | ||||
| 	'set_B': function(aValue) { | ||||
| 		//	Warning: this value should be strictly greater than zero: how should we perform this check? | ||||
| 		if (! aValue.equals(0)) { | ||||
| 			this._B = aValue; | ||||
| //MochiKit.Logging.logDebug("SRP B: " + this._B); | ||||
| 		} else { | ||||
| MochiKit.Logging.logError("Clipperz.Crypto.SRP.Connection: trying to set 'B' to 0."); | ||||
| 			throw Clipperz.Crypto.SRP.exception.InvalidValue; | ||||
| 		} | ||||
| 	}, | ||||
| 	 | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'x': function () { | ||||
| 		if (this._x == null) { | ||||
| 			this._x = new Clipperz.Crypto.BigInt(this.stringHash(this.s().asString(16, 64) + this.P()), 16); | ||||
| //MochiKit.Logging.logDebug("SRP x: " + this._x); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._x; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'u': function () { | ||||
| 		if (this._u == null) { | ||||
| 			this._u = new Clipperz.Crypto.BigInt(this.stringHash(this.B().asString()), 16); | ||||
| //MochiKit.Logging.logDebug("SRP u: " + this._u); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._u; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'S': function () { | ||||
| 		if (this._S == null) { | ||||
| 			var bigint; | ||||
| 			var	srp; | ||||
|  | ||||
| 			bigint = Clipperz.Crypto.BigInt; | ||||
| 			srp = 	 Clipperz.Crypto.SRP; | ||||
|  | ||||
| 			this._S =	bigint.powerModule( | ||||
| 								bigint.subtract(this.B(), bigint.powerModule(srp.g(), this.x(), srp.n())), | ||||
| 								bigint.add(this.a(), bigint.multiply(this.u(), this.x())), | ||||
| 								srp.n() | ||||
| 						) | ||||
| //MochiKit.Logging.logDebug("SRP S: " + this._S); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._S; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'K': function () { | ||||
| 		if (this._K == null) { | ||||
| 			this._K = this.stringHash(this.S().asString()); | ||||
| //MochiKit.Logging.logDebug("SRP K: " + this._K); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._K; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'M1': function () { | ||||
| 		if (this._M1 == null) { | ||||
| 			this._M1 = this.stringHash(this.A().asString(10) + this.B().asString(10) + this.K()); | ||||
| //MochiKit.Logging.logDebug("SRP M1: " + this._M1); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._M1; | ||||
| 	}, | ||||
|  | ||||
| 	//------------------------------------------------------------------------- | ||||
|  | ||||
| 	'M2': function () { | ||||
| 		if (this._M2 == null) { | ||||
| 			this._M2 = this.stringHash(this.A().asString(10) + this.M1() + this.K()); | ||||
| //MochiKit.Logging.logDebug("SRP M2: " + this._M2); | ||||
| 		} | ||||
| 		 | ||||
| 		return this._M2; | ||||
| 	}, | ||||
|  | ||||
| 	//========================================================================= | ||||
|  | ||||
| 	'serverSideCredentialsWithSalt': function(aSalt) { | ||||
| 		var result; | ||||
| 		var s, x, v; | ||||
| 		 | ||||
| 		s = aSalt; | ||||
| 		x = this.stringHash(s + this.P()); | ||||
| 		v = Clipperz.Crypto.SRP.g().powerModule(new Clipperz.Crypto.BigInt(x, 16), Clipperz.Crypto.SRP.n()); | ||||
|  | ||||
| 		result = {}; | ||||
| 		result['C'] = this.C(); | ||||
| 		result['s'] = s; | ||||
| 		result['v'] = v.asString(16); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	'serverSideCredentials': function() { | ||||
| 		var result; | ||||
| 		var s; | ||||
| 		 | ||||
| 		s = Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2); | ||||
|  | ||||
| 		result = this.serverSideCredentialsWithSalt(s); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//========================================================================= | ||||
| /* | ||||
| 	'computeServerSide_S': function(b) { | ||||
| 		var result; | ||||
| 		var v; | ||||
| 		var bigint; | ||||
| 		var	srp; | ||||
|  | ||||
| 		bigint = Clipperz.Crypto.BigInt; | ||||
| 		srp = 	 Clipperz.Crypto.SRP; | ||||
|  | ||||
| 		v = new Clipperz.Crypto.BigInt(srpConnection.serverSideCredentialsWithSalt(this.s().asString(16, 64)).v, 16); | ||||
| //		_S =  (this.A().multiply(this.v().modPow(this.u(), this.n()))).modPow(this.b(), this.n()); | ||||
| 		result = bigint.powerModule( | ||||
| 					bigint.multiply( | ||||
| 						this.A(), | ||||
| 						bigint.powerModule(v, this.u(), srp.n()) | ||||
| 					), new Clipperz.Crypto.BigInt(b, 10), srp.n() | ||||
| 				); | ||||
|  | ||||
| 		return result; | ||||
| 	}, | ||||
| */ | ||||
| 	//========================================================================= | ||||
|  | ||||
| 	'stringHash': function(aValue) { | ||||
| 		var	result; | ||||
|  | ||||
| 		result = this.hash(new Clipperz.ByteArray(aValue)).toHexString().substring(2); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}, | ||||
| 	 | ||||
| 	//========================================================================= | ||||
| 	__syntaxFix__: "syntax fix" | ||||
| 	 | ||||
| }); | ||||
|  | ||||
| //############################################################################# | ||||
		Reference in New Issue
	
	Block a user
	 Clipperz
					Clipperz