diff --git a/lib/internal/streams/lazy_transform.js b/lib/internal/streams/lazy_transform.js index bd68bef4b6dd17..3607d985346992 100644 --- a/lib/internal/streams/lazy_transform.js +++ b/lib/internal/streams/lazy_transform.js @@ -5,6 +5,7 @@ const stream = require('stream'); const util = require('util'); +const crypto = require('crypto'); module.exports = LazyTransform; @@ -22,7 +23,11 @@ util.inherits(LazyTransform, stream.Transform); get: function() { stream.Transform.call(this, this._options); this._writableState.decodeStrings = false; - this._writableState.defaultEncoding = 'latin1'; + + if (!this._options || !this._options.defaultEncoding) { + this._writableState.defaultEncoding = crypto.DEFAULT_ENCODING; + } + return this[prop]; }, set: function(val) { diff --git a/test/parallel/test-crypto.js b/test/parallel/test-crypto.js index 46218e72754eba..37729b2cbcde37 100644 --- a/test/parallel/test-crypto.js +++ b/test/parallel/test-crypto.js @@ -189,3 +189,42 @@ console.log(crypto.randomBytes(16)); assert.throws(function() { tls.createSecureContext({ crl: 'not a CRL' }); }, /^Error: Failed to parse CRL$/); + +/** + * Check if the stream function uses utf8 as a default encoding. + **/ + +function testEncoding(options, assertionHash) { + const hash = crypto.createHash('sha256', options); + let hashValue = ''; + + hash.on('data', (data) => { + hashValue += data.toString('hex'); + }); + + hash.on('end', common.mustCall(() => { + assert.strictEqual(hashValue, assertionHash); + })); + + hash.write('öäü'); + hash.end(); +} + +// Hash of "öäü" in utf8 format +const assertionHashUtf8 = + '4f53d15bee524f082380e6d7247cc541e7cb0d10c64efdcc935ceeb1e7ea345c'; + +// Hash of "öäü" in latin1 format +const assertionHashLatin1 = + 'cd37bccd5786e2e76d9b18c871e919e6eb11cc12d868f5ae41c40ccff8e44830'; + +testEncoding(undefined, assertionHashUtf8); +testEncoding({}, assertionHashUtf8); + +testEncoding({ + defaultEncoding: 'utf8' +}, assertionHashUtf8); + +testEncoding({ + defaultEncoding: 'latin1' +}, assertionHashLatin1);