From 1640e7a4da9ecb202d7439a622daaf698987ae05 Mon Sep 17 00:00:00 2001 From: atstojanov Date: Sat, 27 Aug 2016 19:41:46 +0300 Subject: [PATCH] crypto: fix getDecoder() encoding check Normalize the encoding in getDecoder() before using it. Fixes an AssertionError: "Cannot change encoding" when encoding is "ucs2", "ucs-2" or "utf-16le" Fixes: https://github.com/nodejs/node/issues/8236 PR-URL: https://github.com/nodejs/node/pull/8301 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell --- lib/crypto.js | 2 +- test/parallel/test-crypto-cipher-decipher.js | 26 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/crypto.js b/lib/crypto.js index 9ffff06f7f..16a8524f84 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -100,7 +100,7 @@ Hmac.prototype._transform = Hash.prototype._transform; function getDecoder(decoder, encoding) { - if (encoding === 'utf-8') encoding = 'utf8'; // Normalize encoding. + encoding = internalUtil.normalizeEncoding(encoding); decoder = decoder || new StringDecoder(encoding); assert(decoder.encoding === encoding, 'Cannot change encoding'); return decoder; diff --git a/test/parallel/test-crypto-cipher-decipher.js b/test/parallel/test-crypto-cipher-decipher.js index 8c9daa16e8..0a140cf9f4 100644 --- a/test/parallel/test-crypto-cipher-decipher.js +++ b/test/parallel/test-crypto-cipher-decipher.js @@ -113,3 +113,29 @@ testCipher2(Buffer.from('0123456789abcdef')); c.update('update', 'utf-8'); c.final('utf8'); // Should not throw. } + +// Regression tests for https://github.com/nodejs/node/issues/8236. +{ + const key = '0123456789abcdef'; + const plaintext = 'Top secret!!!'; + const c = crypto.createCipher('aes192', key); + var ciph = c.update(plaintext, 'utf16le', 'base64'); + ciph += c.final('base64'); + + var decipher = crypto.createDecipher('aes192', key); + + var txt; + assert.doesNotThrow(() => txt = decipher.update(ciph, 'base64', 'ucs2')); + assert.doesNotThrow(() => txt += decipher.final('ucs2')); + assert.strictEqual(txt, plaintext, 'decrypted result in ucs2'); + + decipher = crypto.createDecipher('aes192', key); + assert.doesNotThrow(() => txt = decipher.update(ciph, 'base64', 'ucs-2')); + assert.doesNotThrow(() => txt += decipher.final('ucs-2')); + assert.strictEqual(txt, plaintext, 'decrypted result in ucs-2'); + + decipher = crypto.createDecipher('aes192', key); + assert.doesNotThrow(() => txt = decipher.update(ciph, 'base64', 'utf-16le')); + assert.doesNotThrow(() => txt += decipher.final('utf-16le')); + assert.strictEqual(txt, plaintext, 'decrypted result in utf-16le'); +}