diff --git a/lib/sync.js b/lib/sync.js index a0c322a..811151f 100644 --- a/lib/sync.js +++ b/lib/sync.js @@ -13,6 +13,26 @@ var sizes = { ripemd160: 20 }; +var blockSizes = { + __proto__: null, + blake2b512: 128, // Should use the built-in key support instead of HMAC. + blake2s256: 64, // (ie PBKDF2-BLAKE2b vs PBKDF2-HMAC-BLAKE2b) + md5: 64, + ripemd160: 64, + rmd160: 64, + sha1: 64, + sha224: 64, + sha256: 64, + sha384: 128, + sha512: 128, + 'sha512-224': 128, + 'sha512-256': 128, + 'sha3-224': 144, + 'sha3-256': 136, + 'sha3-384': 104, + 'sha3-512': 72 +}; + var mapping = { __proto__: null, 'sha-1': 'sha1', @@ -24,6 +44,7 @@ var mapping = { }; var createHmac = require('create-hmac'); +var createHash = require('create-hash'); var Buffer = require('safe-buffer').Buffer; var checkParameters = require('./precondition'); @@ -38,9 +59,13 @@ function pbkdf2(password, salt, iterations, keylen, digest) { var lowerDigest = (digest || 'sha1').toLowerCase(); var mappedDigest = mapping[lowerDigest] || lowerDigest; var size = sizes[mappedDigest]; - if (typeof size !== 'number' || !size) { + var blockSize = blockSizes[mappedDigest]; + if (typeof size !== 'number' || !size || typeof blockSize !== 'number' || !blockSize) { throw new TypeError('Digest algorithm not supported: ' + digest); } + if (password.length > blockSize) { + password = createHash(mappedDigest).update(password).digest(); + } var DK = Buffer.allocUnsafe(keylen); var block1 = Buffer.allocUnsafe(salt.length + 4);