ECDH key exchange
This commit is contained in:
parent
44d2446872
commit
834267399f
22
src/app.js
22
src/app.js
@ -40,16 +40,32 @@ app.use('/', express.static(__dirname + '/public'));
|
|||||||
|
|
||||||
// socket.io
|
// socket.io
|
||||||
io.engine.use(sessionMiddleware);
|
io.engine.use(sessionMiddleware);
|
||||||
io.on('connection', (socket) => {
|
io.on('connection', async (socket) => {
|
||||||
const session = socket.request.session;
|
const session = socket.request.session;
|
||||||
|
socket.join(session.publicKey);
|
||||||
console.log('A user connected');
|
console.log('A user connected');
|
||||||
|
const peers = await database.getPeers(session.publicKey);
|
||||||
|
peers.forEach(peer => {
|
||||||
|
socket.to(peer).emit('connected', session.publicKey);
|
||||||
|
});
|
||||||
socket.on('disconnect', () => {
|
socket.on('disconnect', () => {
|
||||||
console.log('User disconnected');
|
console.log('User disconnected');
|
||||||
});
|
});
|
||||||
socket.on('chat message', (msg, room) => {
|
socket.on('chat message', async (msg, room) => {
|
||||||
console.log('message: ' + msg + ', sender: ' + session.id + 'room: ' + room.substring(5));
|
const roomid = room.substring(5);
|
||||||
|
const members = await database.getRoomMembers(roomid);
|
||||||
|
members.forEach(memberRoom => {
|
||||||
|
socket.to(memberRoom).emit('chat message', msg, roomid, session.publicKey);
|
||||||
|
});
|
||||||
|
console.log('message: ' + msg + ', sender: ' + session.id);
|
||||||
console.log(session.publicKey);
|
console.log(session.publicKey);
|
||||||
});
|
});
|
||||||
|
socket.on('key exchange', (user_pubkey, pubkey) => {
|
||||||
|
socket.to(user_pubkey).emit('key exchange', session.publicKey, pubkey);
|
||||||
|
});
|
||||||
|
socket.on('key exchange 2', (user_pubkey, pubkey) => {
|
||||||
|
socket.to(user_pubkey).emit('key exchange 2', session.publicKey, pubkey);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
30
src/db.js
30
src/db.js
@ -143,6 +143,36 @@ const database = {
|
|||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
getRoomMembers: async (roomid) => {
|
||||||
|
try {
|
||||||
|
const members = await pool.query(
|
||||||
|
'SELECT u.pubkey FROM room_members r, users u WHERE r.user_uuid = u.uuid AND r.room_uuid = $1',
|
||||||
|
[roomid]
|
||||||
|
);
|
||||||
|
return members.rows.map(row => row.pubkey);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error retrieving rooms:', err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getPeers: async (pubkey) => {
|
||||||
|
try {
|
||||||
|
const peers = await pool.query(
|
||||||
|
`SELECT u1.pubkey
|
||||||
|
FROM room_members r1, room_members r2, users u1, users u2
|
||||||
|
WHERE r1.user_uuid = u1.uuid
|
||||||
|
AND r2.user_uuid = u2.uuid
|
||||||
|
AND r1.room_uuid = r2.room_uuid
|
||||||
|
AND u2.pubkey != u1.pubkey
|
||||||
|
AND u2.pubkey = $1`,
|
||||||
|
[pubkey]
|
||||||
|
);
|
||||||
|
return peers.rows.map(row => row.pubkey);
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error retrieving peers:', err);
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
},
|
||||||
getPublicKeys: async () => {
|
getPublicKeys: async () => {
|
||||||
try {
|
try {
|
||||||
const result = await pool.query('SELECT pubkey FROM users');
|
const result = await pool.query('SELECT pubkey FROM users');
|
||||||
|
@ -1,4 +1,37 @@
|
|||||||
|
import { genKeys, sharedKey } from "./ecdh.js";
|
||||||
|
|
||||||
const socket = io();
|
const socket = io();
|
||||||
|
let secret = null;
|
||||||
|
let sharedsecret = {};
|
||||||
|
|
||||||
|
socket.on('chat message', (msg, room) => {
|
||||||
|
console.log(`received: ${msg}`);
|
||||||
|
console.log(sharedsecret);
|
||||||
|
const item = document.createElement('li');
|
||||||
|
item.textContent = msg;
|
||||||
|
const messages = document.getElementById(`messages-${room}`);
|
||||||
|
messages.appendChild(item);
|
||||||
|
window.scrollTo(0, document.body.scrollHeight);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('connected', (user_pubkey) => {
|
||||||
|
const keys = genKeys();
|
||||||
|
secret = keys.privkey;
|
||||||
|
socket.emit('key exchange', user_pubkey, toHexString(keys.pubkey));
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('key exchange', (user_pubkey, pubkey) => {
|
||||||
|
const keys = genKeys();
|
||||||
|
secret = keys.privkey
|
||||||
|
sharedsecret[user_pubkey] = sharedKey(secret, fromHexString(pubkey));
|
||||||
|
socket.emit('key exchange 2', user_pubkey, toHexString(keys.pubkey));
|
||||||
|
console.log(`shared secret: ${toHexString(sharedsecret[user_pubkey])}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
socket.on('key exchange 2', (user_pubkey, pubkey) => {
|
||||||
|
sharedsecret[user_pubkey] = sharedKey(secret, fromHexString(pubkey));
|
||||||
|
console.log(`shared secret: ${toHexString(sharedsecret[user_pubkey])}`);
|
||||||
|
});
|
||||||
|
|
||||||
export function create_listener(form, input) {
|
export function create_listener(form, input) {
|
||||||
form.addEventListener('submit', function(e) {
|
form.addEventListener('submit', function(e) {
|
||||||
@ -9,3 +42,9 @@ export function create_listener(form, input) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const fromHexString = (hexString) =>
|
||||||
|
Uint8Array.from(hexString.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
|
||||||
|
|
||||||
|
const toHexString = (bytes) =>
|
||||||
|
bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user