flocore/lib/browser/cryptox.js
2014-06-08 12:43:05 -07:00

42 lines
1.3 KiB
JavaScript

// Crypto extensions
//
// PBKDF2 with SHA512 - browser version
var jssha = require('jssha')
var pbkdf2_sha512 = function (password, salt, keylen, options) {
password = new Buffer(password);
salt = new Buffer(salt);
// Defaults
var iterations = options && options.iterations || 1;
// Pseudo-random function
function PRF(password, salt) {
var j = new jssha(salt.toString('hex'), 'HEX');
var hash = j.getHMAC(password.toString('hex'), "HEX", "SHA-512", "HEX");
return new Buffer(hash, 'hex');
}
// Generate key
var derivedKeyBytes = new Buffer([]),
blockindex = 1;
while (derivedKeyBytes.length < keylen) {
var block = PRF(password, salt.concat([0, 0, 0, blockindex]));
for (var u = block, i = 1; i < iterations; i++) {
u = PRF(password, u);
for (var j = 0; j < block.length; j++) block[j] ^= u[j];
}
derivedKeyBytes = derivedKeyBytes.concat(block);
blockindex++;
}
// Truncate excess bytes - TODO
//derivedKeyBytes.length = keylen;
return new Buffer(derivedKeyBytes);
};
exports.pbkdf2Sync_sha512 = function(password, salt, iterations, keylen) {
return pbkdf2_sha512(password, salt, keylen, {iterations: iterations});
};