summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorWei-Wei Wu <wuxx1045@umn.edu>2018-03-01 17:13:12 -0800
committerTobias Nießen <tniessen@tnie.de>2018-03-23 19:56:59 +0100
commitf2e02883e7ef6ff58331e980f91bc31d8076a5c8 (patch)
tree81055ee1ca2f44f3f127af876584a2c4c7910df2 /lib
parenta0adf56855f59a301d9a1f69b4267ced4fd4cf03 (diff)
downloadandroid-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.js82
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,