honeybee-hive
Version:
A node module to allow for volunteer computing, like BOINC.
67 lines (66 loc) • 2.04 kB
JavaScript
;
//Import verification module
let verify = require('./Verify.js');
//Import AES module
let AES = require('simple-encryption').AES;
//Import error handler
let errorHandler = require('../error/errorHandler.js');
let errorList = require('../error/errorList.js');
module.exports = function(socket, eventHandler, serverPublicKey,
clientPrivateKey, clientID, strength, data, callback) {
verify(socket, eventHandler, serverPublicKey, clientPrivateKey, clientID,
strength, function(error, verified, sessionKey) {
//If we get an error, pass it on
if(error) {
return callback(error);
}
//If we're not verified
if(verified == null) {
return callback(new errorList.SecurityVerificationFailure());
}
//Receive status
socket.once('message', function(message) {
//If we get an error
if(message.error) {
return callback(errorHandler.createError(message.errror));
}
//Get encryption information
let payload = message.payload;
let tag = message.tag;
let iv = message.iv;
//Try to decrypt
let decrypted;
try {
decrypted = JSON.parse(AES.decrypt(sessionKey, iv, tag, payload));
} catch(e) {
return callback(new errorList.SecurityDecryptionFailure());
}
//If authentication failed
if(decrypted == null) {
return callback(new errorList.HandshakePostCompleteFailure());
}
callback(null, decrypted.success);
});
//Prepare message for sending
let jsonmsg = {
data: data
};
//Generate IV
let iv = AES.generateIV();
//Try to encrypt
let encrypted;
try {
encrypted = AES.encrypt(sessionKey, iv, JSON.stringify(jsonmsg));
} catch(e) {
return callback(new errorList.SecurityEncryptionFailure());
}
try {
socket.sendMessage({type: 'submit', payload: encrypted.encrypted,
tag: encrypted.tag, iv: iv});
} catch(e) {
//Destroy socket
socket.destroy();
return;
}
});
};