Update adapter tests to use Uint8Array and fix crypto encodings, complete zlib work. Fixes #52.
This commit is contained in:
parent
82f4648ef5
commit
3d11b34893
|
@ -7,16 +7,19 @@ define(function(require) {
|
||||||
// Rabbit, see http://code.google.com/p/crypto-js/#Rabbit
|
// Rabbit, see http://code.google.com/p/crypto-js/#Rabbit
|
||||||
require("crypto-js/rollups/rabbit");
|
require("crypto-js/rollups/rabbit");
|
||||||
|
|
||||||
// Move back and forth from Uint8Arrays and CryptoJS' WordArray
|
|
||||||
// source: https://groups.google.com/forum/#!topic/crypto-js/TOb92tcJlU0
|
// Move back and forth from Uint8Arrays and CryptoJS WordArray
|
||||||
|
// See http://code.google.com/p/crypto-js/#The_Cipher_Input and
|
||||||
|
// https://groups.google.com/forum/#!topic/crypto-js/TOb92tcJlU0
|
||||||
var WordArray = CryptoJS.lib.WordArray;
|
var WordArray = CryptoJS.lib.WordArray;
|
||||||
function fromWordArray(wordArray) {
|
function fromWordArray(wordArray) {
|
||||||
var words = wordArray.words;
|
var words = wordArray.words;
|
||||||
var sigBytes = wordArray.sigBytes;
|
var sigBytes = wordArray.sigBytes;
|
||||||
var u8 = new Uint8Array(sigBytes);
|
var u8 = new Uint8Array(sigBytes);
|
||||||
|
var b;
|
||||||
for (var i = 0; i < sigBytes; i++) {
|
for (var i = 0; i < sigBytes; i++) {
|
||||||
var byte = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
b = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
|
||||||
u8[i]=byte;
|
u8[i] = b;
|
||||||
}
|
}
|
||||||
return u8;
|
return u8;
|
||||||
}
|
}
|
||||||
|
@ -29,10 +32,16 @@ define(function(require) {
|
||||||
return WordArray.create(words, len);
|
return WordArray.create(words, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
CryptoJS.enc.Uint8Array = {
|
|
||||||
stringify: fromWordArray,
|
// UTF8 Text De/Encoders
|
||||||
parse: toWordArray
|
require('encoding');
|
||||||
};
|
function encode(str) {
|
||||||
|
return (new TextEncoder('utf-8')).encode(str);
|
||||||
|
}
|
||||||
|
function decode(u8arr) {
|
||||||
|
return (new TextDecoder('utf-8')).decode(u8arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
function CryptoContext(context, encrypt, decrypt) {
|
function CryptoContext(context, encrypt, decrypt) {
|
||||||
this.context = context;
|
this.context = context;
|
||||||
|
@ -69,30 +78,34 @@ define(function(require) {
|
||||||
// prompting the user to enter it when the file system is being opened.
|
// prompting the user to enter it when the file system is being opened.
|
||||||
function CryptoAdapter(passphrase, provider) {
|
function CryptoAdapter(passphrase, provider) {
|
||||||
this.provider = provider;
|
this.provider = provider;
|
||||||
|
|
||||||
|
// Cache cipher algorithm we'll use in encrypt/decrypt
|
||||||
|
var cipher = CryptoJS[encryptionType];
|
||||||
|
|
||||||
|
// To encrypt:
|
||||||
|
// 1) accept a buffer (Uint8Array) containing binary data
|
||||||
|
// 2) convert the buffer to a CipherJS WordArray
|
||||||
|
// 3) encrypt the WordArray using the chosen cipher algorithm + passphrase
|
||||||
|
// 4) convert the resulting ciphertext to a UTF8 encoded Uint8Array and return
|
||||||
this.encrypt = function(buffer) {
|
this.encrypt = function(buffer) {
|
||||||
var wordArray = toWordArray(buffer);
|
var wordArray = toWordArray(buffer);
|
||||||
// return CryptoJS[encryptionType]
|
var encrypted = cipher.encrypt(wordArray, passphrase);
|
||||||
// .encrypt(wordArray, passphrase)
|
var utf8EncodedBuf = encode(encrypted);
|
||||||
// .toString(CryptoJS.enc.Uint8Array);
|
return utf8EncodedBuf;
|
||||||
|
|
||||||
var e = CryptoJS[encryptionType].encrypt(wordArray, passphrase);
|
|
||||||
var e2 = e.ciphertext.toString(CryptoJS.enc.Uint8Array);
|
|
||||||
console.log("encrypt", e, e2);
|
|
||||||
return e2;
|
|
||||||
};
|
};
|
||||||
this.decrypt = function(encrypted) {
|
|
||||||
debugger;
|
|
||||||
var wordArray = toWordArray(encrypted);
|
|
||||||
// return CryptoJS[encryptionType]
|
|
||||||
// .decrypt(wordArray, passphrase)
|
|
||||||
// .toString(CryptoJS.enc.Uint8Array);
|
|
||||||
|
|
||||||
// var cipherParams = CryptoJS.lib.CipherParams.create({
|
// To decrypt:
|
||||||
// ciphertext: CryptoJS.enc.Base64.parse(jsonObj.ct)
|
// 1) accept a buffer (Uint8Array) containing a UTF8 encoded Uint8Array
|
||||||
// });
|
// 2) convert the buffer to string (i.e., the ciphertext we got from encrypting)
|
||||||
|
// 3) decrypt the ciphertext string
|
||||||
var result = CryptoJS[encryptionType].decrypt({ciphertext:wordArray}, passphrase);
|
// 4) convert the decrypted cipherParam object to a UTF8 string
|
||||||
return result.toString(CryptoJS.enc.Uint8Array);
|
// 5) encode the UTF8 string to a Uint8Array buffer and return
|
||||||
|
this.decrypt = function(buffer) {
|
||||||
|
var encryptedStr = decode(buffer);
|
||||||
|
var decrypted = cipher.decrypt(encryptedStr, passphrase);
|
||||||
|
var decryptedUtf8 = decrypted.toString(CryptoJS.enc.Utf8);
|
||||||
|
var utf8EncodedBuf = encode(decryptedUtf8);
|
||||||
|
return utf8EncodedBuf;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
CryptoAdapter.isSupported = function() {
|
CryptoAdapter.isSupported = function() {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
define(function(require) {
|
define(function(require) {
|
||||||
|
|
||||||
// ZLib compression, see
|
// Zlib compression, see
|
||||||
// https://github.com/imaya/zlib.js/blob/master/bin/zlib.min.js
|
// https://github.com/imaya/zlib.js/blob/master/bin/zlib.min.js
|
||||||
require("zlib");
|
require("zlib");
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ define(function(require) {
|
||||||
|
|
||||||
|
|
||||||
function ZlibAdapter(provider, inflate, deflate) {
|
function ZlibAdapter(provider, inflate, deflate) {
|
||||||
this.provider = provider;
|
this.provider = provider;
|
||||||
}
|
}
|
||||||
ZlibAdapter.isSupported = function() {
|
ZlibAdapter.isSupported = function() {
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -22,7 +22,10 @@ define(["IDBFS"], function(IDBFS) {
|
||||||
|
|
||||||
describe("IDBFS.FileSystem.adapters." + adapterName, function() {
|
describe("IDBFS.FileSystem.adapters." + adapterName, function() {
|
||||||
it("is supported -- if it isn't, none of these tests can run.", function() {
|
it("is supported -- if it isn't, none of these tests can run.", function() {
|
||||||
expect(IDBFS.FileSystem.adapters[adapterName].isSupported()).toEqual(true);
|
// Allow for combined adapters (e.g., 'AES+Zlib') joined by '+'
|
||||||
|
adapterName.split('+').forEach(function(name) {
|
||||||
|
expect(IDBFS.FileSystem.adapters[name].isSupported()).toEqual(true);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("has open, getReadOnlyContext, and getReadWriteContext instance methods", function() {
|
it("has open, getReadOnlyContext, and getReadWriteContext instance methods", function() {
|
||||||
|
@ -55,7 +58,7 @@ define(["IDBFS"], function(IDBFS) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Read/Write operations on a Memory provider with an " + adapterName + "adapter", function() {
|
describe("Read/Write operations on a Memory provider with an " + adapterName + " adapter", function() {
|
||||||
it("should allow put() and get()", function() {
|
it("should allow put() and get()", function() {
|
||||||
var complete = false;
|
var complete = false;
|
||||||
var _error, _result;
|
var _error, _result;
|
||||||
|
@ -213,4 +216,12 @@ define(["IDBFS"], function(IDBFS) {
|
||||||
return new IDBFS.FileSystem.adapters.Zlib(provider);
|
return new IDBFS.FileSystem.adapters.Zlib(provider);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// AES + Zlib together
|
||||||
|
buildTestsFor('AES+Zlib', function buildAdapter(provider) {
|
||||||
|
var passphrase = '' + Date.now();
|
||||||
|
var zlib = new IDBFS.FileSystem.adapters.Zlib(provider);
|
||||||
|
var AESwithZlib = new IDBFS.FileSystem.adapters.AES(passphrase, zlib);
|
||||||
|
return AESwithZlib;
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue