1 | var sizes = {
|
2 | md5: 16,
|
3 | sha1: 20,
|
4 | sha224: 28,
|
5 | sha256: 32,
|
6 | sha384: 48,
|
7 | sha512: 64,
|
8 | rmd160: 20,
|
9 | ripemd160: 20
|
10 | }
|
11 |
|
12 | var createHmac = require('create-hmac')
|
13 | var Buffer = require('safe-buffer').Buffer
|
14 |
|
15 | var checkParameters = require('./precondition')
|
16 | var defaultEncoding = require('./default-encoding')
|
17 | var toBuffer = require('./to-buffer')
|
18 |
|
19 | function pbkdf2 (password, salt, iterations, keylen, digest) {
|
20 | checkParameters(iterations, keylen)
|
21 | password = toBuffer(password, defaultEncoding, 'Password')
|
22 | salt = toBuffer(salt, defaultEncoding, 'Salt')
|
23 |
|
24 | digest = digest || 'sha1'
|
25 |
|
26 | var DK = Buffer.allocUnsafe(keylen)
|
27 | var block1 = Buffer.allocUnsafe(salt.length + 4)
|
28 | salt.copy(block1, 0, 0, salt.length)
|
29 |
|
30 | var destPos = 0
|
31 | var hLen = sizes[digest]
|
32 | var l = Math.ceil(keylen / hLen)
|
33 |
|
34 | for (var i = 1; i <= l; i++) {
|
35 | block1.writeUInt32BE(i, salt.length)
|
36 |
|
37 | var T = createHmac(digest, password).update(block1).digest()
|
38 | var U = T
|
39 |
|
40 | for (var j = 1; j < iterations; j++) {
|
41 | U = createHmac(digest, password).update(U).digest()
|
42 | for (var k = 0; k < hLen; k++) T[k] ^= U[k]
|
43 | }
|
44 |
|
45 | T.copy(DK, destPos)
|
46 | destPos += hLen
|
47 | }
|
48 |
|
49 | return DK
|
50 | }
|
51 |
|
52 | module.exports = pbkdf2
|