# FaCT
This is the compiler for the Flexible and Constant Time cryptographic programming language.
FaCT is a domain-specific language that aids you in writing constant-time code for cryptographic routines
that need to be free from timing side channels.
## Useful links:
- [Our paper](https://github.com/FaCT_extended.pdf)
- [Online demo using Compiler Explorer](https://github.comhttps://fact.sysnet.ucsd.edu/) ([source](https://github.comhttps://github.com/bjohannesmeyer/fact-website) forked from [mattgodbolt/compiler-explorer](https://github.comhttps://github.com/mattgodbolt/compiler-explorer))
- [FaCT case studies / evaluation](https://github.comhttps://github.com/PLSysSec/fact-eval)
- [Haskell embedding](https://github.comhttps://github.com/PLSysSec/inline-fact)
- [Python embedding](https://github.comhttps://github.com/PLSysSec/CTFFI)
- [Vim syntax files](https://github.comhttps://github.com/PLSysSec/factlang.vim)
## Building
To build the compiler, you can either build from source or download a pre-built release.
We recommend building from source if possible.
### Virtual machine image
You can download a [VM image pre-configured for building the FaCT compiler and case studies](https://github.comhttps://drive.google.com/open?id=1xzw4Ohsdj4WqxJPl1RvvxSnhysMSejPi).
The file `fact.ova` should have a SHA256 sum of `089398c85c5074d911c2f2b67ca22df453235e8733f1eb283c71717cf70f714c`.
### Using Docker
If you have docker installed, you can load our docker image with the build
environment already installed:
```
cd docker/
./run.sh
```
Once inside the docker shell, run the following to finish setting up the environment:
```
cd FaCT/
eval $(opam config env)
```
### Setting up the build environment
FaCT is developed using OCaml 4.06.0 and LLVM 6.0.
### Using a local environment
Building FaCT has been tested on Ubuntu 16.04, 18.04, and macOS.
#### 1. Install System Dependencies
**Ubuntu (16.04 & 18.04)**
```
sudo apt install llvm-6.0 clang-6.0 cmake libgmp-dev m4 pkg-config
```
**macOS**
These instructions require [Homebrew](https://github.comhttps://brew.sh)
```
brew install cmake gmp m4 pkg-config
brew install llvm@6 --with-toolchain
```
**Note:** This does not put the proper version of clang on your `PATH`. You will need to run:
```
export PATH="$(brew --prefix llvm@6)/bin:$PATH"
```
#### 2. Install OCaml + packages
We recommend installing the [opam package manager](https://github.comhttps://opam.ocaml.org/) to manage OCaml and package dependencies:
```
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
```
Then, install OCaml and the libraries:
```
opam init
eval $(opam config env)
opam switch create 4.06.0
eval $(opam config env)
opam switch import ocamlswitch.txt
```
Finally, make sure the Z3 lib is available to the OCaml compiler:
```
export LD_LIBRARY_PATH="$HOME/.opam/4.06.0/lib/z3:$LD_LIBRARY_PATH"
```
#### 3. Configure Paths
The FaCT compiler depends on the LLVM 6.0 toolchain **at runtime**,
and expects binaries with `-6.0` suffixes.
Ensure that `clang-6.0` is in your PATH:
```
clang-6.0 --version
```
### Compiling FaCT
You can now build the compiler:
```
oasis setup
make
```
This will produce the `factc` executable.
## Usage
#### Basic Usage
Run ```./factc