Skip to content

Commit

Permalink
crypto: fix default encoding of LazyTransform
Browse files Browse the repository at this point in the history
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: #5522
Refs: #5500
PR-URL: #8611
Reviewed-By: Fedor Indutny <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Anna Henningsen <[email protected]>
  • Loading branch information
Lukas Möller authored and addaleax committed Mar 11, 2017
1 parent c672077 commit 443691a
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 1 deletion.
7 changes: 6 additions & 1 deletion lib/internal/streams/lazy_transform.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

const stream = require('stream');
const util = require('util');
const crypto = require('crypto');

module.exports = LazyTransform;

Expand All @@ -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) {
Expand Down
39 changes: 39 additions & 0 deletions test/parallel/test-crypto.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

0 comments on commit 443691a

Please sign in to comment.