summaryrefslogtreecommitdiff
path: root/frontend/gamma/tests/tests/Clipperz/PM/Crypto.html
blob: 044658ee993bcfbd17f454e3c39fbde301a4b39b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<!--

Copyright 2008-2011 Clipperz Srl

This file is part of Clipperz Community Edition.
Clipperz Community Edition is an online password manager.
For further information about its features and functionalities please
refer to http://www.clipperz.com.

* Clipperz Community Edition is free software: you can redistribute
  it and/or modify it under the terms of the GNU Affero General Public
  License as published by the Free Software Foundation, either version
  3 of the License, or (at your option) any later version.

* Clipperz Community Edition is distributed in the hope that it will
  be useful, but WITHOUT ANY WARRANTY; without even the implied
  warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the GNU Affero General Public License for more details.

* You should have received a copy of the GNU Affero General Public
  License along with Clipperz Community Edition.  If not, see
  <http://www.gnu.org/licenses/>.

-->

<html>
<head>
	<title>Clipperz.PM.Crypto - TEST</title>

	<script>
		jslog_config_enabled = true;
		clipperz_profiling_enabled = true;
	</script>

	<script type="text/javascript" src="../../../../js/MochiKit/MochiKit.js"></script>
    <script type="text/javascript" src="../../../SimpleTest/SimpleTest.js"></script>
    <link rel="stylesheet" type="text/css" href="../../../SimpleTest/test.css">

	<script type='text/javascript' src='../../../../js/JSON/json2.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/YUI/Utils.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/YUI/DomHelper.js'></script>

	<script type='text/javascript' src='../../../../js/Clipperz/ByteArray.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Base.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Logging.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Async.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/DOM.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Profile.js'></script>

	<script type='text/javascript' src='../../../../js/Clipperz/Crypto/SHA.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Crypto/AES.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Crypto/PRNG.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Crypto/BigInt.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Crypto/Base.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/Crypto/SRP.js'></script>

	<script type='text/javascript' src='../../../../js/Clipperz/PM/Proxy.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/PM/Connection.js'></script>
	<script type='text/javascript' src='../../../../js/Clipperz/PM/Crypto.js'></script>

    <script type="text/javascript" src="../../../SimpleTest/SimpleTest.Async.js"></script>
<!--
	<script>
		MochiKit.DOM.addLoadEvent(MochiKit.Base.partial(MochiKit.LoggingPane.createLoggingPane, true));
		MochiKit.Logging.logger.useNativeConsole = true;
	</script>
-->
</head>
<body>
<pre id="test">

<script type="text/javascript">


