mirror of
https://github.com/moparisthebest/mail
synced 2025-02-07 02:20:14 -05:00
made util, nacl and aes crossplatform
This commit is contained in:
parent
84c9abcd36
commit
21aad0afb2
@ -20,7 +20,7 @@
|
||||
|
||||
var args = e.data,
|
||||
output = null,
|
||||
aes = new app.crypto.AesCCM(),
|
||||
aes = new app.crypto.AesCCM(sjcl),
|
||||
util = new app.crypto.Util(null, null);
|
||||
|
||||
if (args.type === 'encrypt' && args.list) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* A Wrapper for SJCL's authenticated AES-CCM encryption
|
||||
*/
|
||||
app.crypto.AesCCM = function() {
|
||||
var AesCCM = function(sjcl) {
|
||||
'use strict';
|
||||
|
||||
var adata = []; // authenticated data (empty by default)
|
||||
@ -47,4 +47,10 @@ app.crypto.AesCCM = function() {
|
||||
return pt;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = AesCCM;
|
||||
} else {
|
||||
app.crypto.AesCCM = AesCCM;
|
||||
}
|
@ -19,7 +19,7 @@
|
||||
|
||||
var args = e.data,
|
||||
output = null,
|
||||
aes = new app.crypto.AesCCM();
|
||||
aes = new app.crypto.AesCCM(sjcl);
|
||||
|
||||
if (args.type === 'encrypt' && args.plaintext && args.key && args.iv) {
|
||||
// start encryption
|
||||
|
@ -6,7 +6,7 @@ app.crypto.Crypto = function(window, util) {
|
||||
'use strict';
|
||||
|
||||
var symmetricUserKey, // the user's secret key used to encrypt item-keys
|
||||
aes = new app.crypto.AesCCM(); // use authenticated AES-CCM mode by default
|
||||
aes = new app.crypto.AesCCM(sjcl); // use authenticated AES-CCM mode by default
|
||||
|
||||
/**
|
||||
* Initializes the crypto modules by fetching the user's
|
||||
|
@ -1,7 +1,7 @@
|
||||
/**
|
||||
* A Wrapper for NaCl's asymmetric/symmetric crypto
|
||||
*/
|
||||
app.crypto.NaclCrypto = function() {
|
||||
var NaclCrypto = function(util) {
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
@ -13,8 +13,8 @@ app.crypto.NaclCrypto = function() {
|
||||
} else {
|
||||
var keys = nacl.crypto_box_keypair();
|
||||
return {
|
||||
boxPk: window.btoa(nacl.decode_latin1(keys.boxPk)),
|
||||
boxSk: window.btoa(nacl.decode_latin1(keys.boxSk))
|
||||
boxPk: util.str2Base64(nacl.decode_latin1(keys.boxPk)),
|
||||
boxSk: util.str2Base64(nacl.decode_latin1(keys.boxSk))
|
||||
};
|
||||
}
|
||||
};
|
||||
@ -29,14 +29,14 @@ app.crypto.NaclCrypto = function() {
|
||||
this.asymmetricEncrypt = function(plaintext, recipientBoxPk, senderBoxSk) {
|
||||
// convert to Uint8Array
|
||||
var ptBuf = nacl.encode_utf8(plaintext);
|
||||
var recipientBoxPkBuf = nacl.encode_latin1(window.atob(recipientBoxPk));
|
||||
var senderBoxSkBuf = nacl.encode_latin1(window.atob(senderBoxSk));
|
||||
var recipientBoxPkBuf = nacl.encode_latin1(util.base642Str(recipientBoxPk));
|
||||
var senderBoxSkBuf = nacl.encode_latin1(util.base642Str(senderBoxSk));
|
||||
// generate nonce
|
||||
var nonce = nacl.crypto_secretbox_random_nonce();
|
||||
|
||||
var ct = nacl.crypto_box(ptBuf, nonce, recipientBoxPkBuf, senderBoxSkBuf);
|
||||
var ctBase64 = window.btoa(nacl.decode_latin1(ct));
|
||||
var nonceBase64 = window.btoa(nacl.decode_latin1(nonce));
|
||||
var ctBase64 = util.str2Base64(nacl.decode_latin1(ct));
|
||||
var nonceBase64 = util.str2Base64(nacl.decode_latin1(nonce));
|
||||
|
||||
return {
|
||||
ct: ctBase64,
|
||||
@ -54,10 +54,10 @@ app.crypto.NaclCrypto = function() {
|
||||
*/
|
||||
this.asymmetricDecrypt = function(ciphertext, nonce, senderBoxPk, recipientBoxSk) {
|
||||
// convert to Uint8Array
|
||||
var ctBuf = nacl.encode_latin1(window.atob(ciphertext));
|
||||
var nonceBuf = nacl.encode_latin1(window.atob(nonce));
|
||||
var senderBoxPkBuf = nacl.encode_latin1(window.atob(senderBoxPk));
|
||||
var recipientBoxSkBuf = nacl.encode_latin1(window.atob(recipientBoxSk));
|
||||
var ctBuf = nacl.encode_latin1(util.base642Str(ciphertext));
|
||||
var nonceBuf = nacl.encode_latin1(util.base642Str(nonce));
|
||||
var senderBoxPkBuf = nacl.encode_latin1(util.base642Str(senderBoxPk));
|
||||
var recipientBoxSkBuf = nacl.encode_latin1(util.base642Str(recipientBoxSk));
|
||||
|
||||
var pt = nacl.crypto_box_open(ctBuf, nonceBuf, senderBoxPkBuf, recipientBoxSkBuf);
|
||||
var ptStr = nacl.decode_utf8(pt);
|
||||
@ -65,4 +65,10 @@ app.crypto.NaclCrypto = function() {
|
||||
return ptStr;
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = NaclCrypto;
|
||||
} else {
|
||||
app.crypto.NaclCrypto = NaclCrypto;
|
||||
}
|
@ -172,6 +172,22 @@ var Util = function(window, uuid) {
|
||||
return str;
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts a binary String (e.g. from the FileReader Api) to a UInt8Array
|
||||
* @param str [String] a binary string with integer values (0..255) per character
|
||||
* @return [UInt8Array]
|
||||
*/
|
||||
this.binStr2Uint8Arr = function(str) {
|
||||
var c, buf = new Uint8Array(str.length);
|
||||
|
||||
for (var i = 0; i < buf.length; i++) {
|
||||
c = str.charCodeAt(i);
|
||||
buf[i] = (c & 0xff);
|
||||
}
|
||||
|
||||
return buf;
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert a str to base64 in a browser and in node.js
|
||||
*/
|
||||
|
@ -29,15 +29,15 @@ test("CBC mode", 4, function() {
|
||||
});
|
||||
|
||||
test("CCM mode", 2, function() {
|
||||
var aes = new app.crypto.AesCCM();
|
||||
|
||||
var aes = new app.crypto.AesCCM(sjcl);
|
||||
|
||||
var plaintext = aes_test.test_message;
|
||||
var key = aes_test.util.random(aes_test.keySize);
|
||||
var iv = aes_test.util.random(104);
|
||||
|
||||
|
||||
var ciphertext = aes.encrypt(plaintext, key, iv);
|
||||
ok(ciphertext, 'Ciphertext length: ' + ciphertext.length);
|
||||
|
||||
|
||||
var decrypted = aes.decrypt(ciphertext, key, iv);
|
||||
equal(decrypted, plaintext, 'Decryption correct: ' + decrypted);
|
||||
});
|
||||
|
@ -6,13 +6,19 @@ var nacl_test = {
|
||||
|
||||
test("Init", 1, function() {
|
||||
// init dependencies
|
||||
nacl_test.util = new app.crypto.Util(window, uuid);
|
||||
ok(nacl_test.util, 'Util');
|
||||
var util = new app.crypto.Util(window, uuid);
|
||||
ok(util, 'Util');
|
||||
// generate test data
|
||||
nacl_test.test_message = new TestData().generateBigString(1000);
|
||||
nacl_test.crypto = new app.crypto.NaclCrypto();
|
||||
nacl_test.crypto = new app.crypto.NaclCrypto(util);
|
||||
});
|
||||
|
||||
// test("Generate Keypair from seed", 2, function() {
|
||||
// // generate keypair from seed
|
||||
// var keys = nacl_test.crypto.generateKeypair();
|
||||
// ok(keys.boxSk && keys.boxPk, "Keypair: " + JSON.stringify(keys));
|
||||
// });
|
||||
|
||||
test("Generate Keypair", 2, function() {
|
||||
// generate keypair from seed
|
||||
var senderKeypair = nacl_test.crypto.generateKeypair();
|
||||
|
@ -1,13 +1,13 @@
|
||||
module("Util");
|
||||
|
||||
test("JQuery and basic requirements", 7, function() {
|
||||
ok( Array.prototype.push, "Array.push()" );
|
||||
ok( Function.prototype.apply, "Function.apply()" );
|
||||
ok( document.getElementById, "getElementById" );
|
||||
ok( document.getElementsByTagName, "getElementsByTagName" );
|
||||
ok( RegExp, "RegExp" );
|
||||
ok( jQuery, "jQuery" );
|
||||
ok( $, "$" );
|
||||
ok(Array.prototype.push, "Array.push()");
|
||||
ok(Function.prototype.apply, "Function.apply()");
|
||||
ok(document.getElementById, "getElementById");
|
||||
ok(document.getElementsByTagName, "getElementsByTagName");
|
||||
ok(RegExp, "RegExp");
|
||||
ok(jQuery, "jQuery");
|
||||
ok($, "$");
|
||||
});
|
||||
|
||||
test("UUID", 2, function() {
|
||||
@ -32,25 +32,15 @@ test("Parse Date", 1, function() {
|
||||
ok(date, "Date: " + date);
|
||||
});
|
||||
|
||||
test("String -> ArrayBuffer -> String", 3, function() {
|
||||
test("String -> Uint8Array -> String", 3, function() {
|
||||
var util = new app.crypto.Util(window);
|
||||
|
||||
|
||||
var input = "asdf";
|
||||
var buf = util.binStr2ArrBuf(input);
|
||||
var buf = util.binStr2Uint8Arr(input);
|
||||
ok(buf);
|
||||
|
||||
|
||||
// test slow conversion in js
|
||||
var binStr = util.arrBuf2BinStr(buf);
|
||||
var binStr = util.uint8Arr2BinStr(buf);
|
||||
ok(binStr);
|
||||
equal(binStr, input);
|
||||
|
||||
// // test native conversion with BlobBuilder Api
|
||||
// var blob = util.arrBuf2Blob(buf, 'application/octet-stream');
|
||||
// ok(blob);
|
||||
//
|
||||
// util.blob2BinStr(blob, function(output) {
|
||||
// equal(output, input);
|
||||
//
|
||||
// start();
|
||||
// });
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user