Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 1 | This document explains how to create builds of Mbed TLS where some |
| 2 | cryptographic mechanisms are provided only by PSA drivers (that is, no |
| 3 | built-in implementation of those algorithms), from a user's perspective. |
| 4 | |
| 5 | This is useful to save code size for people who are using either a hardware |
Manuel Pégourié-Gonnard | 030f11b | 2023-09-23 09:02:42 +0200 | [diff] [blame] | 6 | accelerator, or an alternative software implementation that is more |
Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 7 | aggressively optimized for code size than the default one in Mbed TLS. |
| 8 | |
| 9 | General considerations |
| 10 | ---------------------- |
| 11 | |
| 12 | This document assumes that you already have a working driver. |
| 13 | Otherwise, please see the [PSA driver example and |
| 14 | guide](psa-driver-example-and-guide.md) for information on writing a |
| 15 | driver. |
| 16 | |
| 17 | In order to have some mechanism provided only by a driver, you'll want |
| 18 | the 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 |
| 22 | and 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 |
| 27 | mechanism through the PSA API in Mbed |
| 28 | TLS](proposed/psa-conditional-inclusion-c.md) for details. |
| 29 | |
| 30 | In 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é-Gonnard | fb22c27 | 2023-07-18 10:40:56 +0200 | [diff] [blame] | 33 | - 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 |
| 35 | informs the PSA code that an accelerator is available for this mechanism. |
Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 36 | - Undefine / comment out the corresponding `MBEDTLS_xxx_C` macro in |
| 37 | `mbedtls/mbedtls_config.h`. This ensures the built-in implementation is not |
| 38 | included in the build. |
| 39 | |
| 40 | For 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 | |
| 44 | In addition to these compile-time considerations, at runtime you'll need to |
| 45 | make sure you call `psa_crypto_init()` before any function that uses the |
Manuel Pégourié-Gonnard | fb22c27 | 2023-07-18 10:40:56 +0200 | [diff] [blame] | 46 | driver-only mechanisms. Note that this is already a requirement for any use of |
| 47 | the 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 |
| 49 | already be doing this. |
Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 50 | |
| 51 | Mechanisms covered |
| 52 | ------------------ |
| 53 | |
Manuel Pégourié-Gonnard | c977751 | 2023-07-11 11:11:20 +0200 | [diff] [blame] | 54 | For now, only the following (families of) mechanisms are supported: |
Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 55 | - 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é-Gonnard | c977751 | 2023-07-11 11:11:20 +0200 | [diff] [blame] | 57 | - finite-field Diffie-Hellman: FFDH algorithm, DH key types. |
Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 58 | |
| 59 | Supported 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 |
| 61 | work in the same way as if the mechanisms where built-in, except as documented |
| 62 | in the "Limitations" sub-sections of the sections dedicated to each family |
| 63 | below. |
| 64 | |
| 65 | In the near future (end of 2023), we are planning to also add support for |
| 66 | ciphers (AES) and AEADs (GCM, CCM, ChachaPoly). |
| 67 | |
Manuel Pégourié-Gonnard | c977751 | 2023-07-11 11:11:20 +0200 | [diff] [blame] | 68 | Currently (mid-2023) we don't have plans to extend this to RSA. If |
| 69 | you're interested in driver-only support for RSA, please let us know. |
Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 70 | |
| 71 | Hashes |
| 72 | ------ |
| 73 | |
Manuel Pégourié-Gonnard | 030f11b | 2023-09-23 09:02:42 +0200 | [diff] [blame] | 74 | It is possible to have all hash operations provided only by a driver. |
Manuel Pégourié-Gonnard | 1f61b7b | 2023-09-22 10:15:22 +0200 | [diff] [blame] | 75 | |
| 76 | More 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 | |
| 83 | In such a build, all crypto operations (via the PSA Crypto API, or non-PSA |
| 84 | APIs), as well as X.509 and TLS, will work as usual, except that direct calls |
| 85 | to low-level hash APIs (`mbedtls_sha256()` etc.) are not possible for the |
| 86 | modules that are disabled. |
| 87 | |
Manuel Pégourié-Gonnard | 030f11b | 2023-09-23 09:02:42 +0200 | [diff] [blame] | 88 | You need to call `psa_crypto_init()` before any crypto operation that uses |
| 89 | a hash algorithm that is provided only by a driver, as mentioned in [General |
Manuel Pégourié-Gonnard | 1f61b7b | 2023-09-22 10:15:22 +0200 | [diff] [blame] | 90 | considerations](#general-considerations) above. |
| 91 | |
| 92 | If you want to check at compile-time whether a certain hash algorithm is |
| 93 | available in the present build of Mbed TLS, regardless of whether it's |
| 94 | provided 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é-Gonnard | 030f11b | 2023-09-23 09:02:42 +0200 | [diff] [blame] | 97 | - for code that uses non-PSA crypto APIs: `MBEDTLS_MD_CAN_xxx` from |
Manuel Pégourié-Gonnard | 1f61b7b | 2023-09-22 10:15:22 +0200 | [diff] [blame] | 98 | `mbedtls/md.h`. |
Manuel Pégourié-Gonnard | 6d5f494 | 2023-07-07 12:00:49 +0200 | [diff] [blame] | 99 | |
| 100 | Elliptic-curve cryptography (ECC) |
| 101 | --------------------------------- |
| 102 | |
Manuel Pégourié-Gonnard | 7a82e27 | 2023-07-07 16:43:56 +0200 | [diff] [blame] | 103 | It 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 | |
| 107 | More 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 | |
| 115 | In addition, if none of `MBEDTLS_ECDH_C`, `MBEDTLS_ECDSA_C`, |
Manuel Pégourié-Gonnard | fb22c27 | 2023-07-18 10:40:56 +0200 | [diff] [blame] | 116 | `MBEDTLS_ECJPAKE_C` are enabled, you can enable: |
Manuel Pégourié-Gonnard | 7a82e27 | 2023-07-07 16:43:56 +0200 | [diff] [blame] | 117 | - `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`; |
| 122 | without `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 |
| 127 | RSA or FFDH, then you can also disable `MBEDTLS_BIGNUM_C` for further code |
| 128 | size saving. |
| 129 | |
Valerio Setti | d31b284 | 2023-08-15 10:59:58 +0200 | [diff] [blame] | 130 | [Coming soon] As noted in the "Limitations regarding the selection of curves" |
| 131 | section below, there is an upcoming requirement for all the required curves to |
Valerio Setti | 7373a66 | 2023-09-04 13:59:03 +0200 | [diff] [blame] | 132 | also be accelerated in the PSA driver in order to exclude the builtin algs |
Valerio Setti | d31b284 | 2023-08-15 10:59:58 +0200 | [diff] [blame] | 133 | support. |
| 134 | |
Manuel Pégourié-Gonnard | 7a82e27 | 2023-07-07 16:43:56 +0200 | [diff] [blame] | 135 | ### Limitations regarding fully removing `ecp.c` |
| 136 | |
| 137 | A limited subset of `ecp.c` will still be automatically re-enabled if any of |
| 138 | the 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é-Gonnard | 1937cf8 | 2023-07-11 11:14:15 +0200 | [diff] [blame] | 146 | Note: when any of the above options is enabled, a subset of `ecp.c` will |
| 147 | automatically be included in the build in order to support it. Therefore |
| 148 | you can still disable `MBEDTLS_ECP_C` in `mbedtls_config.h` and this will |
| 149 | result in some code size savings, but not as much as when none of the |
| 150 | above features are enabled. |
Manuel Pégourié-Gonnard | 7a82e27 | 2023-07-07 16:43:56 +0200 | [diff] [blame] | 151 | |
| 152 | We do have plans to support each of these with `ecp.c` fully removed in the |
Manuel Pégourié-Gonnard | fb22c27 | 2023-07-18 10:40:56 +0200 | [diff] [blame] | 153 | future, however there is no established timeline. If you're interested, please |
| 154 | let us know, so we can take it into consideration in our planning. |
Manuel Pégourié-Gonnard | 7a82e27 | 2023-07-07 16:43:56 +0200 | [diff] [blame] | 155 | |
| 156 | ### Limitations regarding restartable / interruptible ECC operations |
| 157 | |
Manuel Pégourié-Gonnard | 1937cf8 | 2023-07-11 11:14:15 +0200 | [diff] [blame] | 158 | At the moment, there is not driver support for interruptible operations |
Manuel Pégourié-Gonnard | 7a82e27 | 2023-07-07 16:43:56 +0200 | [diff] [blame] | 159 | (see `psa_sign_hash_start()` + `psa_sign_hash_complete()` etc.) so as a |
| 160 | consequence these are not supported in builds without `MBEDTLS_ECDSA_C`. |
| 161 | |
| 162 | Similarly, there is no PSA support for interruptible ECDH operations so these |
| 163 | are not supported without `ECDH_C`. See also limitations regarding |
| 164 | restartable operations with `MBEDTLS_USE_PSA_CRYPTO` in [its |
| 165 | documentation](use-psa-crypto.md). |
| 166 | |
Manuel Pégourié-Gonnard | fb22c27 | 2023-07-18 10:40:56 +0200 | [diff] [blame] | 167 | Again, we have plans to support this in the future but not with an established |
Manuel Pégourié-Gonnard | 7a82e27 | 2023-07-07 16:43:56 +0200 | [diff] [blame] | 168 | timeline, please let us know if you're interested. |
| 169 | |
| 170 | ### Limitations regarding the selection of curves |
| 171 | |
Paul Elliott | 3d0bffb | 2023-09-13 15:15:37 +0100 | [diff] [blame] | 172 | There is ongoing work which is trying to establish the links and constraints |
| 173 | between the list of supported curves and supported algorithms both in the |
| 174 | builtin and PSA sides. In particular: |
Valerio Setti | d31b284 | 2023-08-15 10:59:58 +0200 | [diff] [blame] | 175 | |
| 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é-Gonnard | c977751 | 2023-07-11 11:11:20 +0200 | [diff] [blame] | 181 | |
Manuel Pégourié-Gonnard | f7dc6cf | 2023-09-27 10:34:52 +0200 | [diff] [blame^] | 182 | ### Limitations regarding "mixed" builds (driver and built-in) |
| 183 | |
| 184 | In order for a build to be driver-only (no built-in implementation), all the |
| 185 | requested algorithms, key types (key operations) and curves must be |
| 186 | accelerated (plus a few other restrictions, see "Limitations regarding fully |
| 187 | removing `ecp.c`" above). However, what if you have an accelerator that only |
| 188 | supports some algorithms, some key types (key operations), or some curves, but |
| 189 | want to have more enabled in you build? |
| 190 | |
| 191 | It is possible to have acceleration for only a subset of the requested |
| 192 | algorithms. In this case, the built-in implementation of the accelerated |
| 193 | algorithms will be disabled, provided all the requested curves and key types |
| 194 | that can be used with this algorithm are also declared as accelerated. |
| 195 | |
| 196 | There is very limited support for having acceleration for only a subset of the |
| 197 | requested key type operations. The only configuration that's tested is that of |
| 198 | a driver accelerating `PUBLIC_KEY`, `KEY_PAIR_BASIC`, `KEY_PAIR_IMPORT`, |
| 199 | `KEY_PAIR_EXPORT` but not `KEY_PAIR_GENERATE`. (Note: currently the driver |
| 200 | interface does not support `KEY_PAIR_DERIVE`.) |
| 201 | |
| 202 | There is limited support for having acceleration for only a subset of the |
| 203 | requested curves. In such builds, only the PSA API is currently tested and |
| 204 | working; there are known issues in PK, and X.509 and TLS are untested. |
| 205 | |
Manuel Pégourié-Gonnard | c977751 | 2023-07-11 11:11:20 +0200 | [diff] [blame] | 206 | Finite-field Diffie-Hellman |
| 207 | --------------------------- |
| 208 | |
Valerio Setti | d31b284 | 2023-08-15 10:59:58 +0200 | [diff] [blame] | 209 | Support is pretty similar to the "Elliptic-curve cryptography (ECC)" section |
| 210 | above. |
| 211 | Key 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 | |
| 220 | The same holds for the associated algorithm: |
Valerio Setti | 7373a66 | 2023-09-04 13:59:03 +0200 | [diff] [blame] | 221 | `[PSA_WANT|MBEDTLS_PSA_ACCEL]_ALG_FFDH` allow builds accelerating FFDH and |
Valerio Setti | d31b284 | 2023-08-15 10:59:58 +0200 | [diff] [blame] | 222 | removing builtin support (i.e. `MBEDTLS_DHM_C`). |
| 223 | |
| 224 | ### Limitations |
| 225 | Support for deterministic derivation of a DH keypair |
| 226 | (i.e. `PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_DERIVE`) is not supported. |