blob: 200f439413f355624b35b52436b2f77934997911 [file] [log] [blame] [view]
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +02001This document explains how to create builds of Mbed TLS where some
2cryptographic mechanisms are provided only by PSA drivers (that is, no
3built-in implementation of those algorithms), from a user's perspective.
4
5This is useful to save code size for people who are using either a hardware
Manuel Pégourié-Gonnard030f11b2023-09-23 09:02:42 +02006accelerator, or an alternative software implementation that is more
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +02007aggressively optimized for code size than the default one in Mbed TLS.
8
9General considerations
10----------------------
11
12This document assumes that you already have a working driver.
13Otherwise, please see the [PSA driver example and
14guide](psa-driver-example-and-guide.md) for information on writing a
15driver.
16
17In order to have some mechanism provided only by a driver, you'll want
18the following compile-time configuration options enabled:
19- `MBEDTLS_PSA_CRYPTO_C` (enabled by default) - this enables PSA Crypto.
20- `MBEDTLS_USE_PSA_CRYPTO` (disabled by default) - this makes PK, X.509 and
21 TLS use PSA Crypto. You need to enable this if you're using PK, X.509 or TLS
22and want them to have access to the algorithms provided by your driver. (See
23[the dedicated document](use-psa-crypto.md) for details.)
24- `MBEDTLS_PSA_CRYPTO_CONFIG` (disabled by default) - this enables
25 configuration of cryptographic algorithms using `PSA_WANT` macros in
26`include/psa/crypto_config.h`. See [Conditional inclusion of cryptographic
27mechanism through the PSA API in Mbed
28TLS](proposed/psa-conditional-inclusion-c.md) for details.
29
30In addition, for each mechanism you want provided only by your driver:
31- Define the corresponding `PSA_WANT` macro in `psa/crypto_config.h` - this
32 means the algorithm will be available in the PSA Crypto API.
Manuel Pégourié-Gonnardfb22c272023-07-18 10:40:56 +020033- Define the corresponding `MBEDTLS_PSA_ACCEL` in your build. This could be
34 defined in `psa/crypto_config.h` or your compiler's command line. This
35informs the PSA code that an accelerator is available for this mechanism.
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020036- Undefine / comment out the corresponding `MBEDTLS_xxx_C` macro in
37 `mbedtls/mbedtls_config.h`. This ensures the built-in implementation is not
38included in the build.
39
40For example, if you want SHA-256 to be provided only by a driver, you'll want
41`PSA_WANT_ALG_SHA_256` and `MBEDTLS_PSA_ACCEL_SHA_256` defined, and
42`MBEDTLS_SHA256_C` undefined.
43
44In addition to these compile-time considerations, at runtime you'll need to
45make sure you call `psa_crypto_init()` before any function that uses the
Manuel Pégourié-Gonnardfb22c272023-07-18 10:40:56 +020046driver-only mechanisms. Note that this is already a requirement for any use of
47the PSA Crypto API, as well as for use of the PK, X.509 and TLS modules when
48`MBEDTLS_USE_PSA_CRYPTO` is enabled, so in most cases your application will
49already be doing this.
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020050
51Mechanisms covered
52------------------
53
Manuel Pégourié-Gonnardc9777512023-07-11 11:11:20 +020054For now, only the following (families of) mechanisms are supported:
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020055- hashes: SHA-3, SHA-2, SHA-1, MD5, etc.
56- elliptic-curve cryptography (ECC): ECDH, ECDSA, EC J-PAKE, ECC key types.
Manuel Pégourié-Gonnardc9777512023-07-11 11:11:20 +020057- finite-field Diffie-Hellman: FFDH algorithm, DH key types.
Valerio Setti20e93a22023-12-04 11:29:36 +010058- AEADs: GCM, CCM and ChachaPoly
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020059
60Supported means that when those are provided only by drivers, everything
61(including PK, X.509 and TLS if `MBEDTLS_USE_PSA_CRYPTO` is enabled) should
62work in the same way as if the mechanisms where built-in, except as documented
63in the "Limitations" sub-sections of the sections dedicated to each family
64below.
65
66In the near future (end of 2023), we are planning to also add support for
Valerio Setti20e93a22023-12-04 11:29:36 +010067ciphers (AES, ARIA, Camellia).
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020068
Manuel Pégourié-Gonnardc9777512023-07-11 11:11:20 +020069Currently (mid-2023) we don't have plans to extend this to RSA. If
70you're interested in driver-only support for RSA, please let us know.
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020071
72Hashes
73------
74
Manuel Pégourié-Gonnard030f11b2023-09-23 09:02:42 +020075It is possible to have all hash operations provided only by a driver.
Manuel Pégourié-Gonnard1f61b7b2023-09-22 10:15:22 +020076
77More precisely:
78- you can enable `PSA_WANT_ALG_SHA_256` without `MBEDTLS_SHA256_C`, provided
79 you have `MBEDTLS_PSA_ACCEL_ALG_SHA_256` enabled;
80- and similarly for all supported hash algorithms: `MD5`, `RIPEMD160`,
81 `SHA_1`, `SHA_224`, `SHA_256`, `SHA_384`, `SHA_512`, `SHA3_224`, `SHA3_256`,
82`SHA3_384`, `SHA3_512`.
83
84In such a build, all crypto operations (via the PSA Crypto API, or non-PSA
85APIs), as well as X.509 and TLS, will work as usual, except that direct calls
86to low-level hash APIs (`mbedtls_sha256()` etc.) are not possible for the
87modules that are disabled.
88
Manuel Pégourié-Gonnard030f11b2023-09-23 09:02:42 +020089You need to call `psa_crypto_init()` before any crypto operation that uses
90a hash algorithm that is provided only by a driver, as mentioned in [General
Manuel Pégourié-Gonnard1f61b7b2023-09-22 10:15:22 +020091considerations](#general-considerations) above.
92
93If you want to check at compile-time whether a certain hash algorithm is
94available in the present build of Mbed TLS, regardless of whether it's
95provided by a driver or built-in, you should use the following macros:
96- for code that uses only the PSA Crypto API: `PSA_WANT_ALG_xxx` from
97 `psa/crypto.h`;
Manuel Pégourié-Gonnard030f11b2023-09-23 09:02:42 +020098- for code that uses non-PSA crypto APIs: `MBEDTLS_MD_CAN_xxx` from
Manuel Pégourié-Gonnard1f61b7b2023-09-22 10:15:22 +020099 `mbedtls/md.h`.
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +0200100
101Elliptic-curve cryptography (ECC)
102---------------------------------
103
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200104It is possible to have most ECC operations provided only by a driver:
105- the ECDH, ECDSA and EC J-PAKE algorithms;
106- key import, export, and random generation.
107
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200108More precisely, if:
109- you have driver support for ECC public and using private keys (that is,
110`MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_PUBLIC_KEY` and
111`MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR_BASIC` are enabled), and
112- you have driver support for all ECC curves that are enabled (that is, for
113 each `PSA_WANT_ECC_xxx` macro enabled, the corresponding
114`MBEDTLS_PSA_ACCEL_ECC_xxx` macros is enabled as well);
Manuel Pégourié-Gonnard8c40f3d2023-09-28 11:06:09 +0200115
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200116then you can:
117- enable `PSA_WANT_ALG_ECDH` without `MBEDTLS_ECDH_C`, provided
118 `MBEDTLS_PSA_ACCEL_ALG_ECDH` is enabled
119- enable `PSA_WANT_ALG_ECDSA` without `MBEDTLS_ECDSA_C`, provided
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200120 `MBEDTLS_PSA_ACCEL_ALG_ECDSA` is enabled;
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200121- enable `PSA_WANT_ALG_JPAKE` without `MBEDTLS_ECJPAKE_C`, provided
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200122 `MBEDTLS_PSA_ACCEL_ALG_JPAKE` is enabled.
123
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200124In addition, if:
125- none of `MBEDTLS_ECDH_C`, `MBEDTLS_ECDSA_C`, `MBEDTLS_ECJPAKE_C` are enabled
126 (see conditions above), and
127- you have driver support for all enabled ECC key pair operations - that is,
128 for each `PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_xxx` macro enabled, the
129corresponding `MBEDTLS_PSA_ACCEL_KEY_TYPE_ECC_KEY_PAIR_xxx` macros is also
130enabled,
Manuel Pégourié-Gonnard8c40f3d2023-09-28 11:06:09 +0200131
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200132then you can also disable `MBEDTLS_ECP_C`. However, a small subset of it might
133still be included in the build, see limitations sub-section below.
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200134
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200135In addition, if:
136- `MBEDTLS_ECP_C` is fully removed (see limitation sub-section below), and
137- support for RSA key types and algorithms is fully disabled, and
138- support for DH key types and the FFDH algorithm is either disabled, or
139 fully provided by a driver,
Manuel Pégourié-Gonnard8c40f3d2023-09-28 11:06:09 +0200140
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200141then you can also disable `MBEDTLS_BIGNUM_C`.
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200142
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200143In such builds, all crypto operations via the PSA Crypto API will work as
144usual, as well as the PK, X.509 and TLS modules if `MBEDTLS_USE_PSA_CRYPTO` is
145enabled, with the following exceptions:
146- direct calls to APIs from the disabled modules are not possible;
147- PK, X.509 and TLS will not support restartable ECC operations (see
148 limitation sub-section below).
149
150If you want to check at compile-time whether a certain curve is available in
151the present build of Mbed TLS, regardless of whether ECC is provided by a
152driver or built-in, you should use the following macros:
153- for code that uses only the PSA Crypto API: `PSA_WANT_ECC_xxx` from
154 `psa/crypto.h`;
155- for code that may also use non-PSA crypto APIs: `MBEDTLS_ECP_HAVE_xxx` from
156 `mbedtls/build_info.h` where xxx can take the same values as for
157`MBEDTLS_ECP_DP_xxx` macros.
Valerio Settid31b2842023-08-15 10:59:58 +0200158
Manuel Pégourié-Gonnard140c08e2023-09-28 11:02:37 +0200159Note that for externally-provided drivers, the integrator is responsible for
160ensuring the appropriate `MBEDTLS_PSA_ACCEL_xxx` macros are defined. However,
161for the p256-m driver that's provided with the library, those macros are
162automatically defined when enabling `MBEDTLS_PSA_P256M_DRIVER_ENABLED`.
163
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200164### Limitations regarding fully removing `ecp.c`
165
166A limited subset of `ecp.c` will still be automatically re-enabled if any of
167the following is enabled:
168- `MBEDTLS_PK_PARSE_EC_COMPRESSED` - support for parsing ECC keys where the
169 public part is in compressed format;
170- `MBEDTLS_PK_PARSE_EC_EXTENDED` - support for parsing ECC keys where the
171 curve is identified not by name, but by explicit parameters;
172- `PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE` - support for deterministic
173 derivation of an ECC keypair with `psa_key_derivation_output_key()`.
174
Manuel Pégourié-Gonnard1937cf82023-07-11 11:14:15 +0200175Note: when any of the above options is enabled, a subset of `ecp.c` will
176automatically be included in the build in order to support it. Therefore
177you can still disable `MBEDTLS_ECP_C` in `mbedtls_config.h` and this will
178result in some code size savings, but not as much as when none of the
179above features are enabled.
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200180
181We do have plans to support each of these with `ecp.c` fully removed in the
Manuel Pégourié-Gonnardfb22c272023-07-18 10:40:56 +0200182future, however there is no established timeline. If you're interested, please
183let us know, so we can take it into consideration in our planning.
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200184
185### Limitations regarding restartable / interruptible ECC operations
186
Manuel Pégourié-Gonnard89ae2662023-09-22 13:05:25 +0200187At the moment, there is no driver support for interruptible operations
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200188(see `psa_sign_hash_start()` + `psa_sign_hash_complete()` etc.) so as a
189consequence these are not supported in builds without `MBEDTLS_ECDSA_C`.
190
191Similarly, there is no PSA support for interruptible ECDH operations so these
192are not supported without `ECDH_C`. See also limitations regarding
193restartable operations with `MBEDTLS_USE_PSA_CRYPTO` in [its
194documentation](use-psa-crypto.md).
195
Manuel Pégourié-Gonnardfb22c272023-07-18 10:40:56 +0200196Again, we have plans to support this in the future but not with an established
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200197timeline, please let us know if you're interested.
198
Manuel Pégourié-Gonnardf7dc6cf2023-09-27 10:34:52 +0200199### Limitations regarding "mixed" builds (driver and built-in)
200
201In order for a build to be driver-only (no built-in implementation), all the
202requested algorithms, key types (key operations) and curves must be
203accelerated (plus a few other restrictions, see "Limitations regarding fully
204removing `ecp.c`" above). However, what if you have an accelerator that only
205supports some algorithms, some key types (key operations), or some curves, but
206want to have more enabled in you build?
207
208It is possible to have acceleration for only a subset of the requested
209algorithms. In this case, the built-in implementation of the accelerated
210algorithms will be disabled, provided all the requested curves and key types
211that can be used with this algorithm are also declared as accelerated.
212
213There is very limited support for having acceleration for only a subset of the
214requested key type operations. The only configuration that's tested is that of
215a driver accelerating `PUBLIC_KEY`, `KEY_PAIR_BASIC`, `KEY_PAIR_IMPORT`,
216`KEY_PAIR_EXPORT` but not `KEY_PAIR_GENERATE`. (Note: currently the driver
217interface does not support `KEY_PAIR_DERIVE`.)
218
219There is limited support for having acceleration for only a subset of the
220requested curves. In such builds, only the PSA API is currently tested and
221working; there are known issues in PK, and X.509 and TLS are untested.
222
Manuel Pégourié-Gonnardc9777512023-07-11 11:11:20 +0200223Finite-field Diffie-Hellman
224---------------------------
225
Valerio Settid31b2842023-08-15 10:59:58 +0200226Support is pretty similar to the "Elliptic-curve cryptography (ECC)" section
227above.
228Key management and usage can be enabled by means of the usual `PSA_WANT` +
229`MBEDTLS_PSA_ACCEL` pairs:
230
231- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_PUBLIC_KEY`;
232- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_BASIC`;
233- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_IMPORT`;
234- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_EXPORT`;
235- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_GENERATE`;
236
237The same holds for the associated algorithm:
Valerio Setti7373a662023-09-04 13:59:03 +0200238`[PSA_WANT|MBEDTLS_PSA_ACCEL]_ALG_FFDH` allow builds accelerating FFDH and
Valerio Settid31b2842023-08-15 10:59:58 +0200239removing builtin support (i.e. `MBEDTLS_DHM_C`).
240
241### Limitations
242Support for deterministic derivation of a DH keypair
243(i.e. `PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_DERIVE`) is not supported.
Valerio Setti20e93a22023-12-04 11:29:36 +0100244
245AEADs
246-----
247
248It is possible to have all AEADs operations provided only by a driver.
249
250More precisely you can:
251- enable desired PSA algorithm(s) and key type(s):
252 - `PSA_WANT_ALG_[CCM|GCM]` with `PSA_WANT_KEY_TYPE_[AES|ARIA|CAMELLIA]`
253 - `PSA_WANT_ALG_CHACHA20_POLY1305` with `PSA_WANT_KEY_TYPE_CHACHA20`;
254- enable `MBEDTLS_PSA_ACCEL_xxx` symbol(s) which correspond to the
255 `PSA_WANT_xxx` of the previous step;
256- disable builtin support of `MBEDTLS_[CCM|GCM|CHACHAPOLY]_C` algorithms and
257 key types `MBEDTLS_[AES|ARIA|CAMELLIA|CHACHA20]_C` for AEADs which are
258 accelerated.
259
260In such a build all AEADs operations requested through the PSA Crypto API
261(including those in TLS and X.509) will be performed by the provided driver.
262Of course direct calls to the disabled builtin modules
263(ex: `mbedtls_ccm_init()`, etc) won't be possible.
264
265If no other non-authenticated cipher is required, it is also possible to
266disable `MBEDTLS_CIPHER_C` in order to further reduce code's footprint.