ECDH key exchange

This commit is contained in:
Sam Hadow 2025-03-04 18:58:43 +01:00
parent 44d2446872
commit 834267399f
3 changed files with 88 additions and 3 deletions

View File

@ -40,16 +40,32 @@ app.use('/', express.static(__dirname + '/public'));
// socket.io
io.engine.use(sessionMiddleware);
io.on('connection', (socket) => {
io.on('connection', async (socket) => {
const session = socket.request.session;
socket.join(session.publicKey);
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', () => {
console.log('User disconnected');
});
socket.on('chat message', (msg, room) => {
console.log('message: ' + msg + ', sender: ' + session.id + 'room: ' + room.substring(5));
socket.on('chat message', async (msg, room) => {
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);
});
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);
});
});

View File

@ -143,6 +143,36 @@ const database = {
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 () => {
try {
const result = await pool.query('SELECT pubkey FROM users');

View File

@ -1,4 +1,37 @@
import { genKeys, sharedKey } from "./ecdh.js";
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) {
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'), '');