blob: a7c4afb9f34f7053797bf83ca781ba398bebff60 [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
17There is currently no support for that in PSA at all. API design, as well as
18implementation, would be non-trivial.
19
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
30[ffdh]: https://github.com/ARMmbed/mbedtls/issues/3261
31
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
35[ecjp]: https://github.com/orgs/ARMmbed/projects/18#column-15836385
36
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
63the crypto community is moving away from custom FFDH parameters.
642. Drop the DHE-RSA and DHE-PSK key exchanges in TLS 1.2 when moving to PSA.
653. Implement RFC 7919, support DHE-RSA and DHE-PSK only in conjunction with it
66 when moving to PSA. We can modify our server so that it only selects a DHE
67 ciphersuite if the client offered name FFDH groups; unfortunately
68client-side the only option is to offer named groups and break the handshake
69if the server didn't take on our offer. This is not fully satisfying, but is
70perhaps the least unsatisfying option in terms of result; it's also probably
71the one that requires the most work, but it would deliver value beyond PSA
72migration by implementing RFC 7919.
73
74RSA-PSS parameters
75------------------
76
77RSA-PSS signatures are defined by PKCS#1 v2, re-published as RFC 8017
78(previously RFC 3447).
79
80As standardized, the signature scheme takes several parameters, in addition to
81the hash algorithm potentially used to hash the message being signed:
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +020082- a hash algorithm used for the encoding function
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020083- a mask generation function
84 - most commonly MGF1, which in turn is parametrized by a hash algorithm
85- a salt length
Manuel Pégourié-Gonnardc70013e2022-02-10 13:07:22 +010086- a trailer field - the value is fixed to 0xBC by PKCS#1 v2.1, but was left
87 configurable in the original scheme; 0xBC is used everywhere in pratice.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020088
89Both the existing `mbedtls_` API and the PSA API support only MGF1 as the
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +020090generation function (and only 0xBC as the trailer field), but there are
91discrepancies in handling the salt length and which of the various hash
92algorithms can differ from each other.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +020093
94### API comparison
95
96- RSA:
97 - signature: `mbedtls_rsa_rsassa_pss_sign()`
98 - message hashed externally
99 - encoding hash = MGF1 hash (from context, or argument = message hash)
100 - salt length: always using the maximum legal value
101 - signature: `mbedtls_rsa_rsassa_pss_sign_ext()`
102 - message hashed externally
103 - encoding hash = MGF1 hash (from context, or argument = message hash)
104 - salt length: specified explicitly
105 - verification: `mbedtls_rsassa_pss_verify()`
106 - message hashed externally
107 - encoding hash = MGF1 hash (from context, or argument = message hash)
108 - salt length: any valid length accepted
109 - verification: `mbedtls_rsassa_pss_verify_ext()`
110 - message hashed externally
111 - encoding hash = MGF1 hash from dedicated argument
112 - expected salt length: specified explicitly, can specify "ANY"
113- PK:
114 - signature: not supported
115 - verification: `mbedtls_pk_verify_ext()`
116 - message hashed externally
117 - encoding hash = MGF1 hash, specified explicitly
118 - expected salt length: specified explicitly, can specify "ANY"
119- PSA:
120 - algorithm specification:
121 - hash alg used for message hashing, encoding and MGF1
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100122 - salt length can be either "standard" (<= hashlen, see note) or "any"
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200123 - signature generation:
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100124 - salt length: always <= hashlen (see note) and random salt
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200125 - verification:
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100126 - salt length: either <= hashlen (see note), or any depending on algorithm
127
128Note: above, "<= hashlen" means that hashlen is used if possible, but if it
Manuel Pégourié-Gonnard80759c42022-02-08 10:33:11 +0100129doesn't fit because the key is too short, then the maximum length that fits is
Manuel Pégourié-Gonnard539b9a52022-02-07 10:19:08 +0100130used.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200131
132The RSA/PK API is in principle more flexible than the PSA Crypto API. The
133following sub-sections study whether and how this matters in practice.
134
135### Use in X.509
136
137RFC 4055 Section 3.1 defines the encoding of RSA-PSS that's used in X.509.
138It allows independently specifying the message hash (also used for encoding
139hash), the MGF (and its hash if MGF1 is used), and the salt length (plus an
140extra parameter "trailer field" that doesn't vary in practice"). These can be
141encoded as part of the key, and of the signature. If both encoding are
142presents, all values must match except possibly for the salt length, where the
143value from the signature parameters is used.
144
145In Mbed TLS, RSA-PSS parameters can be parsed and displayed for various
146objects (certificates, CRLs, CSRs). During parsing, the following properties
147are enforced:
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200148- the extra "trailer field" parameter must have its default value
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200149- the mask generation function is MGF1
150- encoding hash = message hashing algorithm (may differ from MGF1 hash)
151
152When it comes to cryptographic operations, only two things are supported:
153- verifying the signature on a certificate from its parent;
154- verifying the signature on a CRL from the issuing CA.
155
156The verification is done using `mbedtls_pk_verify_ext()`.
157
158Note: since X.509 parsing ensures that message hash = encoding hash, and
Manuel Pégourié-Gonnard58d101b2022-02-10 12:58:09 +0100159`mbedtls_pk_verify_ext()` uses encoding hash = mgf1 hash, it looks like all
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200160three hash algorithms must be equal, which would be good news as it would
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200161match a limitation of the PSA API.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200162
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200163It is unclear what parameters people use in practice. It looks like by default
164OpenSSL picks saltlen = keylen - hashlen - 2 (tested with openssl 1.1.1f).
165The `certool` command provided by GnuTLS seems to be picking saltlen = hashlen
Manuel Pégourié-Gonnard839bb8a2022-02-08 10:33:41 +0100166by default (tested with GnuTLS 3.6.13). FIPS 186-4 requires 0 <= saltlen <=
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +0100167hashlen.
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200168
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200169### Use in TLS
170
171In TLS 1.2 (or lower), RSA-PSS signatures are never used, except via X.509.
172
173In TLS 1.3, RSA-PSS signatures can be used directly in the protocol (in
174addition to indirect use via X.509). It has two sets of three signature
175algorithm identifiers (for SHA-256, SHA-384 and SHA-512), depending of what
176the OID of the public key is (rsaEncryption or RSASSA-PSS).
177
178In both cases, it specifies that:
179- the mask generation function is MGF1
180- all three hashes are equal
181- the length of the salt MUST be equal to the length of the digest algorithm
182
183When signing, the salt length picked by PSA is the one required by TLS 1.3
184(unless the key is unreasonably small).
185
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200186When verifying signatures, PSA will by default enforce the salt len is the one
187required by TLS 1.3.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200188
189### Current testing - X509
190
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200191All test files use the default trailer field of 0xBC, as enforced by our
192parser. (There's a negative test for that using the
193`x509_parse_rsassa_pss_params` test function and hex data.)
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200194
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200195Files with "bad" in the name are expected to be invalid and rejected in tests.
Manuel Pégourié-Gonnardf5ee4b32021-10-21 13:04:01 +0200196
197**Test certificates:**
198
199server9-bad-mgfhash.crt (announcing mgf1(sha224), signed with another mgf)
200 Hash Algorithm: sha256
201 Mask Algorithm: mgf1 with sha224
202 Salt Length: 0xDE
203server9-bad-saltlen.crt (announcing saltlen = 0xDE, signed with another len)
204 Hash Algorithm: sha256
205 Mask Algorithm: mgf1 with sha256
206 Salt Length: 0xDE
207server9-badsign.crt (one bit flipped in the signature)
208 Hash Algorithm: sha1 (default)
209 Mask Algorithm: mgf1 with sha1 (default)
210 Salt Length: 0xEA
211server9-defaults.crt
212 Hash Algorithm: sha1 (default)
213 Mask Algorithm: mgf1 with sha1 (default)
214 Salt Length: 0x14 (default)
215server9-sha224.crt
216 Hash Algorithm: sha224
217 Mask Algorithm: mgf1 with sha224
218 Salt Length: 0xE2
219server9-sha256.crt
220 Hash Algorithm: sha256
221 Mask Algorithm: mgf1 with sha256
222 Salt Length: 0xDE
223server9-sha384.crt
224 Hash Algorithm: sha384
225 Mask Algorithm: mgf1 with sha384
226 Salt Length: 0xCE
227server9-sha512.crt
228 Hash Algorithm: sha512
229 Mask Algorithm: mgf1 with sha512
230 Salt Length: 0xBE
231server9-with-ca.crt
232 Hash Algorithm: sha1 (default)
233 Mask Algorithm: mgf1 with sha1 (default)
234 Salt Length: 0xEA
235server9.crt
236 Hash Algorithm: sha1 (default)
237 Mask Algorithm: mgf1 with sha1 (default)
238 Salt Length: 0xEA
239
240These certificates are signed with a 2048-bit key. It appears that they are
241all using saltlen = keylen - hashlen - 2, except for server9-defaults which is
242using saltlen = hashlen.
243
244**Test CRLs:**
245
246crl-rsa-pss-sha1-badsign.pem
247 Hash Algorithm: sha1 (default)
248 Mask Algorithm: mgf1 with sha1 (default)
249 Salt Length: 0xEA
250crl-rsa-pss-sha1.pem
251 Hash Algorithm: sha1 (default)
252 Mask Algorithm: mgf1 with sha1 (default)
253 Salt Length: 0xEA
254crl-rsa-pss-sha224.pem
255 Hash Algorithm: sha224
256 Mask Algorithm: mgf1 with sha224
257 Salt Length: 0xE2
258crl-rsa-pss-sha256.pem
259 Hash Algorithm: sha256
260 Mask Algorithm: mgf1 with sha256
261 Salt Length: 0xDE
262crl-rsa-pss-sha384.pem
263 Hash Algorithm: sha384
264 Mask Algorithm: mgf1 with sha384
265 Salt Length: 0xCE
266crl-rsa-pss-sha512.pem
267 Hash Algorithm: sha512
268 Mask Algorithm: mgf1 with sha512
269 Salt Length: 0xBE
270
271These CRLs are signed with a 2048-bit key. It appears that they are
272all using saltlen = keylen - hashlen - 2.
273
274**Test CSRs:**
275
276server9.req.sha1
277 Hash Algorithm: sha1 (default)
278 Mask Algorithm: mgf1 with sha1 (default)
279 Salt Length: 0x6A
280server9.req.sha224
281 Hash Algorithm: sha224
282 Mask Algorithm: mgf1 with sha224
283 Salt Length: 0x62
284server9.req.sha256
285 Hash Algorithm: sha256
286 Mask Algorithm: mgf1 with sha256
287 Salt Length: 0x5E
288server9.req.sha384
289 Hash Algorithm: sha384
290 Mask Algorithm: mgf1 with sha384
291 Salt Length: 0x4E
292server9.req.sha512
293 Hash Algorithm: sha512
294 Mask Algorithm: mgf1 with sha512
295 Salt Length: 0x3E
296
297These CSRss are signed with a 2048-bit key. It appears that they are
298all using saltlen = keylen - hashlen - 2.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200299
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200300### Possible courses of action
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200301
Manuel Pégourié-Gonnarde459be22021-10-27 13:25:49 +0200302There's no question about what to do with TLS (any version); the only question
303is about X.509 signature verification. Options include:
304
3051. Doing all verifications with `PSA_ALG_RSA_PSS_ANY_SALT` - while this
306 wouldn't cause a concrete security issue, this would be non-compliant.
3072. Doing verifications with `PSA_ALG_RSA_PSS` when we're lucky and the encoded
308 saltlen happens to match hashlen, and falling back to `ANY_SALT` otherwise.
309Same issue as with the previous point, except more contained.
3103. Reject all certificates with saltlen != hashlen. This includes all
311 certificates generate with OpenSSL using the default parameters, so it's
312probably not acceptable.
3134. Request an extension to the PSA Crypto API and use one of the above options
314 in the meantime. Such an extension seems inconvenient and not motivated by
315strong security arguments, so it's unclear whether it would be accepted.
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200316
Manuel Pégourié-Gonnard52187742022-01-17 11:02:31 +0100317HKDF: Expand not exposed on its own (TLS 1.3)
318---------------------------------------------
319
320The HKDF function uses and Extract-then-Expand approch, that is:
321
322 HKDF(x, ...) = HKDF-Expand(HKDF-Extract(x, ...), ...)
323
324Only the full HKDF function is safe in general, however there are cases when
325one case safely use the individual Extract and Expand; the TLS 1.3 key
326schedule does so. Specifically, looking at the [hierarchy of secrets][13hs]
327is seems that Expand and Extract are always chained, so that this hierarchy
328can be implemented using only the full HKDF. However, looking at the
329derivation of traffic keys (7.3) and the update mechanism (7.2) it appears
330that calls to HKDF-Expand are iterated without any intermediated call to
331HKDF-Extract : that is, the traffic keys are computed as
332
333 HKDF-Expand(HKDF-Expand(HKDF-Extract(...)))
334
335(with possibly more than two Expands in a row with update).
336
337[13hs]: https://datatracker.ietf.org/doc/html/rfc8446#page-93
338
339In the short term (early 2022), we'll work around that by re-implementing HKDF
340in `ssl_tls13_keys.c` based on the `psa_mac_` APIs (for HMAC).
341
Manuel Pégourié-Gonnard8e559da2022-02-01 10:26:07 +0100342In the long term, it is desirable to extend the PSA API. See
343https://github.com/ARM-software/psa-crypto-api/issues/539
Manuel Pégourié-Gonnard52187742022-01-17 11:02:31 +0100344
Manuel Pégourié-Gonnardd9edd562021-09-30 15:05:01 +0200345Limitations relevant for G2 (isolation of long-term secrets)
346============================================================
347
348Custom key derivations for mixed-PSK handshake
349----------------------------------------------
350
351Currently, `MBEDTLS_USE_PSA_CRYPTO` enables the new configuration function
352`mbedtls_ssl_conf_psk_opaque()` which allows a PSA-held key to be used for the
353(pure) `PSK` key exchange in TLS 1.2. This requires that the derivation of the
354Master Secret (MS) be done on the PSA side. To support this, an algorithm
355family `PSA_ALG_TLS12_PSK_TO_MS(hash_alg)` was added to PSA Crypto.
356
357If we want to support key isolation for the "mixed PSK" key exchanges:
358DHE-PSK, RSA-PSK, ECDHE-PSK, where the PSK is concatenated with the result of
359a DH key agreement (resp. RSA decryption) to form the pre-master secret (PMS)
360from which the MS is derived. If the value of the PSK is to remain hidden, we
361need the derivation PSK + secondary secret -> MS to be implemented as an
362ad-hoc PSA key derivation algorithm.
363
364Adding this new, TLS-specific, key derivation algorithm to PSA Crypto should
365be no harder than it was to add `PSA_ALG_TLS12_PSK_TO_MS()` but still requires
366an extension to PSA Crypto.
367
368Note: looking at RFCs 4279 and 5489, it appears that the structure of the PMS
369is always the same: 2-byte length of the secondary secret, secondary secret,
3702-byte length of the PSK, PSK. So, a single key derivation algorithm should be
371able to cover the 3 key exchanges DHE-PSK, RSA-PSK and ECDHE-PSK. (That's a
372minor gain: adding 3 algorithms would not be a blocker anyway.)
373
374Note: if later we want to also isolate short-term secret (G3), the "secondary
375secret" (output of DHE/ECDHE key agreement or RSA decryption) could be a
376candidate. This wouldn't be a problem as the PSA key derivation API always
377allows inputs from key slots. (Tangent: the hard part in isolating the result
378of RSA decryption would be still checking that is has the correct format:
37948 bytes, the first two matching the TLS version - note that this is timing
380sensitive.)
381
Manuel Pégourié-Gonnard52187742022-01-17 11:02:31 +0100382HKDF: Expand not exposed on its own (TLS 1.3)
383---------------------------------------------
384
Manuel Pégourié-Gonnard8ebed212022-02-07 10:23:49 +0100385See the section with the same name in the G1 part above for background.
Manuel Pégourié-Gonnard52187742022-01-17 11:02:31 +0100386
387The work-around mentioned there works well enough just for acceleration, but
388is not sufficient for key isolation or generally proper key management (it
389requires marking keys are usable for HMAC while they should only be used for
390key derivation).
391
392The obvious long-term solution is to make HKDF-Expand available as a new KDF
393(in addition to the full HKDF) in PSA (with appropriate warnings in the
394documentation).