cryptol/README.md

210 lines
7.4 KiB
Markdown
Raw Normal View History

2014-04-18 02:34:25 +04:00
# Cryptol, version 2
This version of Cryptol is (C) 2013-2014 Galois, Inc., and
distributed under a standard, three-clause BSD license. Please see
the file LICENSE, distributed with this software, for specific
terms and conditions.
# What is Cryptol?
The Cryptol specification language was designed by Galois for the
NSA's Trusted Systems Research Group as a public standard for
specifying cryptographic algorithms. A Cryptol reference specification
can serve as the formal documentation for a cryptographic module.
Unlike current specification mechanisms, Cryptol is fully executable,
allowing designers to experiment with their programs incrementally as
their designs evolve.
This release is an interpreter for version 2 of the Cryptol
language. The interpreter includes a `:check` command, which tests
predicates written in Cryptol against randomly-generated test vectors
(in the style of
[QuickCheck](http://hackage.haskell.org/package/QuickCheck). There is
also a `:prove` command, which calls out to SMT solvers, such as
Yices, Z3, or CVC4, to prove predicates for all possible inputs.
# Getting Cryptol Binaries
Cryptol binaries for Mac OS X, Linux, and Windows are available from
the GitHub
[releases page](https://github.com/GaloisInc/cryptol/releases). Mac OS
X and Linux binaries are distributed as a tarball which you can
extract to a location of your choice. Windows binaries are distributed
as an `.msi` installer package which places a shortcut to the Cryptol
interpreter in the Start menu.
Cryptol currently depends on the
[CVC4 SMT solver](http://cvc4.cs.nyu.edu/) to solve constraints during
typechecking, and as the default solver for the `:sat` and `:prove`
commands. You can download CVC4 binaries for a variety of platforms
from their [download page](http://cvc4.cs.nyu.edu/downloads/).
# Building Cryptol From Source
In addition to the binaries, the Cryptol source is available publicly
on [GitHub](https://github.com/GaloisInc/cryptol).
Cryptol builds and runs on various flavors of Linux, Mac OS X, and
Windows. We regularly build and test it in the following environments:
- Mac OS X 10.9 64-bit
- CentOS 5 32/64-bit
- CentOS 6 32/64-bit
- Windows XP 32-bit
## Prerequisites
Cryptol is developed using GHC 7.6.3 and cabal-install 1.18. While you
can install these independently, the easiest way to get the correct
versions is to:
1. Install [Haskell Platform 2013.2.0.0](http://www.haskell.org/platform/)
**Mac Users**: the current version of the Haskell Platform has
some incompatibilities with Mac OS X 10.9; it is easier to install
GHC, cabal-install, alex, and happy from
[MacPorts](https://www.macports.org/) or
[Homebrew](http://brew.sh/).
1. Run `cabal update`
1. Run `cabal install cabal-install`
1. Add cabal-install's binary path to your PATH variable (usually `~/.cabal/bin`)
Some supporting non-Haskell libraries are required to build
Cryptol. Most should already be present for your operating system, but
you may need to install the following:
- [The GNU Multiple Precision Arithmetic Library (GMP)](https://gmplib.org/)
- [ncurses](https://www.gnu.org/software/ncurses/)
## Building Cryptol
From the Cryptol source directory, run:
make
This will build Cryptol in place. From there, there are additional targets:
- `make test`: run the regression test suite
- `make docs`: build the Cryptol documentation (requires
[pandoc](http://johnmacfarlane.net/pandoc/) and
[TeX Live](https://www.tug.org/texlive/))
- `make tarball`: build a tarball with a relocatable Cryptol binary and documentation
- `make dist`: build a platform-specific distribution. On all
platforms except Windows, this is currently equivalent to `make
tarball`. On Windows, this will build an `.msi` package using
[WiX Toolset 3.7](http://wixtoolset.org/), which must be installed
separately.
## Installing Cryptol
Aside from the `docs` target, these will leave you with a Cryptol
binary at `.cabal-sandbox/bin/cryptol` in your source directory. You
can either use that binary directly, or use the results of `tarball`
or `dist` to install Cryptol in a location of your choice.
2014-04-21 22:40:07 +04:00
## Verifying your Installation
Run Cryptol, and at the prompt type:
_ _
___ _ __ _ _ _ __ | |_ ___ | |
/ __| '__| | | | '_ \| __/ _ \| |
| (__| | | |_| | |_) | || (_) | |
\___|_| \__, | .__/ \__\___/|_|
|___/|_| version 2.0.424
Loading module Cryptol
Cryptol> :prove True
If Cryptol responds
Q.E.D.
then your installation is correct. If it prints something like
*** An error occurred.
*** Unable to locate executable for cvc4
*** Executable specified: "cvc4"
then make sure you've installed CVC4, and that the binary is on your `PATH`.
2014-04-18 02:34:25 +04:00
# Contributing
We believe that anyone who uses Cryptol is making an important
contribution toward making Cryptol a better tool. There are many ways
to get involved.
## Users
2014-04-21 22:40:07 +04:00
If you write Cryptol programs that you think would benefit the community, fork the GitHub repository, and
add them to the `examples/contrib` directory and submit
a pull request.
We host a Cryptol mailing list, which
you can [join here](http://community.galois.com/mailman/listinfo/cryptol-users).
If you run into a bug in Cryptol, if something
doesn't make sense in the documentation, if you
think something could be better, or if you
just have a cool use of Cryptol that you'd like to share with us, use the issues page on
[GitHub](https://github.com/GaloisInc/cryptol), or
2014-04-18 02:34:25 +04:00
send email to <cryptol@galois.com>.
## Developers
If you plan to do development work on the Cryptol interpreter, please
make a fork of the GitHub repository and send along pull
requests. This makes it easier for us to track development and to
incorprate your changes.
### Repository Structure
- `/cryptol`: Haskell sources for the front-end `cryptol` executable
and read-eval-print loop
- `/docs`: LaTeX and Markdown sources for the Cryptol documentation
- `/examples`: Cryptol sources implementing several interesting
algorithms
- `/lib`: Cryptol standard library sources
- `/notebook`: Experimental Cryptol IPython Notebook implementation
- `/sbv`: Haskell sources for the `sbv` library, derived from Levent
Erkok's [`sbv` library](http://leventerkok.github.io/sbv/) (see
`/sbv/LICENSE`)
- `/src`: Haskell sources for the `cryptol` library (the bulk of the
implementation)
- `/tests`: Haskell sources for the Cryptol regression test suite, as
well as the Cryptol sources and expected outputs that comprise that
suite
# Where to Look Next
The `docs` directory of the installation package contains an
introductory book, the `examples` directory contains a number of
2014-04-21 22:40:07 +04:00
algorithms specified in Cryptol.
2014-04-18 02:34:25 +04:00
If you are familiar with version 1 of Cryptol, you should read the
`Version2Changes` document in the `docs` directory.
Cryptol is still under active development at Galois. We are also
building tools that consume both Cryptol specifications and
implementations in (for example) C or Java, and can (with some amount
of work) allow you to verify that an implementation meets its
specification. Email us at <cryptol@galois.com> if you're interested
in these capabilities.
# Thanks!
We hope that Cryptol is useful as a tool for educators and students,
commercial and open source authors of cryptographic implementations,
and by cryptographers to
* specify cryptographic algorithms
* check or prove properties of algorithms
* generate test vectors for testing implementations
* experiment with new algorithms