copay/js/util/crypto.js

69 lines
1.9 KiB
JavaScript
Raw Normal View History

2014-10-21 20:14:48 -07:00
/**
2014-10-24 05:36:28 -07:00
* Small module for some helpers that wrap sjcl with some good practices.
2014-10-21 20:14:48 -07:00
*/
2014-10-28 11:57:49 -07:00
var sjcl = require('sjcl');
2014-10-21 20:14:48 -07:00
var log = require('../log.js');
2014-10-25 15:57:12 -07:00
var _ = require('lodash');
2014-10-21 20:14:48 -07:00
2014-10-27 13:23:01 -07:00
var defaultSalt = 'mjuBtGybi/4=';
var defaultIterations = 100;
2014-10-21 20:14:48 -07:00
module.exports = {
2014-10-27 18:15:23 -07:00
/**
* @param {string} password
* @param {string} salt - base64 encoded, defaults to 'mjuBtGybi/4='
* @param {number} iterations - defaults to 100
* @param {number} length - bits, defaults to 512 bits
* @returns {string} base64 encoded pbkdf2 derivation using sha1 for hmac
*/
kdf: function(password, salt, iterations, length) {
return sjcl.codec.base64.fromBits(
this.kdfbinary(password, salt, iterations, length)
);
},
/**
* @param {string} password
* @param {string} salt - base64 encoded, defaults to 'mjuBtGybi/4='
* @param {number} iterations - defaults to 100
* @param {number} length - bits, defaults to 512 bits
* @returns {string} base64 encoded pbkdf2 derivation using sha1 for hmac
*/
kdfbinary: function(password, salt, iterations, length) {
2014-10-27 13:23:01 -07:00
iterations = iterations || defaultIterations;
2014-10-27 18:15:23 -07:00
length = length || 512;
salt = sjcl.codec.base64.toBits(salt || defaultSalt);
2014-10-27 15:26:21 -07:00
var hash = sjcl.hash.sha256.hash(sjcl.hash.sha256.hash(password));
var prff = function(key) {
return new sjcl.misc.hmac(hash, sjcl.hash.sha1);
};
2014-10-27 18:15:23 -07:00
return sjcl.misc.pbkdf2(hash, salt, iterations, length, prff);
2014-10-21 20:14:48 -07:00
},
/**
* Encrypts symmetrically using a passphrase
*/
encrypt: function(key, message) {
if (!_.isString(message)) {
message = JSON.stringify(message);
}
2014-10-21 20:14:48 -07:00
return sjcl.encrypt(key, message);
},
/**
* Decrypts symmetrically using a passphrase
*/
2014-10-27 13:23:01 -07:00
decrypt: function(key, cyphertext) {
2014-10-21 20:14:48 -07:00
var output = {};
try {
2014-10-27 13:23:01 -07:00
return sjcl.decrypt(key, cyphertext);
2014-10-21 20:14:48 -07:00
} catch (e) {
2014-10-29 04:34:07 -07:00
log.info('Decryption failed due to error: ' + e.message);
2014-10-21 20:14:48 -07:00
return null;
}
}
};