summaryrefslogtreecommitdiff
path: root/frontend/gamma/js/Clipperz/PM/Crypto.js
Unidiff
Diffstat (limited to 'frontend/gamma/js/Clipperz/PM/Crypto.js') (more/less context) (ignore whitespace changes)
-rw-r--r--frontend/gamma/js/Clipperz/PM/Crypto.js513
1 files changed, 513 insertions, 0 deletions
diff --git a/frontend/gamma/js/Clipperz/PM/Crypto.js b/frontend/gamma/js/Clipperz/PM/Crypto.js
new file mode 100644
index 0000000..bfafbea
--- a/dev/null
+++ b/frontend/gamma/js/Clipperz/PM/Crypto.js
@@ -0,0 +1,513 @@
1/*
2
3Copyright 2008-2011 Clipperz Srl
4
5This file is part of Clipperz's Javascript Crypto Library.
6Javascript Crypto Library provides web developers with an extensive
7and efficient set of cryptographic functions. The library aims to
8obtain maximum execution speed while preserving modularity and
9reusability.
10For further information about its features and functionalities please
11refer to http://www.clipperz.com
12
13* Javascript Crypto Library is free software: you can redistribute
14 it and/or modify it under the terms of the GNU Affero General Public
15 License as published by the Free Software Foundation, either version
16 3 of the License, or (at your option) any later version.
17
18* Javascript Crypto Library is distributed in the hope that it will
19 be useful, but WITHOUT ANY WARRANTY; without even the implied
20 warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
21 See the GNU Affero General Public License for more details.
22
23* You should have received a copy of the GNU Affero General Public
24 License along with Javascript Crypto Library. If not, see
25 <http://www.gnu.org/licenses/>.
26
27*/
28
29if (typeof(Clipperz) == 'undefined') { Clipperz = {}; }
30if (typeof(Clipperz.PM) == 'undefined') { Clipperz.PM = {}; }
31if (typeof(Clipperz.PM.Crypto) == 'undefined') { Clipperz.PM.Crypto = {}; }
32
33Clipperz.PM.Crypto.VERSION = "0.2";
34Clipperz.PM.Crypto.NAME = "Clipperz.PM.Crypto";
35
36Clipperz.PM.Crypto.encryptingFunctions = {};
37
38MochiKit.Base.update(Clipperz.PM.Crypto, {
39
40 '__repr__': function () {
41 return "[" + this.NAME + " " + this.VERSION + "]";
42 },
43
44 //-------------------------------------------------------------------------
45
46 'toString': function () {
47 return this.__repr__();
48 },
49
50 //-------------------------------------------------------------------------
51/*
52 'communicationProtocol': {
53 'currentVersion': '0.2',
54 'versions': {
55 '0.1': Clipperz.PM.Connection.SRP['1.0'],//Clipperz.Crypto.SRP.versions['1.0'].Connection,
56 '0.2': Clipperz.PM.Connection.SRP['1.1']//Clipperz.Crypto.SRP.versions['1.1'].Connection
57 },
58 'fallbackVersions': {
59 'current':'0.1',
60 '0.2': '0.1',
61 '0.1': null
62 }
63 },
64*/
65 //-------------------------------------------------------------------------
66
67 'encryptingFunctions': {
68 'currentVersion': '0.3',
69 'versions': {
70
71 //#####################################################################
72
73 '0.1': {
74 'encrypt': function(aKey, aValue) {
75 return Clipperz.Crypto.Base.encryptUsingSecretKey(aKey, Clipperz.Base.serializeJSON(aValue));
76 },
77
78 'deferredEncrypt': function(aKey, aValue) {
79 var deferredResult;
80
81 deferredResult = new Clipperz.Async.Deferred("Crypto[0.1].deferredEncrypt");
82 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].encrypt, aKey, aValue);
83 deferredResult.callback();
84
85 return deferredResult;
86 },
87
88 'decrypt': function(aKey, aValue) {
89 var result;
90
91 if (aValue != null) {
92 result = Clipperz.Base.evalJSON(Clipperz.Crypto.Base.decryptUsingSecretKey(aKey, aValue));
93 } else {
94 result = null;
95 }
96
97 return result;
98 },
99
100 'deferredDecrypt': function(aKey, aValue) {
101 var deferredResult;
102
103 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.1].deferredDecrypt");
104 deferredResult.addCallback(Clipperz.PM.Crypto.encryptingFunctions.versions['0.1'].decrypt, aKey, aValue);
105 deferredResult.callback();
106
107 return deferredResult;
108 },
109
110 'hash': function(aValue) {
111 var result;
112 var strngResult;
113
114 stringResult = Clipperz.Crypto.Base.computeHashValue(aValue.asString()); //!!!!!!!
115 result = new Clipperz.ByteArray("0x" + stringResult);
116
117 return result;
118 },
119
120 'deriveKey': function(aStringValue) {
121 return Clipperz.Crypto.Base.computeHashValue(aStringValue);
122 }
123 },
124
125 //#####################################################################
126
127 '0.2': {
128 'encrypt': function(aKey, aValue, aNonce) {
129 var result;
130 varkey, value;
131 var dataToEncrypt;
132 var encryptedData;
133
134 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
135 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
136 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
137 encryptedData = Clipperz.Crypto.AES.encrypt(key, dataToEncrypt, aNonce);
138 result = encryptedData.toBase64String();
139
140 return result;
141 },
142
143 'deferredEncrypt': function(aKey, aValue, aNonce) {
144 var deferredResult;
145 varkey, value;
146 var dataToEncrypt;
147 // var encryptedData;
148
149 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
150 value = new Clipperz.ByteArray(Clipperz.Base.serializeJSON(aValue));
151 dataToEncrypt = Clipperz.Crypto.SHA.sha_d256(value).appendBlock(value);
152
153 deferredResult = new Clipperz.Async.Deferred("Crypto[0.2].deferredEncrypt")
154 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, dataToEncrypt, aNonce);
155 deferredResult.addCallback(function(aResult) {
156 return aResult.toBase64String();
157 })
158 deferredResult.callback();
159
160 return deferredResult;
161 },
162
163 'decrypt': function(aKey, aValue) {
164 var result;
165
166 if (aValue != null) {
167 var key, value;
168 var decryptedData;
169 var decryptedValue;
170
171 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
172 value = new Clipperz.ByteArray().appendBase64String(aValue);
173
174 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
175 decryptedValue = decryptedData.split((256/8));
176
177 try {
178 result = Clipperz.Base.evalJSON(decryptedValue.asString());
179 } catch (exception) {
180 MochiKit.Logging.logError("Error while decrypting data [1]");
181 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
182 }
183 } else {
184 result = null;
185 }
186
187 return result;
188 },
189
190 'deferredDecrypt': function(aKey, aValue) {
191 var result;
192
193 if (aValue != null) {
194 var deferredResult;
195 var key, value;
196 // var decryptedData;
197
198 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
199 value = new Clipperz.ByteArray().appendBase64String(aValue);
200
201 deferredResult = new Clipperz.Async.Deferred("Crypto.[0.2].deferredDecrypt");
202 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
203 deferredResult.addCallback(function(aResult) {
204 var result;
205 var decryptedData;
206
207 decryptedData = aResult.split((256/8));
208
209 try {
210 result = Clipperz.Base.evalJSON(decryptedData.asString());
211 } catch (exception) {
212 MochiKit.Logging.logError("Error while decrypting data [2]");
213 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
214 }
215
216 return result;
217 })
218 deferredResult.callback();
219
220 result = deferredResult;
221 } else {
222 result = MochiKit.Async.succeed(null);
223 }
224
225 return result;
226 },
227
228 'hash': Clipperz.Crypto.SHA.sha_d256,
229
230 'deriveKey': function(aStringValue) {
231 varbyteData;
232 var result;
233
234 byteData = new Clipperz.ByteArray(aStringValue);
235 result = Clipperz.Crypto.SHA.sha_d256(byteData);
236
237 return result;
238 }
239 },
240
241 //#####################################################################
242
243 '0.3': {
244 'encrypt': function(aKey, aValue, aNonce) {
245 var result;
246 varkey, value;
247 var data;
248 var dataToEncrypt;
249 var encryptedData;
250
251 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
252 value = Clipperz.Base.serializeJSON(aValue);
253 data = new Clipperz.ByteArray(value);
254 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
255 result = encryptedData.toBase64String();
256
257 return result;
258 },
259
260 'deferredEncrypt': function(aKey, aValue, aNonce) {
261 var deferredResult;
262 varkey, value;
263 var data;
264 var dataToEncrypt;
265 var encryptedData;
266
267 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
268 value = Clipperz.Base.serializeJSON(aValue);
269 data = new Clipperz.ByteArray(value);
270
271 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredEncrypt")
272 deferredResult.addCallback(Clipperz.Crypto.AES.deferredEncrypt, key, data, aNonce);
273 deferredResult.addCallback(function(aResult) {
274 return aResult.toBase64String();
275 })
276 deferredResult.callback();
277
278 return deferredResult;
279 },
280
281 'decrypt': function(aKey, aValue) {
282 var result;
283
284 if (aValue != null) {
285 var key, value;
286 var decryptedData;
287
288 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
289 value = new Clipperz.ByteArray().appendBase64String(aValue);
290
291 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
292
293 value = decryptedData.asString();
294 try {
295 result = Clipperz.Base.evalJSON(value);
296 } catch (exception) {
297 MochiKit.Logging.logError("Error while decrypting data [3]");
298 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
299 }
300 } else {
301 result = null;
302 }
303
304 return result;
305 },
306
307 'deferredDecrypt': function(aKey, aValue) {
308 var deferredResult;
309
310 deferredResult = new Clipperz.Async.Deferred("Crypto[0.3].deferredDecrypt", {trace: false});
311 // now = new Date;
312
313 if (aValue != null) {
314 var key, value;
315 // var decryptedData;
316
317 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
318 value = new Clipperz.ByteArray().appendBase64String(aValue);
319
320 deferredResult.addCallback(Clipperz.Crypto.AES.deferredDecrypt, key, value);
321 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
322 deferredResult.addCallback(function(aResult) {
323 return aResult.asString();
324 });
325 deferredResult.addCallback(MochiKit.Async.wait, 0.1);
326 deferredResult.addCallback(Clipperz.Base.evalJSON);
327 deferredResult.addErrback(function(anError) {
328 MochiKit.Logging.logError("Error while decrypting data [4]");
329 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
330 })
331 } else {
332 deferredResult.addCallback(function() {
333 return null;
334 });
335 }
336 deferredResult.callback();
337
338 return deferredResult;
339 },
340
341 'hash': Clipperz.Crypto.SHA.sha_d256,
342
343 'deriveKey': function(aStringValue) {
344 varbyteData;
345 var result;
346
347 byteData = new Clipperz.ByteArray(aStringValue);
348 result = Clipperz.Crypto.SHA.sha_d256(byteData);
349
350 return result;
351 }
352
353 },
354
355 //#####################################################################
356/*
357 '0.4': {
358 'encrypt': function(aKey, aValue, aNonce) {
359 var result;
360 varkey, value;
361 var data;
362 var dataToEncrypt;
363 var encryptedData;
364
365//MochiKit.Logging.logDebug(">>> [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
366 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
367//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 1");
368 value = Clipperz.Base.serializeJSON(aValue);
369//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 2");
370/ *
371//MochiKit.Logging.logDebug("--> encrypt.fullSize: " + value.length);
372 value = value.replace(/":{"label":"/g, '":{l:"');
373 value = value.replace(/":{"key":"/g, '":{k:"');
374 value = value.replace(/":{"notes":"/g, '":{n:"');
375 value = value.replace(/":{"record":"/g, '":{r:"');
376 value = value.replace(/", "label":"/g, '",l:"');
377 value = value.replace(/", "favicon":"/g,'",f:"');
378//MochiKit.Logging.logDebug("<-- encrypt.compressed: " + value.length);
379* /
380 data = new Clipperz.ByteArray(value);
381//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 3");
382 encryptedData = Clipperz.Crypto.AES.encrypt(key, data, aNonce);
383//MochiKit.Logging.logDebug("--- [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt - 4");
384 result = encryptedData.toBase64String();
385//MochiKit.Logging.logDebug("<<< [" + (new Date()).valueOf() + "] Clipperz.PM.Crypto.versions[0.3].encrypt");
386
387 return result;
388 },
389
390 'decrypt': function(aKey, aValue) {
391 var result;
392
393 if (aValue != null) {
394 var key, value;
395 var decryptedData;
396
397 key = Clipperz.Crypto.SHA.sha_d256(new Clipperz.ByteArray(aKey));
398 value = new Clipperz.ByteArray().appendBase64String(aValue);
399
400 decryptedData = Clipperz.Crypto.AES.decrypt(key, value);
401
402 value = decryptedData.asString();
403/ *
404 value = value.replace(/":{l:"/g,'":{"label":"');
405 value = value.replace(/":{k:"/g,'":{"key":"');
406 value = value.replace(/":{n:"/g,'":{"notes":"');
407 value = value.replace(/":{r:"/g,'":{"record":"');
408 value = value.replace(/",l:"/g, '", "label":"');
409 value = value.replace(/",f:"/g, '", "favicon":"');
410* /
411 try {
412 result = Clipperz.Base.evalJSON(value);
413 } catch (exception) {
414 MochiKit.Logging.logError("Error while decrypting data");
415 throw Clipperz.Crypto.Base.exception.CorruptedMessage;
416 }
417
418
419 } else {
420 result = null;
421 }
422
423 return result;
424 },
425
426 'hash': Clipperz.Crypto.SHA.sha_d256
427 },
428*/
429 //#####################################################################
430 __syntaxFix__: "syntax fix"
431 }
432 },
433
434 //-------------------------------------------------------------------------
435
436 'encrypt': function(aKey, aValue, aVersion) {
437 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].encrypt(aKey, aValue);
438 },
439
440 'deferredEncrypt': function(someParameters) {
441 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredEncrypt(someParameters['key'], someParameters['value']);
442 },
443
444 //.........................................................................
445
446 'decrypt': function(aKey, aValue, aVersion) {
447 return Clipperz.PM.Crypto.encryptingFunctions.versions[aVersion].decrypt(aKey, aValue);
448 },
449
450 'deferredDecrypt': function(someParameters) {
451 return Clipperz.PM.Crypto.encryptingFunctions.versions[someParameters['version']].deferredDecrypt(someParameters['key'], someParameters['value']);
452 },
453
454 //-------------------------------------------------------------------------
455
456 'hash': function(aValue) {
457 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]['hash'](aValue);
458 },
459
460 //-------------------------------------------------------------------------
461
462 'randomKey': function() {
463 return Clipperz.Crypto.PRNG.defaultRandomGenerator().getRandomBytes(32).toHexString().substring(2);
464 },
465
466 //-------------------------------------------------------------------------
467
468 'deriveKey': function(aValue) {
469 return Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion].deriveKey(aValue);
470 },
471
472 //-------------------------------------------------------------------------
473
474 'passwordEntropy': function(aValue) {
475 var result;
476 varbitPerChar;
477
478 bitPerChar = 4;
479 if (/[a-z]/.test(aValue)) {
480 bitPerChar ++;
481 }
482 if (/[A-Z]/.test(aValue)) {
483 bitPerChar ++;
484 }
485 if (/[^a-zA-Z0-9]/.test(aValue)) {
486 bitPerChar ++;
487 }
488
489 result = aValue.length * bitPerChar;
490
491 return result;
492 },
493
494 //-------------------------------------------------------------------------
495
496 'nullValue': '####',
497
498 //-------------------------------------------------------------------------
499 __syntaxFix__: "syntax fix"
500
501});
502
503//*****************************************************************************
504
505//MochiKit.Base.update(Clipperz.PM.Connection.communicationProtocol.versions, {
506 //'current': Clipperz.PM.Connection.communicationProtocol.versions[Clipperz.PM.Connection.communicationProtocol.currentVersion]
507//});
508
509MochiKit.Base.update(Clipperz.PM.Crypto.encryptingFunctions.versions, {
510 'current': Clipperz.PM.Crypto.encryptingFunctions.versions[Clipperz.PM.Crypto.encryptingFunctions.currentVersion]
511});
512
513//*****************************************************************************