honeybee-hive
Version:
A node module to allow for volunteer computing, like BOINC.
69 lines (68 loc) • 2.06 kB
JavaScript
;
//Import verification module
const verify = require('./Verify.js');
//Import AES module
const AES = require('simple-encryption').AES;
//Import error module
const errorHandler = require('../error/errorHandler.js');
const errorList = require('../error/errorList.js');
module.exports = function(socket, eventHandler, serverPublicKey,
clientPrivateKey, clientID, strength, callback) {
verify(socket, eventHandler, serverPublicKey, clientPrivateKey, clientID,
strength, function(error, verified, sessionKey) {
//If we're passed an error
if(error) {
//Pass it on
return callback(error);
}
//If we're not verified
if(!verified) {
return callback(new errorList.SecurityEncryptionFailure());
}
//Receive work
socket.once('message', function(message) {
//If we get an error
if(message.error) {
//pass it on
return callback(errorHandler.createError(message.error));
}
//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) {
return callback(new errorList.HandshakePostCompleteFailure());
}
callback(null, decrypted.work);
});
//Prepare message for sending
let jsonmsg = {
request: 'request'
};
//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: 'request', payload: encrypted.encrypted,
tag: encrypted.tag, iv: iv});
} catch(e) {
//Destroy socket
socket.destroy();
return;
}
});
};