crypto: remove arbitrary UTF16 restriction

Since 71f633a32f, this is no longer necessary.

Refs: https://github.com/nodejs/node/pull/22622
Fixes: https://github.com/nodejs/node/issues/29793

PR-URL: https://github.com/nodejs/node/pull/29795
Reviewed-By: Michaël Zasso <targos@protonmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
This commit is contained in:
Anna Henningsen 2019-10-01 13:59:25 +02:00 committed by Rich Trott
parent 500720f578
commit 389969ea92
6 changed files with 18 additions and 30 deletions

View File

@ -765,14 +765,6 @@ to enable or disable FIPS mode in the `crypto` module.
An attempt was made to enable or disable FIPS mode, but FIPS mode was not An attempt was made to enable or disable FIPS mode, but FIPS mode was not
available. available.
<a id="ERR_CRYPTO_HASH_DIGEST_NO_UTF16"></a>
### ERR_CRYPTO_HASH_DIGEST_NO_UTF16
The UTF-16 encoding was used with [`hash.digest()`][]. While the
`hash.digest()` method does allow an `encoding` argument to be passed in,
causing the method to return a string rather than a `Buffer`, the UTF-16
encoding (e.g. `ucs` or `utf16le`) is not supported.
<a id="ERR_CRYPTO_HASH_FINALIZED"></a> <a id="ERR_CRYPTO_HASH_FINALIZED"></a>
### ERR_CRYPTO_HASH_FINALIZED ### ERR_CRYPTO_HASH_FINALIZED
@ -2078,6 +2070,18 @@ removed: v11.12.0
There was an attempt to use a `MessagePort` instance in a closed There was an attempt to use a `MessagePort` instance in a closed
state, usually after `.close()` has been called. state, usually after `.close()` has been called.
<a id="ERR_CRYPTO_HASH_DIGEST_NO_UTF16"></a>
### ERR_CRYPTO_HASH_DIGEST_NO_UTF16
<!-- YAML
added: v9.0.0
removed: REPLACEME
-->
The UTF-16 encoding was used with [`hash.digest()`][]. While the
`hash.digest()` method does allow an `encoding` argument to be passed in,
causing the method to return a string rather than a `Buffer`, the UTF-16
encoding (e.g. `ucs` or `utf16le`) is not supported.
<a id="ERR_HTTP2_FRAME_ERROR"></a> <a id="ERR_HTTP2_FRAME_ERROR"></a>
### ERR_HTTP2_FRAME_ERROR ### ERR_HTTP2_FRAME_ERROR
<!-- YAML <!-- YAML

View File

