diff options
author | Wei-Wei Wu <wuxx1045@umn.edu> | 2018-03-01 17:13:12 -0800 |
---|---|---|
committer | Tobias Nießen <tniessen@tnie.de> | 2018-03-23 19:56:59 +0100 |
commit | f2e02883e7ef6ff58331e980f91bc31d8076a5c8 (patch) | |
tree | 81055ee1ca2f44f3f127af876584a2c4c7910df2 /lib | |
parent | a0adf56855f59a301d9a1f69b4267ced4fd4cf03 (diff) | |
download | android-node-v8-f2e02883e7ef6ff58331e980f91bc31d8076a5c8.tar.gz android-node-v8-f2e02883e7ef6ff58331e980f91bc31d8076a5c8.tar.bz2 android-node-v8-f2e02883e7ef6ff58331e980f91bc31d8076a5c8.zip |
crypto: add ECDH.convertKey to convert public keys
ECDH.convertKey is used to convert public keys between different
formats.
PR-URL: https://github.com/nodejs/node/pull/19080
Fixes: https://github.com/nodejs/node/issues/18977
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/internal/crypto/diffiehellman.js | 82 |
1 files changed, 50 insertions, 32 deletions
diff --git a/lib/internal/crypto/diffiehellman.js b/lib/internal/crypto/diffiehellman.js index f6d525c215..793f3fb351 100644 --- a/lib/internal/crypto/diffiehellman.js +++ b/lib/internal/crypto/diffiehellman.js @@ -14,7 +14,8 @@ const { const { DiffieHellman: _DiffieHellman, DiffieHellmanGroup: _DiffieHellmanGroup, - ECDH: _ECDH + ECDH: _ECDH, + ECDHConvertKey: _ECDHConvertKey } = process.binding('crypto'); const { POINT_CONVERSION_COMPRESSED, @@ -84,11 +85,9 @@ DiffieHellmanGroup.prototype.generateKeys = dhGenerateKeys; function dhGenerateKeys(encoding) { - var keys = this._handle.generateKeys(); + const keys = this._handle.generateKeys(); encoding = encoding || getDefaultEncoding(); - if (encoding && encoding !== 'buffer') - keys = keys.toString(encoding); - return keys; + return encode(keys, encoding); } @@ -100,12 +99,10 @@ function dhComputeSecret(key, inEnc, outEnc) { const encoding = getDefaultEncoding(); inEnc = inEnc || encoding; outEnc = outEnc || encoding; - var ret = this._handle.computeSecret(toBuf(key, inEnc)); + const ret = this._handle.computeSecret(toBuf(key, inEnc)); if (typeof ret === 'string') throw new ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY(); - if (outEnc && outEnc !== 'buffer') - ret = ret.toString(outEnc); - return ret; + return encode(ret, outEnc); } @@ -114,11 +111,9 @@ DiffieHellmanGroup.prototype.getPrime = dhGetPrime; function dhGetPrime(encoding) { - var prime = this._handle.getPrime(); + const prime = this._handle.getPrime(); encoding = encoding || getDefaultEncoding(); - if (encoding && encoding !== 'buffer') - prime = prime.toString(encoding); - return prime; + return encode(prime, encoding); } @@ -127,11 +122,9 @@ DiffieHellmanGroup.prototype.getGenerator = dhGetGenerator; function dhGetGenerator(encoding) { - var generator = this._handle.getGenerator(); + const generator = this._handle.getGenerator(); encoding = encoding || getDefaultEncoding(); - if (encoding && encoding !== 'buffer') - generator = generator.toString(encoding); - return generator; + return encode(generator, encoding); } @@ -140,11 +133,9 @@ DiffieHellmanGroup.prototype.getPublicKey = dhGetPublicKey; function dhGetPublicKey(encoding) { - var key = this._handle.getPublicKey(); + const key = this._handle.getPublicKey(); encoding = encoding || getDefaultEncoding(); - if (encoding && encoding !== 'buffer') - key = key.toString(encoding); - return key; + return encode(key, encoding); } @@ -153,11 +144,9 @@ DiffieHellmanGroup.prototype.getPrivateKey = dhGetPrivateKey; function dhGetPrivateKey(encoding) { - var key = this._handle.getPrivateKey(); + const key = this._handle.getPrivateKey(); encoding = encoding || getDefaultEncoding(); - if (encoding && encoding !== 'buffer') - key = key.toString(encoding); - return key; + return encode(key, encoding); } @@ -197,7 +186,40 @@ ECDH.prototype.generateKeys = function generateKeys(encoding, format) { }; ECDH.prototype.getPublicKey = function getPublicKey(encoding, format) { - var f; + const f = getFormat(format); + const key = this._handle.getPublicKey(f); + encoding = encoding || getDefaultEncoding(); + return encode(key, encoding); +}; + +ECDH.convertKey = function convertKey(key, curve, inEnc, outEnc, format) { + if (typeof key !== 'string' && !isArrayBufferView(key)) { + throw new ERR_INVALID_ARG_TYPE( + 'key', + ['string', 'Buffer', 'TypedArray', 'DataView'] + ); + } + + if (typeof curve !== 'string') { + throw new ERR_INVALID_ARG_TYPE('curve', 'string'); + } + + const encoding = getDefaultEncoding(); + inEnc = inEnc || encoding; + outEnc = outEnc || encoding; + const f = getFormat(format); + const convertedKey = _ECDHConvertKey(toBuf(key, inEnc), curve, f); + return encode(convertedKey, outEnc); +}; + +function encode(buffer, encoding) { + if (encoding && encoding !== 'buffer') + buffer = buffer.toString(encoding); + return buffer; +} + +function getFormat(format) { + let f; if (format) { if (format === 'compressed') f = POINT_CONVERSION_COMPRESSED; @@ -211,12 +233,8 @@ ECDH.prototype.getPublicKey = function getPublicKey(encoding, format) { } else { f = POINT_CONVERSION_UNCOMPRESSED; } - var key = this._handle.getPublicKey(f); - encoding = encoding || getDefaultEncoding(); - if (encoding && encoding !== 'buffer') - key = key.toString(encoding); - return key; -}; + return f; +} module.exports = { DiffieHellman, |