Wallet/js/util/crypto.js

61 lines
1.4 KiB
JavaScript
Raw Normal View History

2014-10-22 00:14:48 -03:00
/**
2014-10-24 09:36:28 -03:00
* Small module for some helpers that wrap sjcl with some good practices.
2014-10-22 00:14:48 -03:00
*/
2014-10-27 09:44:41 -03:00
var sjcl = require('../../lib/sjcl');
2014-10-22 00:14:48 -03:00
var log = require('../log.js');
2014-10-25 19:57:12 -03:00
var _ = require('lodash');
2014-10-22 00:14:48 -03:00
2014-10-27 17:23:01 -03:00
var defaultSalt = 'mjuBtGybi/4=';
var defaultIterations = 100;
2014-10-27 19:26:21 -03:00
sjcl.defaults = {
v: 1,
iter: 100,
ks: 128,
ts: 64,
mode: "ccm",
adata: "",
cipher: "aes"
},
2014-10-22 00:14:48 -03:00
module.exports = {
2014-10-27 17:23:01 -03:00
kdf: function(value1, value2, salt, iterations) {
iterations = iterations || defaultIterations;
salt = salt || defaultSalt;
2014-10-27 19:26:21 -03:00
var password = value1 + (value2 || '');
var hash = sjcl.hash.sha256.hash(sjcl.hash.sha256.hash(password));
var salt = sjcl.codec.base64.toBits(salt);
var prff = function(key) {
return new sjcl.misc.hmac(hash, sjcl.hash.sha1);
};
var bits = sjcl.misc.pbkdf2(hash, salt, iterations, 64 * 8, prff);
var base64 = sjcl.codec.base64.fromBits(bits);
return base64;
2014-10-22 00:14:48 -03:00
},
/**
* Encrypts symmetrically using a passphrase
*/
encrypt: function(key, message) {
if (!_.isString(message)) {
message = JSON.stringify(message);
}
2014-10-22 00:14:48 -03:00
return sjcl.encrypt(key, message);
},
/**
* Decrypts symmetrically using a passphrase
*/
2014-10-27 17:23:01 -03:00
decrypt: function(key, cyphertext) {
2014-10-22 00:14:48 -03:00
var output = {};
try {
2014-10-27 17:23:01 -03:00
return sjcl.decrypt(key, cyphertext);
2014-10-22 00:14:48 -03:00
} catch (e) {
log.error('Decryption failed due to error: ' + e.message);
return null;
}
}
};