Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorIngmar Runge <ingmar@irsoft.de>2011-12-03 00:04:13 +0400
committerBert Belder <bertbelder@gmail.com>2012-01-19 00:20:25 +0400
commit0ca30187cfc4c437510bf0ed3d27a660ba54c80b (patch)
tree42f049e1a50231a660a86b38468817ecad3ecac5 /test
parentad42a82df556068ffe79e13bd36799a8eedb3ebf (diff)
Crypto: adding ability to turn off automatic PKCS padding
Diffstat (limited to 'test')
-rw-r--r--test/simple/test-crypto-padding.js119
1 files changed, 119 insertions, 0 deletions
diff --git a/test/simple/test-crypto-padding.js b/test/simple/test-crypto-padding.js
new file mode 100644
index 00000000000..55bd94e00d6
--- /dev/null
+++ b/test/simple/test-crypto-padding.js
@@ -0,0 +1,119 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+
+try {
+ var crypto = require('crypto');
+} catch (e) {
+ console.log('Not compiled with OPENSSL support.');
+ process.exit();
+}
+
+
+/*
+ * Input data
+ */
+
+var ODD_LENGTH_PLAIN = 'Hello node world!',
+ EVEN_LENGTH_PLAIN = 'Hello node world!AbC09876dDeFgHi';
+
+var KEY_PLAIN = 'S3c.r.e.t.K.e.Y!',
+ IV_PLAIN = 'blahFizz2011Buzz';
+
+var CIPHER_NAME = 'aes-128-cbc';
+
+
+/*
+ * Expected result data
+ */
+
+// echo -n 'Hello node world!' | openssl enc -aes-128-cbc -e -K 5333632e722e652e742e4b2e652e5921 -iv 626c616846697a7a3230313142757a7a | xxd -p -c256
+var ODD_LENGTH_ENCRYPTED = '7f57859550d4d2fdb9806da2a750461a9fe77253cd1cbd4b07beee4e070d561f';
+
+// echo -n 'Hello node world!AbC09876dDeFgHi' | openssl enc -aes-128-cbc -e -K 5333632e722e652e742e4b2e652e5921 -iv 626c616846697a7a3230313142757a7a | xxd -p -c256
+var EVEN_LENGTH_ENCRYPTED = '7f57859550d4d2fdb9806da2a750461ab46e71b3d78ebe2d9684dfc87f7575b9886119866912cb8c7bcaf76c5ebc2378';
+
+// echo -n 'Hello node world!AbC09876dDeFgHi' | openssl enc -aes-128-cbc -e -K 5333632e722e652e742e4b2e652e5921 -iv 626c616846697a7a3230313142757a7a -nopad | xxd -p -c256
+var EVEN_LENGTH_ENCRYPTED_NOPAD = '7f57859550d4d2fdb9806da2a750461ab46e71b3d78ebe2d9684dfc87f7575b9';
+
+
+/*
+ * Helper wrappers
+ */
+
+function enc(plain, pad) {
+ var encrypt = crypto.createCipheriv(CIPHER_NAME, KEY_PLAIN, IV_PLAIN);
+ encrypt.setAutoPadding(pad);
+ var hex = encrypt.update(plain, 'ascii', 'hex');
+ hex += encrypt.final('hex');
+ return hex;
+}
+
+function dec(encd, pad) {
+ var decrypt = crypto.createDecipheriv(CIPHER_NAME, KEY_PLAIN, IV_PLAIN);
+ decrypt.setAutoPadding(pad);
+ var plain = decrypt.update(encd, 'hex');
+ plain += decrypt.final('binary');
+ return plain;
+}
+
+
+/*
+ * Test encryption
+ */
+
+assert.equal(enc(ODD_LENGTH_PLAIN, true), ODD_LENGTH_ENCRYPTED);
+assert.equal(enc(EVEN_LENGTH_PLAIN, true), EVEN_LENGTH_ENCRYPTED);
+
+assert.throws(function() {
+ // input must have block length %
+ enc(ODD_LENGTH_PLAIN, false);
+});
+
+assert.doesNotThrow(function() {
+ assert.equal(enc(EVEN_LENGTH_PLAIN, false), EVEN_LENGTH_ENCRYPTED_NOPAD);
+});
+
+
+/*
+ * Test decryption
+ */
+
+assert.equal(dec(ODD_LENGTH_ENCRYPTED, true), ODD_LENGTH_PLAIN);
+assert.equal(dec(EVEN_LENGTH_ENCRYPTED, true), EVEN_LENGTH_PLAIN);
+
+assert.doesNotThrow(function() {
+ // returns including original padding
+ assert.equal(dec(ODD_LENGTH_ENCRYPTED, false).length, 32);
+ assert.equal(dec(EVEN_LENGTH_ENCRYPTED, false).length, 48);
+});
+
+assert.throws(function() {
+ // must have at least 1 byte of padding (PKCS):
+ assert.equal(dec(EVEN_LENGTH_ENCRYPTED_NOPAD, true), EVEN_LENGTH_PLAIN);
+});
+
+assert.doesNotThrow(function() {
+ // no-pad encrypted string should return the same:
+ assert.equal(dec(EVEN_LENGTH_ENCRYPTED_NOPAD, false), EVEN_LENGTH_PLAIN);
+});