index.js 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. var md5 = require('create-hash/md5')
  2. module.exports = EVP_BytesToKey
  3. function EVP_BytesToKey (password, salt, keyLen, ivLen) {
  4. if (!Buffer.isBuffer(password)) {
  5. password = new Buffer(password, 'binary')
  6. }
  7. if (salt && !Buffer.isBuffer(salt)) {
  8. salt = new Buffer(salt, 'binary')
  9. }
  10. keyLen = keyLen / 8
  11. ivLen = ivLen || 0
  12. var ki = 0
  13. var ii = 0
  14. var key = new Buffer(keyLen)
  15. var iv = new Buffer(ivLen)
  16. var addmd = 0
  17. var md_buf
  18. var i
  19. var bufs = []
  20. while (true) {
  21. if (addmd++ > 0) {
  22. bufs.push(md_buf)
  23. }
  24. bufs.push(password)
  25. if (salt) {
  26. bufs.push(salt)
  27. }
  28. md_buf = md5(Buffer.concat(bufs))
  29. bufs = []
  30. i = 0
  31. if (keyLen > 0) {
  32. while (true) {
  33. if (keyLen === 0) {
  34. break
  35. }
  36. if (i === md_buf.length) {
  37. break
  38. }
  39. key[ki++] = md_buf[i]
  40. keyLen--
  41. i++
  42. }
  43. }
  44. if (ivLen > 0 && i !== md_buf.length) {
  45. while (true) {
  46. if (ivLen === 0) {
  47. break
  48. }
  49. if (i === md_buf.length) {
  50. break
  51. }
  52. iv[ii++] = md_buf[i]
  53. ivLen--
  54. i++
  55. }
  56. }
  57. if (keyLen === 0 && ivLen === 0) {
  58. break
  59. }
  60. }
  61. for (i = 0; i < md_buf.length; i++) {
  62. md_buf[i] = 0
  63. }
  64. return {
  65. key: key,
  66. iv: iv
  67. }
  68. }