blob: c3680231d55cf3e2beab2c645f68c864314e695a [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
Manuel Pégourié-Gonnard55a188b2022-12-06 12:00:33 +010020Currently, when `MBEDTLS_USE_PSA_CRYPTO` and `MBEDTLS_ECP_RESTARTABLE` are
21both enabled, some operations that should be restartable are not (ECDH in TLS
221.2 clients using ECDHE-ECDSA), as they are using PSA instead, and some
23operations that should use PSA do not (signature generation & verification) as
24they use the legacy API instead, in order to get restartable behaviour.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020025
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +010026Things that are in the API but not implemented yet
27--------------------------------------------------
28
29PSA Crypto has an API for FFDH, but it's not implemented in Mbed TLS yet.
30(Regarding FFDH, see the next section as well.) See issue [3261][ffdh] on
31github.
32
Dave Rodgman017a1992022-03-31 14:07:01 +010033[ffdh]: https://github.com/Mbed-TLS/mbedtls/issues/3261
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +010034
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020035Arbitrary parameters for FFDH
36-----------------------------
37
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +010038(See also the first paragraph in the previous section.)
39
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020040Currently, the PSA Crypto API can only perform FFDH with a limited set of
Manuel Pégourié-Gonnard58d101b2022-02-10 12:58:09 +010041well-known parameters (some of them defined in the spec, but implementations
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020042are free to extend that set).
43
44TLS 1.2 (and earlier) on the other hand have the server send explicit
Manuel Pégourié-Gonnard58d101b2022-02-10 12:58:09 +010045parameters (P and G) in its ServerKeyExchange message. This has been found to
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020046be suboptimal for security, as it is prohibitively hard for the client to
47verify the strength of these parameters. This led to the development of RFC
487919 which allows use of named groups in TLS 1.2 - however as this is only an
49extension, servers can still send custom parameters if they don't support the
50extension.
51
52In TLS 1.3 the situation will be simpler: named groups are the only
53option, so the current PSA Crypto API is a good match for that. (Not
Manuel Pégourié-Gonnardc7f32542022-02-10 13:00:33 +010054coincidentally, all the groups used by RFC 7919 and TLS 1.3 are included
55in the PSA specification.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020056
57There are several options here:
58
591. Implement support for custom FFDH parameters in PSA Crypto: this would pose
60 non-trivial API design problem, but most importantly seems backwards, as
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +020061the crypto community is moving away from custom FFDH parameters. (Could be
62done any time.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200632. 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 +020064 (For people who want some algorithmic variety in case ECC collapses, FFDH
65would still be available in TLS 1.3, just not in 1.2.) (Can only be done in
664.0 or another major version.)
673. Variant of the precedent: only drop client-side support. Server-side is
68 easy to support in terms of API/protocol, as the server picks the
69parameters: we just need remove the existing `mbedtls_ssl_conf_dh_param_xxx()`
70APIs and tell people to use `mbedtls_ssl_conf_groups()` instead. (Can only be
71done in 4.0 or another major version.)
724. Implement RFC 7919, support DHE-RSA and DHE-PSK only in conjunction with it
73 when moving to PSA. Server-side would work as above; unfortunately
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020074client-side the only option is to offer named groups and break the handshake
75if the server didn't take on our offer. This is not fully satisfying, but is
76perhaps the least unsatisfying option in terms of result; it's also probably
77the one that requires the most work, but it would deliver value beyond PSA
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +020078migration by implementing RFC 7919. (Implementing RFC 7919 could be done any
79time; making it mandatory can only be done in 4.0 or another major version.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020080
81RSA-PSS parameters
82------------------
83
84RSA-PSS signatures are defined by PKCS#1 v2, re-published as RFC 8017
85(previously RFC 3447).
86
87As standardized, the signature scheme takes several parameters, in addition to
88the hash algorithm potentially used to hash the message being signed:
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +020089- a hash algorithm used for the encoding function
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020090- a mask generation function
91 - most commonly MGF1, which in turn is parametrized by a hash algorithm
92- a salt length
Manuel Pégourié-Gonnardc70013e2022-02-10 13:07:22 +010093- a trailer field - the value is fixed to 0xBC by PKCS#1 v2.1, but was left
Andrzej Kurek5c65c572022-04-13 14:28:52 -040094 configurable in the original scheme; 0xBC is used everywhere in practice.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020095
96Both the existing `mbedtls_` API and the PSA API support only MGF1 as the
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +020097generation function (and only 0xBC as the trailer field), but there are
98discrepancies in handling the salt length and which of the various hash
99algorithms can differ from each other.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200100
101### API comparison
102
103- RSA:
104 - signature: `mbedtls_rsa_rsassa_pss_sign()`
105 - message hashed externally
106 - encoding hash = MGF1 hash (from context, or argument = message hash)
107 - salt length: always using the maximum legal value
108 - signature: `mbedtls_rsa_rsassa_pss_sign_ext()`
109 - message hashed externally
110 - encoding hash = MGF1 hash (from context, or argument = message hash)
111 - salt length: specified explicitly
112 - verification: `mbedtls_rsassa_pss_verify()`
113 - message hashed externally
114 - encoding hash = MGF1 hash (from context, or argument = message hash)
115 - salt length: any valid length accepted
116 - verification: `mbedtls_rsassa_pss_verify_ext()`
117 - message hashed externally
118 - encoding hash = MGF1 hash from dedicated argument
119 - expected salt length: specified explicitly, can specify "ANY"
120- PK:
121 - signature: not supported
122 - verification: `mbedtls_pk_verify_ext()`
123 - message hashed externally
124 - encoding hash = MGF1 hash, specified explicitly
125 - expected salt length: specified explicitly, can specify "ANY"
126- PSA:
127 - algorithm specification:
128 - hash alg used for message hashing, encoding and MGF1
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100129 - salt length can be either "standard" (<= hashlen, see note) or "any"
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200130 - signature generation:
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100131 - salt length: always <= hashlen (see note) and random salt
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200132 - verification:
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100133 - salt length: either <= hashlen (see note), or any depending on algorithm
134
135Note: above, "<= hashlen" means that hashlen is used if possible, but if it
Manuel Pégourié-Gonnard80759c42022-02-08 10:33:11 +0100136doesn't fit because the key is too short, then the maximum length that fits is
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100137used.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200138
139The RSA/PK API is in principle more flexible than the PSA Crypto API. The
140following sub-sections study whether and how this matters in practice.
141
142### Use in X.509
143
144RFC 4055 Section 3.1 defines the encoding of RSA-PSS that's used in X.509.
145It allows independently specifying the message hash (also used for encoding
146hash), the MGF (and its hash if MGF1 is used), and the salt length (plus an
147extra parameter "trailer field" that doesn't vary in practice"). These can be
148encoded as part of the key, and of the signature. If both encoding are
149presents, all values must match except possibly for the salt length, where the
150value from the signature parameters is used.
151
152In Mbed TLS, RSA-PSS parameters can be parsed and displayed for various
153objects (certificates, CRLs, CSRs). During parsing, the following properties
154are enforced:
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200155- the extra "trailer field" parameter must have its default value
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200156- the mask generation function is MGF1
157- encoding hash = message hashing algorithm (may differ from MGF1 hash)
158
159When it comes to cryptographic operations, only two things are supported:
160- verifying the signature on a certificate from its parent;
161- verifying the signature on a CRL from the issuing CA.
162
163The verification is done using `mbedtls_pk_verify_ext()`.
164
165Note: since X.509 parsing ensures that message hash = encoding hash, and
Manuel Pégourié-Gonnard58d101b2022-02-10 12:58:09 +0100166`mbedtls_pk_verify_ext()` uses encoding hash = mgf1 hash, it looks like all
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200167three hash algorithms must be equal, which would be good news as it would
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200168match a limitation of the PSA API.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200169
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200170It is unclear what parameters people use in practice. It looks like by default
171OpenSSL picks saltlen = keylen - hashlen - 2 (tested with openssl 1.1.1f).
Tom Cosgrove0b86ac12022-07-29 13:44:01 +0100172The `certtool` command provided by GnuTLS seems to be picking saltlen = hashlen
Manuel Pégourié-Gonnard839bb8a2022-02-08 10:33:41 +0100173by default (tested with GnuTLS 3.6.13). FIPS 186-4 requires 0 <= saltlen <=
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +0100174hashlen.
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200175
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200176### Use in TLS
177
178In TLS 1.2 (or lower), RSA-PSS signatures are never used, except via X.509.
179
180In TLS 1.3, RSA-PSS signatures can be used directly in the protocol (in
181addition to indirect use via X.509). It has two sets of three signature
182algorithm identifiers (for SHA-256, SHA-384 and SHA-512), depending of what
183the OID of the public key is (rsaEncryption or RSASSA-PSS).
184
185In both cases, it specifies that:
186- the mask generation function is MGF1
187- all three hashes are equal
188- the length of the salt MUST be equal to the length of the digest algorithm
189
190When signing, the salt length picked by PSA is the one required by TLS 1.3
191(unless the key is unreasonably small).
192
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200193When verifying signatures, PSA will by default enforce the salt len is the one
194required by TLS 1.3.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200195
196### Current testing - X509
197
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200198All test files use the default trailer field of 0xBC, as enforced by our
199parser. (There's a negative test for that using the
200`x509_parse_rsassa_pss_params` test function and hex data.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200201
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200202Files with "bad" in the name are expected to be invalid and rejected in tests.
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200203
204**Test certificates:**
205
206server9-bad-mgfhash.crt (announcing mgf1(sha224), signed with another mgf)
207 Hash Algorithm: sha256
208 Mask Algorithm: mgf1 with sha224
209 Salt Length: 0xDE
210server9-bad-saltlen.crt (announcing saltlen = 0xDE, signed with another len)
211 Hash Algorithm: sha256
212 Mask Algorithm: mgf1 with sha256
213 Salt Length: 0xDE
214server9-badsign.crt (one bit flipped in the signature)
215 Hash Algorithm: sha1 (default)
216 Mask Algorithm: mgf1 with sha1 (default)
217 Salt Length: 0xEA
218server9-defaults.crt
219 Hash Algorithm: sha1 (default)
220 Mask Algorithm: mgf1 with sha1 (default)
221 Salt Length: 0x14 (default)
222server9-sha224.crt
223 Hash Algorithm: sha224
224 Mask Algorithm: mgf1 with sha224
225 Salt Length: 0xE2
226server9-sha256.crt
227 Hash Algorithm: sha256
228 Mask Algorithm: mgf1 with sha256
229 Salt Length: 0xDE
230server9-sha384.crt
231 Hash Algorithm: sha384
232 Mask Algorithm: mgf1 with sha384
233 Salt Length: 0xCE
234server9-sha512.crt
235 Hash Algorithm: sha512
236 Mask Algorithm: mgf1 with sha512
237 Salt Length: 0xBE
238server9-with-ca.crt
239 Hash Algorithm: sha1 (default)
240 Mask Algorithm: mgf1 with sha1 (default)
241 Salt Length: 0xEA
242server9.crt
243 Hash Algorithm: sha1 (default)
244 Mask Algorithm: mgf1 with sha1 (default)
245 Salt Length: 0xEA
246
247These certificates are signed with a 2048-bit key. It appears that they are
248all using saltlen = keylen - hashlen - 2, except for server9-defaults which is
249using saltlen = hashlen.
250
251**Test CRLs:**
252
253crl-rsa-pss-sha1-badsign.pem
254 Hash Algorithm: sha1 (default)
255 Mask Algorithm: mgf1 with sha1 (default)
256 Salt Length: 0xEA
257crl-rsa-pss-sha1.pem
258 Hash Algorithm: sha1 (default)
259 Mask Algorithm: mgf1 with sha1 (default)
260 Salt Length: 0xEA
261crl-rsa-pss-sha224.pem
262 Hash Algorithm: sha224
263 Mask Algorithm: mgf1 with sha224
264 Salt Length: 0xE2
265crl-rsa-pss-sha256.pem
266 Hash Algorithm: sha256
267 Mask Algorithm: mgf1 with sha256
268 Salt Length: 0xDE
269crl-rsa-pss-sha384.pem
270 Hash Algorithm: sha384
271 Mask Algorithm: mgf1 with sha384
272 Salt Length: 0xCE
273crl-rsa-pss-sha512.pem
274 Hash Algorithm: sha512
275 Mask Algorithm: mgf1 with sha512
276 Salt Length: 0xBE
277
278These CRLs are signed with a 2048-bit key. It appears that they are
279all using saltlen = keylen - hashlen - 2.
280
281**Test CSRs:**
282
283server9.req.sha1
284 Hash Algorithm: sha1 (default)
285 Mask Algorithm: mgf1 with sha1 (default)
286 Salt Length: 0x6A
287server9.req.sha224
288 Hash Algorithm: sha224
289 Mask Algorithm: mgf1 with sha224
290 Salt Length: 0x62
291server9.req.sha256
292 Hash Algorithm: sha256
293 Mask Algorithm: mgf1 with sha256
294 Salt Length: 0x5E
295server9.req.sha384
296 Hash Algorithm: sha384
297 Mask Algorithm: mgf1 with sha384
298 Salt Length: 0x4E
299server9.req.sha512
300 Hash Algorithm: sha512
301 Mask Algorithm: mgf1 with sha512
302 Salt Length: 0x3E
303
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +0200304These CSRs are signed with a 2048-bit key. It appears that they are
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200305all using saltlen = keylen - hashlen - 2.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200306
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200307### Possible courses of action
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200308
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200309There's no question about what to do with TLS (any version); the only question
310is about X.509 signature verification. Options include:
311
3121. Doing all verifications with `PSA_ALG_RSA_PSS_ANY_SALT` - while this
313 wouldn't cause a concrete security issue, this would be non-compliant.
3142. Doing verifications with `PSA_ALG_RSA_PSS` when we're lucky and the encoded
315 saltlen happens to match hashlen, and falling back to `ANY_SALT` otherwise.
316Same issue as with the previous point, except more contained.
3173. Reject all certificates with saltlen != hashlen. This includes all
Manuel Pégourié-Gonnard83c53882022-04-20 14:27:48 +0200318 certificates generated with OpenSSL using the default parameters, so it's
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200319probably not acceptable.
3204. Request an extension to the PSA Crypto API and use one of the above options
321 in the meantime. Such an extension seems inconvenient and not motivated by
322strong security arguments, so it's unclear whether it would be accepted.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200323
324Limitations relevant for G2 (isolation of long-term secrets)
325============================================================
326
Manuel Pégourié-Gonnard103b9922022-05-11 13:21:39 +0200327Currently none.