-
Notifications
You must be signed in to change notification settings - Fork 14
/
browser.js
124 lines (112 loc) · 2.63 KB
/
browser.js
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)
}
}