Clipperz_PM_Crypt_test = function() {
	var	key;

	var plainData;
	var encryptedData;
	var decryptedData;
	
	var result;
	var expectedResult;
	
	var plainText;
	var longPlainText;

	key = 'trustno1';

	plainText = "Lorem ipsum dolor sit amet";
	longPlainText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec nunc sapien, condimentum vitae, varius vel, pharetra in, augue. Mauris quam magna, pretium sit amet, accumsan id, volutpat lobortis, nibh. Fusce sagittis. Aenean justo. Curabitur euismod pede. Morbi at ante. Proin nisl leo, ultrices sed, facilisis et, nonummy sit amet, lorem. Praesent mauris tellus, pulvinar sed, nonummy vitae, rhoncus non, nunc. Proin placerat malesuada nisl. Nunc id enim. Maecenas commodo enim ac nibh. Sed condimentum, urna sit amet euismod gravida, mi urna varius odio, luctus pretium lectus justo nec felis. Ut in augue et est malesuada rhoncus. Sed vel orci. Mauris suscipit.  Praesent cursus velit non turpis. Donec tristique dolor ac est. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla est sapien, vulputate eget, bibendum id, pharetra nec, mauris. Aliquam faucibus tincidunt dui. Proin iaculis. Maecenas sagittis. Integer et augue. Donec vitae urna in orci aliquet commodo. Vestibulum lorem sem, suscipit ac, placerat nec, mollis in, felis. Donec laoreet odio a mauris. Integer rutrum, sapien id varius molestie, mauris odio egestas orci, non bibendum sem felis in metus.  Phasellus consectetuer lectus adipiscing mauris. Ut magna tellus, euismod ac, suscipit tincidunt, ullamcorper adipiscing, massa. Etiam orci. Phasellus a urna. Cras neque quam, laoreet at, tempus eget, euismod nec, nibh. Etiam hendrerit. Aenean vel lorem. Ut ligula lacus, congue eu, lobortis sit amet, venenatis in, magna. Nullam cursus felis quis est. Sed sem est, condimentum eu, vestibulum a, mattis vel, diam. Curabitur tincidunt pede quis pede. Sed neque diam, convallis vel, luctus at, porta id, nisl. Suspendisse potenti. Sed volutpat lobortis orci. Praesent mi. In interdum. Suspendisse suscipit ipsum eget dolor. Curabitur et tellus sed velit hendrerit varius. Cras sit amet est.  Donec arcu nulla, vehicula et, pretium in, placerat id, felis. Integer mollis auctor lectus. Integer ultrices elementum sapien. Nam et erat. Nam pulvinar porta tortor. Nam at risus. Quisque nulla. Integer vestibulum, lacus id bibendum laoreet, ligula mi pharetra lorem, sit amet pharetra felis mauris quis justo. Aliquam ultricies. Duis a pede eget lorem dapibus rhoncus. Aenean eu elit non libero consectetuer viverra. Maecenas velit mi, eleifend vel, malesuada vel, condimentum quis, odio. Mauris tempus augue sed turpis. Pellentesque condimentum, lacus vitae pellentesque ultricies, risus tellus posuere nisi, et dictum turpis pede nec elit. Sed eu lectus eu justo sagittis euismod. Vestibulum lobortis, urna id mollis rhoncus, orci quam euismod ligula, at malesuada lacus magna vitae massa. Phasellus mattis fermentum velit.  Nulla vulputate consequat enim. Maecenas quis neque. Curabitur sagittis facilisis neque. In elementum, eros non porttitor rhoncus, libero turpis sodales odio, vitae porta tellus purus et ante. Nullam molestie sollicitudin metus. Donec a elit. Morbi ut lacus. Donec at arcu. Quisque velit diam, interdum a, lacinia at, varius et, odio. Cras neque magna, ornare id, sollicitudin id, consequat a, est. Phasellus vestibulum est at leo. Nam facilisis, nulla dapibus condimentum pellentesque, est magna viverra ligula, at sollicitudin urna augue ut sapien. Fusce justo.";

	//
	//	hashing
	//
	plainData = new Clipperz.ByteArray(plainText);
	
	result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
	is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a short text");

	result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
	is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a short text");


	plainData = new Clipperz.ByteArray(longPlainText);
	
	result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].hash(plainData);
	is(result.length(), (256/8), "encryptingFunctions.versions[0.1].hash generate a 256 bit signature with a long text");

	result = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].hash(plainData);
	is(result.length(), (256/8), "encryptingFunctions.versions[0.2].hash generate a 256 bit signature with a long text");


	//
	//	encrypting / decripting
	//
	plainData = plainText;

	encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData);
	decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData);
	is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a short text");

	encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData);
	decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData);
	is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a short text");

//console.time("encrypt-256-short");
	encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData);
//console.timeEnd("encrypt-256-short");
//console.time("decrypt-256-short");
	decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData);
//console.timeEnd("decrypt-256-short");
	is(plainData.toString(), decryptedData.toString(), "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a short text");


	plainData = longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText + longPlainText;

