Merge pull request #55 from maraoz/add/encrypted-storage

Add encrypted storage component
This commit is contained in:
Ryan X. Charles 2014-04-15 18:16:46 -03:00
commit 4ec6d070b1
7 changed files with 97 additions and 22 deletions

View File

@ -13,6 +13,7 @@
"peerjs": "~0.3.8",
"angular-mocks": "~1.2.14",
"mocha": "~1.18.2",
"chai": "~1.9.1"
"chai": "~1.9.1",
"crypto-js": "http://crypto-js.googlecode.com/files/CryptoJS%20v3.1.2.zip"
}
}

View File

@ -8,6 +8,7 @@ module.exports.PrivateKey = require('./js/models/core/PrivateKey');
var WebRTC = module.exports.WebRTC = require('./js/models/network/WebRTC');
var Insight = module.exports.Insight = require('./js/models/blockchain/Insight');
var StoragePlain = module.exports.StoragePlain = require('./js/models/storage/Plain');
var StorageEncrypted = module.exports.StorageEncrypted = require('./js/models/storage/Encrypted');
module.exports.Wallet = require('soop').load('./js/models/core/Wallet',{
Network: WebRTC,

View File

@ -271,6 +271,7 @@
<script src="lib/angular-foundation/mm-foundation-tpls.min.js"></script>
<script src="lib/peerjs/peer.js"></script>
<script src="lib/bitcore.js"></script>
<script src="lib/crypto-js/rollups/aes.js"></script>
<script src="js/copayBundle.js"></script>

View File

@ -1,29 +1,49 @@
'use strict';
var imports = require('soop').imports();
//var buffertools = imports.buffertools || require('buffertools');
var parent = imports.parent || require('./Plain');
function Storage() {
// TODO
}
Storage.parent = parent;
var passphrase = null;
Storage.prototype._getPassphrase = function() {
return passphrase;
}
// get value by key
Storage.prototype.get = function(k) {
// TODO
Storage.prototype._setPassphrase = function(password) {
passphrase = password;
}
Storage.prototype._encrypt = function(data) {
return CryptoJS.AES.encrypt(data, this._getPassphrase());
};
// set value for key
Storage.prototype.set = function(k,v) {
// TODO
Storage.prototype._decrypt = function(encrypted) {
return CryptoJS.AES.decrypt(encrypted, this._getPassphrase());
};
// remove value for key
Storage.prototype.remove = function(k) {
// TODO
Storage.prototype._read = function(k) {
var ret;
try {
ret = localStorage.getItem(k);
ret = this._decrypt(ret);
ret = ret.toString(CryptoJS.enc.Utf8);
ret = JSON.parse(ret);
} catch (e) {
console.log('Error while decrypting: '+e);
throw e;
};
return ret;
};
// remove all values
Storage.prototype.clearAll = function() {
// TODO
};
Storage.prototype._write = function(k,v) {
v = JSON.stringify(v);
v = this._encrypt(v);
localStorage.setItem(k, v);
};
module.exports = require('soop')(Storage);

View File

@ -3,7 +3,6 @@
var imports = require('soop').imports();
function Storage() {
this.data = {};
}
Storage.prototype._read = function(k) {
@ -14,6 +13,9 @@ Storage.prototype._read = function(k) {
return ret;
};
Storage.prototype._write = function(k,v) {
localStorage.setItem(k, JSON.stringify(v));
};
// get value by key
Storage.prototype.getGlobal = function(k) {
@ -22,7 +24,7 @@ Storage.prototype.getGlobal = function(k) {
// set value for key
Storage.prototype.setGlobal = function(k,v) {
localStorage.setItem(k, JSON.stringify(v));
this._write(k,v);
};
// remove value for key
@ -37,17 +39,17 @@ Storage.prototype._key = function(walletId, k) {
};
// get value by key
Storage.prototype.get = function(walletId, k) {
return this._read(this._key(walletId,k));
return this.getGlobal(this._key(walletId,k));
};
// set value for key
Storage.prototype.set = function(walletId, k,v) {
localStorage.setItem(this._key(walletId,k), JSON.stringify(v));
this.setGlobal(this._key(walletId,k), v);
};
// remove value for key
Storage.prototype.remove = function(walletId, k) {
localStorage.removeItem(this._key(walletId,k));
this.removeGlobal(this._key(walletId,k));
};
// remove all values

View File

@ -10,14 +10,15 @@
<div id="mocha"></div>
<script src="../node_modules/mocha/mocha.js"></script>
<script src="../node_modules/chai/chai.js"></script>
<script src="../lib/crypto-js/rollups/aes.js"></script>
<script>mocha.setup('bdd')</script>
<script src="../lib/bitcore.js"></script>
<script src="../js/copayBundle.js"></script>
<script>
var copay = require('copay');
var copay = require('copay');
</script>
<script src="test.storage-plain.js"></script>
<script src="test.storage-encrypted.js"></script>
<script src="test.Wallet.js"></script>
<script src="test.PublicKeyRing.js"></script>
<!--

View File

@ -0,0 +1,49 @@
'use strict';
if (typeof process === 'undefined' || !process.version) {
// browser
var chai = chai || require('chai');
var should = chai.should();
var copay = copay || require('../copay');
var Encrypted = copay.StorageEncrypted;
describe('Storage/Encrypted model', function() {
var wid = 'fake-wallet-id';
var s = new Encrypted();
s._setPassphrase('mysupercoolpassword');
it('should create an instance', function() {
var s = new Encrypted();
should.exist(s);
});
it.skip('should fail when encrypting without a password', function() {
var s = new Encrypted();
(function(){s.set(wid, 'x', 1);}).should.throw();
});
it('should be able to encrypt and decrypt', function() {
s._write('key', 'value');
s._read('key').should.equal('value');
});
it('should be able to set a value', function() {
s.set(wid, 'x', 1);
});
var getSetData = [
1,1000,-15, -1000,
0.1, -0.5, -0.5e-10, Math.PI,
'hi', 'auydoaiusyodaisudyoa', '0b5b8556a0c2ce828c9ccfa58b3dd0a1ae879b9b',
'1CjPR7Z5ZSyWk6WtXvSFgkptmpoi4UM9BC', 'OP_DUP OP_HASH160 80ad90d4035',
[1,2,3,4,5,6],
{ x: 1, y: 2},
{ x: 'hi', y: null},
{ a: {}, b: [], c: [1,2,'hi']},
null
];
getSetData.forEach(function(obj) {
it('should be able to set a value and get it for '+JSON.stringify(obj), function() {
s.set(wid, 'x', obj);
var obj2 = s.get(wid, 'x');
JSON.stringify(obj2).should.equal(JSON.stringify(obj));
});
});
});
}