diff options
author | Anna Henningsen <anna@addaleax.net> | 2017-03-22 09:42:04 +0300 |
---|---|---|
committer | Anna Henningsen <anna@addaleax.net> | 2017-03-27 03:08:49 +0300 |
commit | c3efe726694907ce0b2e41546d84a9a94547383e (patch) | |
tree | 29c490bd046b4e29b9d1cd92d5d94df066800c9a | |
parent | 2dc1053b0a6800ab7baf052017d37eaebf5e5a7e (diff) |
tls: support Uint8Arrays for protocol list buffers
PR-URL: https://github.com/nodejs/node/pull/11984
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
-rw-r--r-- | doc/api/tls.md | 48 | ||||
-rw-r--r-- | lib/tls.js | 5 | ||||
-rw-r--r-- | test/parallel/test-tls-basic-validations.js | 14 |
3 files changed, 51 insertions, 16 deletions
diff --git a/doc/api/tls.md b/doc/api/tls.md index 468a1b4eb8a..1e8bff1d49a 100644 --- a/doc/api/tls.md +++ b/doc/api/tls.md @@ -752,6 +752,10 @@ decrease overall server throughput. <!-- YAML added: v0.11.3 changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/11984 + description: The `ALPNProtocols` and `NPNProtocols` options can + be `Uint8Array`s now. - version: v5.3.0, v4.7.0 pr-url: https://github.com/nodejs/node/pull/4246 description: The `secureContext` option is supported now. @@ -776,16 +780,18 @@ changes: against the list of supplied CAs. An `'error'` event is emitted if verification fails; `err.code` contains the OpenSSL error code. Defaults to `true`. - * `NPNProtocols` {string[]|Buffer[]} An array of strings or `Buffer`s - containing supported NPN protocols. `Buffer`s should have the format - `[len][name][len][name]...` e.g. `0x05hello0x05world`, where the first - byte is the length of the next protocol name. Passing an array is usually - much simpler, e.g. `['hello', 'world']`. - * `ALPNProtocols`: {string[]|Buffer[]} An array of strings or `Buffer`s - containing the supported ALPN protocols. `Buffer`s should have the format - `[len][name][len][name]...` e.g. `0x05hello0x05world`, where the first byte - is the length of the next protocol name. Passing an array is usually much - simpler: `['hello', 'world']`.) + * `NPNProtocols` {string[]|Buffer[]|Uint8Array[]|Buffer|Uint8Array} + An array of strings, Buffer`s or `Uint8Array`s, or a single `Buffer` or + `Uint8Array` containing supported NPN protocols. `Buffer`s should have the + format `[len][name][len][name]...` e.g. `0x05hello0x05world`, where the + first byte is the length of the next protocol name. Passing an array is + usually much simpler, e.g. `['hello', 'world']`. + * `ALPNProtocols`: {string[]|Buffer[]|Uint8Array[]|Buffer|Uint8Array} + An array of strings, `Buffer`s or `Uint8Array`s, or a single `Buffer` or + `Uint8Array` containing the supported ALPN protocols. `Buffer`s should have + the format `[len][name][len][name]...` e.g. `0x05hello0x05world`, where the + first byte is the length of the next protocol name. Passing an array is + usually much simpler, e.g. `['hello', 'world']`. * `servername`: {string} Server name for the SNI (Server Name Indication) TLS extension. * `checkServerIdentity(servername, cert)` {Function} A callback function @@ -1002,6 +1008,10 @@ publicly trusted list of CAs as given in <!-- YAML added: v0.3.2 changes: + - version: REPLACEME + pr-url: https://github.com/nodejs/node/pull/11984 + description: The `ALPNProtocols` and `NPNProtocols` options can + be `Uint8Array`s now. - version: v5.0.0 pr-url: https://github.com/nodejs/node/pull/2564 description: ALPN options are supported now. @@ -1018,10 +1028,20 @@ changes: * `rejectUnauthorized` {boolean} If not `false` the server will reject any connection which is not authorized with the list of supplied CAs. This option only has an effect if `requestCert` is `true`. Defaults to `true`. - * `NPNProtocols` {string[]|Buffer} An array of strings or a `Buffer` naming - possible NPN protocols. (Protocols should be ordered by their priority.) - * `ALPNProtocols` {string[]|Buffer} An array of strings or a `Buffer` naming - possible ALPN protocols. (Protocols should be ordered by their priority.) + * `NPNProtocols` {string[]|Buffer[]|Uint8Array[]|Buffer|Uint8Array} + An array of strings, Buffer`s or `Uint8Array`s, or a single `Buffer` or + `Uint8Array` containing supported NPN protocols. `Buffer`s should have the + format `[len][name][len][name]...` e.g. `0x05hello0x05world`, where the + first byte is the length of the next protocol name. Passing an array is + usually much simpler, e.g. `['hello', 'world']`. + (Protocols should be ordered by their priority.) + * `ALPNProtocols`: {string[]|Buffer[]|Uint8Array[]|Buffer|Uint8Array} + An array of strings, `Buffer`s or `Uint8Array`s, or a single `Buffer` or + `Uint8Array` containing the supported ALPN protocols. `Buffer`s should have + the format `[len][name][len][name]...` e.g. `0x05hello0x05world`, where the + first byte is the length of the next protocol name. Passing an array is + usually much simpler, e.g. `['hello', 'world']`. + (Protocols should be ordered by their priority.) When the server receives both NPN and ALPN extensions from the client, ALPN takes precedence over NPN and the server does not send an NPN extension to the client. diff --git a/lib/tls.js b/lib/tls.js index 9e092fe8bb3..748ab6fefba 100644 --- a/lib/tls.js +++ b/lib/tls.js @@ -28,6 +28,7 @@ const net = require('net'); const url = require('url'); const binding = process.binding('crypto'); const Buffer = require('buffer').Buffer; +const { isUint8Array } = process.binding('util'); // Allow {CLIENT_RENEG_LIMIT} client-initiated session renegotiations // every {CLIENT_RENEG_WINDOW} seconds. An error event is emitted if more @@ -71,7 +72,7 @@ exports.convertNPNProtocols = function(protocols, out) { // If protocols is Array - translate it into buffer if (Array.isArray(protocols)) { out.NPNProtocols = convertProtocols(protocols); - } else if (protocols instanceof Buffer) { + } else if (isUint8Array(protocols)) { // Copy new buffer not to be modified by user. out.NPNProtocols = Buffer.from(protocols); } @@ -81,7 +82,7 @@ exports.convertALPNProtocols = function(protocols, out) { // If protocols is Array - translate it into buffer if (Array.isArray(protocols)) { out.ALPNProtocols = convertProtocols(protocols); - } else if (protocols instanceof Buffer) { + } else if (isUint8Array(protocols)) { // Copy new buffer not to be modified by user. out.ALPNProtocols = Buffer.from(protocols); } diff --git a/test/parallel/test-tls-basic-validations.js b/test/parallel/test-tls-basic-validations.js index 3454da571df..0b5d87ddc88 100644 --- a/test/parallel/test-tls-basic-validations.js +++ b/test/parallel/test-tls-basic-validations.js @@ -56,3 +56,17 @@ assert.throws(() => tls.createSecurePair({}), assert(buffer.equals(Buffer.from('abcd'))); assert(out.NPNProtocols.equals(Buffer.from('efgh'))); } + +{ + const buffer = new Uint8Array(Buffer.from('abcd')); + const out = {}; + tls.convertALPNProtocols(buffer, out); + assert(out.ALPNProtocols.equals(Buffer.from('abcd'))); +} + +{ + const buffer = new Uint8Array(Buffer.from('abcd')); + const out = {}; + tls.convertNPNProtocols(buffer, out); + assert(out.NPNProtocols.equals(Buffer.from('abcd'))); +} |