CS 8803b Computer Systems Security
Programming Assignment 2
Due Date: Friday, December 10,  1999


In this programming assignment,  you will  develop an "object server"  which stores information that is of interest to a set of client nodes. Client nodes can request the server for a copy of  an object. The server can send the object confidentially or can ensure that its integrity is maintained while it is transmitted.  To simplify the project, we will make two assumptions. First, we would not worry about when and how the object are created. The server can be initialized with a set of objects.  In addition to the data, each object has an object identifier and a type (e.g., what kind of object it is) as well as a security requirement. The security requirement can be confidentiality, integrity or none. Confidential objects should not be transmitted in the clear. For objects that  require integrity,  an intruder should not be able to modify the object content. Objects that have no security requirement  do not need either of these guarantees. The second assumption we make is to ignore access control. Thus, any client may request an object and the server will provide the object to the client according to the security requirements defined for the object.

You need to implement the server and a set of clients.  To meet the integrity and confidentiality needs, we will need to use cryptographic functions. In particular, you should use the support provided by Java Crypto API to achieve this goal. You should use public keys to encrypt information when needed.  This, however, creates the problem of how client public keys are made known to the server.  One way to build such system is to implement a primitive certification authority that issues certificates that bind clients to their public keys. Thus, if client A makes a request, the server can request A's public key and use it to encrypt the
object before sending it to the client. Similarly, keys can be used to meet the integrity requirement.

As a first step, you should study the Java Crypto API and explore  how it can be used to build a system such as the one described above. Once you understand this, you should come up with a design of the object server and the certification authority.  This design should include the major data structures implemented by them as well as the interactions that they support with each other.  This should be followed by the actual implementation. The clients can simply query the object server repeatedly and display what objects are received and their sensitivity levels.  A client specifies the object it is interested in by supplying its object identifier. The sensitivity level received in response determines if the object is received in cipher or plain text. You should program multiple clients and they should run on different machines. Communication between the server, the certification authority and the clients can be implemented either using Java RMI or sockets.

You have considerable flexibility in working out some of the details (e.g., what kind of objects to store).  However, you will have to do a demo of your system and prepare a write-up that discusses your design and implementation.