blob: b6df1154b2472ced340a5b1330920931ee65c056 [file] [log] [blame] [view]
# Cryptography Principles
Author: Filippo Valsorda\
Last updated: June 2019\
Discussion: [golang.org/issue/32466](https://golang.org/issue/32466)
https://golang.org/design/cryptography-principles
The Go cryptography libraries goal is to *help developers build
secure applications*. Thus, they aim to be **secure**, **safe**,
**practical** and **modern**, in roughly that order.
**Secure**. We aim to provide a secure implementation free of
security vulnerabilities.
> This is achieved through reduced complexity, testing, code
> review, and a focus on readability. We will only accept
> changes when there are enough maintainer resources to ensure
> their (ongoing) security.
**Safe**. The goal is to make the libraries easynot just
possibleto use securely, as library misuse is just as dangerous
to applications as vulnerabilities.
> The default behavior should be safe in as many scenarios as
> possible, and unsafe functionality, if at all available,
> should require explicit acknowledgement in the API.
> Documentation should provide guidance on how to choose and use
> the libraries.
**Practical**. The libraries should provide most developers with
a way to securely and easily do what they are trying to do,
focusing on common use cases to stay minimal.
> The target is applications, not diagnostic or testing tools.
> Its expected that niche and uncommon needs will be addressed
> by third-party projects. Widely supported functionality is
> preferred to enable interoperability with non-Go applications.
>
> Note that performance, flexibility and compatibility are only
> goals to the extent that they make the libraries useful, not as
> absolute values in themselves.
**Modern**. The libraries should provide the best available
tools for the job, and they should keep up to date with progress
in cryptography engineering.
> If functionality becomes legacy and superseded, it should be
> marked as deprecated and a modern replacement should be
> provided and documented.
>
> Modern doesnt mean experimental. As the community grows, its
> expected that most functionality will be implemented by
> third-party projects first, and thats ok.
Note that this is an ordered list, from highest to lowest
priority. For example, an insecure implementation or unsafe API
will not be considered, even if it enables more use cases or is
more performant.
---
The Go cryptography libraries are the `crypto/...` and
`golang.org/x/crypto/...` packages in the Go standard library
and subrepos.
The specific criteria for what is considered a common use case,
widely supported or superseded are complex and out of scope for
this document.