blob: 5c5d83f1b84007209de39eb816a7331d17dc3b04 [file] [log] [blame] [view]
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +02001This document explains the strategy that was used so far in starting the
2migration to PSA Crypto and mentions future perspectives and open questions.
3
4Goals
5=====
6
7Several benefits are expected from migrating to PSA Crypto:
8
Manuel Pégourié-Gonnard74979912021-10-27 14:00:08 +02009G1. Use PSA Crypto drivers when available.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020010G2. Allow isolation of long-term secrets (for example, private keys).
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +010011G3. Allow isolation of short-term secrets (for example, TLS session keys).
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020012G4. Have a clean, unified API for Crypto (retire the legacy API).
Manuel Pégourié-Gonnard74979912021-10-27 14:00:08 +020013G5. Code size: compile out our implementation when a driver is available.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020014
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +020015As of Mbed TLS 3.2, most of (G1) and all of (G2) is implemented when
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020016`MBEDTLS_USE_PSA_CRYPTO` is enabled. For (G2) to take effect, the application
Manuel Pégourié-Gonnard8c7b81c2022-07-18 11:17:06 +020017needs to be changed to use new APIs. For a more detailed account of what's
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +020018implemented, see `docs/use-psa-crypto.md`, where new APIs are about (G2), and
19internal changes implement (G1).
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020020
Manuel Pégourié-Gonnard4837f722024-05-23 09:26:31 +020021As of Mbed TLS 3.6 (early 2024), work towards G5 is well advanced: it is now
Manuel Pégourié-Gonnard72375632024-05-21 11:43:20 +020022possible to have hashes/HMAC, ciphers/AEAD, and ECC provided only by drivers,
Manuel Pégourié-Gonnard4837f722024-05-23 09:26:31 +020023with some limitations. See
24[`docs/driver-only-builds.md`](../../driver-only-builds.html) for details.
Manuel Pégourié-Gonnard72375632024-05-21 11:43:20 +020025The main gap is RSA in PK, X.509 and TLS; it should be resolved by 4.0 work.
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +010026
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020027Generally speaking, the numbering above doesn't mean that each goal requires
Manuel Pégourié-Gonnard72375632024-05-21 11:43:20 +020028the preceding ones to be completed. (As an example, much progress towards G5
29was made in 3.x, while G4 will be mostly 4.0 and probably not fully complete
30until 5.0.)
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020031
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +010032
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020033Compile-time options
34====================
35
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +010036We currently have a few compile-time options that are relevant to the migration:
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020037
38- `MBEDTLS_PSA_CRYPTO_C` - enabled by default, controls the presence of the PSA
Gilles Peskine4f65e1f2024-12-04 18:05:46 +010039 Crypto APIs with their implementations. (Builds with only
40 `MBEDTLS_PSA_CRYPTO_CLIENT`, where PSA crypto APIs are present but
41 implemented via third-party code, are out of scope of this document.)
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020042- `MBEDTLS_USE_PSA_CRYPTO` - disabled by default (enabled in "full" config),
43 controls usage of PSA Crypto APIs to perform operations in X.509 and TLS
44(G1 above), as well as the availability of some new APIs (G2 above).
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +020045- `PSA_CRYPTO_CONFIG` - disabled by default, supports builds with drivers and
46 without the corresponding software implementation (G5 above).
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020047
Manuel Pégourié-Gonnarda6c601c2021-10-27 14:12:44 +020048The reasons why `MBEDTLS_USE_PSA_CRYPTO` is optional and disabled by default
49are:
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +010050- it's not fully compatible with `MBEDTLS_ECP_RESTARTABLE`: you can enable
51 both, but then you won't get the full effect of RESTARTBLE (see the
52documentation of this option in `mbedtls_config.h`);
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +010053- to avoid a hard/default dependency of TLS, X.509 and PK on
Manuel Pégourié-Gonnard80759c42022-02-08 10:33:11 +010054 `MBEDTLS_PSA_CRYPTO_C`, for backward compatibility reasons:
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +020055 - When `MBEDTLS_PSA_CRYPTO_C` is enabled and used, applications need to call
56 `psa_crypto_init()` before TLS/X.509 uses PSA functions. (This prevents us
57from even enabling the option by default.)
Tom Cosgrove0b86ac12022-07-29 13:44:01 +010058 - `MBEDTLS_PSA_CRYPTO_C` has a hard dependency on `MBEDTLS_ENTROPY_C ||
Manuel Pégourié-Gonnardce6c0872022-02-01 10:34:20 +010059 MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG` but it's
Tom Cosgrove0b86ac12022-07-29 13:44:01 +010060 currently possible to compile TLS and X.509 without any of the options.
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +010061 Also, we can't just auto-enable `MBEDTLS_ENTROPY_C` as it doesn't build
Manuel Pégourié-Gonnardce6c0872022-02-01 10:34:20 +010062 out of the box on all platforms, and even less
63 `MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG` as it requires a user-provided RNG
64 function.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020065
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +020066The downside of this approach is that until we are able to make
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +020067`MBDEDTLS_USE_PSA_CRYPTO` non-optional (always enabled), we have to maintain
68two versions of some parts of the code: one using PSA, the other using the
69legacy APIs. However, see next section for strategies that can lower that
Manuel Pégourié-Gonnarda6c601c2021-10-27 14:12:44 +020070cost. The rest of this section explains the reasons for the
71incompatibilities mentioned above.
72
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +020073At the time of writing (early 2022) it is unclear what could be done about the
74backward compatibility issues, and in particular if the cost of implementing
75solutions to these problems would be higher or lower than the cost of
76maintaining dual code paths until the next major version. (Note: these
77solutions would probably also solve other problems at the same time.)
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +010078
Manuel Pégourié-Gonnarda6c601c2021-10-27 14:12:44 +020079### `MBEDTLS_ECP_RESTARTABLE`
80
81Currently this option controls not only the presence of restartable APIs in
82the crypto library, but also their use in the TLS and X.509 layers. Since PSA
83Crypto does not support restartable operations, there's a clear conflict: the
84TLS and X.509 layers can't both use only PSA APIs and get restartable
85behaviour.
86
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +010087Support for restartable (aka interruptible) ECDSA sign/verify operation was
88added to PSA in Mbed TLS 3.4, but support for ECDH is not present yet.
Manuel Pégourié-Gonnarda6c601c2021-10-27 14:12:44 +020089
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +010090It will then require follow-up work to make use of the new PSA APIs in
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +020091PK/X.509/TLS in all places where we currently allow restartable operations.
Manuel Pégourié-Gonnarda6c601c2021-10-27 14:12:44 +020092
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +020093### Backward compatibility issues with making `MBEDTLS_USE_PSA_CRYPTO` always on
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +010094
951. Existing applications may not be calling `psa_crypto_init()` before using
96 TLS, X.509 or PK. We can try to work around that by calling (the relevant
97part of) it ourselves under the hood as needed, but that would likely require
98splitting init between the parts that can fail and the parts that can't (see
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +020099<https://github.com/ARM-software/psa-crypto-api/pull/536> for that).
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +01001002. It's currently not possible to enable `MBEDTLS_PSA_CRYPTO_C` in
101 configurations that don't have `MBEDTLS_ENTROPY_C`, and we can't just
102auto-enable the latter, as it won't build or work out of the box on all
103platforms. There are two kinds of things we'd need to do if we want to work
104around that:
105 1. Make it possible to enable the parts of PSA Crypto that don't require an
106 RNG (typically, public key operations, symmetric crypto, some key
107management functions (destroy etc)) in configurations that don't have
108`ENTROPY_C`. This requires going through the PSA code base to adjust
109dependencies. Risk: there may be annoying dependencies, some of which may be
110surprising.
111 2. For operations that require an RNG, provide an alternative function
112 accepting an explicit `f_rng` parameter (see #5238), that would be
113available in entropy-less builds. (Then code using those functions still needs
114to have one version using it, for entropy-less builds, and one version using
115the standard function, for driver support in build with entropy.)
116
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +0200117See <https://github.com/Mbed-TLS/mbedtls/issues/5156>.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200118
119Taking advantage of the existing abstractions layers - or not
120=============================================================
121
122The Crypto library in Mbed TLS currently has 3 abstraction layers that offer
123algorithm-agnostic APIs for a class of algorithms:
124
125- MD for messages digests aka hashes (including HMAC)
126- Cipher for symmetric ciphers (included AEAD)
127- PK for asymmetric (aka public-key) cryptography (excluding key exchange)
128
129Note: key exchange (FFDH, ECDH) is not covered by an abstraction layer.
130
131These abstraction layers typically provide, in addition to the API for crypto
132operations, types and numerical identifiers for algorithms (for
133example `mbedtls_cipher_mode_t` and its values). The
134current strategy is to keep using those identifiers in most of the code, in
135particular in existing structures and public APIs, even when
136`MBEDTLS_USE_PSA_CRYPTO` is enabled. (This is not an issue for G1, G2, G3
137above, and is only potentially relevant for G4.)
138
139The are multiple strategies that can be used regarding the place of those
140layers in the migration to PSA.
141
142Silently call to PSA from the abstraction layer
143-----------------------------------------------
144
145- Provide a new definition (conditionally on `USE_PSA_CRYPTO`) of wrapper
146 functions in the abstraction layer, that calls PSA instead of the legacy
147crypto API.
148- Upside: changes contained to a single place, no need to change TLS or X.509
149 code anywhere.
150- Downside: tricky to implement if the PSA implementation is currently done on
151 top of that layer (dependency loop).
152
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100153This strategy is currently (early 2023) used for all operations in the PK
154layer; the MD layer uses a variant where it dispatches to PSA if a driver is
155available and the driver subsystem has been initialized, regardless of whether
Manuel Pégourié-Gonnard4837f722024-05-23 09:26:31 +0200156`USE_PSA_CRYPTO` is enabled; see [`md-cipher-dispatch.md`](md-cipher-dispatch.html)
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100157for details.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200158
Manuel Pégourié-Gonnard09503592021-10-27 14:21:23 +0200159This strategy is not very well suited to the Cipher layer, as the PSA
160implementation is currently done on top of that layer.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200161
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +0100162This strategy will probably be used for some time for the PK layer, while we
163figure out what the future of that layer is: parts of it (parse/write, ECDSA
164signatures in the format that X.509 & TLS want) are not covered by PSA, so
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200165they will need to keep existing in some way. (Also, the PK layer is a good
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +0100166place for dispatching to either PSA or `mbedtls_xxx_restartable` while that
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200167part is not covered by PSA yet, if we decide to do that.)
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +0100168
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200169Replace calls for each operation
170--------------------------------
171
172- For every operation that's done through this layer in TLS or X.509, just
173 replace function call with calls to PSA (conditionally on `USE_PSA_CRYPTO`)
174- Upside: conceptually simple, and if the PSA implementation is currently done
175 on top of that layer, avoids concerns about dependency loops.
Manuel Pégourié-Gonnardec3fd752022-01-17 11:29:18 +0100176- Upside: opens the door to building TLS/X.509 without that layer, saving some
177 code size.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200178- Downside: TLS/X.509 code has to be done for each operation.
179
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100180This strategy is currently (early 2023) used for the MD layer and the Cipher
181layer in X.509 and TLS. Crypto modules however always call to MD which may
Manuel Pégourié-Gonnard4837f722024-05-23 09:26:31 +0200182then dispatch to PSA, see [`md-cipher-dispatch.md`](md-cipher-dispatch.html).
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200183
184Opt-in use of PSA from the abstraction layer
185--------------------------------------------
186
187- Provide a new way to set up a context that causes operations on that context
188 to be done via PSA.
189- Upside: changes mostly contained in one place, TLS/X.509 code only needs to
190 be changed when setting up the context, but not when using it. In
191 particular, no changes to/duplication of existing public APIs that expect a
192 key to be passed as a context of this layer (eg, `mbedtls_pk_context`).
193- Upside: avoids dependency loop when PSA implemented on top of that layer.
194- Downside: when the context is typically set up by the application, requires
195 changes in application code.
196
Manuel Pégourié-Gonnard09503592021-10-27 14:21:23 +0200197This strategy is not useful when no context is used, for example with the
198one-shot function `mbedtls_md()`.
199
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200200There are two variants of this strategy: one where using the new setup
201function also allows for key isolation (the key is only held by PSA,
202supporting both G1 and G2 in that area), and one without isolation (the key is
Manuel Pégourié-Gonnard80759c42022-02-08 10:33:11 +0100203still stored outside of PSA most of the time, supporting only G1).
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200204
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200205This strategy, with support for key isolation, is currently (early 2022) used for
206private-key operations in the PK layer - see `mbedtls_pk_setup_opaque()`. This
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200207allows use of PSA-held private ECDSA keys in TLS and X.509 with no change to
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200208the TLS/X.509 code, but a contained change in the application.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200209
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200210This strategy, without key isolation, was also previously used (until 3.1
211included) in the Cipher layer - see `mbedtls_cipher_setup_psa()`. This allowed
212use of PSA for cipher operations in TLS with no change to the application
213code, and a contained change in TLS code. (It only supported a subset of
214ciphers.)
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200215
216Note: for private key operations in the PK layer, both the "silent" and the
217"opt-in" strategy can apply, and can complement each other, as one provides
218support for key isolation, but at the (unavoidable) code of change in
219application code, while the other requires no application change to get
220support for drivers, but fails to provide isolation support.
221
Manuel Pégourié-Gonnard09503592021-10-27 14:21:23 +0200222Summary
223-------
224
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200225Strategies currently (early 2022) used with each abstraction layer:
Manuel Pégourié-Gonnard09503592021-10-27 14:21:23 +0200226
227- PK (for G1): silently call PSA
228- PK (for G2): opt-in use of PSA (new key type)
Manuel Pégourié-Gonnard72375632024-05-21 11:43:20 +0200229- PK (for G5): store keys in PSA-friendly format when `ECP_C` is disabled and
230 `USE_PSA` is enabled
231- Cipher (G1, TLS): replace calls at each call site
232- Cipher (G5): create a new internal abstraction layer for (non-DES) block
233 ciphers that silently calls PSA when a driver is available, see
Manuel Pégourié-Gonnard4837f722024-05-23 09:26:31 +0200234 [`md-cipher-dispatch.md`](md-cipher-dispatch.html).
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100235- MD (G1, X.509 and TLS): replace calls at each call site (depending on
236 `USE_PSA_CRYPTO`)
237- MD (G5): silently call PSA when a driver is available, see
Manuel Pégourié-Gonnard4837f722024-05-23 09:26:31 +0200238 [`md-cipher-dispatch.md`](md-cipher-dispatch.html).
Manuel Pégourié-Gonnard09503592021-10-27 14:21:23 +0200239
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200240
241Supporting builds with drivers without the software implementation
242==================================================================
243
244This section presents a plan towards G5: save code size by compiling out our
245software implementation when a driver is available.
246
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200247Let's expand a bit on the definition of the goal: in such a configuration
248(driver used, software implementation and abstraction layer compiled out),
249we want:
250
251a. the library to build in a reasonably-complete configuration,
252b. with all tests passing,
253c. and no more tests skipped than the same configuration with software
254 implementation.
255
256Criterion (c) ensures not only test coverage, but that driver-based builds are
257at feature parity with software-based builds.
258
259We can roughly divide the work needed to get there in the following steps:
260
2610. Have a working driver interface for the algorithms we want to replace.
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +01002621. Have users of these algorithms call to PSA or an abstraction layer than can
263 dispatch to PSA, but not the low-level legacy API, for all operations.
264(This is G1, and for PK, X.509 and TLS this is controlled by
265`MBEDTLS_USE_PSA_CRYPTO`.) This needs to be done in the library and tests.
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +02002662. Have users of these algorithms not depend on the legacy API for information
267 management (getting a size for a given algorithm, etc.)
2683. Adapt compile-time guards used to query availability of a given algorithm;
269 this needs to be done in the library (for crypto operations and data) and
270tests.
271
272Note: the first two steps enable use of drivers, but not by themselves removal
273of the software implementation.
274
275Note: the fact that step 1 is not achieved for all of libmbedcrypto (see
276below) is the reason why criterion (a) has "a reasonably-complete
277configuration", to allow working around internal crypto dependencies when
278working on other parts such as X.509 and TLS - for example, a configuration
279without RSA PKCS#1 v2.1 still allows reasonable use of X.509 and TLS.
280
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200281Note: this is a conceptual division that will sometimes translate to how the
282work is divided into PRs, sometimes not. For example, in situations where it's
283not possible to achieve good test coverage at the end of step 1 or step 2, it
284is preferable to group with the next step(s) in the same PR until good test
285coverage can be reached.
286
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100287**Status as of end of March 2023 (shortly after 3.4):**
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200288
289- Step 0 is achieved for most algorithms, with only a few gaps remaining.
290- Step 1 is achieved for most of PK, X.509, and TLS when
291 `MBEDTLS_USE_PSA_CRYPTO` is enabled with only a few gaps remaining (see
292 docs/use-psa-crypto.md).
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100293- Step 1 is achieved for the crypto library regarding hashes: everything uses
294 MD (not low-level hash APIs), which then dispatches to PSA if applicable.
295- Step 1 is not achieved for all of the crypto library when it come to
296 ciphers. For example,`ctr_drbg.c` calls the legacy API `mbedtls_aes`.
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200297- Step 2 is achieved for most of X.509 and TLS (same gaps as step 1) when
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100298 `MBEDTLS_USE_PSA_CRYPTO` is enabled.
299- Step 3 is done for hashes and top-level ECC modules (ECDSA, ECDH, ECJPAKE).
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200300
301**Strategy for step 1:**
302
303Regarding PK, X.509, and TLS, this is mostly achieved with only a few gaps.
Manuel Pégourié-Gonnard8c7b81c2022-07-18 11:17:06 +0200304(The strategy was outlined in the previous section.)
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200305
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100306Regarding libmbedcrypto:
Manuel Pégourié-Gonnard4837f722024-05-23 09:26:31 +0200307- for hashes and ciphers, see [`md-cipher-dispatch.md`](md-cipher-dispatch.html);
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100308- for ECC, we have no internal uses of the top-level algorithms (ECDSA, ECDH,
309 ECJPAKE), however they all depend on `ECP_C` which in turn depends on
310`BIGNUM_C`. So, direct calls from TLS, X.509 and PK to ECP and Bignum will
311need to be replaced; see <https://github.com/Mbed-TLS/mbedtls/issues/6839> and
Manuel Pégourié-Gonnardb38c9c82023-03-24 10:43:28 +0100312linked issues for a summary of intermediate steps and open points.
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200313
314**Strategy for step 2:**
315
316The most satisfying situation here is when we can just use the PSA Crypto API
317for information management as well. However sometimes it may not be
Manuel Pégourié-Gonnard8c7b81c2022-07-18 11:17:06 +0200318convenient, for example in parts of the code that accept old-style identifiers
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200319(such as `mbedtls_md_type_t`) in their API and can't assume PSA to be
320compiled in (such as `rsa.c`).
321
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100322When using an existing abstraction layer such as MD, it can provide
323information management functions. In other cases, information that was in a
324low-level module but logically belongs in a higher-level module can be moved
325to that module (for example, TLS identifiers of curves and there conversion
326to/from PSA or legacy identifiers belongs in TLS, not `ecp.c`).
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200327
328**Strategy for step 3:**
329
Manuel Pégourié-Gonnardf88b1b52022-07-15 11:05:05 +0200330There are currently two (complementary) ways for crypto-using code to check if a
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200331particular algorithm is supported: using `MBEDTLS_xxx` macros, and using
332`PSA_WANT_xxx` macros. For example, PSA-based code that want to use SHA-256
333will check for `PSA_WANT_ALG_SHA_256`, while legacy-based code that wants to
334use SHA-256 will check for `MBEDTLS_SHA256_C` if using the `mbedtls_sha256`
Manuel Pégourié-Gonnard8c7b81c2022-07-18 11:17:06 +0200335API, or for `MBEDTLS_MD_C && MBEDTLS_SHA256_C` if using the `mbedtls_md` API.
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200336
Manuel Pégourié-Gonnardc8c352c2022-07-21 11:01:50 +0200337Code that obeys `MBEDTLS_USE_PSA_CRYPTO` will want to use one of the two
338dependencies above depending on whether `MBEDTLS_USE_PSA_CRYPTO` is defined:
339if it is, the code want the algorithm available in PSA, otherwise, it wants it
340available via the legacy API(s) is it using (MD and/or low-level).
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200341
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100342As much as possible, we're trying to create for each algorithm a single new
343macro that can be used to express dependencies everywhere (except pure PSA
344code that should always use `PSA_WANT`). For example, for hashes this is the
345`MBEDTLS_MD_CAN_xxx` family. For ECC algorithms, we have similar
346`MBEDTLS_PK_CAN_xxx` macros.
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200347
Manuel Pégourié-Gonnard52f7edb2023-03-22 15:56:01 +0100348Note that in order to achieve that goal, even for code that obeys
349`USE_PSA_CRYPTO`, it is useful to impose that all algorithms that are
350available via the legacy APIs are also available via PSA.
Manuel Pégourié-Gonnardc42c7e62022-09-15 11:11:00 +0200351
Manuel Pégourié-Gonnardc8c352c2022-07-21 11:01:50 +0200352Executing step 3 will mostly consist of using the right dependency macros in
353the right places (once the previous steps are done).
Manuel Pégourié-Gonnardaf8cf5c2022-07-12 11:05:53 +0200354
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200355**Note on testing**
356
Manuel Pégourié-Gonnardfca4dc62022-07-26 10:10:07 +0200357Since supporting driver-only builds is not about adding features, but about
358supporting existing features in new types of builds, testing will not involve
359adding cases to the test suites, but instead adding new components in `all.sh`
360that build and run tests in newly-supported configurations. For example, if
361we're making some part of the library work with hashes provided only by
362drivers when `MBEDTLS_USE_PSA_CRYPTO` is defined, there should be a place in
363`all.sh` that builds and run tests in such a configuration.
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200364
365There is however a risk, especially in step 3 where we change how dependencies
366are expressed (sometimes in bulk), to get things wrong in a way that would
367result in more tests being skipped, which is easy to miss. Care must be
368taken to ensure this does not happen. The following criteria can be used:
369
Manuel Pégourié-Gonnard222bc852022-12-29 13:47:25 +01003701. The sets of tests skipped in the default config and the full config must be
371 the same before and after the PR that implements step 3. This is tested
372manually for each PR that changes dependency declarations by using the script
373`outcome-analysis.sh` in the present directory.
3742. The set of tests skipped in the driver-only build is the same as in an
375 equivalent software-based configuration. This is tested automatically by the
376CI in the "Results analysis" stage, by running
Manuel Pégourié-Gonnard5a2e0262023-01-23 12:51:52 +0100377`tests/scripts/analyze_outcomes.py`. See the
Manuel Pégourié-Gonnard222bc852022-12-29 13:47:25 +0100378`analyze_driver_vs_reference_xxx` actions in the script and the comments above
379their declaration for how to do that locally.
Manuel Pégourié-Gonnardfb2ed582022-07-21 11:04:52 +0200380
381
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200382Migrating away from the legacy API
383==================================
384
385This section briefly introduces questions and possible plans towards G4,
386mainly as they relate to choices in previous stages.
387
388The role of the PK/Cipher/MD APIs in user migration
389---------------------------------------------------
390
Manuel Pégourié-Gonnard481846c2022-07-12 09:27:39 +0200391We're currently taking advantage of the existing PK layer in order
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200392to reduce the number of places where library code needs to be changed. It's
393only natural to consider using the same strategy (with the PK, MD and Cipher
394layers) for facilitating migration of application code.
395
396Note: a necessary first step for that would be to make sure PSA is no longer
397implemented of top of the concerned layers
398
399### Zero-cost compatibility layer?
400
401The most favourable case is if we can have a zero-cost abstraction (no
402runtime, RAM usage or code size penalty), for example just a bunch of
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +0100403`#define`s, essentially mapping `mbedtls_` APIs to their `psa_` equivalent.
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200404
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200405Unfortunately that's unlikely to fully work. For example, the MD layer uses the
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200406same context type for hashes and HMACs, while the PSA API (rightfully) has
407distinct operation types. Similarly, the Cipher layer uses the same context
408type for unauthenticated and AEAD ciphers, which again the PSA API
409distinguishes.
410
411It is unclear how much value, if any, a zero-cost compatibility layer that's
412incomplete (for example, for MD covering only hashes, or for Cipher covering
413only AEAD) or differs significantly from the existing API (for example,
414introducing new context types) would provide to users.
415
416### Low-cost compatibility layers?
417
418Another possibility is to keep most or all of the existing API for the PK, MD
419and Cipher layers, implemented on top of PSA, aiming for the lowest possible
420cost. For example, `mbedtls_md_context_t` would be defined as a (tagged) union
421of `psa_hash_operation_t` and `psa_mac_operation_t`, then `mbedtls_md_setup()`
422would initialize the correct part, and the rest of the functions be simple
423wrappers around PSA functions. This would vastly reduce the complexity of the
424layers compared to the existing (no need to dispatch through function
425pointers, just call the corresponding PSA API).
426
427Since this would still represent a non-zero cost, not only in terms of code
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +0100428size, but also in terms of maintenance (testing, etc.) this would probably
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200429be a temporary solution: for example keep the compatibility layers in 4.0 (and
430make them optional), but remove them in 5.0.
431
432Again, this provides the most value to users if we can manage to keep the
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +0100433existing API unchanged. Their might be conflicts between this goal and that of
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200434reducing the cost, and judgment calls may need to be made.
435
436Note: when it comes to holding public keys in the PK layer, depending on how
437the rest of the code is structured, it may be worth holding the key data in
438memory controlled by the PK layer as opposed to a PSA key slot, moving it to a
439slot only when needed (see current `ecdsa_verify_wrap` when
440`MBEDTLS_USE_PSA_CRYPTO` is defined) For example, when parsing a large
441number, N, of X.509 certificates (for example the list of trusted roots), it
442might be undesirable to use N PSA key slots for their public keys as long as
443the certs are loaded. OTOH, this could also be addressed by merging the "X.509
444parsing on-demand" (#2478), and then the public key data would be held as
445bytes in the X.509 CRT structure, and only moved to a PK context / PSA slot
446when it's actually used.
447
448Note: the PK layer actually consists of two relatively distinct parts: crypto
449operations, which will be covered by PSA, and parsing/writing (exporting)
450from/to various formats, which is currently not fully covered by the PSA
451Crypto API.
452
453### Algorithm identifiers and other identifiers
454
455It should be easy to provide the user with a bunch of `#define`s for algorithm
456identifiers, for example `#define MBEDTLS_MD_SHA256 PSA_ALG_SHA_256`; most of
457those would be in the MD, Cipher and PK compatibility layers mentioned above,
458but there might be some in other modules that may be worth considering, for
459example identifiers for elliptic curves.
460
461### Lower layers
462
463Generally speaking, we would retire all of the low-level, non-generic modules,
464such as AES, SHA-256, RSA, DHM, ECDH, ECP, bignum, etc, without providing
465compatibility APIs for them. People would be encouraged to switch to the PSA
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +0100466API. (The compatibility implementation of the existing PK, MD, Cipher APIs
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200467would mostly benefit people who already used those generic APis rather than
468the low-level, alg-specific ones.)
469
470### APIs in TLS and X.509
471
472Public APIs in TLS and X.509 may be affected by the migration in at least two
473ways:
474
4751. APIs that rely on a legacy `mbedtls_` crypto type: for example
476 `mbedtls_ssl_conf_own_cert()` to configure a (certificate and the
477associated) private key. Currently the private key is passed as a
478`mbedtls_pk_context` object, which would probably change to a `psa_key_id_t`.
479Since some users would probably still be using the compatibility PK layer, it
480would need a way to easily extract the PSA key ID from the PK context.
481
4822. APIs the accept list of identifiers: for example
483 `mbedtls_ssl_conf_curves()` taking a list of `mbedtls_ecp_group_id`s. This
bootstrap-prime6dbbf442022-05-17 19:30:44 -0400484could be changed to accept a list of pairs (`psa_ecc_family_t`, size) but we
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +0100485should probably take this opportunity to move to a identifier independent from
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200486the underlying crypto implementation and use TLS-specific identifiers instead
487(based on IANA values or custom enums), as is currently done in the new
488`mbedtls_ssl_conf_groups()` API, see #4859).
489
490Testing
491-------
492
493An question that needs careful consideration when we come around to removing
494the low-level crypto APIs and making PK, MD and Cipher optional compatibility
495layers is to be sure to preserve testing quality. A lot of the existing test
496cases use the low level crypto APIs; we would need to either keep using that
Manuel Pégourié-Gonnard2a47d232022-04-20 15:01:13 +0200497API for tests, or manually migrate tests to the PSA Crypto API. Perhaps a
Manuel Pégourié-Gonnardb89fd952021-09-30 11:52:04 +0200498combination of both, perhaps evolving gradually over time.