Skip to the content.

๐Ÿ”— GitHub | ๐Ÿ“– Book | ๐Ÿ“ Blog | ๐Ÿ’ฌ Zulip | ๐Ÿ› ๏ธ Internal docs

Hax

hax is a tool for high assurance translations that translates a large subset of Rust into formal languages such as F* or Coq. This extends the scope of the hacspec project, which was previously a DSL embedded in Rust, to a usable tool for verifying Rust programs.

So what is hacspec now?

hacspec is the functional subset of Rust that can be used, together with a hacspec standard library, to write succinct, executable, and verifiable specifications in Rust. These specifications can be translated into formal languages with hax.

Learn more

Here are some resources for learning more about hax:

Usage

Hax is a cargo subcommand. The command cargo hax accepts the following subcommands:

Note:

Installation

Manual installation 1. Make sure to have the following installed on your system: - [`opam`](https://opam.ocaml.org/) (`opam switch create 4.14.1`) - [`rustup`](https://rustup.rs/) - [`nodejs`](https://nodejs.org/) - [`jq`](https://jqlang.github.io/jq/) 2. Clone this repo: `git clone git@github.com:hacspec/hax.git && cd hax` 3. Run the [setup.sh](./setup.sh) script: `./setup.sh`. 4. Run `cargo-hax --help`
Nix This should work on [Linux](https://nixos.org/download.html#nix-install-linux), [MacOS](https://nixos.org/download.html#nix-install-macos) and [Windows](https://nixos.org/download.html#nix-install-windows).
Prerequisites: Nix package manager (with flakes enabled) - Either using the [Determinate Nix Installer](https://github.com/DeterminateSystems/nix-installer), with the following bash one-liner: ```bash curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install ``` - or following [those steps](https://github.com/mschwaig/howto-install-nix-with-flake-support).
+ **Run hax on a crate directly** to get F\*/Coq/... (assuming you are in the crate's folder): - `nix run github:hacspec/hax -- into fstar` extracts F*. + **Install hax**: `nix profile install github:hacspec/hax`, then run `cargo hax --help` anywhere + **Note**: in any of the Nix commands above, replace `github:hacspec/hax` by `./dir` to compile a local checkout of hax that lives in `./some-dir` + **Setup binary cache**: [using Cachix](https://app.cachix.org/cache/hax), just `cachix use hax`
Using Docker 1. Clone this repo: `git clone git@github.com:hacspec/hax.git && cd hax` 3. Build the docker image: `docker build -f .docker/Dockerfile . -t hax` 4. Get a shell: `docker run -it --rm -v /some/dir/with/a/crate:/work hax bash` 5. You can now run `cargo-hax --help` (notice here we use `cargo-hax` instead of `cargo hax`)

Supported Subset of the Rust Language

Hax intends to support full Rust, with the two following exceptions, promoting a functional style:

  1. no unsafe code (see https://github.com/hacspec/hax/issues/417);
  2. mutable references (aka &mut T) on return types or when aliasing (see https://github.com/hacspec/hax/issues/420).

Each unsupported Rust feature is documented as an issue labeled unsupported-rust. When the issue is labeled wontfix-v1, that means we donโ€™t plan on supporting that feature soon.

Quicklinks:

Hacking on Hax

The documentation of the internal crate of hax and its engine can be found here.

Edit the sources (Nix)

Just clone & cd into the repo, then run nix develop .. You can also just use direnv, with editor integration.

Structure of this repository

Recompiling

You can use the .utils/rebuild.sh script (which is available automatically as the command rebuild when using the Nix devshell):

Publications & Other material

Secondary literature, using hacspec:

Contributing

Before starting any work please join the Zulip chat, start a discussion on Github, or file an issue to discuss your contribution.

Acknowledgements

Zulip graciously provides the hacspec & hax community with a โ€œZulip Cloud Standardโ€ tier.