Working implementation of darkwire interface

This commit is contained in:
Dan Seripap 2016-02-19 12:39:47 -05:00
parent ebeab321e1
commit c6670b56d6
6 changed files with 77 additions and 53 deletions

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
node_modules node_modules
npm-debug.log
src/public/main.js src/public/main.js
src/.secret src/.secret

View File

@ -16,6 +16,15 @@ gulp.task('bundle', function() {
.pipe(gulp.dest('src/public')) .pipe(gulp.dest('src/public'))
}); });
gulp.task('dev', function() {
return browserify('src/js/main.js', { debug: true }).transform(babel.configure({
presets: ["es2015"]
})).bundle()
.pipe(source('main.js'))
.pipe(buffer())
.pipe(gulp.dest('src/public'))
});
gulp.task('start', function() { gulp.task('start', function() {
nodemon({ nodemon({
script: 'index.js', script: 'index.js',
@ -24,6 +33,6 @@ gulp.task('start', function() {
env: { env: {
'NODE_ENV': 'development' 'NODE_ENV': 'development'
}, },
tasks: ['bundle'] tasks: ['dev']
}) })
}); });

View File

@ -9,6 +9,25 @@ export default class Darkwire {
this._myUserId = false; this._myUserId = false;
this._connected = false; this._connected = false;
this._users = []; this._users = [];
this._keys = {};
}
get keys() {
return this._keys;
}
set keys(keys) {
this._keys = keys;
return this._keys;
}
get connected() {
return this._connected;
}
set connected(state) {
this._connected = state;
return this._connected;
} }
get users() { get users() {
@ -60,18 +79,14 @@ export default class Darkwire {
encodeMessage(message, messageType) { encodeMessage(message, messageType) {
// Don't send unless other users exist // Don't send unless other users exist
return new Promise( (resolve, reject) => { return new Promise( (resolve, reject) => {
if (this._users.length <= 1) { // if (this._users.length <= 1) {
reject(); // console.log('rejected:' + this._users);
return; // reject();
}; // return;
// };
// if there is a non-empty message and a socket connection // if there is a non-empty message and a socket connection
if (message && this._connected) { if (message && this._connected) {
$('#send-message-btn').removeClass('active');
addChatMessage({
username: username,
message: message
});
let vector = this._cryptoUtil.crypto.getRandomValues(new Uint8Array(16)); let vector = this._cryptoUtil.crypto.getRandomValues(new Uint8Array(16));
let secretKey; let secretKey;
@ -80,14 +95,13 @@ export default class Darkwire {
let signature; let signature;
let signingKey; let signingKey;
let encryptedMessageData; let encryptedMessageData;
// Generate new secret key and vector for each message // Generate new secret key and vector for each message
this._cryptoUtil.createSecretKey() this._cryptoUtil.createSecretKey()
.then(function(key) { .then((key) => {
secretKey = key; secretKey = key;
return this._cryptoUtil.createSigningKey(); return this._cryptoUtil.createSigningKey();
}) })
.then(function(key) { .then((key) => {
signingKey = key; signingKey = key;
// Generate secretKey and encrypt with each user's public key // Generate secretKey and encrypt with each user's public key
let promises = []; let promises = [];
@ -101,20 +115,20 @@ export default class Darkwire {
// Export secret key // Export secret key
this._cryptoUtil.exportKey(secretKey, "raw") this._cryptoUtil.exportKey(secretKey, "raw")
.then(function(data) { .then((data) => {
return this._cryptoUtil.encryptSecretKey(data, thisUser.publicKey); return this._cryptoUtil.encryptSecretKey(data, thisUser.publicKey);
}) })
.then(function(encryptedSecretKey) { .then((encryptedSecretKey) => {
let encData = new Uint8Array(encryptedSecretKey); let encData = new Uint8Array(encryptedSecretKey);
secretKeyStr = this._cryptoUtil.convertArrayBufferViewToString(encData); secretKeyStr = this._cryptoUtil.convertArrayBufferViewToString(encData);
// Export HMAC signing key // Export HMAC signing key
return this._cryptoUtil.exportKey(signingKey, "raw"); return this._cryptoUtil.exportKey(signingKey, "raw");
}) })
.then(function(data) { .then((data) => {
// Encrypt signing key with user's public key // Encrypt signing key with user's public key
return this._cryptoUtil.encryptSigningKey(data, thisUser.publicKey); return this._cryptoUtil.encryptSigningKey(data, thisUser.publicKey);
}) })
.then(function(encryptedSigningKey) { .then((encryptedSigningKey) => {
let encData = new Uint8Array(encryptedSigningKey); let encData = new Uint8Array(encryptedSigningKey);
var str = this._cryptoUtil.convertArrayBufferViewToString(encData); var str = this._cryptoUtil.convertArrayBufferViewToString(encData);
res({ res({
@ -129,16 +143,16 @@ export default class Darkwire {
}); });
return Promise.all(promises); return Promise.all(promises);
}) })
.then(function(data) { .then((data) => {
secretKeys = data; secretKeys = data;
messageData = this._cryptoUtil.convertStringToArrayBufferView(message); messageData = this._cryptoUtil.convertStringToArrayBufferView(message);
return this._cryptoUtil.signKey(messageData, signingKey); return this._cryptoUtil.signKey(messageData, signingKey);
}) })
.then(function(data) { .then((data) => {
signature = data; signature = data;
return this._cryptoUtil.encryptMessage(messageData, secretKey, vector); return this._cryptoUtil.encryptMessage(messageData, secretKey, vector);
}) })
.then(function(data) { .then((data) => {
encryptedMessageData = data; encryptedMessageData = data;
let msg = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(encryptedMessageData)); let msg = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(encryptedMessageData));
let vct = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(vector)); let vct = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(vector));
@ -146,7 +160,7 @@ export default class Darkwire {
resolve({ resolve({
message: msg, message: msg,
vector: vct, vector: vct,
messageType: type, messageType: messageType,
secretKeys: secretKeys, secretKeys: secretKeys,
signature: sig signature: sig
}); });
@ -176,7 +190,7 @@ export default class Darkwire {
let secretKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.secretKey); let secretKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.secretKey);
let signingKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.encryptedSigningKey); let signingKeyArrayBuffer = this._cryptoUtil.convertStringToArrayBufferView(mySecretKey.encryptedSigningKey);
this._cryptoUtil.decryptSecretKey(secretKeyArrayBuffer, keys.private) this._cryptoUtil.decryptSecretKey(secretKeyArrayBuffer, this._keys.private)
.then((data) => { .then((data) => {
return this._cryptoUtil.importSecretKey(new Uint8Array(data), "raw"); return this._cryptoUtil.importSecretKey(new Uint8Array(data), "raw");
}) })
@ -187,7 +201,7 @@ export default class Darkwire {
.then((data) => { .then((data) => {
decryptedMessageData = data; decryptedMessageData = data;
decryptedMessage = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(data)) decryptedMessage = this._cryptoUtil.convertArrayBufferViewToString(new Uint8Array(data))
return this._cryptoUtil.decryptSigningKey(signingKeyArrayBuffer, keys.private) return this._cryptoUtil.decryptSigningKey(signingKeyArrayBuffer, this._keys.private)
}) })
.then((data) => { .then((data) => {
return this._cryptoUtil.importSigningKey(new Uint8Array(data), "raw"); return this._cryptoUtil.importSigningKey(new Uint8Array(data), "raw");

View File

@ -39,7 +39,7 @@ export default class FileHandler {
reader.readAsBinaryString(file); reader.readAsBinaryString(file);
return base64; return encodedFile;
} }
return false; return false;

View File

@ -33,8 +33,6 @@ $(function() {
let roomId = window.location.pathname.length ? window.location.pathname : null; let roomId = window.location.pathname.length ? window.location.pathname : null;
let keys = {};
if (!roomId) return; if (!roomId) return;
$('input.share-text').val(document.location.protocol + "//" + document.location.host + roomId); $('input.share-text').val(document.location.protocol + "//" + document.location.host + roomId);
@ -77,7 +75,7 @@ $(function() {
cryptoUtil.createPrimaryKeys() cryptoUtil.createPrimaryKeys()
]) ])
.then(function(data) { .then(function(data) {
keys = { darkwire.keys = {
public: data[0].publicKey, public: data[0].publicKey,
private: data[0].privateKey private: data[0].privateKey
}; };
@ -231,13 +229,7 @@ $(function() {
$window.keydown(function (event) { $window.keydown(function (event) {
// When the client hits ENTER on their keyboard and chat message input is focused // When the client hits ENTER on their keyboard and chat message input is focused
if (event.which === 13 && $('.inputMessage').is(':focus')) { if (event.which === 13 && $('.inputMessage').is(':focus')) {
let message = cleanInput($inputMessage.val()); handleMessageSending();
darkwire.encodeMessage(message, 'chat').then( (message) => {
$inputMessage.val('');
socket.emit('new message', message);
}).catch( (err) => {
console.log(err);
});
socket.emit('stop typing'); socket.emit('stop typing');
typing = false; typing = false;
} }
@ -296,16 +288,14 @@ $(function() {
// Whenever the server emits 'new message', update the chat body // Whenever the server emits 'new message', update the chat body
socket.on('new message', function (data) { socket.on('new message', function (data) {
// Don't show messages if no key darkwire.decodeMessage(data).then( (data) => {
if (!windowHandler.isActive) { if (!windowHandler.isActive) {
windowHandler.notifyFavicon(); windowHandler.notifyFavicon();
darkwire.audio.play(); darkwire.audio.play();
} }
addChatMessage(data);
});
let decoded = darkwire.decode(data);
decoded.then( (data) => {
console.log(data);
})
}); });
// Whenever the server emits 'user left', log it in the chat body // Whenever the server emits 'user left', log it in the chat body
@ -363,14 +353,7 @@ $(function() {
} }
$('#send-message-btn').click(function() { $('#send-message-btn').click(function() {
let message = cleanInput($inputMessage.val()); handleMessageSending();
// Prevent markup from being injected into the message
darkwire.encodeMessage(message, 'chat').then( (message) => {
$inputMessage.val('');
socket.emit('new message', message);
}).catch( (err) => {
console.log(err);
});
socket.emit('stop typing'); socket.emit('stop typing');
typing = false; typing = false;
}); });
@ -385,4 +368,21 @@ $(function() {
darkwire.audio.soundEnabled = state; darkwire.audio.soundEnabled = state;
}); });
function handleMessageSending() {
let message = $inputMessage;
let cleanedMessage = cleanInput(message.val());
// Prevent markup from being injected into the message
darkwire.encodeMessage(cleanedMessage, 'chat').then( (socketData) => {
message.val('');
$('#send-message-btn').removeClass('active');
addChatMessage({
username: username,
message: cleanedMessage
});
socket.emit('new message', socketData);
}).catch( (err) => {
console.log(err);
});
}
}); });

View File

@ -293,6 +293,6 @@ html.no-touchevents .chat #input-icons {
border-color: #2a9fd6 !important; border-color: #2a9fd6 !important;
} }
#fileSendForm { #fileInput {
display: none; display: none;
} }