Blame view

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