Final Project

The final project is an encrypted client/server messaging system. The networking part will be very simple (and you will be given code for that), but it will draw on many of the topics covered in the class, including:


Briefly, users of the system who wish to send messages to other users will contact the server, receive certificates for them, encrypt and digitally sign the messages, and upload them. The server will store those messages for retrieval by the recipients. 

System Components

The system will consist of several components. On the server side, there will (conceptually) be one program that will handle all requests. The client side will consist of several programs:

All connections to the server must be encrypted with TLS. Users who do not have a certificate or who wish to change their password must use the password for authentication; users with certificates must use them to authenticate.

There are a number things that you should not do, in the interests of keeping this manageable:

Deliverables

Sandboxing

We will discuss sandboxing in detail in a few weeks; briefly, it's a way to limit the powers of a process. You could limit what files it can open, block its ability to open files or write to them, etc. But sandboxed processes still need to talk to some part of the outside world, or they can't do anything useful. How you split a program is a delicate matter—if the process has many permissions, it's dangerous, but if it has too few, you may have to do risky things in the privileged part.

There are a lot of different ways to do sandboxing on Linux; we'll discuss that in about a month.

OpenSSL

You'll need to use OpenSSL routines. There are many and they're complex. I'll provide guides to the ones you'll need.

Network Protocol

The client and server will use a simplified version of HTTPS to communicate. By using HTTPS, you'll be able to use your browser for some debugging. The details of the simplified protocol are here.

Storage

Using Github for a code is strongly encouraged. If you don't know how to use it, now is a good time to learn; it will really pay off for you. Yes, there are crazy, weird things you can do with git—but the simple things are simple, and it's by far the best way for a group to maintain a codebase.

Google Docs is a convenient way to collaborate on writing. If your team uses LaTeX, you can use Github for that, or perhaps Overleaf.com.