From 433d54efd19b405f37173d1bc36214ea05f784c0 Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Wed, 30 Jan 2019 21:41:40 +0100
Subject: Added AES message encryption

---
 public/scripts/chat.js       |  2 +-
 public/scripts/encryption.js | 40 +++++++++++++++++++++++++++++++++-------
 2 files changed, 34 insertions(+), 8 deletions(-)

(limited to 'public')

diff --git a/public/scripts/chat.js b/public/scripts/chat.js
index 13c7839..9a01a0e 100644
--- a/public/scripts/chat.js
+++ b/public/scripts/chat.js
@@ -156,7 +156,7 @@ function chat() {
             $('#messages').append(`<span style="color: green">${message}</span><br>`);
         } else {
             if (message.type === 'text') {
-                await encryption.storeMsg(connectedPeer.peer, message.data);
+                await encryption.storeMsg(connectedPeer.peer, message.data, passphrase);
                 await encryption.decrypt(message.data, await encryption.get(connectedPeer.peer), await encryption.getPrivate(), passphrase)
                     .then(plaintext => $('#messages').append(`${plaintext}<br>`));
             } else if (message.type === 'key') {
diff --git a/public/scripts/encryption.js b/public/scripts/encryption.js
index 79b8dc0..74abddc 100644
--- a/public/scripts/encryption.js
+++ b/public/scripts/encryption.js
@@ -7,6 +7,7 @@
 
 const Dexie = require('dexie');
 const moment = require('moment');
+const crypto = require('crypto');
 const openpgp = require('openpgp');
 
 // compress encryption data
@@ -147,12 +148,39 @@ async function isEncrypted() {
 }
 
 /**
- * Stores a message
+ * Encrypts a message
+ * @param message
+ * @param passphrase
+ * @returns {string}
+ */
+function encryptMessage(message, passphrase) {
+    const cipher = crypto.createCipher('aes-256-ctr', passphrase);
+    const plaintext = cipher.update(message, 'utf8', 'hex');
+    console.log('[LOG] Encrypted message successfully!');
+    return plaintext + cipher.final('hex');
+}
+
+/**
+ * Decrypts a message
+ * @param message
+ * @param passphrase
+ * @returns {string}
+ */
+function decryptMessage(message, passphrase) {
+    const cipher = crypto.createCipher('aes-256-ctr', passphrase);
+    const plaintext = cipher.update(message, 'hex', 'utf8');
+    console.log('[LOG] Decrypted message successfully!');
+    return plaintext + cipher.final('utf8');
+}
+
+/**
+ * Stores a message // TODO: Store and get own messages too
  * @param peerId
  * @param message
+ * @param passphrase
  */
-async function storeMessage(peerId, message) {
-    db.messages.put({peer_id: peerId, message: message, time: new Date()}).then(() =>
+async function storeMessage(peerId, message, passphrase) {
+    db.messages.put({peer_id: peerId, message: encryptMessage(message, passphrase), time: new Date()}).then(() =>
         console.log('[LOG] Stored message of ' + peerId)
     );
 }
@@ -166,13 +194,13 @@ async function storeMessage(peerId, message) {
  * @returns {Promise<Array>}
  */
 async function getMessages(peerId, publicKey, privateKey, passphrase) {
-    console.log('[LOG] Getting messages');
+    console.log('[LOG] Getting messages...');
     try {
         const messages = await db.messages.where('peer_id').equals(peerId).sortBy('id');
         let messageArray = [];
         for (let i = messages.length; i--;) {
             await messageArray.push({
-                message: await decrypt(messages[i]['message'], publicKey, privateKey, passphrase),
+                message: await decrypt(decryptMessage(messages[i]['message'], passphrase), publicKey, privateKey, passphrase),
                 time: moment(messages[i]['time']).fromNow()
             })
         }
@@ -249,5 +277,3 @@ exports.store = storePeerPublicKey;
 exports.get = getPeerPublicKey;
 exports.getId = getPublicKeyUserId;
 exports.reset = reset;
-
-window.getMsgs = getMessages;
-- 
cgit v1.2.3