blob: 7b0d8c402c169911dbb0b1fab5948a65171780e7 [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.
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020058
59Supported means that when those are provided only by drivers, everything
60(including PK, X.509 and TLS if `MBEDTLS_USE_PSA_CRYPTO` is enabled) should
61work in the same way as if the mechanisms where built-in, except as documented
62in the "Limitations" sub-sections of the sections dedicated to each family
63below.
64
65In the near future (end of 2023), we are planning to also add support for
66ciphers (AES) and AEADs (GCM, CCM, ChachaPoly).
67
Manuel Pégourié-Gonnardc9777512023-07-11 11:11:20 +020068Currently (mid-2023) we don't have plans to extend this to RSA. If
69you're interested in driver-only support for RSA, please let us know.
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020070
71Hashes
72------
73
Manuel Pégourié-Gonnard030f11b2023-09-23 09:02:42 +020074It is possible to have all hash operations provided only by a driver.
Manuel Pégourié-Gonnard1f61b7b2023-09-22 10:15:22 +020075
76More precisely:
77- you can enable `PSA_WANT_ALG_SHA_256` without `MBEDTLS_SHA256_C`, provided
78 you have `MBEDTLS_PSA_ACCEL_ALG_SHA_256` enabled;
79- and similarly for all supported hash algorithms: `MD5`, `RIPEMD160`,
80 `SHA_1`, `SHA_224`, `SHA_256`, `SHA_384`, `SHA_512`, `SHA3_224`, `SHA3_256`,
81`SHA3_384`, `SHA3_512`.
82
83In such a build, all crypto operations (via the PSA Crypto API, or non-PSA
84APIs), as well as X.509 and TLS, will work as usual, except that direct calls
85to low-level hash APIs (`mbedtls_sha256()` etc.) are not possible for the
86modules that are disabled.
87
Manuel Pégourié-Gonnard030f11b2023-09-23 09:02:42 +020088You need to call `psa_crypto_init()` before any crypto operation that uses
89a hash algorithm that is provided only by a driver, as mentioned in [General
Manuel Pégourié-Gonnard1f61b7b2023-09-22 10:15:22 +020090considerations](#general-considerations) above.
91
92If you want to check at compile-time whether a certain hash algorithm is
93available in the present build of Mbed TLS, regardless of whether it's
94provided by a driver or built-in, you should use the following macros:
95- for code that uses only the PSA Crypto API: `PSA_WANT_ALG_xxx` from
96 `psa/crypto.h`;
Manuel Pégourié-Gonnard030f11b2023-09-23 09:02:42 +020097- for code that uses non-PSA crypto APIs: `MBEDTLS_MD_CAN_xxx` from
Manuel Pégourié-Gonnard1f61b7b2023-09-22 10:15:22 +020098 `mbedtls/md.h`.
Manuel Pégourié-Gonnard6d5f4942023-07-07 12:00:49 +020099
100Elliptic-curve cryptography (ECC)
101---------------------------------
102
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200103It is possible to have most ECC operations provided only by a driver:
104- the ECDH, ECDSA and EC J-PAKE algorithms;
105- key import, export, and random generation.
106
107More precisely:
108- you can enable `PSA_WANT_ALG_ECDH` without `MBEDTLS_ECDH_C` provided
109 `MBEDTLS_PSA_ACCEL_ALG_ECDH` is enabled;
110- you can enable `PSA_WANT_ALG_ECDSA` without `MBEDTLS_ECDSA_C` provided
111 `MBEDTLS_PSA_ACCEL_ALG_ECDSA` is enabled;
112- you can enable `PSA_WANT_ALG_JPAKE` without `MBEDTLS_ECJPAKE_C` provided
113 `MBEDTLS_PSA_ACCEL_ALG_JPAKE` is enabled.
114
115In addition, if none of `MBEDTLS_ECDH_C`, `MBEDTLS_ECDSA_C`,
Manuel Pégourié-Gonnardfb22c272023-07-18 10:40:56 +0200116`MBEDTLS_ECJPAKE_C` are enabled, you can enable:
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200117- `PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY`;
118- `PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_BASIC`;
119- `PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_IMPORT`;
120- `PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_EXPORT`;
121- `PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_GENERATE`;
122without `MBEDTLS_ECP_C` provided the corresponding
123`MBEDTLS_PSA_ACCEL_KEY_TYPE_xxx` are enabled.
124
125[Coming soon] If `MBEDTLS_ECP_C` is disabled and `ecp.c` is fully removed (see
126"Limitations regarding fully removing `ecp.c`" below), and you're not using
127RSA or FFDH, then you can also disable `MBEDTLS_BIGNUM_C` for further code
128size saving.
129
Valerio Settid31b2842023-08-15 10:59:58 +0200130[Coming soon] As noted in the "Limitations regarding the selection of curves"
131section below, there is an upcoming requirement for all the required curves to
Valerio Setti7373a662023-09-04 13:59:03 +0200132also be accelerated in the PSA driver in order to exclude the builtin algs
Valerio Settid31b2842023-08-15 10:59:58 +0200133support.
134
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200135### Limitations regarding fully removing `ecp.c`
136
137A limited subset of `ecp.c` will still be automatically re-enabled if any of
138the following is enabled:
139- `MBEDTLS_PK_PARSE_EC_COMPRESSED` - support for parsing ECC keys where the
140 public part is in compressed format;
141- `MBEDTLS_PK_PARSE_EC_EXTENDED` - support for parsing ECC keys where the
142 curve is identified not by name, but by explicit parameters;
143- `PSA_WANT_KEY_TYPE_ECC_KEY_PAIR_DERIVE` - support for deterministic
144 derivation of an ECC keypair with `psa_key_derivation_output_key()`.
145
Manuel Pégourié-Gonnard1937cf82023-07-11 11:14:15 +0200146Note: when any of the above options is enabled, a subset of `ecp.c` will
147automatically be included in the build in order to support it. Therefore
148you can still disable `MBEDTLS_ECP_C` in `mbedtls_config.h` and this will
149result in some code size savings, but not as much as when none of the
150above features are enabled.
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200151
152We do have plans to support each of these with `ecp.c` fully removed in the
Manuel Pégourié-Gonnardfb22c272023-07-18 10:40:56 +0200153future, however there is no established timeline. If you're interested, please
154let us know, so we can take it into consideration in our planning.
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200155
156### Limitations regarding restartable / interruptible ECC operations
157
Manuel Pégourié-Gonnard1937cf82023-07-11 11:14:15 +0200158At the moment, there is not driver support for interruptible operations
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200159(see `psa_sign_hash_start()` + `psa_sign_hash_complete()` etc.) so as a
160consequence these are not supported in builds without `MBEDTLS_ECDSA_C`.
161
162Similarly, there is no PSA support for interruptible ECDH operations so these
163are not supported without `ECDH_C`. See also limitations regarding
164restartable operations with `MBEDTLS_USE_PSA_CRYPTO` in [its
165documentation](use-psa-crypto.md).
166
Manuel Pégourié-Gonnardfb22c272023-07-18 10:40:56 +0200167Again, we have plans to support this in the future but not with an established
Manuel Pégourié-Gonnard7a82e272023-07-07 16:43:56 +0200168timeline, please let us know if you're interested.
169
170### Limitations regarding the selection of curves
171
Paul Elliott3d0bffb2023-09-13 15:15:37 +0100172There is ongoing work which is trying to establish the links and constraints
173between the list of supported curves and supported algorithms both in the
174builtin and PSA sides. In particular:
Valerio Settid31b2842023-08-15 10:59:58 +0200175
176- #8014 ensures that the curves supported on the PSA side (`PSA_WANT_ECC_xxx`)
177 are always a superset of the builtin ones (`MBEDTLS_ECP_DP_xxx`)
178- #8016 forces builtin alg support as soon as there is at least one builtin
179 curve. In other words, in order to exclue all builtin algs, all the required
180 curves should be supported and accelerated by the PSA driver.
Manuel Pégourié-Gonnardc9777512023-07-11 11:11:20 +0200181
Manuel Pégourié-Gonnardf7dc6cf2023-09-27 10:34:52 +0200182### Limitations regarding "mixed" builds (driver and built-in)
183
184In order for a build to be driver-only (no built-in implementation), all the
185requested algorithms, key types (key operations) and curves must be
186accelerated (plus a few other restrictions, see "Limitations regarding fully
187removing `ecp.c`" above). However, what if you have an accelerator that only
188supports some algorithms, some key types (key operations), or some curves, but
189want to have more enabled in you build?
190
191It is possible to have acceleration for only a subset of the requested
192algorithms. In this case, the built-in implementation of the accelerated
193algorithms will be disabled, provided all the requested curves and key types
194that can be used with this algorithm are also declared as accelerated.
195
196There is very limited support for having acceleration for only a subset of the
197requested key type operations. The only configuration that's tested is that of
198a driver accelerating `PUBLIC_KEY`, `KEY_PAIR_BASIC`, `KEY_PAIR_IMPORT`,
199`KEY_PAIR_EXPORT` but not `KEY_PAIR_GENERATE`. (Note: currently the driver
200interface does not support `KEY_PAIR_DERIVE`.)
201
202There is limited support for having acceleration for only a subset of the
203requested curves. In such builds, only the PSA API is currently tested and
204working; there are known issues in PK, and X.509 and TLS are untested.
205
Manuel Pégourié-Gonnardc9777512023-07-11 11:11:20 +0200206Finite-field Diffie-Hellman
207---------------------------
208
Valerio Settid31b2842023-08-15 10:59:58 +0200209Support is pretty similar to the "Elliptic-curve cryptography (ECC)" section
210above.
211Key management and usage can be enabled by means of the usual `PSA_WANT` +
212`MBEDTLS_PSA_ACCEL` pairs:
213
214- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_PUBLIC_KEY`;
215- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_BASIC`;
216- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_IMPORT`;
217- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_EXPORT`;
218- `[PSA_WANT|MBEDTLS_PSA_ACCEL]_KEY_TYPE_DH_KEY_PAIR_GENERATE`;
219
220The same holds for the associated algorithm:
Valerio Setti7373a662023-09-04 13:59:03 +0200221`[PSA_WANT|MBEDTLS_PSA_ACCEL]_ALG_FFDH` allow builds accelerating FFDH and
Valerio Settid31b2842023-08-15 10:59:58 +0200222removing builtin support (i.e. `MBEDTLS_DHM_C`).
223
224### Limitations
225Support for deterministic derivation of a DH keypair
226(i.e. `PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_DERIVE`) is not supported.