Skip to content

Commit

Permalink
crypto: fix default encoding of LazyTransform
Browse files Browse the repository at this point in the history
PullRequest nodejs#5522 and nodejs#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: nodejs#5522
Refs: nodejs#5500
PR-URL: nodejs#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 jungx098 committed Mar 21, 2017
1 parent 4c00e60 commit 98659fd
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 98659fd

Please sign in to comment.