ethers.js/src/utils/pbkdf2.js

43 lines
1.4 KiB
JavaScript
Raw Normal View History

2018-06-13 22:39:39 +03:00
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
2018-06-17 23:47:28 +03:00
var bytes_1 = require("./bytes");
2018-06-13 22:39:39 +03:00
function pbkdf2(password, salt, iterations, keylen, createHmac) {
2018-06-17 23:47:28 +03:00
password = bytes_1.arrayify(password);
salt = bytes_1.arrayify(salt);
2018-06-13 22:39:39 +03:00
var hLen;
var l = 1;
var DK = new Uint8Array(keylen);
var block1 = new Uint8Array(salt.length + 4);
block1.set(salt);
//salt.copy(block1, 0, 0, salt.length)
var r;
var T;
for (var i = 1; i <= l; i++) {
//block1.writeUInt32BE(i, salt.length)
block1[salt.length] = (i >> 24) & 0xff;
block1[salt.length + 1] = (i >> 16) & 0xff;
block1[salt.length + 2] = (i >> 8) & 0xff;
block1[salt.length + 3] = i & 0xff;
var U = createHmac(password).update(block1).digest();
if (!hLen) {
hLen = U.length;
T = new Uint8Array(hLen);
l = Math.ceil(keylen / hLen);
r = keylen - (l - 1) * hLen;
}
//U.copy(T, 0, 0, hLen)
T.set(U);
for (var j = 1; j < iterations; j++) {
U = createHmac(password).update(U).digest();
for (var k = 0; k < hLen; k++)
T[k] ^= U[k];
}
var destPos = (i - 1) * hLen;
var len = (i === l ? r : hLen);
//T.copy(DK, destPos, 0, len)
2018-06-17 23:47:28 +03:00
DK.set(bytes_1.arrayify(T).slice(0, len), destPos);
2018-06-13 22:39:39 +03:00
}
2018-06-17 23:47:28 +03:00
return bytes_1.arrayify(DK);
2018-06-13 22:39:39 +03:00
}
exports.pbkdf2 = pbkdf2;