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
|
||||
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);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
30
src/db.js
30
src/db.js
@ -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');
|
||||
|
@ -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'), '');
|
||||
|
Loading…
x
Reference in New Issue
Block a user