# Audit Criteria

Before you can go about auditing code, you need to decide what you want the
audits to entail. This is expressed with "audit criteria", which are just labels
corresponding to human-readable descriptions of what to check for.

`cargo vet` comes pre-equipped with two built-in criteria:
[safe-to-run](built-in-criteria.md#safe-to-run) and
[safe-to-deploy](built-in-criteria.md#safe-to-deploy). You can use these without
any additional configuration.

## Custom Criteria

You can also specify arbitrary custom criteria in `audits.toml`. For example:

```
[criteria.crypto-reviewed]
description = '''
The cryptographic code in this crate has been reviewed for correctness by a
member of a designated set of cryptography experts within the project.
'''
```

The full feature set is documented [here](config.md#the-criteria-table).

## Multiple Sets of Criteria

There are a number of reasons you might wish to operate with multiple sets of
criteria:
* **Applying extra checks to some crates:** For example, you might define
  `crypto-reviewed` criteria and require them for audits of crates which
  implement cryptographic algorithms that your application depends on.
* **Relaxing your audit requirements for some crates:** For example, you might
  decide that crates not exposed in production can just be `safe-to-run`
  rather than `safe-to-deploy`, since they don't need to be audited for handling
  adversarial input.
* **Improving Sharing:** If one project wants to audit for issues A and B, and
  another project wants to audit for B and C, defining separate sets of criteria
  for A, B, and C allows the two projects to partially share work.

You can define and use as many separate sets of criteria as you like.
