# cryptography

Hybrid Python + Rust project. The Python package lives in `src/cryptography/`; the Rust extension (PyO3) lives in `src/rust/`. CFFI bindings to OpenSSL/LibreSSL/BoringSSL/AWS-LC are generated from `src/_cffi_src/`. Test vectors live in `vectors/` (an installable sub-package).

## Running tests

Use `nox -e local` to run the full local check: it formats, lints, and type-checks Python and Rust, then runs the Python and Rust test suites. This is the canonical command — never invoke any test, build, lint, or format Python or Rust tools directly.

Other useful sessions: `nox -e tests`, `nox -e tests-nocoverage`, `nox -e rust`, `nox -e docs`, `nox -e flake`.

To test against different versions of OpenSSL, you can set the `OPENSSL_DIR` environment variable to the path to an OpenSSL/BoringSSL/LibreSSL/AWS-LC installation.

## Package management

Use `uv`, not `pip`, for any Python package installation or environment management. `noxfile.py` already sets `default_venv_backend = "uv"`.

## Changelog

User-visible changes go in `CHANGELOG.rst` under the unreleased section.
