From 443691a5aef8a908bc4c6f63b1710eb988235674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Mo=CC=88ller?= Date: Sat, 17 Sep 2016 11:32:29 +0200 Subject: [PATCH] crypto: fix default encoding of LazyTransform PullRequest #5522 and #5500 described the change of the default encoding into UTF8 in crypto functions. This however was only changed for the non-streaming API. The streaming API still used binary as the default encoding. This commit will change the default streaming API encoding to UTF8 to make both APIs behave the same. It will also add tests to validate the behavior. Refs: https://github.com/nodejs/node/pull/5522 Refs: https://github.com/nodejs/node/pull/5500 PR-URL: https://github.com/nodejs/node/pull/8611 Reviewed-By: Fedor Indutny Reviewed-By: James M Snell Reviewed-By: Anna Henningsen --- lib/internal/streams/lazy_transform.js | 7 ++++- test/parallel/test-crypto.js | 39 ++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) 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);