/*
	encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt(key, plainData);
	decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt(key, encryptedData);
	is(plainData, decryptedData, "encryptingFunctions.versions[0.1] of encrypt/decrypt functions work with a long text");

	encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].encrypt(key, plainData);
	decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.2'].decrypt(key, encryptedData);
	is(plainData, decryptedData, "encryptingFunctions.versions[0.2] of encrypt/decrypt functions work with a long text");

	encryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].encrypt(key, plainData);
	decryptedData = Clipperz.PM.Crypto.encryptingFunctions.versions['0.3'].decrypt(key, encryptedData);
	is(plainData, decryptedData, "encryptingFunctions.versions[0.3] of encrypt/decrypt functions work with a long text");
*/

	{
		var deferredResult;
		var startTime;
//		var nonce;
		
//		nonce = new Clipperz.ByteArray("0x00000000000000000000000000000000");
		plainData = plainData + plainData + plainData + plainData + plainData + plainData + plainData + plainData;
MochiKit.Logging.logDebug("plainData length: " + plainData.length);
		startTime = new Date();
		
		deferredResult = new MochiKit.Async.Deferred();
		
		deferredResult.addCallback(function() {
			return Clipperz.PM.Crypto.deferredEncrypt({key:key, value:plainData, version:'0.3'});
//			return Clipperz.PM.Crypto.encrypt(key, plainData, '0.3' / *Clipperz.PM.Crypto.encryptingFunctions.currentVersion* /);
		});
		deferredResult.addCallback(function(aResult) {
			MochiKit.Logging.logDebug("encrypting: " + (new Date() - startTime));
			startTime = new Date();
			return aResult;
		});
		deferredResult.addCallback(MochiKit.Async.wait, 1);
		deferredResult.addCallback(function(aResult) {
			MochiKit.Logging.logDebug("pause: " + (new Date() - startTime));
			startTime = new Date();
			return aResult;
		});
		deferredResult.addCallback(function(anEncryptedValue) {
			return Clipperz.PM.Crypto.deferredDecrypt({key:key, value:anEncryptedValue, version:'0.3'});
		});
		deferredResult.addCallback(function(aResult) {
			MochiKit.Logging.logDebug("decrypting: " + (new Date() - startTime));
			startTime = new Date();
			return aResult;
		});
		deferredResult.addCallback(MochiKit.Async.wait, 1);
		deferredResult.addBoth(function(aDecryptedValue) {
			is(plainData, aDecryptedValue, "deferredEncript/deferredDecript functions work with a long text");
		});



/*
		deferredResult.addCallback(function(aResult) {
			var i,c;
			var currentChar;
			var unicode;
			
			unicode = 150;
			
			c = 100000;
			startTime = new Date();
			for (i=0; i<c; i++) {
				currentChar = String.fromCharCode(unicode+1);
			}
			MochiKit.Logging.logDebug("String.fromCharCode: " + (new Date() - startTime));
		});

		deferredResult.addCallback(function(aResult) {
			var i,c;
			var currentByte;
			var unicode;
			
			currentByte = 150;
			
			c = 100000;
			startTime = new Date();
			for (i=0; i<c; i++) {
				unicode = (currentByte & 0x0f) << (6+6);
			}
			MochiKit.Logging.logDebug("(currentByte & 0x0f) << (6+6): " + (new Date() - startTime));
		});

		deferredResult.addCallback(function(aResult) {
			var i,c;
			var currentByte;
			var byteArray;
			
			currentByte = 150;
			
			byteArray = new Clipperz.ByteArray(plainData);
			c = byteArray.length();
			startTime = new Date();
			for (i=0; i<c; i++) {
				currentByte = byteArray.byteAtIndex(i);
			}
			MochiKit.Logging.logDebug("byteAtIndex: " + (new Date() - startTime));
		});
*/

		deferredResult.addBoth(function() {
			SimpleTest.ok(true, "COMPLETED all tests");
			SimpleTest.finish();
		})

		deferredResult.callback();
	}

	SimpleTest.waitForExplicitFinish();
}

//#############################################################################

try {
	MochiKit.Signal.connect(Clipperz.Crypto.PRNG.defaultRandomGenerator(), 'readyToGenerateRandomBytes', Clipperz_PM_Crypt_test);

	Clipperz.Crypto.PRNG.defaultRandomGenerator().fastEntropyAccumulationForTestingPurpose();
	SimpleTest.waitForExplicitFinish(); 
} catch (err) {
    
    var s = "test suite failure!\n";
    var o = {};
    var k = null;
    for (k in err) {
        // ensure unique keys?!
        if (!o[k]) {
            s +=  k + ": " + err[k] + "\n";
            o[k] = err[k];
        }
    }
    ok ( false, s );
}

</script>
</pre>
</body>
</html>