From 98be8df571f92ad0b846209c21cc00139bc14805 Mon Sep 17 00:00:00 2001 From: Kai Groner Date: Thu, 18 Apr 2013 19:01:14 -0400 Subject: [PATCH] crypto: Make Decipher._flush() emit errors. When Decipher processes a stream using an incorrect key, the DecipherFinal() method throws an unhandled exception at the end of the stream. --- lib/crypto.js | 7 ++++++- test/simple/test-crypto-stream.js | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/lib/crypto.js b/lib/crypto.js index 0cc70ff15a8..22141ff8ae9 100644 --- a/lib/crypto.js +++ b/lib/crypto.js @@ -263,7 +263,12 @@ Cipher.prototype._transform = function(chunk, encoding, callback) { }; Cipher.prototype._flush = function(callback) { - this.push(this._binding.final()); + try { + this.push(this._binding.final()); + } catch (e) { + callback(e); + return; + } callback(); }; diff --git a/test/simple/test-crypto-stream.js b/test/simple/test-crypto-stream.js index b51516f7d19..72c9776d09b 100644 --- a/test/simple/test-crypto-stream.js +++ b/test/simple/test-crypto-stream.js @@ -60,3 +60,18 @@ crypto.createHash('md5').unpipe({}); crypto.createHash('md5').setEncoding('utf8'); crypto.createHash('md5').pause(); crypto.createHash('md5').resume(); + +// Decipher._flush() should emit an error event, not an exception. +var key = new Buffer('48fb56eb10ffeb13fc0ef551bbca3b1b', 'hex'), + badkey = new Buffer('12341234123412341234123412341234', 'hex'), + iv = new Buffer('6d358219d1f488f5f4eb12820a66d146', 'hex'), + cipher = crypto.createCipheriv('aes-128-cbc', key, iv), + decipher = crypto.createDecipheriv('aes-128-cbc', badkey, iv); + +cipher.pipe(decipher) + .on('error', common.mustCall(function end(err) { + // TypeError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt + assert(/:06065064:/.test(err)); + })); + +cipher.end('Papaya!'); // Should not cause an unhandled exception.