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