blob: 7b8ec9929f78ffcaa1a21c8aab470d37c28d45d0 [file] [log] [blame] [view]
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +02001This document lists current limitations of the PSA Crypto API (as of version
21.1) that may impact our ability to (1) use it for all crypto operations in
3TLS and X.509 and (2) support isolation of all long-term secrets in TLS (that
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +01004is, goals G1 and G2 in [strategy.md](strategy.md) in the same directory).
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +02005
6This is supposed to be a complete list, based on a exhaustive review of crypto
7operations done in TLS and X.509 code, but of course it's still possible that
8subtle-but-important issues have been missed. The only way to be really sure
9is, of course, to actually do the migration work.
10
11Limitations relevant for G1 (performing crypto operations)
12==========================================================
13
14Restartable ECC operations
15--------------------------
16
Manuel Pégourié-Gonnard9bf9b9e2022-06-07 10:16:24 +020017There is currently no support for that in PSA at all, but it will be added at
18some point, see <https://github.com/orgs/Mbed-TLS/projects/1#column-18816849>.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020019
20Currently, `MBEDTLS_USE_PSA_CRYPTO` is simply incompatible with
21`MBEDTLS_ECP_RESTARTABLE`.
22
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +010023Things that are in the API but not implemented yet
24--------------------------------------------------
25
26PSA Crypto has an API for FFDH, but it's not implemented in Mbed TLS yet.
27(Regarding FFDH, see the next section as well.) See issue [3261][ffdh] on
28github.
29
Dave Rodgman017a1992022-03-31 14:07:01 +010030[ffdh]: https://github.com/Mbed-TLS/mbedtls/issues/3261
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +010031
32PSA Crypto has an experimental API for EC J-PAKE, but it's not implemented in
33Mbed TLS yet. See the [EC J-PAKE follow-up EPIC][ecjp] on github.
34
Dave Rodgman017a1992022-03-31 14:07:01 +010035[ecjp]: https://github.com/orgs/Mbed-TLS/projects/1#column-17950140
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +010036
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020037Arbitrary parameters for FFDH
38-----------------------------
39
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +010040(See also the first paragraph in the previous section.)
41
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020042Currently, the PSA Crypto API can only perform FFDH with a limited set of
Manuel Pégourié-Gonnard58d101b2022-02-10 12:58:09 +010043well-known parameters (some of them defined in the spec, but implementations
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020044are free to extend that set).
45
46TLS 1.2 (and earlier) on the other hand have the server send explicit
Manuel Pégourié-Gonnard58d101b2022-02-10 12:58:09 +010047parameters (P and G) in its ServerKeyExchange message. This has been found to
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020048be suboptimal for security, as it is prohibitively hard for the client to
49verify the strength of these parameters. This led to the development of RFC
507919 which allows use of named groups in TLS 1.2 - however as this is only an
51extension, servers can still send custom parameters if they don't support the
52extension.
53
54In TLS 1.3 the situation will be simpler: named groups are the only
55option, so the current PSA Crypto API is a good match for that. (Not
Manuel Pégourié-Gonnardc7f32542022-02-10 13:00:33 +010056coincidentally, all the groups used by RFC 7919 and TLS 1.3 are included
57in the PSA specification.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020058
59There are several options here:
60
611. Implement support for custom FFDH parameters in PSA Crypto: this would pose
62 non-trivial API design problem, but most importantly seems backwards, as
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +020063the crypto community is moving away from custom FFDH parameters. (Could be
64done any time.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200652. Drop the DHE-RSA and DHE-PSK key exchanges in TLS 1.2 when moving to PSA.
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +020066 (For people who want some algorithmic variety in case ECC collapses, FFDH
67would still be available in TLS 1.3, just not in 1.2.) (Can only be done in
684.0 or another major version.)
693. Variant of the precedent: only drop client-side support. Server-side is
70 easy to support in terms of API/protocol, as the server picks the
71parameters: we just need remove the existing `mbedtls_ssl_conf_dh_param_xxx()`
72APIs and tell people to use `mbedtls_ssl_conf_groups()` instead. (Can only be
73done in 4.0 or another major version.)
744. Implement RFC 7919, support DHE-RSA and DHE-PSK only in conjunction with it
75 when moving to PSA. Server-side would work as above; unfortunately
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020076client-side the only option is to offer named groups and break the handshake
77if the server didn't take on our offer. This is not fully satisfying, but is
78perhaps the least unsatisfying option in terms of result; it's also probably
79the one that requires the most work, but it would deliver value beyond PSA
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +020080migration by implementing RFC 7919. (Implementing RFC 7919 could be done any
81time; making it mandatory can only be done in 4.0 or another major version.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020082
83RSA-PSS parameters
84------------------
85
86RSA-PSS signatures are defined by PKCS#1 v2, re-published as RFC 8017
87(previously RFC 3447).
88
89As standardized, the signature scheme takes several parameters, in addition to
90the hash algorithm potentially used to hash the message being signed:
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +020091- a hash algorithm used for the encoding function
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020092- a mask generation function
93 - most commonly MGF1, which in turn is parametrized by a hash algorithm
94- a salt length
Manuel Pégourié-Gonnardc70013e2022-02-10 13:07:22 +010095- a trailer field - the value is fixed to 0xBC by PKCS#1 v2.1, but was left
Andrzej Kurek5c65c572022-04-13 14:28:52 -040096 configurable in the original scheme; 0xBC is used everywhere in practice.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020097
98Both the existing `mbedtls_` API and the PSA API support only MGF1 as the
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +020099generation function (and only 0xBC as the trailer field), but there are
100discrepancies in handling the salt length and which of the various hash
101algorithms can differ from each other.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200102
103### API comparison
104
105- RSA:
106 - signature: `mbedtls_rsa_rsassa_pss_sign()`
107 - message hashed externally
108 - encoding hash = MGF1 hash (from context, or argument = message hash)
109 - salt length: always using the maximum legal value
110 - signature: `mbedtls_rsa_rsassa_pss_sign_ext()`
111 - message hashed externally
112 - encoding hash = MGF1 hash (from context, or argument = message hash)
113 - salt length: specified explicitly
114 - verification: `mbedtls_rsassa_pss_verify()`
115 - message hashed externally
116 - encoding hash = MGF1 hash (from context, or argument = message hash)
117 - salt length: any valid length accepted
118 - verification: `mbedtls_rsassa_pss_verify_ext()`
119 - message hashed externally
120 - encoding hash = MGF1 hash from dedicated argument
121 - expected salt length: specified explicitly, can specify "ANY"
122- PK:
123 - signature: not supported
124 - verification: `mbedtls_pk_verify_ext()`
125 - message hashed externally
126 - encoding hash = MGF1 hash, specified explicitly
127 - expected salt length: specified explicitly, can specify "ANY"
128- PSA:
129 - algorithm specification:
130 - hash alg used for message hashing, encoding and MGF1
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100131 - salt length can be either "standard" (<= hashlen, see note) or "any"
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200132 - signature generation:
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100133 - salt length: always <= hashlen (see note) and random salt
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200134 - verification:
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100135 - salt length: either <= hashlen (see note), or any depending on algorithm
136
137Note: above, "<= hashlen" means that hashlen is used if possible, but if it
Manuel Pégourié-Gonnard80759c42022-02-08 10:33:11 +0100138doesn't fit because the key is too short, then the maximum length that fits is
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100139used.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200140
141The RSA/PK API is in principle more flexible than the PSA Crypto API. The
142following sub-sections study whether and how this matters in practice.
143
144### Use in X.509
145
146RFC 4055 Section 3.1 defines the encoding of RSA-PSS that's used in X.509.
147It allows independently specifying the message hash (also used for encoding
148hash), the MGF (and its hash if MGF1 is used), and the salt length (plus an
149extra parameter "trailer field" that doesn't vary in practice"). These can be
150encoded as part of the key, and of the signature. If both encoding are
151presents, all values must match except possibly for the salt length, where the
152value from the signature parameters is used.
153
154In Mbed TLS, RSA-PSS parameters can be parsed and displayed for various
155objects (certificates, CRLs, CSRs). During parsing, the following properties
156are enforced:
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200157- the extra "trailer field" parameter must have its default value
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200158- the mask generation function is MGF1
159- encoding hash = message hashing algorithm (may differ from MGF1 hash)
160
161When it comes to cryptographic operations, only two things are supported:
162- verifying the signature on a certificate from its parent;
163- verifying the signature on a CRL from the issuing CA.
164
165The verification is done using `mbedtls_pk_verify_ext()`.
166
167Note: since X.509 parsing ensures that message hash = encoding hash, and
Manuel Pégourié-Gonnard58d101b2022-02-10 12:58:09 +0100168`mbedtls_pk_verify_ext()` uses encoding hash = mgf1 hash, it looks like all
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200169three hash algorithms must be equal, which would be good news as it would
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200170match a limitation of the PSA API.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200171
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200172It is unclear what parameters people use in practice. It looks like by default
173OpenSSL picks saltlen = keylen - hashlen - 2 (tested with openssl 1.1.1f).
174The `certool` command provided by GnuTLS seems to be picking saltlen = hashlen
Manuel Pégourié-Gonnard839bb8a2022-02-08 10:33:41 +0100175by default (tested with GnuTLS 3.6.13). FIPS 186-4 requires 0 <= saltlen <=
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +0100176hashlen.
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200177
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200178### Use in TLS
179
180In TLS 1.2 (or lower), RSA-PSS signatures are never used, except via X.509.
181
182In TLS 1.3, RSA-PSS signatures can be used directly in the protocol (in
183addition to indirect use via X.509). It has two sets of three signature
184algorithm identifiers (for SHA-256, SHA-384 and SHA-512), depending of what
185the OID of the public key is (rsaEncryption or RSASSA-PSS).
186
187In both cases, it specifies that:
188- the mask generation function is MGF1
189- all three hashes are equal
190- the length of the salt MUST be equal to the length of the digest algorithm
191
192When signing, the salt length picked by PSA is the one required by TLS 1.3
193(unless the key is unreasonably small).
194
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200195When verifying signatures, PSA will by default enforce the salt len is the one
196required by TLS 1.3.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200197
198### Current testing - X509
199
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200200All test files use the default trailer field of 0xBC, as enforced by our
201parser. (There's a negative test for that using the
202`x509_parse_rsassa_pss_params` test function and hex data.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200203
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200204Files with "bad" in the name are expected to be invalid and rejected in tests.
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200205
206**Test certificates:**
207
208server9-bad-mgfhash.crt (announcing mgf1(sha224), signed with another mgf)
209 Hash Algorithm: sha256
210 Mask Algorithm: mgf1 with sha224
211 Salt Length: 0xDE
212server9-bad-saltlen.crt (announcing saltlen = 0xDE, signed with another len)
213 Hash Algorithm: sha256
214 Mask Algorithm: mgf1 with sha256
215 Salt Length: 0xDE
216server9-badsign.crt (one bit flipped in the signature)
217 Hash Algorithm: sha1 (default)
218 Mask Algorithm: mgf1 with sha1 (default)
219 Salt Length: 0xEA
220server9-defaults.crt
221 Hash Algorithm: sha1 (default)
222 Mask Algorithm: mgf1 with sha1 (default)
223 Salt Length: 0x14 (default)
224server9-sha224.crt
225 Hash Algorithm: sha224
226 Mask Algorithm: mgf1 with sha224
227 Salt Length: 0xE2
228server9-sha256.crt
229 Hash Algorithm: sha256
230 Mask Algorithm: mgf1 with sha256
231 Salt Length: 0xDE
232server9-sha384.crt
233 Hash Algorithm: sha384
234 Mask Algorithm: mgf1 with sha384
235 Salt Length: 0xCE
236server9-sha512.crt
237 Hash Algorithm: sha512
238 Mask Algorithm: mgf1 with sha512
239 Salt Length: 0xBE
240server9-with-ca.crt
241 Hash Algorithm: sha1 (default)
242 Mask Algorithm: mgf1 with sha1 (default)
243 Salt Length: 0xEA
244server9.crt
245 Hash Algorithm: sha1 (default)
246 Mask Algorithm: mgf1 with sha1 (default)
247 Salt Length: 0xEA
248
249These certificates are signed with a 2048-bit key. It appears that they are
250all using saltlen = keylen - hashlen - 2, except for server9-defaults which is
251using saltlen = hashlen.
252
253**Test CRLs:**
254
255crl-rsa-pss-sha1-badsign.pem
256 Hash Algorithm: sha1 (default)
257 Mask Algorithm: mgf1 with sha1 (default)
258 Salt Length: 0xEA
259crl-rsa-pss-sha1.pem
260 Hash Algorithm: sha1 (default)
261 Mask Algorithm: mgf1 with sha1 (default)
262 Salt Length: 0xEA
263crl-rsa-pss-sha224.pem
264 Hash Algorithm: sha224
265 Mask Algorithm: mgf1 with sha224
266 Salt Length: 0xE2
267crl-rsa-pss-sha256.pem
268 Hash Algorithm: sha256
269 Mask Algorithm: mgf1 with sha256
270 Salt Length: 0xDE
271crl-rsa-pss-sha384.pem
272 Hash Algorithm: sha384
273 Mask Algorithm: mgf1 with sha384
274 Salt Length: 0xCE
275crl-rsa-pss-sha512.pem
276 Hash Algorithm: sha512
277 Mask Algorithm: mgf1 with sha512
278 Salt Length: 0xBE
279
280These CRLs are signed with a 2048-bit key. It appears that they are
281all using saltlen = keylen - hashlen - 2.
282
283**Test CSRs:**
284
285server9.req.sha1
286 Hash Algorithm: sha1 (default)
287 Mask Algorithm: mgf1 with sha1 (default)
288 Salt Length: 0x6A
289server9.req.sha224
290 Hash Algorithm: sha224
291 Mask Algorithm: mgf1 with sha224
292 Salt Length: 0x62
293server9.req.sha256
294 Hash Algorithm: sha256
295 Mask Algorithm: mgf1 with sha256
296 Salt Length: 0x5E
297server9.req.sha384
298 Hash Algorithm: sha384
299 Mask Algorithm: mgf1 with sha384
300 Salt Length: 0x4E
301server9.req.sha512
302 Hash Algorithm: sha512
303 Mask Algorithm: mgf1 with sha512
304 Salt Length: 0x3E
305
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +0200306These CSRs are signed with a 2048-bit key. It appears that they are
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200307all using saltlen = keylen - hashlen - 2.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200308
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200309### Possible courses of action
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200310
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200311There's no question about what to do with TLS (any version); the only question
312is about X.509 signature verification. Options include:
313
3141. Doing all verifications with `PSA_ALG_RSA_PSS_ANY_SALT` - while this
315 wouldn't cause a concrete security issue, this would be non-compliant.
3162. Doing verifications with `PSA_ALG_RSA_PSS` when we're lucky and the encoded
317 saltlen happens to match hashlen, and falling back to `ANY_SALT` otherwise.
318Same issue as with the previous point, except more contained.
3193. Reject all certificates with saltlen != hashlen. This includes all
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +0200320 certificates generated with OpenSSL using the default parameters, so it's
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200321probably not acceptable.
3224. Request an extension to the PSA Crypto API and use one of the above options
323 in the meantime. Such an extension seems inconvenient and not motivated by
324strong security arguments, so it's unclear whether it would be accepted.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200325
326Limitations relevant for G2 (isolation of long-term secrets)
327============================================================
328
Manuel Pégourié-Gonnard103b9922022-05-11 13:21:39 +0200329Currently none.