Blame view

node_modules/create-ecdh/browser.js 2.63 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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
  var elliptic = require('elliptic')
  var BN = require('bn.js')
  
  module.exports = function createECDH (curve) {
    return new ECDH(curve)
  }
  
  var aliases = {
    secp256k1: {
      name: 'secp256k1',
      byteLength: 32
    },
    secp224r1: {
      name: 'p224',
      byteLength: 28
    },
    prime256v1: {
      name: 'p256',
      byteLength: 32
    },
    prime192v1: {
      name: 'p192',
      byteLength: 24
    },
    ed25519: {
      name: 'ed25519',
      byteLength: 32
    },
    secp384r1: {
      name: 'p384',
      byteLength: 48
    },
    secp521r1: {
      name: 'p521',
      byteLength: 66
    }
  }
  
  aliases.p224 = aliases.secp224r1
  aliases.p256 = aliases.secp256r1 = aliases.prime256v1
  aliases.p192 = aliases.secp192r1 = aliases.prime192v1
  aliases.p384 = aliases.secp384r1
  aliases.p521 = aliases.secp521r1
  
  function ECDH (curve) {
    this.curveType = aliases[curve]
    if (!this.curveType) {
      this.curveType = {
        name: curve
      }
    }
    this.curve = new elliptic.ec(this.curveType.name) // eslint-disable-line new-cap
    this.keys = void 0
  }
  
  ECDH.prototype.generateKeys = function (enc, format) {
    this.keys = this.curve.genKeyPair()
    return this.getPublicKey(enc, format)
  }
  
  ECDH.prototype.computeSecret = function (other, inenc, enc) {
    inenc = inenc || 'utf8'
    if (!Buffer.isBuffer(other)) {
      other = new Buffer(other, inenc)
    }
    var otherPub = this.curve.keyFromPublic(other).getPublic()
    var out = otherPub.mul(this.keys.getPrivate()).getX()
    return formatReturnValue(out, enc, this.curveType.byteLength)
  }
  
  ECDH.prototype.getPublicKey = function (enc, format) {
    var key = this.keys.getPublic(format === 'compressed', true)
    if (format === 'hybrid') {
      if (key[key.length - 1] % 2) {
        key[0] = 7
      } else {
        key[0] = 6
      }
    }
    return formatReturnValue(key, enc)
  }
  
  ECDH.prototype.getPrivateKey = function (enc) {
    return formatReturnValue(this.keys.getPrivate(), enc)
  }
  
  ECDH.prototype.setPublicKey = function (pub, enc) {
    enc = enc || 'utf8'
    if (!Buffer.isBuffer(pub)) {
      pub = new Buffer(pub, enc)
    }
    this.keys._importPublic(pub)
    return this
  }
  
  ECDH.prototype.setPrivateKey = function (priv, enc) {
    enc = enc || 'utf8'
    if (!Buffer.isBuffer(priv)) {
      priv = new Buffer(priv, enc)
    }
  
    var _priv = new BN(priv)
    _priv = _priv.toString(16)
    this.keys = this.curve.genKeyPair()
    this.keys._importPrivate(_priv)
    return this
  }
  
  function formatReturnValue (bn, enc, len) {
    if (!Array.isArray(bn)) {
      bn = bn.toArray()
    }
    var buf = new Buffer(bn)
    if (len && buf.length < len) {
      var zeros = new Buffer(len - buf.length)
      zeros.fill(0)
      buf = Buffer.concat([zeros, buf])
    }
    if (!enc) {
      return buf
    } else {
      return buf.toString(enc)
    }
  }