The goal of this assignment is to implement a secure log to describe the state of a hospital in terms of the doctors and nurses who have entered the building and which rooms they are in. The log will be used by two programs. One program, logappend
, will append new information to this file, and the other, logread
, will read from the file and display the state of the hospital according to a given query over the log. Both programs will use an authentication token, supplied as a command-line argument, to authenticate each other; the security model is described in more detail below.
Students design the log format and implement both logappend
and logread
to use it. These programs must be written in C or C++ and must compile and run on compute.cse.tamu.edu
. Each program's description is linked below.
Look at the page of examples for examples of using the logappend
and logread
tools together.
The system as a whole must guarantee the privacy and integrity of the log in the presence of an adversary.
The adversary is able to:
logappend
and logread
.Makefile
, logappend
, and logread
(see below).The adversary is not able to:
logappend
and logread
.logappend
and logread
.logappend
and logread
.logappend
and logread
.
The adversary does not know the authentication token. This token, specified on the command line, is used by both the logappend
and logread
tools. Without knowledge of the token an attacker should not be able to:
logread
or otherwise learn facts about the names of staff members, room numbers, or times by inspecting the log itselflogappend
. logread
or logappend
into accepting a bogus file. In particular, modifications made to the log by means other than correct use of logappend
should be detected by (subsequent calls to) logread
or logappend
when the correct token is suppliedAn oracle reference implementation is provided to demonstrate the expected output of a series of commands run on logappend
and logread
.
Students may run the reference implementation by going to ritchey.tk. Here is an example of the expected input for the oracle:
{
"tests":[
{
"input":"logappend -T 1 -K secret -D ritchey -A -F log"
},
{
"input":"logappend -T 2 -K secret -D ritchey -A -R 326 -F log"
},
{
"input":"logappend -T 3 -K secret -N bregger -A -F log"
},
{
"input":"logread -K secret -S -F log"
}
]
}
logappend
and logread
are invoked, or in a sub-directory.requirements
in the top-level directory of your submission and place your requirements documentation in that directory.tests
in the top-level directory of your submission and place your tests in that directory.build
in the top-level directory of your submission and place your code in that directory.├─ secure_log │ ├─ build │ │ ├─ Makefile │ │ ├─ *.c │ │ ├─ *.cpp │ │ ├─ *.h │ ├─ requirements │ │ ├─ *.pdf │ ├─ tests │ │ ├─ *.json
.tar.gz
file that contains your submission directory (e.g. tar --exclude=".git" -czvf secure_log.tar.gz secure_log/
)
make
in the build
directory of your submission. Once make
finishes, executable files logappend
and logread
should exist within the build
directory. An automated system will invoke them with a variety of options and measure their responses.make
must function without Internet connectivity.make
must return within five minutes.make coverage
should create the executables compiled with flags -fprofile-arcs -ftest-coverage
.