@ -20,14 +20,12 @@ const {
const { Buffer } = require('buffer'); const { Buffer } = require('buffer');
const { const {
ERR_CRYPTO_HASH_DIGEST_NO_UTF16,
ERR_CRYPTO_HASH_FINALIZED, ERR_CRYPTO_HASH_FINALIZED,
ERR_CRYPTO_HASH_UPDATE_FAILED, ERR_CRYPTO_HASH_UPDATE_FAILED,
ERR_INVALID_ARG_TYPE ERR_INVALID_ARG_TYPE
} = require('internal/errors').codes; } = require('internal/errors').codes;
const { validateEncoding, validateString, validateUint32 } = const { validateEncoding, validateString, validateUint32 } =
require('internal/validators'); require('internal/validators');
const { normalizeEncoding } = require('internal/util');
const { isArrayBufferView } = require('internal/util/types'); const { isArrayBufferView } = require('internal/util/types');
const LazyTransform = require('internal/streams/lazy_transform'); const LazyTransform = require('internal/streams/lazy_transform');
const kState = Symbol('kState'); const kState = Symbol('kState');
@ -90,8 +88,6 @@ Hash.prototype.digest = function digest(outputEncoding) {
if (state[kFinalized]) if (state[kFinalized])
throw new ERR_CRYPTO_HASH_FINALIZED(); throw new ERR_CRYPTO_HASH_FINALIZED();
outputEncoding = outputEncoding || getDefaultEncoding(); outputEncoding = outputEncoding || getDefaultEncoding();
if (normalizeEncoding(outputEncoding) === 'utf16le')
throw new ERR_CRYPTO_HASH_DIGEST_NO_UTF16();
// Explicit conversion for backward compatibility. // Explicit conversion for backward compatibility.
const ret = this[kHandle].digest(`${outputEncoding}`); const ret = this[kHandle].digest(`${outputEncoding}`);
@ -121,8 +117,6 @@ Hmac.prototype.update = Hash.prototype.update;
Hmac.prototype.digest = function digest(outputEncoding) { Hmac.prototype.digest = function digest(outputEncoding) {
const state = this[kState]; const state = this[kState];
outputEncoding = outputEncoding || getDefaultEncoding(); outputEncoding = outputEncoding || getDefaultEncoding();
if (normalizeEncoding(outputEncoding) === 'utf16le')
throw new ERR_CRYPTO_HASH_DIGEST_NO_UTF16();
if (state[kFinalized]) { if (state[kFinalized]) {
const buf = Buffer.from(''); const buf = Buffer.from('');

View File

@ -749,8 +749,6 @@ E('ERR_CRYPTO_FIPS_FORCED',
'Cannot set FIPS mode, it was forced with --force-fips at startup.', Error); 'Cannot set FIPS mode, it was forced with --force-fips at startup.', Error);
E('ERR_CRYPTO_FIPS_UNAVAILABLE', 'Cannot set FIPS mode in a non-FIPS build.', E('ERR_CRYPTO_FIPS_UNAVAILABLE', 'Cannot set FIPS mode in a non-FIPS build.',
Error); Error);
E('ERR_CRYPTO_HASH_DIGEST_NO_UTF16', 'hash.digest() does not support UTF-16',
Error);
E('ERR_CRYPTO_HASH_FINALIZED', 'Digest already called', Error); E('ERR_CRYPTO_HASH_FINALIZED', 'Digest already called', Error);
E('ERR_CRYPTO_HASH_UPDATE_FAILED', 'Hash update failed', Error); E('ERR_CRYPTO_HASH_UPDATE_FAILED', 'Hash update failed', Error);
E('ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS', 'The selected key encoding %s %s.', E('ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS', 'The selected key encoding %s %s.',

View File

@ -4678,7 +4678,6 @@ void Hmac::HmacDigest(const FunctionCallbackInfo<Value>& args) {
if (args.Length() >= 1) { if (args.Length() >= 1) {
encoding = ParseEncoding(env->isolate(), args[0], BUFFER); encoding = ParseEncoding(env->isolate(), args[0], BUFFER);
} }
CHECK_NE(encoding, UCS2); // Digest does not support UTF-16
unsigned char md_value[EVP_MAX_MD_SIZE]; unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len = 0; unsigned int md_len = 0;

View File

@ -161,13 +161,9 @@ common.expectsError(
type: Error type: Error
}); });
common.expectsError( assert.strictEqual(
() => crypto.createHash('sha256').digest('ucs2'), crypto.createHash('sha256').update('test').digest('ucs2'),
{ crypto.createHash('sha256').update('test').digest().toString('ucs2'));
code: 'ERR_CRYPTO_HASH_DIGEST_NO_UTF16',
type: Error
}
);
common.expectsError( common.expectsError(
() => crypto.createHash(), () => crypto.createHash(),

View File

@ -408,12 +408,9 @@ const rfc2202_sha1 = [
for (const { key, data, hmac } of rfc2202_sha1) for (const { key, data, hmac } of rfc2202_sha1)
testHmac('sha1', key, data, hmac); testHmac('sha1', key, data, hmac);
common.expectsError( assert.strictEqual(
() => crypto.createHmac('sha256', 'w00t').digest('ucs2'), crypto.createHmac('sha256', 'w00t').digest('ucs2'),
{ crypto.createHmac('sha256', 'w00t').digest().toString('ucs2'));
code: 'ERR_CRYPTO_HASH_DIGEST_NO_UTF16',
type: Error
});
// Check initialized -> uninitialized state transition after calling digest(). // Check initialized -> uninitialized state transition after calling digest().
{ {