add encrypted Storage component

This commit is contained in:
Manuel Araoz 2014-04-15 18:13:25 -03:00
parent f84180e76c
commit 241fb3aeb7
6 changed files with 84 additions and 51 deletions

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,7 +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/cyrpto-js/rollups/aes.js"></script>
<script src="lib/crypto-js/rollups/aes.js"></script>
<script src="js/copayBundle.js"></script>

View File

@ -1,70 +1,49 @@
'use strict';
var imports = require('soop').imports();
//var buffertools = imports.buffertools || require('buffertools');
var parent = imports.parent || require('./Plain');
function Storage() {
}
Storage.parent = parent;
Storage.prototype._getPwd = function() {
var pwd = prompt('Please enter your password');
return pwd;
var passphrase = null;
Storage.prototype._getPassphrase = function() {
return passphrase;
}
Storage.prototype._setPassphrase = function(password) {
passphrase = password;
}
Storage.prototype._encrypt = function(data) {
return CryptoJS.AES.encrypt("Message", "Secret Passphrase");
return CryptoJS.AES.encrypt(data, this._getPassphrase());
};
Storage.prototype._decrypt = function(encrypted) {
return CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");
return CryptoJS.AES.decrypt(encrypted, this._getPassphrase());
};
Storage.prototype._read = function(k) {
var ret;
try {
ret = JSON.parse(localStorage.getItem(k));
} catch (e) {};
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;
};
// get value by key
Storage.prototype.getGlobal = function(k) {
return this._read(k);
Storage.prototype._write = function(k,v) {
v = JSON.stringify(v);
v = this._encrypt(v);
localStorage.setItem(k, v);
};
// set value for key
Storage.prototype.setGlobal = function(k,v) {
localStorage.setItem(k, JSON.stringify(v));
};
// remove value for key
Storage.prototype.removeGlobal = function(k) {
localStorage.removeItem(k);
};
Storage.prototype._key = function(walletId, k) {
return walletId + '::' + k;
};
// get value by key
Storage.prototype.get = function(walletId, k) {
return this._read(localStorage.getItem(this._key(walletId,k)));
};
// set value for key
Storage.prototype.set = function(walletId, k,v) {
this.setGlobal(this._key(walletId,k), v);
};
// remove value for key
Storage.prototype.remove = function(walletId, k) {
localStorage.removeItem(this._key(walletId,k));
};
// remove all values
Storage.prototype.clearAll = function() {
localStorage.clear();
};
module.exports = require('soop')(Storage);

View File

@ -13,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) {
@ -21,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
@ -36,7 +39,7 @@ 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

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));
});
});
});
}