Skip to content
This repository was archived by the owner on Jul 17, 2020. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions server/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
crypto/keys
node_modules
npm-debug.log
5 changes: 5 additions & 0 deletions server/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ var routDevices = require('./routes/devices');
const config = require("./config/database")//requiring database folder
var subscrib = require('./subscribe_post');

/**
* Create public and private keys of client and store them in file
*/
const rsaWrapper = require('./crypto/rsa-wrapper');
rsaWrapper.generateIfRequired('server');

var app = express();

Expand Down
5 changes: 5 additions & 0 deletions server/crypto/init.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
const rsaWrapper = require('./rsa-wrapper');
// generate opened and closed keys for browser and server
rsaWrapper.generate('server');
rsaWrapper.generate('client');
console.log('Keys generated …');
63 changes: 63 additions & 0 deletions server/crypto/rsa-wrapper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
const path = require('path');
const rsaWrapper = {};
const fs = require('fs');
const NodeRSA = require('node-rsa');
const crypto = require('crypto');

// load keys from file
rsaWrapper.initLoadServerKeys = (basePath) => {
rsaWrapper.serverPub = rsaWrapper.loadKey(basePath, 'server', 'public');
rsaWrapper.serverPrivate = rsaWrapper.loadKey(basePath, 'server', 'private');
rsaWrapper.clientPub = rsaWrapper.loadKey(basePath, 'client', 'private');
};

rsaWrapper.loadKey = (basePath, direction, type) => {
return fs.readFileSync(path.resolve(basePath, 'keys', `${direction}.${type}.pem`));
};

rsaWrapper.generate = (direction) => {
let key = new NodeRSA();
key.generateKeyPair(2048, 65537);
fs.writeFileSync(path.resolve(__dirname, 'keys', direction + '.private.pem'), key.exportKey('pkcs8-private-pem'));
fs.writeFileSync(path.resolve(__dirname, 'keys', direction + '.public.pem'), key.exportKey('pkcs8-public-pem'));

return true;
};

rsaWrapper.generateIfRequired = (direction) => {
const exists = fs.existsSync(path.resolve(__dirname, 'keys', direction + '.private.pem'))
&& fs.existsSync(path.resolve(__dirname, 'keys', direction + '.public.pem'));

return exists || this.generate(direction);
}

rsaWrapper.serverExampleEncrypt = () => {
console.log('Server public encrypting');

let enc = rsaWrapper.encrypt(rsaWrapper.serverPub, '{"sensor":"PIR","temperature":"44.77","humidity":"86.46","userid":"nakwarsi"}');
console.log('Encrypted RSA string ', '\n', enc);
let dec = rsaWrapper.decrypt(rsaWrapper.serverPrivate, enc);
console.log('Decrypted RSA string ...');
console.log(dec);
};

rsaWrapper.encrypt = (publicKey, message) => {
let enc = crypto.publicEncrypt({
key: publicKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
}, Buffer.from(message));

return enc.toString('base64');
};

rsaWrapper.decrypt = (privateKey, message) => {
console.log('crypto.RSA_PKCS1_OAEP_PADDING', crypto.RSA_PKCS1_OAEP_PADDING);
let enc = crypto.privateDecrypt({
key: privateKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
}, Buffer.from(message, 'base64'));

return enc.toString();
};

module.exports = rsaWrapper;
1 change: 1 addition & 0 deletions server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"mongoose": "^5.1.6",
"morgan": "~1.9.0",
"mqtt": "^2.18.1",
"node-rsa": "^1.0.0",
"request": "^2.87.0"
}
}
13 changes: 10 additions & 3 deletions server/subscribe_post.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,20 @@ var client = mqtt.connect('mqtt://localhost:1883');
//var db_sensor = require('../mongoose/database');
let message;

const rsaWrapper = require('./crypto/rsa-wrapper');
let serverPrivateKey;

var connectCallback = function () {
console.log('mqtt broker connected')
client.subscribe('question2')
client.subscribe('question2');
serverPrivateKey = rsaWrapper.loadKey('./crypto', 'server', 'private');
}

client.on('message', function (topic, msg) {
message = JSON.parse(msg);
client.on('message', function (topic, msg) {
const decrypted = rsaWrapper.decrypt(serverPrivateKey, msg.toString('utf8'));
console.log('DECRYPTED Message - ', decrypted);

message = JSON.parse(decrypted);
let DATA = {
sensor: message.sensor,
temperature: message.temperature,
Expand Down
16 changes: 14 additions & 2 deletions server/virtualDevice.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@ var interval_time = 1
var it = 5;
var interval = -1;

/**
* Create public and private keys of client and store them in file
*/
const rsaWrapper = require('./crypto/rsa-wrapper');
rsaWrapper.generateIfRequired('client');

const serverPublicKey = rsaWrapper.loadKey('./crypto', 'server', 'public');
console.log('Sercver Public *******************', serverPublicKey);


function sentData()
{
Expand All @@ -15,8 +24,11 @@ function sentData()
humidity: (Math.random() * 100).toFixed(2),
userid: sen[Math.floor((Math.random() * 3).toFixed(2))]
}
console.log('sent');
client.publish('question2', JSON.stringify(data))

const encrypted = rsaWrapper.encrypt(serverPublicKey,JSON.stringify(data));
console.log('\nDATA - ', encrypted);

client.publish('question2', encrypted);
it = interval_time
}

Expand Down