From 7661769b5249f235db8054631172c9172c2f084f Mon Sep 17 00:00:00 2001 From: Yuri Tatishchev Date: Tue, 7 Apr 2026 15:25:17 -0700 Subject: [PATCH] lab12: init --- lab12/chatServer.js | 39 +++++++++++++++++++++++++++++ lab12/keys/alicePriv.txt | 25 +++++++++++++++++++ lab12/keys/alicePub.txt | 7 ++++++ lab12/keys/bobPriv.txt | 25 +++++++++++++++++++ lab12/keys/bobPub.txt | 7 ++++++ lab12/keys/charliePriv.txt | 25 +++++++++++++++++++ lab12/keys/charliePub.txt | 7 ++++++ lab12/signingExample.js | 51 ++++++++++++++++++++++++++++++++++++++ lab12/tcpserver.js | 23 +++++++++++++++++ 9 files changed, 209 insertions(+) create mode 100644 lab12/chatServer.js create mode 100644 lab12/keys/alicePriv.txt create mode 100644 lab12/keys/alicePub.txt create mode 100644 lab12/keys/bobPriv.txt create mode 100644 lab12/keys/bobPub.txt create mode 100644 lab12/keys/charliePriv.txt create mode 100644 lab12/keys/charliePub.txt create mode 100644 lab12/signingExample.js create mode 100644 lab12/tcpserver.js diff --git a/lab12/chatServer.js b/lab12/chatServer.js new file mode 100644 index 0000000..c977c96 --- /dev/null +++ b/lab12/chatServer.js @@ -0,0 +1,39 @@ +const net = require('net'); +const eol = require('os').EOL; +const crypto = require('crypto'); + +const HASH_ALG = 'sha256'; +const NAME_LEN = 10; + +var srvr = net.createServer(); +var clientList = []; + +srvr.on('connection', function(client) { + client.name = calcName(client.remoteAddress, client.remotePort); + client.write('Welcome, ' + client.name + eol); + + // + // **YOUR CODE HERE** + // + // First, add the client to clientList. + // + // Next, add a listener to the client for a 'data' event. + // This event means that the client typed something in. + // Broadcast that message to all **other** clients in clientList. + // + // For extra challenges, try adding the following functionality: + // 1) Typing '\list' will list the names of all other users. + // 2) Typing '\rename ' will let the user specify a new name for himself/herself. + // 3) Typing '\private ' will send a message only to the specified user. + +}); + +function calcName(remoteAddress, remotePort) { + let data = remoteAddress + ":" + remotePort; + let h = crypto.createHash(HASH_ALG).update(data).digest('hex') + return h.substring(0, NAME_LEN); +} + +srvr.listen(9000); + + diff --git a/lab12/keys/alicePriv.txt b/lab12/keys/alicePriv.txt new file mode 100644 index 0000000..5308d2e --- /dev/null +++ b/lab12/keys/alicePriv.txt @@ -0,0 +1,25 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAifK0oKcMmyyCBSSramC4RtcxGNkXUPcs3towqvEAhPisZeXaskG5JnvK +Tk1tdIsDcG9ioUOO3SKo1UwSC1tWf0XZiSxRWDh4fM7m+SoMBHcyE2rAo/EtOtv+hsa9Jsjg +q28eD9BJZyZJkFrz+pY6hrIQNeLJp4Iq1BlLwzni6Mhea7rBoU0pUG3rrvXMPoG/lPcOC5yi +bjL2fKAojG66ML5nfFDp3Cda/ccs8K6e/89cSwgYQBgz1qntd7djSW8moURrPsDdwhFo6/Dm +Ctds4Ct/sCilkGyz6NydK3n1wKk+JiRQlvmCZcOpiy9ywsq+t336Ly8JIIQ8fBdOKvSjAwID +AQABAoIBAB3Fg7YoV1AmCumRQG108lBXoQD72UxgDA8Mh/RcjwAjqxFSyiAujwb/MGo1y6mb +VuKtJ1wmeG7BTC68fCh3TfOp34j7R5MCnP5SqQadTHqqPuRx5aF8K4bIc+YifjAgqlxVXueK +zEy2tqmw93bddUQcqeL3Tw4XyaZ8zx0TISWbx6S8cI8VKYOz5l+8itNM8lH79i0IxKfAMeUR +QF0jfRxzWLCuOedY1/19/Q9rY9BB6pgi+7bh6hgMUbPRzWegMpuMuGHjk+23Ah6QKfSO4bd4 +9Wq8CqYVLCqRpTUiSfHChXopnm3jGp6ELGYOOqxrI38M3X4izW2kv0mnk/o7UAECgYEAvw8L +laZs1j8LrisSiEp+453qlGB+Pq3h4OJK6gnKZDiD0K8K4sXl5a6wNTOlx77gdL6Xmmevqp8J +I787+TG/K4nrBnRObPPo/Jr6Ug/ON3oCRzhm5Ul5WMcJmkxEIgdJOzTxmuPdlMco9hU1rN3R +OzMgce9smZ0RUdEWN66naaMCgYEAuNY9RBjj7v95zfTGsbYv7xj2UYq0FBqU9s+PpMQFKfPg +bsPhoxOZgaWR2olVhj8XimhIv2eClOkISSORZryCVFzdFlYalrfzbj4ZLMzUrcEwhEY1x8Sj +GRwSb6LW23hH2CR47OBCAB/I1pskClXPhjqDPeoI4w2LlmzoOch6NyECgYBC65coLKnUhTKn +J6kPGeDGAysGG6I8fBUw+rI4tYMxhWYOMzGB6sUypPRNPjDj/OSLn7JkP8sU3S2LWtE74IPQ +UTeEBDrwCKLjz7i8A5M8dTzVC1lnGEwrn1OquunmbVzmIw45LXUQRo3/W8B4Mx21OZw0rCMC +zzQgzzaT/FXhNwKBgQCKl3lQuikOZ1j5aPQjBCxk5x6qfYoRGO1hMrjOHnyQvGAoLY/eKzAK +2g7HAfqyslQAX7lMa1yqMyEXVigMFITUpNzRhrZhFITewIk34k4GCrlKNSrWI0b36OiZ9EuO +PF4CXzacxno2hZ6d663WYgk86FrH7dfEB8AGhpqJ2RxqgQKBgD+NoVR7ER6o40pmCiBIT6O6 +A8C3gSUZcNpNFRzB6EOZHPtRvmJ9xSmw5V/nRqIL744f+UYgTggbSmW1IJLnbbUX+hKkrscV +ldcil/J5xr56lm3eHpNiQc/h0mIWMSJwYl2YfMYmK6alASQzyfi1ibyw6PXMCYXm2MPKadI3 +FjHP +-----END RSA PRIVATE KEY----- diff --git a/lab12/keys/alicePub.txt b/lab12/keys/alicePub.txt new file mode 100644 index 0000000..5c36df0 --- /dev/null +++ b/lab12/keys/alicePub.txt @@ -0,0 +1,7 @@ +-----BEGIN RSA PUBLIC KEY----- +MIIBCgKCAQEAifK0oKcMmyyCBSSramC4RtcxGNkXUPcs3towqvEAhPisZeXaskG5JnvKTk1t +dIsDcG9ioUOO3SKo1UwSC1tWf0XZiSxRWDh4fM7m+SoMBHcyE2rAo/EtOtv+hsa9Jsjgq28e +D9BJZyZJkFrz+pY6hrIQNeLJp4Iq1BlLwzni6Mhea7rBoU0pUG3rrvXMPoG/lPcOC5yibjL2 +fKAojG66ML5nfFDp3Cda/ccs8K6e/89cSwgYQBgz1qntd7djSW8moURrPsDdwhFo6/DmCtds +4Ct/sCilkGyz6NydK3n1wKk+JiRQlvmCZcOpiy9ywsq+t336Ly8JIIQ8fBdOKvSjAwIDAQAB +-----END RSA PUBLIC KEY----- diff --git a/lab12/keys/bobPriv.txt b/lab12/keys/bobPriv.txt new file mode 100644 index 0000000..e962bc8 --- /dev/null +++ b/lab12/keys/bobPriv.txt @@ -0,0 +1,25 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEA4g5WrWWU+FRbrBbT0J8vADRic+kYkggBFARM3VxWIKOA3o6/6oUi4PIE +dAocsLmYegL8c/xp/OTP/qpOZdFWOZ4/QgO/9ru9hbCIEUDQ1E3FwDCP835OHAZ7yv75gRD2 +zcxsX95FZnN9Z3InwW3tNr59k97921OIV+Zjc55+HDHjovN+dM29jP72o1zBIRYsJxBSt1Op +hwkuDGA/IFwDrHqbidrFDR8cgGw6S0OV8TqhOaLmvCwXskJfp3/9uxo0JOO/rxKBU0WaqgU/ +p816qtwVqdHmYkI04WxbihVvMdFFEMdv9l6igJlC6vbVO+qaCVBa17939nyuhexmJQP8IwID +AQABAoIBAELje0JTjIDudTG2j3Zro7yrw3YIwvxy4d7KZvQZHmMJ/lfcZW0/d9KXyjmLxHGG +eVehCpJHXhU2n1T7j7cQ+jKSYKVn9qVLaAjm81wnkaNAYAM+W1nxRauFP5wRVkKagmzi0C6N +1ns6MSEq5hiWLlrEguP+V59OWEmqIkNT4nz0t8iuF7HPaIHIx9X/+tDCRjJT9+y3L7qKkXjm +CdZf9x8MZCj9PffwjGwLhGUW5PTm140p4g3+KgVkQxDyaJnXmsMJxSrs9x4QTfJtrdtNt+Yv +jKF+e0kwEiKSKbGBGl/KeaFSA3O8lxMnSswim3/3R09Hwd5DTIaJPafYXjmBsgECgYEA8jRh +qmhzX09OcKkQOWcUUc6CtV/FL57hlP4t5cWR83ABAWmiagw4JStsnfw75VKo9zl9mlicXyYB +w4AVJo0eDKaxYn7YF8N441vQtpuvrGayulQg9CdggRfOWulIQH6g48JcpS06TeLAcTMDd6Py +4I9CzpAb3H/EJty7DNhdl9cCgYEA7u599/UGYIx1QSLADq/oNA3boY6ybkRSh0RhoF9OiDkM +kdE0di7Bu9AJHBboS+wkgnMH8vA7Vn6LsWslpStylqp+S5hU/845IAj7gHrazm0KRSSKi+XS +Ijipqz8TJqloptqDpzmC0JtVd3tdTD1RL6yMDePf38UB+sMX7BLGxJUCgYEAmNISOZpUCXQZ +sx4JPZ7bhE5/zH8UBNsDzKWgQhUp5Obry39iWfVBy7ode4V2KVjBgdQFe0ijyalKfZcoQT3T +EvpufA46vKu6cAIzq7SJ4IagCM8iR8s8qddifZwp2X/MdkjhedsSqagD8qjUbD3G9oeOCJWG +7tay5i5p2039p9sCgYEAkvEnlYQijOQ1BH8LoLy8UK8pIN2yjLAGFVyPseKLWKnFOjRwUDKH +QSs7PwQzjuXGuldmTxlBVPt0jAN6Xm8vBMwL6g/gToYUicgcbLKhuIxE4asMbedEaXlxl3iu +HXvYea0vhHuRIRw23smG4mlfcbNrWuuG9oahpgevwab2iVUCgYEAj0F7DiCUg2sJsLf1aZfi +5bjPCqA5oszwyuzB9j6SYDJ15Jprc744u7MdOTcnTVM/5k2hOgjTSWJYm9ghm7V9NAWFpyaP +2k4IR6686XF3us4Oh+LYNd1YqjgB+XW/cjS6bWtyk/nFJYAw9Ois2mTyuc0wba0xrP/n3oxT +QyzNeNs= +-----END RSA PRIVATE KEY----- diff --git a/lab12/keys/bobPub.txt b/lab12/keys/bobPub.txt new file mode 100644 index 0000000..49a417d --- /dev/null +++ b/lab12/keys/bobPub.txt @@ -0,0 +1,7 @@ +-----BEGIN RSA PUBLIC KEY----- +MIIBCgKCAQEA4g5WrWWU+FRbrBbT0J8vADRic+kYkggBFARM3VxWIKOA3o6/6oUi4PIEdAoc +sLmYegL8c/xp/OTP/qpOZdFWOZ4/QgO/9ru9hbCIEUDQ1E3FwDCP835OHAZ7yv75gRD2zcxs +X95FZnN9Z3InwW3tNr59k97921OIV+Zjc55+HDHjovN+dM29jP72o1zBIRYsJxBSt1Ophwku +DGA/IFwDrHqbidrFDR8cgGw6S0OV8TqhOaLmvCwXskJfp3/9uxo0JOO/rxKBU0WaqgU/p816 +qtwVqdHmYkI04WxbihVvMdFFEMdv9l6igJlC6vbVO+qaCVBa17939nyuhexmJQP8IwIDAQAB +-----END RSA PUBLIC KEY----- diff --git a/lab12/keys/charliePriv.txt b/lab12/keys/charliePriv.txt new file mode 100644 index 0000000..462c38e --- /dev/null +++ b/lab12/keys/charliePriv.txt @@ -0,0 +1,25 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAh3tLOaiZvejIsA08OBMqYB4zdn5emWjcJpIHObW8H5jrcj9hpGe1IZ+Q +BpZ53318aD0uoJPSnOLXcLQR5v8AVdddmwaJr3meaW8PL/J5BPMpDyknxk2GgvZRxXy/eQkv +VLXbEIRzG5+8Zj8PXkc6rV+qlJEkK/0kuN2y9wz/vYN5z5Fq5qmGnZO665HBh15OxM9b30Fl +iBA/DXmD+zK8oR3Gwk3W8GISWmckAqFegZQr9ocY73JHFGTXYmxVbGiWvpmEIuES57bKQX4f +g3Xa2yQnW8jco48YX6ScPSpVWRiP+56YgAsoojHYr/Evn+fVE4OLqlLrNgWp9UWE6OKqVwID +AQABAoIBAHdfGxjihRPfV3RHNRfzSxMFiTKOhauFyPPzFoqypd7xTgKL9ex1tBK8FJq5Wwif ++E2gGsVBegDhnhGfl2aAqDr6V2+QgyApeHpNcIQ+kILb/QFusaz4AdzCS6pGEC8E+L8avLoA ++asNQ2KTjWb0O68m65WbjNN1aDW6oUUsHulK8wKC9M2pDs+nTd18IAkFVOop31rJ09bZcsnr +qiofRxjLhilvmH0F4nmUTfjrvNxNR0dWpeMEOnoIOg3OtTDqGcJFUI7ELwhYFt3vRP1sRXMS +mqgBmLmHK1p8B02YlVjXfmxAMR1ONk+G4uhLLdKkA+9DTNuc8PfEm7Ox+TXV9gECgYEA159D +kR/FnZhf64gylHKJei554oGB/EapC+LIViwHptSJ38Vk3vkWKomKPKmi3Se+S4e0FkEbgSqv +Tje6IzZwYFxEoZE+UNJSLXYTtnus4yhCItc0FHbCz+4bKuLf7Kij0b1L22LVJ6mObtG1ij1F +nJj381pkopQ579RT/14yT+cCgYEAoNop/ygCEp6tDAPr63HfaKDWY7Xy2B85nh62DiWqZ+eX +hkh/+mSKryRkkQiVSOxEzR5S2G68yXeiuGHF1N0XuwveDvSRP0wNJ5XVXY3F+cI9Y/Kdt2Kj +Hqf7Nm9bxlDHxj4LrL1PvJniG7Pk3e3eV+NIS8eNeWngEdZCrwDeRBECgYBYQM+e7qorvtpD +xRMuv1KVt8AbfXZ+k01NmBz3aD4ZgpSMCncm7DyuXG1ANw56BnJU585F7ZAcZiQql5SQJRAJ +4LoWhyRCYFNSWCnpXuV8dFXdfMfMOG+0O3jTLNkKPFwQ1LHfsawc98FcimkLk9iSJ+oUqMLX +6GNuTjGzLBLbsQKBgEwglKm/HKQFVy8NmBV5clvJa04LqeBhftp3/H/bkbfVYuBZ5b/y37Qe +jD4cCtNVhwZxKJJobo8HQQr0szWYYgfTiQgY9bk4XC10+2Nomt8m7/kitUQ6uarjo8BSmePV +DYeki8/4VQmU5u9nh5UFZCrCVdAPpMRmuHaYqjy7M3aRAoGAVKyUCZnu9AIkmCmuPEvF/7mQ +88zJ3y8BF44iTjKLquMb4SgK0Hur9EiPcufuzEHMiiHE/m6DPhE8OeV984ZlgwrXXcLvdnDL +N3lVkTGSNQjRmjK66ITqyTAscc/Hi/W/LzLl0ZjlgynJjtrJQRCIv5tEAaCWeEEY9zS1rD4j +4Jo= +-----END RSA PRIVATE KEY----- diff --git a/lab12/keys/charliePub.txt b/lab12/keys/charliePub.txt new file mode 100644 index 0000000..a61f297 --- /dev/null +++ b/lab12/keys/charliePub.txt @@ -0,0 +1,7 @@ +-----BEGIN RSA PUBLIC KEY----- +MIIBCgKCAQEAh3tLOaiZvejIsA08OBMqYB4zdn5emWjcJpIHObW8H5jrcj9hpGe1IZ+QBpZ5 +3318aD0uoJPSnOLXcLQR5v8AVdddmwaJr3meaW8PL/J5BPMpDyknxk2GgvZRxXy/eQkvVLXb +EIRzG5+8Zj8PXkc6rV+qlJEkK/0kuN2y9wz/vYN5z5Fq5qmGnZO665HBh15OxM9b30FliBA/ +DXmD+zK8oR3Gwk3W8GISWmckAqFegZQr9ocY73JHFGTXYmxVbGiWvpmEIuES57bKQX4fg3Xa +2yQnW8jco48YX6ScPSpVWRiP+56YgAsoojHYr/Evn+fVE4OLqlLrNgWp9UWE6OKqVwIDAQAB +-----END RSA PUBLIC KEY----- diff --git a/lab12/signingExample.js b/lab12/signingExample.js new file mode 100644 index 0000000..b593786 --- /dev/null +++ b/lab12/signingExample.js @@ -0,0 +1,51 @@ +var crypto = require('crypto'); +var fs = require('fs'); +var events = require('events'); + +function Signer(privKeyFile) { + // Reads in and stores the private key + this.privateKey = fs.readFileSync(privKeyFile).toString('ascii'); +} + +Signer.prototype.signMessage = function(messageFileName) { + // Read in the file + var msg = fs.readFileSync(messageFileName).toString('ascii'); + // Specify which signing algorithm we want to use + var sign = crypto.createSign('RSA-SHA256'); + // Sign the message and return the signature in hexadecimal form + return sign.update(msg).sign(this.privateKey,'hex'); +} + + +function Verifier(pubKeyFile) { + // Reads in and stores the public key + this.publicKey = fs.readFileSync(pubKeyFile).toString('ascii'); +} +Verifier.prototype = new events.EventEmitter(); + +Verifier.prototype.verifySignature = function(messageFileName, signature) { + // Read in the file + var msg = fs.readFileSync(messageFileName).toString('ascii'); + // Test the signature + var legit = crypto.createVerify('RSA-SHA256').update(msg) + .verify(this.publicKey, signature, 'hex'); + if (legit) { + console.log("Signature is valid"); + } else { + console.log("Invalid signature"); + } +} + +var verifier = new Verifier('./keys/charliePub.txt'); +Verifier.prototype.on('signing', verifier.verifySignature); + +// Valid signing +var signer = new Signer('./keys/charliePriv.txt'); +var signature = signer.signMessage('./message.txt'); +verifier.emit('signing', './message.txt', signature); + +// Wrong signature used +signer = new Signer('./keys/bobPriv.txt'); +signature = signer.signMessage('./message.txt'); +verifier.emit('signing', './message.txt', signature); + diff --git a/lab12/tcpserver.js b/lab12/tcpserver.js new file mode 100644 index 0000000..b6bcf10 --- /dev/null +++ b/lab12/tcpserver.js @@ -0,0 +1,23 @@ +var net = require('net'); +var eol = require('os').EOL; + +var srvr = net.createServer(); + +srvr.on('connection', function(client) { + client.write('Hello there!' + eol); + client.end(); +}); + +srvr.listen(9000); + +// node tcpserver.js + +/* +$ telnet 127.0.0.1 9000 +Trying 127.0.0.1... +Connected to localhost. +Escape character is '^]'. +Hello there! +Connection closed by foreign host. +*/ +