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
npm-debug.log
src/public/main.js
src/.secret

View File

@ -16,6 +16,15 @@ gulp.task('bundle', function() {
.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() {
nodemon({
script: 'index.js',
@ -24,6 +33,6 @@ gulp.task('start', function() {
env: {
'NODE_ENV': 'development'
},
tasks: ['bundle']
tasks: ['dev']
})
});

View File

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

View File

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

View File

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