Manuel Pégourié-Gonnard | 6cf7d94 | 2021-09-21 13:55:00 +0200 | [diff] [blame] | 1 | This document describes the compile-time configuration option |
| 2 | `MBEDTLS_USE_PSA_CRYPTO` from a user's perspective, more specifically its |
| 3 | current effects as well as the parts that aren't covered yet. |
Manuel Pégourié-Gonnard | 00b72fc | 2021-09-20 13:21:25 +0200 | [diff] [blame] | 4 | |
| 5 | Current effects |
| 6 | =============== |
| 7 | |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 8 | General limitations |
| 9 | ------------------- |
Manuel Pégourié-Gonnard | 00b72fc | 2021-09-20 13:21:25 +0200 | [diff] [blame] | 10 | |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 11 | Compile-time: enabling `MBEDTLS_USE_PSA_CRYPTO` requires |
| 12 | `MBEDTLS_ECP_RESTARTABLE` and |
| 13 | `MBEDTLS_PSA_CRYPTO_KEY_ID_ENCODES_OWNER` to be disabled. |
| 14 | |
| 15 | Effect: `MBEDTLS_USE_PSA_CRYPTO` currently has no effect on TLS 1.3 (which is |
| 16 | itself experimental and only partially supported so far): TLS 1.3 always uses |
| 17 | the legacy APIs even when this option is set. |
| 18 | |
| 19 | Stability: any API that's only available when `MBEDTLS_USE_PSA_CRYPTO` is |
| 20 | defined is considered experimental and may change in incompatible ways at any |
| 21 | time. Said otherwise, these APIs are explicitly excluded from the usual API |
| 22 | stability promises. |
| 23 | |
| 24 | New APIs / API extensions |
| 25 | ------------------------- |
| 26 | |
| 27 | Some of these APIs are meant for the application to use in place of |
| 28 | pre-existing APIs, in order to get access to the benefits; in the sub-sections |
| 29 | below these are indicated by "Use in (X.509 and) TLS: opt-in", meaning that |
| 30 | this requires changes to the application code for the (X.509 and) TLS layers |
| 31 | to pick up the improvements. |
| 32 | |
| 33 | Some of these APIs are mostly meant for internal use by the TLS (and X.509) |
| 34 | layers; they are indicated below by "Use in (X.509 and) TLS: automatic", |
| 35 | meaning that no changes to the application code are required for the TLS (and |
| 36 | X.509) layers to pick up the improvements. |
| 37 | |
| 38 | ### PSA-held (opaque) keys in the PK layer |
| 39 | |
Manuel Pégourié-Gonnard | 12ab49a | 2021-09-24 10:14:32 +0200 | [diff] [blame] | 40 | There is a new API function `mbedtls_pk_setup_opaque()` that can be used to |
| 41 | wrap a PSA keypair into a PK context. The key can be used for private-key |
| 42 | operations and its public part can be exported. |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 43 | |
| 44 | Benefits: isolation of long-term secrets, use of PSA Crypto drivers. |
| 45 | |
| 46 | Limitations: only for private keys, only ECC. (That is, only ECDSA signature |
Manuel Pégourié-Gonnard | 12ab49a | 2021-09-24 10:14:32 +0200 | [diff] [blame] | 47 | generation. Note: currently this will use randomized ECDSA while Mbed TLS uses |
| 48 | deterministic ECDSA by default.) The following operations are not supported |
| 49 | with a context set this way, while they would be available with a normal |
| 50 | `ECKEY` context: `mbedtls_pk_verify()`, `mbedtls_pk_check_pair()`, |
| 51 | `mbedtls_pk_debug()`. |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 52 | |
| 53 | Use in X.509 and TLS: opt-in. The application needs to construct the PK context |
| 54 | using the new API in order to get the benefits; it can then pass the |
| 55 | resulting context to the following existing APIs: |
| 56 | |
| 57 | - `mbedtls_ssl_conf_own_cert()` or `mbedtls_ssl_set_hs_own_cert()` to use the |
Manuel Pégourié-Gonnard | fec7ef8 | 2021-09-24 11:43:14 +0200 | [diff] [blame] | 58 | key together with a certificate for ECDSA-based key exchanges (note: while |
| 59 | this is supported on both sides, it's currently only tested client-side); |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 60 | - `mbedtls_x509write_csr_set_key()` to generate a CSR (certificate signature |
| 61 | request). |
| 62 | |
Manuel Pégourié-Gonnard | 12ab49a | 2021-09-24 10:14:32 +0200 | [diff] [blame] | 63 | In the TLS and X.509 API, there are two other functions which accept a key or |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 64 | keypair as a PK context: `mbedtls_x509write_crt_set_subject_key()` and |
| 65 | `mbedtls_x509write_crt_set_issuer_key()`. Use of opaque contexts here probably |
| 66 | works but is so far untested. |
| 67 | |
Manuel Pégourié-Gonnard | ee20baf | 2021-09-24 10:17:07 +0200 | [diff] [blame] | 68 | ### PSA-held (opaque) keys for TLS pre-shared keys (PSK) |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 69 | |
Manuel Pégourié-Gonnard | 12ab49a | 2021-09-24 10:14:32 +0200 | [diff] [blame] | 70 | There are two new API functions `mbedtls_ssl_conf_psk_opaque()` and |
| 71 | `mbedtls_ssl_set_hs_psk_opaque()`. Call one of these from an application to |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 72 | register a PSA key for use with a PSK key exchange. |
| 73 | |
| 74 | Benefits: isolation of long-term secrets. |
| 75 | |
Manuel Pégourié-Gonnard | ee20baf | 2021-09-24 10:17:07 +0200 | [diff] [blame] | 76 | Limitations: the key can only be used with "pure" |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 77 | PSK key exchanges (ciphersuites starting with `TLS_PSK_WITH_`), to the |
| 78 | exclusion of RSA-PSK, DHE-PSK and ECDHE-PSK key exchanges. It is the responsibility of |
| 79 | the user to make sure that when provisioning an opaque pre-shared key, the |
| 80 | only PSK ciphersuites that can be negotiated are "pure" PSK; other XXX-PSK key |
| 81 | exchanges will result in a handshake failure with the handshake function |
| 82 | returning `MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE`. |
| 83 | |
| 84 | Use in TLS: opt-in. The application needs to register the key using the new |
| 85 | APIs to get the benefits. |
| 86 | |
| 87 | ### PSA-based operations in the Cipher layer |
| 88 | |
Manuel Pégourié-Gonnard | 12ab49a | 2021-09-24 10:14:32 +0200 | [diff] [blame] | 89 | There is a new API function `mbedtls_cipher_setup_psa()` to set up a context |
| 90 | that will call PSA to store the key and perform the operations. |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 91 | |
| 92 | Benefits: use of PSA Crypto drivers; partial isolation of short-term secrets |
| 93 | (still generated outside of PSA, but then held by PSA). |
| 94 | |
| 95 | Limitations: the key is still passed in the clear by the application. The |
| 96 | multi-part APIs are not supported, only the one-shot APIs. The only modes |
| 97 | supported are ECB, CBC without padding, GCM and CCM (this excludes stream |
| 98 | ciphers and ChachaPoly); the only cipher supported is AES (this excludes Aria, |
Manuel Pégourié-Gonnard | fec7ef8 | 2021-09-24 11:43:14 +0200 | [diff] [blame] | 99 | Camellia, and ChachaPoly). (Note: ECB is currently not tested.) (Note: it is |
| 100 | possible to perform multiple one-shot operations with the same context; |
| 101 | however this is not unit-tested, only tested via usage in TLS.) |
Manuel Pégourié-Gonnard | 04bc687 | 2021-09-21 11:21:23 +0200 | [diff] [blame] | 102 | |
| 103 | Use in TLS: automatic. Used when the cipher and mode is supported (with |
| 104 | gracious fallback to the legacy API otherwise) in all places where a cipher is |
| 105 | used. There are two such places: in `ssl_tls.c` for record protection, and in |
| 106 | `ssl_ticket.c` for protecting tickets we issue. |
| 107 | |
| 108 | Internal changes |
| 109 | ---------------- |
| 110 | |
| 111 | All of these internal changes are active as soon as `MBEDTLS_USE_PSA_CRYPTO` |
| 112 | is enabled, no change required on the application side. |
| 113 | |
| 114 | ### TLS: cipher operations based on PSA |
| 115 | |
| 116 | See "PSA-based operations in the Cipher layer" above. |
| 117 | |
| 118 | ### PK layer: ECDSA verification based on PSA |
| 119 | |
| 120 | Scope: `mbedtls_pk_verify()` will call to PSA for ECDSA signature |
| 121 | verification. |
| 122 | |
| 123 | Benefits: use of PSA Crypto drivers. |
| 124 | |
| 125 | Use in TLS and X.509: in all places where an ECDSA signature is verified. |
| 126 | |
| 127 | ### TLS: ECDHE computation based on PSA |
| 128 | |
| 129 | Scope: Client-side, for ECDHE-RSA and ECDHE-ECDSA key exchanges, the |
| 130 | computation of the ECDHE key exchange is done by PSA. |
| 131 | |
| 132 | Limitations: client-side only, ECDHE-PSK not covered |
| 133 | |
| 134 | Benefits: use of PSA Crypto drivers. |
| 135 | |
| 136 | ### TLS: handshake hashes and PRF computed with PSA |
| 137 | |
| 138 | Scope: with TLS 1.2, the following are computed with PSA: |
| 139 | - the running handshake hashes; |
| 140 | - the hash of the ServerKeyExchange part that is signed; |
| 141 | - the `verify_data` part of the Finished message; |
| 142 | - the TLS PRF. |
| 143 | |
| 144 | Benefits: use of PSA Crypto drivers. |
| 145 | |
| 146 | ### X.509: some hashes computed with PSA |
| 147 | |
| 148 | Scope: the following hashes are computed with PSA: |
| 149 | - when verifying a certificate chain, hash of the child for verifying the |
| 150 | parent's signature; |
| 151 | - when writing a CSR, hash of the request for self-signing the request. |
| 152 | |
| 153 | Benefits: use of PSA Crypto drivers. |
| 154 | |
| 155 | Parts that are not covered yet |
| 156 | ============================== |
Manuel Pégourié-Gonnard | 00b72fc | 2021-09-20 13:21:25 +0200 | [diff] [blame] | 157 | |
Manuel Pégourié-Gonnard | 6cf7d94 | 2021-09-21 13:55:00 +0200 | [diff] [blame] | 158 | This is only a high-level overview, grouped by theme |
Manuel Pégourié-Gonnard | 00b72fc | 2021-09-20 13:21:25 +0200 | [diff] [blame] | 159 | |
Manuel Pégourié-Gonnard | ee20baf | 2021-09-24 10:17:07 +0200 | [diff] [blame] | 160 | TLS: 1.3 experimental support |
| 161 | ----------------------------- |
| 162 | |
| 163 | No part of the experimental support for TLS 1.3 is covered at the moment. |
| 164 | |
Manuel Pégourié-Gonnard | 6cf7d94 | 2021-09-21 13:55:00 +0200 | [diff] [blame] | 165 | TLS: key exchanges / asymmetric crypto |
| 166 | -------------------------------------- |
Manuel Pégourié-Gonnard | 00b72fc | 2021-09-20 13:21:25 +0200 | [diff] [blame] | 167 | |
Manuel Pégourié-Gonnard | b4113ba | 2021-09-24 10:06:04 +0200 | [diff] [blame] | 168 | The following key exchanges are not covered at all: |
| 169 | |
| 170 | - RSA |
| 171 | - DHE-RSA |
| 172 | - DHE-PSK |
| 173 | - RSA-PSK |
| 174 | - ECDHE-PSK |
| 175 | - ECDH-RSA |
| 176 | - ECDH-ECDSA |
| 177 | - ECJPAKE |
| 178 | |
| 179 | The following key exchanges are only partially covered: |
| 180 | |
| 181 | - ECDHE-RSA: RSA operations are not covered and, server-side, the ECDHE |
| 182 | operation isn't either |
| 183 | - ECDHE-ECDSA: server-side, the ECDHE operation isn't covered. (ECDSA |
| 184 | signature generation is only covered if using `mbedtls_pk_setup_opaque()`.) |
| 185 | |
| 186 | PSK if covered when the application uses `mbedtls_ssl_conf_psk_opaque()` or |
| 187 | `mbedtls_ssl_set_hs_psk_opaque()`. |
Manuel Pégourié-Gonnard | 00b72fc | 2021-09-20 13:21:25 +0200 | [diff] [blame] | 188 | |
Manuel Pégourié-Gonnard | 6cf7d94 | 2021-09-21 13:55:00 +0200 | [diff] [blame] | 189 | TLS: symmetric crypto |
| 190 | --------------------- |
| 191 | |
| 192 | - some ciphers not supported via PSA yet: ARIA, Camellia, ChachaPoly (silent |
| 193 | fallback to the legacy APIs) |
Manuel Pégourié-Gonnard | b4113ba | 2021-09-24 10:06:04 +0200 | [diff] [blame] | 194 | - the HMAC part of the CBC and NULL ciphersuites |
Manuel Pégourié-Gonnard | 6cf7d94 | 2021-09-21 13:55:00 +0200 | [diff] [blame] | 195 | - the HMAC computation in `ssl_cookie.c` |
| 196 | |
| 197 | X.509 |
| 198 | ----- |
| 199 | |
| 200 | - most hash operations are still done via the legacy API, except the few that |
| 201 | are documented above as using PSA |
Manuel Pégourié-Gonnard | b4113ba | 2021-09-24 10:06:04 +0200 | [diff] [blame] | 202 | - RSA PKCS#1 v1.5 signature generation (from PSA-held keys) |
| 203 | - RSA PKCS#1 v1.5 signature verification |
| 204 | - RSA-PSS signature verification |