Skip to content

Commit

Permalink
CipherParams conform to latest spec (separate algorithm and keyLength)
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonWoolf committed Sep 8, 2015
1 parent 29ebc6a commit 08438ef
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 18 deletions.
9 changes: 7 additions & 2 deletions browser/lib/util/crypto.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
var Crypto = (function() {
var DEFAULT_ALGORITHM = 'aes';
var DEFAULT_KEYLENGTH = 128; // bits
var DEFAULT_MODE = 'cbc';
var DEFAULT_BLOCKLENGTH = 16; // bytes
var DEFAULT_BLOCKLENGTH_WORDS = 4; // 32-bit words
var VAL32 = 0x100000000;
Expand Down Expand Up @@ -102,6 +103,8 @@ var Crypto = (function() {
*/
function CipherParams() {
this.algorithm = null;
this.keyLength = null;
this.mode = null;
this.key = null;
this.iv = null;
}
Expand Down Expand Up @@ -138,8 +141,10 @@ var Crypto = (function() {
key = BufferUtils.toWordArray(key); // Expect key to be an Array, ArrayBuffer, or WordArray at this point

var params = new CipherParams();
params.algorithm = DEFAULT_ALGORITHM + '-' + String(key.words.length * (4 * 8));
params.algorithm = DEFAULT_ALGORITHM;
params.key = key;
params.keyLength = key.words.length * (4 * 8);
params.mode = DEFAULT_MODE;
generateRandom(DEFAULT_BLOCKLENGTH, function(err, buf) {
params.iv = buf;
callback(null, params);
Expand Down Expand Up @@ -170,7 +175,7 @@ var Crypto = (function() {
};

function CBCCipher(params) {
this.algorithm = params.algorithm + '-cbc';
this.algorithm = params.algorithm + '-' + String(params.keyLength) + '-' + params.mode;
var cjsAlgorithm = this.cjsAlgorithm = params.algorithm.toUpperCase().replace(/-\d+$/, '');
var key = this.key = BufferUtils.toWordArray(params.key);
var iv = this.iv = BufferUtils.toWordArray(params.iv);
Expand Down
10 changes: 8 additions & 2 deletions nodejs/lib/util/crypto.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ var Crypto = (function() {

var DEFAULT_ALGORITHM = 'aes';
var DEFAULT_KEYLENGTH = 128; // bits
var DEFAULT_MODE = 'cbc';
var DEFAULT_BLOCKLENGTH = 16; // bytes

/**
Expand Down Expand Up @@ -80,6 +81,8 @@ var Crypto = (function() {
*/
function CipherParams() {
this.algorithm = null;
this.keyLength = null;
this.mode = null;
this.key = null;
this.iv = null;
}
Expand Down Expand Up @@ -112,8 +115,11 @@ var Crypto = (function() {
}

var params = new CipherParams();
params.algorithm = DEFAULT_ALGORITHM + '-' + String(key.length * 8);
params.algorithm = DEFAULT_ALGORITHM;
params.key = key;
params.keyLength = key.length * 8;
params.mode = DEFAULT_MODE;
params.algorithm = DEFAULT_ALGORITHM;
generateRandom(DEFAULT_BLOCKLENGTH, function(err, buf) {
params.iv = buf;
callback(null, params);
Expand Down Expand Up @@ -144,7 +150,7 @@ var Crypto = (function() {
};

function CBCCipher(params) {
var algorithm = this.algorithm = params.algorithm + '-cbc';
var algorithm = this.algorithm = params.algorithm + '-' + String(params.keyLength) + '-' + params.mode;
var key = this.key = params.key;
var iv = this.iv = params.iv;
this.encryptCipher = crypto.createCipheriv(algorithm, key, iv);
Expand Down
35 changes: 21 additions & 14 deletions spec/realtime/crypto.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
}

var realtime = helper.AblyRealtime({ transports: ['web_socket'] });
test.expect(2);
test.expect(3);
var channel = realtime.channels.get('single_send_binary'),
messageText = 'Test message (single_send_binary)';

Expand All @@ -240,7 +240,8 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
return;
}

test.equal(params.algorithm, 'aes-128');
test.equal(params.algorithm, 'aes');
test.equal(params.keyLength, 128);
channel.setOptions({encrypted:true, cipherParams: params});
channel.subscribe('event0', function(msg) {
test.ok(msg.data == messageText);
Expand All @@ -261,12 +262,13 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
}

var realtime = helper.AblyRealtime({ transports: ['web_socket'], useBinaryProtocol: false });
test.expect(2);
test.expect(3);
var channel = realtime.channels.get('single_send_text'),
messageText = 'Test message (single_send_text)';

Crypto.getDefaultParams(function(err, params) {
test.equal(params.algorithm, 'aes-128');
test.equal(params.algorithm, 'aes');
test.equal(params.keyLength, 128);
if(err) {
test.ok(false, 'Unable to get cipher params; err = ' + err);
closeAndFinish(test, realtime);
Expand All @@ -292,13 +294,14 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
}

var realtime = helper.AblyRealtime({ transports: ['web_socket'] });
test.expect(2);
test.expect(3);
var channel = realtime.channels.get('single_send_binary_256'),
messageText = 'Test message (single_send_binary_256)';

Crypto.generateRandom(256 / 8, function(err, key) {
Crypto.getDefaultParams(key, function(err, params) {
test.equal(params.algorithm, 'aes-256');
test.equal(params.algorithm, 'aes');
test.equal(params.keyLength, 256);
if(err) {
test.ok(false, 'Unable to get cipher params; err = ' + err);
closeAndFinish(test, realtime);
Expand All @@ -325,13 +328,14 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
}

var realtime = helper.AblyRealtime({ transports: ['web_socket'], useBinaryProtocol: false });
test.expect(2);
test.expect(3);
var channel = realtime.channels.get('single_send_text_256'),
messageText = 'Test message (single_send_text_256)';

Crypto.generateRandom(256 / 8, function(err, key) {
Crypto.getDefaultParams(key, function(err, params) {
test.equal(params.algorithm, 'aes-256');
test.equal(params.algorithm, 'aes');
test.equal(params.keyLength, 256);
if(err) {
test.ok(false, 'Unable to get cipher params; err = ' + err);
closeAndFinish(test, realtime);
Expand All @@ -355,14 +359,15 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
}

var realtime = helper.AblyRealtime({ transports: ['web_socket'], useBinaryProtocol: !text});
test.expect(iterations + 2);
test.expect(iterations + 3);
var channelName = 'multiple_send_' + (text ? 'text_' : 'binary_') + iterations + '_' + delay,
channel = realtime.channels.get(channelName),
messageText = 'Test message (' + channelName + ')';

Crypto.generateRandom(128 / 8, function(err, key) {
Crypto.getDefaultParams(key, function(err, params) {
test.equal(params.algorithm, 'aes-128');
test.equal(params.algorithm, 'aes');
test.equal(params.keyLength, 128);
if(err) {
test.ok(false, 'Unable to get cipher params; err = ' + err);
closeAndFinish(test, realtime);
Expand Down Expand Up @@ -419,7 +424,7 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {

var txRealtime = helper.AblyRealtime({ transports: ['web_socket'] });
var rxRealtime = helper.AblyRealtime({ transports: ['web_socket'], useBinaryProtocol: false });
test.expect(2);
test.expect(3);
var channelName = 'single_send_binary_text',
messageText = 'Test message (' + channelName + ')',
txChannel = txRealtime.channels.get(channelName),
Expand All @@ -435,7 +440,8 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
return;
}
var params = res[0];
test.equal(params.algorithm, 'aes-128');
test.equal(params.algorithm, 'aes');
test.equal(params.keyLength, 128);

txChannel.setOptions({encrypted:true, cipherParams: params});
rxChannel.setOptions({encrypted:true, cipherParams: params});
Expand All @@ -462,7 +468,7 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {

var txRealtime = helper.AblyRealtime({ transports: ['web_socket'], useBinaryProtocol: false });
var rxRealtime = helper.AblyRealtime({ transports: ['web_socket'] });
test.expect(2);
test.expect(3);
var channelName = 'single_send_text_binary',
messageText = 'Test message (' + channelName + ')',
txChannel = txRealtime.channels.get(channelName),
Expand All @@ -478,7 +484,8 @@ define(['ably', 'shared_helper', 'async'], function(Ably, helper, async) {
return;
}
var params = res[0];
test.equal(params.algorithm, 'aes-128');
test.equal(params.algorithm, 'aes');
test.equal(params.keyLength, 128);

txChannel.setOptions({encrypted:true, cipherParams: params});
rxChannel.setOptions({encrypted:true, cipherParams: params});
Expand Down

0 comments on commit 08438ef

Please sign in to comment.