summaryrefslogtreecommitdiffstats
path: root/node_modules/create-ecdh/browser.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/create-ecdh/browser.js')
-rw-r--r--node_modules/create-ecdh/browser.js124
1 files changed, 124 insertions, 0 deletions
diff --git a/node_modules/create-ecdh/browser.js b/node_modules/create-ecdh/browser.js
new file mode 100644
index 0000000..3613b45
--- /dev/null
+++ b/node_modules/create-ecdh/browser.js
@@ -0,0 +1,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)
+ }
+}