diff --git a/src/node_crypto.cc b/src/node_crypto.cc index 20a475e35e5..058d0c705b2 100644 --- a/src/node_crypto.cc +++ b/src/node_crypto.cc @@ -1825,6 +1825,19 @@ class Cipher : public ObjectWrap { outString = Encode(out_hexdigest, out_hex_len, BINARY); delete [] out_hexdigest; } else if (strcasecmp(*encoding, "base64") == 0) { + // Check to see if we need to add in previous base64 overhang + if (cipher->incomplete_base64!=NULL){ + unsigned char* complete_base64 = new unsigned char[out_len+cipher->incomplete_base64_len+1]; + memcpy(complete_base64, cipher->incomplete_base64, cipher->incomplete_base64_len); + memcpy(&complete_base64[cipher->incomplete_base64_len], out_value, out_len); + delete [] out_value; + + delete [] cipher->incomplete_base64; + cipher->incomplete_base64=NULL; + + out_value=complete_base64; + out_len += cipher->incomplete_base64_len; + } base64(out_value, out_len, &out_hexdigest, &out_hex_len); outString = Encode(out_hexdigest, out_hex_len, BINARY); delete [] out_hexdigest; diff --git a/test/simple/test-crypto.js b/test/simple/test-crypto.js index 9f2d6f32e0f..2e42459c6ff 100644 --- a/test/simple/test-crypto.js +++ b/test/simple/test-crypto.js @@ -128,6 +128,25 @@ txt += decipher.final('utf8'); assert.equal(txt, plaintext, 'encryption and decryption'); +// encryption and decryption with Base64 +// reported in https://github.com/joyent/node/issues/738 +var plaintext = + '32|RmVZZkFUVmpRRkp0TmJaUm56ZU9qcnJkaXNNWVNpTTU*|iXmckfRWZBGWWELw' + + 'eCBsThSsfUHLeRe0KCsK8ooHgxie0zOINpXxfZi/oNG7uq9JWFVCk70gfzQH8ZUJjAfaFg**'; +var cipher = crypto.createCipher('aes256', '0123456789abcdef'); + +// encrypt plaintext which is in utf8 format +// to a ciphertext which will be in Base64 +var ciph = cipher.update(plaintext, 'utf8', 'base64'); +ciph += cipher.final('base64'); + +var decipher = crypto.createDecipher('aes256', '0123456789abcdef'); +var txt = decipher.update(ciph, 'base64', 'utf8'); +txt += decipher.final('utf8'); + +assert.equal(txt, plaintext, 'encryption and decryption with Base64'); + + // Test encyrption and decryption with explicit key and iv var encryption_key = '0123456789abcd0123456789'; var iv = '12345678';