| 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 |