| .. SPDX-License-Identifier: GPL-2.0-or-later | |
| ============== | |
| Crypto library | |
| ============== | |
| ``lib/crypto/`` provides faster and easier access to cryptographic algorithms | |
| than the traditional crypto API. | |
| Each cryptographic algorithm is supported via a set of dedicated functions. | |
| "Crypto agility", where needed, is left to calling code. | |
| The crypto library functions are intended to be boring and straightforward, and | |
| to follow familiar conventions. Their primary documentation is their (fairly | |
| extensive) kernel-doc. This page just provides some extra high-level context. | |
| Note that the crypto library isn't entirely new. ``lib/`` has contained some | |
| crypto functions since 2005. Rather, it's just an approach that's been expanded | |
| over time as it's been found to work well. It also largely just matches how the | |
| kernel already does things elsewhere. | |
| Scope and intended audience | |
| =========================== | |
| The crypto library documentation is primarily meant for kernel developers who | |
| need to use a particular cryptographic algorithm(s) in kernel code. For | |
| example, "I just need to compute a SHA-256 hash." A secondary audience is | |
| developers working on the crypto algorithm implementations themselves. | |
| If you're looking for more general information about cryptography, like the | |
| differences between the different crypto algorithms or how to select an | |
| appropriate algorithm, you should refer to external sources which cover that | |
| type of information much more comprehensively. If you need help selecting | |
| algorithms for a new kernel feature that doesn't already have its algorithms | |
| predefined, please reach out to ``linux-crypto@vger.kernel.org`` for advice. | |
| Code organization | |
| ================= | |
| - ``lib/crypto/*.c``: the crypto algorithm implementations | |
| - ``lib/crypto/$(SRCARCH)/``: architecture-specific code for crypto algorithms. | |
| It is here rather than somewhere in ``arch/`` partly because this allows | |
| generic and architecture-optimized code to be easily built into a single | |
| loadable module (when the algorithm is set to 'm' in the kconfig). | |
| - ``lib/crypto/tests/``: KUnit tests for the crypto algorithms | |
| - ``include/crypto/``: crypto headers, for both the crypto library and the | |
| traditional crypto API | |
| Generally, there is one kernel module per algorithm. Sometimes related | |
| algorithms are grouped into one module. There is intentionally no common | |
| framework, though there are some utility functions that multiple algorithms use. | |
| Each algorithm module is controlled by a tristate kconfig symbol | |
| ``CRYPTO_LIB_$(ALGORITHM)``. As is the norm for library functions in the | |
| kernel, these are hidden symbols which don't show up in the kconfig menu. | |
| Instead, they are just selected by all the kconfig symbols that need them. | |
| Many of the algorithms have multiple implementations: a generic implementation | |
| and architecture-optimized implementation(s). Each module initialization | |
| function, or initcall in the built-in case, automatically enables the best | |
| implementation based on the available CPU features. | |
| Note that the crypto library doesn't use the ``crypto/``, | |
| ``arch/$(SRCARCH)/crypto/``, or ``drivers/crypto/`` directories. These | |
| directories are used by the traditional crypto API. When possible, algorithms | |
| in the traditional crypto API are implemented by calls into the library. | |
| Advantages | |
| ========== | |
| Some of the advantages of the library over the traditional crypto API are: | |
| - The library functions tend to be much easier to use. For example, a hash | |
| value can be computed using only a single function call. Most of the library | |
| functions always succeed and return void, eliminating the need to write | |
| error-handling code. Most also accept standard virtual addresses, rather than | |
| scatterlists which are difficult and less efficient to work with. | |
| - The library functions are usually faster, especially for short inputs. They | |
| call the crypto algorithms directly without inefficient indirect calls, memory | |
| allocations, string parsing, lookups in an algorithm registry, and other | |
| unnecessary API overhead. Architecture-optimized code is enabled by default. | |
| - The library functions use standard link-time dependencies instead of | |
| error-prone dynamic loading by name. There's no need for workarounds such as | |
| forcing algorithms to be built-in or adding module soft dependencies. | |
| - The library focuses on the approach that works the best on the vast majority | |
| of systems: CPU-based implementations of the crypto algorithms, utilizing | |
| on-CPU acceleration (such as AES instructions) when available. | |
| - The library uses standard KUnit tests, rather than custom ad-hoc tests. | |
| - The library tends to have higher assurance implementations of the crypto | |
| algorithms. This is both due to its simpler design and because more of its | |
| code is being regularly tested. | |
| - The library supports features that don't fit into the rigid framework of the | |
| traditional crypto API, for example interleaved hashing and XOFs. | |
| When to use it | |
| ============== | |
| In-kernel users should use the library (rather than the traditional crypto API) | |
| whenever possible. Many subsystems have already been converted. It usually | |
| simplifies their code significantly and improves performance. | |
| Some kernel features allow userspace to provide an arbitrary string that selects | |
| an arbitrary algorithm from the traditional crypto API by name. These features | |
| generally will have to keep using the traditional crypto API for backwards | |
| compatibility. | |
| Note: new kernel features shouldn't support every algorithm, but rather make a | |
| deliberate choice about what algorithm(s) to support. History has shown that | |
| making a deliberate, thoughtful choice greatly simplifies code maintenance, | |
| reduces the chance for mistakes (such as using an obsolete, insecure, or | |
| inappropriate algorithm), and makes your feature easier to use. | |
| Testing | |
| ======= | |
| The crypto library uses standard KUnit tests. Like many of the kernel's other | |
| KUnit tests, they are included in the set of tests that is run by | |
| ``tools/testing/kunit/kunit.py run --alltests``. | |
| A ``.kunitconfig`` file is also provided to run just the crypto library tests. | |
| For example, here's how to run them in user-mode Linux: | |
| .. code-block:: sh | |
| tools/testing/kunit/kunit.py run --kunitconfig=lib/crypto/ | |
| Many of the crypto algorithms have architecture-optimized implementations. | |
| Testing those requires building an appropriate kernel and running the tests | |
| either in QEMU or on appropriate hardware. Here's one example with QEMU: | |
| .. code-block:: sh | |
| tools/testing/kunit/kunit.py run --kunitconfig=lib/crypto/ --arch=arm64 --make_options LLVM=1 | |
| Depending on the code being tested, flags may need to be passed to QEMU to | |
| emulate the correct type of hardware for the code to be reached. | |
| Since correctness is essential in cryptographic code, new architecture-optimized | |
| code is accepted only if it can be tested in QEMU. | |
| Note: the crypto library also includes FIPS 140 self-tests. These are | |
| lightweight, are designed specifically to meet FIPS 140 requirements, and exist | |
| *only* to meet those requirements. Normal testing done by kernel developers and | |
| integrators should use the much more comprehensive KUnit tests instead. | |
| API documentation | |
| ================= | |
| .. toctree:: | |
| :maxdepth: 2 | |
| libcrypto-blockcipher | |
| libcrypto-hash | |
| libcrypto-signature | |
| libcrypto-utils | |
| sha3 |