Getting started

Development dependencies

Working on cryptography requires the installation of a small number of development dependencies in addition to the dependencies for Installation. These are listed in dev-requirements.txt and they can be installed in a virtualenv using pip. Before you install them, follow the build instructions in Installation (be sure to stop before actually installing cryptography). Once you’ve done that, install the development dependencies, and then install cryptography in editable mode. For example:

$ # Create a virtualenv and activate it
$ # Set up your cryptography build environment
$ pip install --requirement dev-requirements.txt
$ pip install --editable .

You will also need to install enchant using your system’s package manager to check spelling in the documentation.


There is an upstream bug in enchant that prevents its installation on Windows with 64-bit Python. See this Github issue for more information. The easiest workaround is to use 32-bit Python for cryptography development, even on 64-bit Windows.

You are now ready to run the tests and build the documentation.

OpenSSL on OS X

You must have installed OpenSSL via Homebrew or MacPorts and must set CFLAGS and LDFLAGS environment variables before installing the dev-requirements.txt otherwise pip will fail with include errors.

For example, with Homebrew:

$ env LDFLAGS="-L$(brew --prefix openssl)/lib" \
    CFLAGS="-I$(brew --prefix openssl)/include" \
    pip install --requirement ./dev-requirements.txt

Alternatively for a static build you can specify CRYPTOGRAPHY_OSX_NO_LINK_FLAGS=1 and ensure LDFLAGS points to the absolute path for the OpenSSL libraries before calling pip.


You will also need to set these values when Building documentation.

Running tests

cryptography unit tests are found in the tests/ directory and are designed to be run using pytest. pytest will discover the tests automatically, so all you have to do is:

$ py.test
62746 passed in 220.43 seconds

This runs the tests with the default Python interpreter.

You can also verify that the tests pass on other supported Python interpreters. For this we use tox, which will automatically create a virtualenv for each supported Python version and run the tests. For example:

$ tox
ERROR:   py26: InterpreterNotFound: python2.6
 py27: commands succeeded
ERROR:   pypy: InterpreterNotFound: pypy
 py33: commands succeeded
 docs: commands succeeded
 pep8: commands succeeded

You may not have all the required Python versions installed, in which case you will see one or more InterpreterNotFound errors.

Explicit backend selection

While testing you may want to run tests against a subset of the backends that cryptography supports. Explicit backend selection can be done via the --backend flag. This flag should be passed to py.test with a comma delimited list of backend names.

$ tox -- --backend=openssl
$ py.test --backend=openssl,commoncrypto

Building documentation

cryptography documentation is stored in the docs/ directory. It is written in reStructured Text and rendered using Sphinx.

Use tox to build the documentation. For example:

$ tox -e docs
docs: commands succeeded
congratulations :)

The HTML documentation index can now be found at docs/_build/html/index.html.