index.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. var Buffer = require('safe-buffer').Buffer
  2. var MD5 = require('md5.js')
  3. /* eslint-disable camelcase */
  4. function EVP_BytesToKey (password, salt, keyLen, ivLen) {
  5. if (!Buffer.isBuffer(password)) password = Buffer.from(password, 'binary')
  6. if (salt) {
  7. if (!Buffer.isBuffer(salt)) salt = Buffer.from(salt, 'binary')
  8. if (salt.length !== 8) throw new RangeError('salt should be Buffer with 8 byte length')
  9. }
  10. var key = Buffer.alloc(keyLen)
  11. var iv = Buffer.alloc(ivLen)
  12. var tmp = Buffer.alloc(0)
  13. while (keyLen > 0 || ivLen > 0) {
  14. var hash = new MD5()
  15. hash.update(tmp)
  16. hash.update(password)
  17. if (salt) hash.update(salt)
  18. tmp = hash.digest()
  19. var used = 0
  20. if (keyLen > 0) {
  21. var keyStart = key.length - keyLen
  22. used = Math.min(keyLen, tmp.length)
  23. tmp.copy(key, keyStart, 0, used)
  24. keyLen -= used
  25. }
  26. if (used < tmp.length && ivLen > 0) {
  27. var ivStart = iv.length - ivLen
  28. var length = Math.min(ivLen, tmp.length - used)
  29. tmp.copy(iv, ivStart, used, used + length)
  30. ivLen -= length
  31. }
  32. }
  33. tmp.fill(0)
  34. return { key: key, iv: iv }
  35. }
  36. module.exports = EVP_BytesToKey