blob: 2b20b5ce6efd0c2b71a6c3f8501522a11627118a [file] [log] [blame] [view]
Dave Rodgmana0e8db02021-06-29 18:05:38 +01001# Migrating from Mbed TLS 2.x to Mbed TLS 3.0
Manuel Pégourié-Gonnard89d4ab02021-04-23 11:54:27 +02002
3This guide details the steps required to migrate from Mbed TLS version 2.x to
4Mbed TLS version 3.0 or greater. Unlike normal releases, Mbed TLS 3.0 breaks
5compatibility with previous versions, so users (and alt implementors) might
6need to change their own code in order to make it work with Mbed TLS 3.0.
7
8Here's the list of breaking changes; each entry should help you answer these
9two questions: (1) am I affected? (2) if yes, what's my migration path?
10
Dave Rodgman1aea4042021-06-29 13:27:15 +010011The changes are detailed below, and include:
Dave Rodgman759c0102021-06-29 15:55:08 +010012
Dave Rodgman949c21b2021-06-29 18:05:04 +010013- Removal of many insecure or obsolete features
14- Tidying up of configuration options (including removing some less useful options).
Dave Rodgman70789732021-06-30 09:18:55 +010015- Changing function signatures, e.g. adding return codes, adding extra parameters, or making some arguments const.
16- Removal of functions previously marked as deprecated.
Dave Rodgmand8a10172021-06-29 21:45:24 +010017
Dave Rodgmand8a10172021-06-29 21:45:24 +010018
19## Tooling
20
Dave Rodgmana0e8db02021-06-29 18:05:38 +010021### Introduce a level of indirection and versioning in the config files
Manuel Pégourié-Gonnard89d4ab02021-04-23 11:54:27 +020022
Dave Rodgmane45e6402021-06-29 13:21:55 +010023`config.h` was split into `build_info.h` and `mbedtls_config.h`.
Manuel Pégourié-Gonnard89d4ab02021-04-23 11:54:27 +020024
Dave Rodgmane45e6402021-06-29 13:21:55 +010025* In code, use `#include <mbedtls/build_info.h>`. Don't include `mbedtls/config.h` and don't refer to `MBEDTLS_CONFIG_FILE`.
26* In build tools, edit `mbedtls_config.h`, or edit `MBEDTLS_CONFIG_FILE` as before.
27* If you had a tool that parsed the library version from `include/mbedtls/version.h`, this has moved to `include/mbedtls/build_info.h`. From C code, both headers now define the `MBEDTLS_VERSION_xxx` macros.
28
29Also, if you have a custom configuration file:
30
31* Don't include `check_config.h` or `config_psa.h` anymore.
32* Don't define `MBEDTLS_CONFIG_H` anymore.
33
34A config file version symbol, `MBEDTLS_CONFIG_VERSION` was introduced.
35Defining it to a particular value will ensure that Mbed TLS interprets
36the config file in a way that's compatible with the config file format
37used by the Mbed TLS release whose `MBEDTLS_VERSION_NUMBER` has the same
38value.
39The only value supported by Mbed TLS 3.0.0 is `0x03000000`.
40
Dave Rodgmand267ec32021-06-29 21:31:58 +010041### Change `MBEDTLS_ECP_FIXED_POINT_OPTIM` behavior
Dave Rodgman8cccbe12021-06-29 13:15:50 +010042
Dave Rodgman36bb5ff2021-06-29 21:39:55 +010043The option `MBEDTLS_ECP_FIXED_POINT_OPTIM` now increases code size and it does
Dave Rodgman8cccbe12021-06-29 13:15:50 +010044not increase peak RAM usage anymore.
45
46If you are limited by code size, you can define `MBEDTLS_ECP_FIXED_POINT_OPTIM`
47to `0` in your config file. The impact depends on the number and size of
48enabled curves. For example, for P-256 the difference is 1KB; see the documentation
49of this option for details.
50
Dave Rodgmana0e8db02021-06-29 18:05:38 +010051### Move part of timing module out of the library
Dave Rodgman8cccbe12021-06-29 13:15:50 +010052
53The change affects users who use any of the following functions:
54`mbedtls_timing_self_test()`, `mbedtls_hardclock_poll()`,
55`mbedtls_timing_hardclock()` and `mbedtls_set_alarm()`.
56
57If you were relying on these functions, you'll now need to change to using your
58platform's corresponding functions directly.
Dave Rodgman759c0102021-06-29 15:55:08 +010059
Dave Rodgmana0e8db02021-06-29 18:05:38 +010060### Deprecated net.h file was removed
Dave Rodgman8cccbe12021-06-29 13:15:50 +010061
62The file `include/mbedtls/net.h` was removed because its only function was to
63include `mbedtls/net_sockets.h` which now should be included directly.
Dave Rodgman759c0102021-06-29 15:55:08 +010064
Dave Rodgmand267ec32021-06-29 21:31:58 +010065### Remove `MBEDTLS_CHECK_PARAMS` option
Dave Rodgman8cccbe12021-06-29 13:15:50 +010066
67This change does not affect users who use the default configuration; it only
68affects users who enabled that option.
69
70The option `MBEDTLS_CHECK_PARAMS` (disabled by default) enabled certain kinds
71of “parameter validation”. It covered two kinds of validations:
72
73- In some functions that require a valid pointer, “parameter validation” checks
74that the pointer is non-null. With the feature disabled, a null pointer is not
75treated differently from any other invalid pointer, and typically leads to a
76runtime crash. 90% of the uses of the feature are of this kind.
77- In some functions that take an enum-like argument, “parameter validation”
78checks that the value is a valid one. With the feature disabled, an invalid
79value causes a silent default to one of the valid values.
80
81The default reaction to a failed check was to call a function
82`mbedtls_param_failed()` which the application had to provide. If this function
83returned, its caller returned an error `MBEDTLS_ERR_xxx_BAD_INPUT_DATA`.
84
85This feature was only used in some classic (non-PSA) cryptography modules. It was
86not used in X.509, TLS or in PSA crypto, and it was not implemented in all
87classic crypto modules.
88
89This feature has been removed. The library no longer checks for NULL pointers;
90checks for enum-like arguments will be kept or re-introduced on a case-by-case
91basis, but their presence will no longer be dependent on a compile-time option.
92
93Validation of enum-like values is somewhat useful, but not extremely important,
94because the parameters concerned are usually constants in applications.
95
96For more information see issue #4313.
Dave Rodgman759c0102021-06-29 15:55:08 +010097
Dave Rodgman30dc6032021-06-29 22:20:58 +010098### Separated `MBEDTLS_SHA224_C` and `MBEDTLS_SHA256_C`
Dave Rodgman8cccbe12021-06-29 13:15:50 +010099
Dave Rodgman30dc6032021-06-29 22:20:58 +0100100This does not affect users who use the default `mbedtls_config.h`. MBEDTLS_SHA256_C
101was enabled by default. Now both MBEDTLS_SHA256_C and MBEDTLS_SHA224_C are
102enabled.
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100103
Dave Rodgman30dc6032021-06-29 22:20:58 +0100104If you were using custom config file with MBEDTLS_SHA256_C enabled, then
Dave Rodgman4a5d3c02021-06-29 22:29:03 +0100105you will need to add `#define MBEDTLS_SHA224_C` option to your config.
Dave Rodgman30dc6032021-06-29 22:20:58 +0100106Current version of the library does not support enabling MBEDTLS_SHA256_C
107without MBEDTLS_SHA224_C.
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100108
Dave Rodgman30dc6032021-06-29 22:20:58 +0100109### Replaced `MBEDTLS_SHA512_NO_SHA384` with `MBEDTLS_SHA384_C`
Dave Rodgman759c0102021-06-29 15:55:08 +0100110
Dave Rodgman30dc6032021-06-29 22:20:58 +0100111This does not affect users who use the default `mbedtls_config.h`.
112MBEDTLS_SHA512_NO_SHA384 was disabled by default, now MBEDTLS_SHA384_C is
113enabled by default.
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100114
Dave Rodgman30dc6032021-06-29 22:20:58 +0100115If you were using a config file with both MBEDTLS_SHA512_C and
116MBEDTLS_SHA512_NO_SHA384, then just remove the MBEDTLS_SHA512_NO_SHA384.
117If you were using a config file with MBEDTLS_SHA512_C and without
118MBEDTLS_SHA512_NO_SHA384 and you need the SHA-384 algorithm, then add
119`#define MBEDTLS_SHA384_C` to your config file.
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100120
Dave Rodgman30dc6032021-06-29 22:20:58 +0100121### Remove the `MBEDTLS_TEST_NULL_ENTROPY` configuration option
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100122
Dave Rodgman30dc6032021-06-29 22:20:58 +0100123This does not affect users who use the default `mbedtls_config.h`, as this option was
124already off by default.
125
126If you were using the `MBEDTLS_TEST_NULL_ENTROPY` option and your platform
127doesn't have any entropy source, you should use `MBEDTLS_ENTROPY_NV_SEED`
128and make sure your device is provisioned with a strong random seed.
129Alternatively, for testing purposes only, you can create and register a fake
130entropy function.
131
132### The configuration option `MBEDTLS_ECP_NO_INTERNAL_RNG` was removed
133
134This doesn't affect users of the default configuration; it only affects people
135who were explicitly setting this option.
136
137This was a trade-off between code size and countermeasures; it is no longer
138relevant as the countermeasure is now always on at no cost in code size.
139
140### Remove the HAVEGE module
141
142This doesn't affect people using the default configuration as it was already
143disabled by default.
144
145This only affects users who called the HAVEGE modules directly (not
146recommended), or users who used it through the entropy module but had it as the
147only source of entropy. If you're in that case, please declare OS or hardware
148RNG interfaces with `mbedtls_entropy_add_source()` and/or use an entropy seed
149file created securely during device provisioning. See
150<https://tls.mbed.org/kb/how-to/add-entropy-sources-to-entropy-pool> for more
151information.
152
153
154
155## Low-level crypto
156
157### The RNG parameter is now mandatory for all functions that accept one
158
159This change affects all users who called a function accepting a `f_rng`
160parameter with `NULL` as the value of this argument; this is no longer
161supported.
162
163The changed functions are: the X.509 CRT and CSR writing functions; the PK and
164RSA sign and decrypt functions; `mbedtls_rsa_private()`; the functions in DHM
165and ECDH that compute the shared secret; the scalar multiplication functions in
166ECP.
167
168You now need to pass a properly seeded, cryptographically secure RNG to all
169functions that accept a `f_rng` parameter. It is of course still possible to
170pass `NULL` as the context pointer `p_rng` if your RNG function doesn't need a
171context.
172
173Alternative implementations of a module (enabled with the `MBEDTLS_module_ALT`
174configuration options) may have their own internal and are free to ignore the
175`f_rng` argument but must allow users to pass one anyway.
176
177### Some functions gained an RNG parameter
178
179This affects users of the following functions: `mbedtls_ecp_check_pub_priv()`,
180`mbedtls_pk_check_pair()`, `mbedtls_pk_parse_key()`, and
181`mbedtls_pk_parse_keyfile()`.
182
183You now need to pass a properly seeded, cryptographically secure RNG when
184calling these functions. It is used for blinding, a countermeasure against
185side-channel attacks.
186
187### Deprecated functions were removed from bignum
188
189The function `mbedtls_mpi_is_prime()` was removed. Please use
190`mbedtls_mpi_is_prime_ext()` instead which additionally allows specifying the
191number of Miller-Rabin rounds.
192
193### Deprecated functions were removed from DRBGs
194
195The functions `mbedtls_ctr_drbg_update()` and `mbedtls_hmac_drbg_update()`
196were removed. They were superseded by `mbedtls_ctr_drbg_update_ret()` and
197`mbedtls_hmac_drbg_update_ret()` respectively.
198
199### Deprecated hex-encoded primes were removed from DHM
200
201The macros `MBEDTLS_DHM_RFC5114_MODP_2048_P`, `MBEDTLS_DHM_RFC5114_MODP_2048_G`,
202`MBEDTLS_DHM_RFC3526_MODP_2048_P`, `MBEDTLS_DHM_RFC3526_MODP_2048_G`,
203`MBEDTLS_DHM_RFC3526_MODP_3072_P`, `MBEDTLS_DHM_RFC3526_MODP_3072_G`,
204`MBEDTLS_DHM_RFC3526_MODP_4096_P `and `MBEDTLS_DHM_RFC3526_MODP_4096_G` were
205removed. The primes from RFC 5114 are deprecated because their derivation is not
206documented and therefore their usage constitutes a security risk; they are fully
207removed from the library. Please use parameters from RFC3526 (still in the
208library, only in binary form) or RFC 7919 (also available in the library) or
209other trusted sources instead.
210
211## High-level crypto
212
213### Remove wrapper for libpkcs11-helper
214
215This doesn't affect people using the default configuration as it was already
216disabled by default.
217
218If you used to rely on this module in order to store your private keys
219securely, please have a look at the key management facilities provided by the
220PSA crypto API. If you have a use case that's not covered yet by this API,
221please reach out on the mailing list.
222
223### Deprecated functions were removed from hashing modules
224
225Modules: MD5, SHA1, SHA256, SHA512, MD.
226
227- The functions `mbedtls_xxx_starts_ret()`, `mbedtls_xxx_update_ret()`,
228 `mbedtls_xxx_finish_ret()` and `mbedtls_xxx_ret()` were renamed to replace
229 the corresponding functions without `_ret` appended. Please call the name without `_ret` appended and check the return value.
230- The function `mbedtls_md_init_ctx()` was removed; please use
231 `mbedtls_md_setup()` instead.
232- The functions `mbedtls_xxx_process()` were removed. You normally don't need
233 to call that from application code. However if you do (or if you want to
234 provide your own version of that function), please use
235 `mbedtls_internal_xxx_process()` instead, and check the return value.
236
237### Remove 3DES ciphersuites
238
239This change does not affect users using default settings for 3DES in `mbedtls_config.h`
240because the 3DES ciphersuites were disabled by that.
241
2423DES has weaknesses/limitations and there are better alternatives, and more and
243more standard bodies are recommending against its use in TLS.
244
245The migration path here is to chose from the recommended in literature alternatives.
246
247### Deprecated error codes for hardware failures were removed
248
249- The macros `MBEDTLS_ERR_xxx_FEATURE_UNSUPPORTED` from various crypto modules
250 were removed; `MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED` is now used
251 instead.
252- The macros `MBEDTLS_ERR_xxx_HW_ACCEL_FAILED` from various crypto modules
253 were removed; `MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED` is now used instead.
254
255### Calling `mbedtls_cipher_finish()` is mandatory for all multi-part operations
256
257This only affects people who use the cipher module to perform AEAD operations
258using the multi-part API.
259
260Previously, the documentation didn't state explicitly if it was OK to call
261`mbedtls_cipher_check_tag()` or `mbedtls_cipher_write_tag()` directly after
262the last call to `mbedtls_cipher_update()` that is, without calling
263`mbedtls_cipher_finish()` in-between. If you code was missing that call,
264please add it and be prepared to get as much as 15 bytes of output.
265
266Currently the output is always 0 bytes, but it may be more when alternative
267implementations of the underlying primitives are in use, or with future
268versions of the library.
269
270### GCM multipart interface: application changes
271
272The GCM module now supports arbitrary chunked input in the multipart interface.
273This changes the interface for applications using the GCM module directly for multipart operations.
274Applications using one-shot GCM or using GCM via the `mbedtls_cipher_xxx` or `psa_aead_xxx` interfaces do not require any changes.
275
276* `mbedtls_gcm_starts()` now only sets the mode and the nonce (IV). Call the new function `mbedtls_gcm_update_ad()` to pass the associated data.
277* `mbedtls_gcm_update()` now takes an extra parameter to indicate the actual output length. In Mbed TLS 2.x, applications had to pass inputs consisting of whole 16-byte blocks except for the last block (this limitation has been lifted). In this case:
278 * As long as the input remains block-aligned, the output length is exactly the input length, as before.
279 * If the length of the last input is not a multiple of 16, alternative implementations may return the last partial block in the call to `mbedtls_gcm_finish()` instead of returning it in the last call to `mbedtls_gcm_update()`.
280* `mbedtls_gcm_finish()` now takes an extra output buffer for the last partial block. This is needed for alternative implementations that can only process a whole block at a time.
281
282### GCM interface changes: impact for alternative implementations
283
284The GCM multipart interface has changed as described in [“GCM multipart interface: application changes”](#gcm-multipart-interface:-application-changes). The consequences for an alternative implementation of GCM (`MBEDTLS_GCM_ALT`) are as follows:
285
286* `mbedtls_gcm_starts()` now only sets the mode and the nonce (IV). The new function `mbedtls_gcm_update_ad()` receives the associated data. It may be called multiple times.
287* `mbedtls_gcm_update()` now allows arbitrary-length inputs, takes an extra parameter to indicate the actual output length. Alternative implementations may choose between two modes:
288 * Always return the partial output immediately, even if it does not consist of a whole number of blocks.
289 * Buffer the data for the last partial block, to be returned in the next call to `mbedtls_gcm_update()` or `mbedtls_gcm_finish()`.
290* `mbedtls_gcm_finish()` now takes an extra output buffer for the last partial block if needed.
291
292### Remove the mode parameter from RSA functions
293
294This affects all users who use the RSA encryption, decryption, sign and
295verify APIs.
296
297The RSA module no longer supports private-key operations with the public key or
298vice versa. As a consequence, RSA operation functions no longer have a mode
299parameter. If you were calling RSA operations with the normal mode (public key
300for verification or encryption, private key for signature or decryption), remove
301the `MBEDTLS_MODE_PUBLIC` or `MBEDTLS_MODE_PRIVATE` argument. If you were calling
302RSA operations with the wrong mode, which rarely makes sense from a security
303perspective, this is no longer supported.
304
305### Remove the RNG parameter from RSA verify functions
306
307RSA verification functions also no longer take random generator arguments (this
308was only needed when using a private key). This affects all applications using
309the RSA verify functions.
310
311### Remove MD2, MD4, RC4, Blowfish and XTEA algorithms
312
313This change affects users of the MD2, MD4, RC4, Blowfish and XTEA algorithms.
314
315They are already niche or obsolete and most of them are weak or broken. For
316those reasons possible users should consider switching to modern and safe
317alternatives to be found in literature.
318
319### Deprecated functions were removed from AES
320
321The functions `mbedtls_aes_encrypt()` and `mbedtls_aes_decrypt()` were
322removed.
323
324If you're simply using the AES module, you should be calling the higher-level
325functions `mbedtls_aes_crypt_xxx()`.
326
327If you're providing an alternative implementation using
328`MBEDTLS_AES_ENCRYPT_ALT` or `MBEDTLS_AES_DECRYPT_ALT`, you should be
329replacing the removed functions with `mbedtls_internal_aes_encrypt()` and
330`mbedtls_internal_aes_decrypt()` respectively.
331
332### Deprecated functions were removed from cipher
333
334The functions `mbedtls_cipher_auth_encrypt()` and
335`mbedtls_cipher_auth_decrypt()` were removed. They were superseded by
336`mbedtls_cipher_auth_encrypt_ext()` and `mbedtls_cipher_auth_decrypt_ext()`
337respectively which additionally support key wrapping algorithms such as
338NIST_KW.
339
340### Deprecated functions were removed from ECDSA
341
342The functions `mbedtls_ecdsa_write_signature_det()` and
343`mbedtls_ecdsa_sign_det()` were removed. They were superseded by
344`mbedtls_ecdsa_write_signature()` and `mbedtls_ecdsa_sign_det_ext()`
345respectively.
346
347### Extra parameter for the output buffer size
348
349The following functions now take an extra parameter indicating the size of the output buffer:
350
351* `mbedtls_ecdsa_write_signature()`, `mbedtls_ecdsa_write_signature_restartable()`
352* `mbedtls_pk_sign()`, `mbedtls_pk_sign_restartable()`
353
354The requirements for the output buffer have not changed, but passing a buffer that is too small now reliably causes the functions to return an error, rather than overflowing the buffer.
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100355
Dave Rodgmana0e8db02021-06-29 18:05:38 +0100356### Rename mbedtls_*_ret() cryptography functions whose deprecated variants have been removed
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100357
358This change affects users who were using the `mbedtls_*_ret()` cryptography
359functions.
360
361Those functions were created based on now-deprecated functions according to a
362requirement that a function needs to return a value. This change brings back the
363original names of those functions. The renamed functions are:
364
365| name before this change | after the change |
366|------------------------------|--------------------------|
367| mbedtls_ctr_drbg_update_ret | mbedtls_ctr_drbg_update |
368| mbedtls_hmac_drbg_update_ret | mbedtls_hmac_drbg_update |
369| mbedtls_md5_starts_ret | mbedtls_md5_starts |
370| mbedtls_md5_update_ret | mbedtls_md5_update |
371| mbedtls_md5_finish_ret | mbedtls_md5_finish |
372| mbedtls_md5_ret | mbedtls_md5 |
373| mbedtls_ripemd160_starts_ret | mbedtls_ripemd160_starts |
374| mbedtls_ripemd160_update_ret | mbedtls_ripemd160_update |
375| mbedtls_ripemd160_finish_ret | mbedtls_ripemd160_finish |
376| mbedtls_ripemd160_ret | mbedtls_ripemd160 |
377| mbedtls_sha1_starts_ret | mbedtls_sha1_starts |
378| mbedtls_sha1_update_ret | mbedtls_sha1_update |
379| mbedtls_sha1_finish_ret | mbedtls_sha1_finish |
380| mbedtls_sha1_ret | mbedtls_sha1 |
381| mbedtls_sha256_starts_ret | mbedtls_sha256_starts |
382| mbedtls_sha256_update_ret | mbedtls_sha256_update |
383| mbedtls_sha256_finish_ret | mbedtls_sha256_finish |
384| mbedtls_sha256_ret | mbedtls_sha256 |
385| mbedtls_sha512_starts_ret | mbedtls_sha512_starts |
386| mbedtls_sha512_update_ret | mbedtls_sha512_update |
387| mbedtls_sha512_finish_ret | mbedtls_sha512_finish |
388| mbedtls_sha512_ret | mbedtls_sha512 |
389
390To migrate to the this change the user can keep the `*_ret` names in their code
391and include the `compat_2.x.h` header file which holds macros with proper
392renaming or to rename those function in their code according to the list from
393mentioned header file.
394
Dave Rodgmana0e8db02021-06-29 18:05:38 +0100395### Signature functions now require the hash length to match the expected value
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100396
397This affects users of the PK API as well as users of the low-level API in the RSA module. Users of the PSA API or of the ECDSA module are unaffected.
398
399All the functions in the RSA module that accept a `hashlen` parameter used to
400ignore it unless the `md_alg` parameter was `MBEDTLS_MD_NONE`, indicating raw
401data was signed. The `hashlen` parameter is now always the size that is read
402from the `hash` input buffer. This length must be equal to the output size of
403the hash algorithm used when signing a hash. (The requirements when signing
404raw data are unchanged.) This affects the following functions:
405
406* `mbedtls_rsa_pkcs1_sign`, `mbedtls_rsa_pkcs1_verify`
407* `mbedtls_rsa_rsassa_pkcs1_v15_sign`, `mbedtls_rsa_rsassa_pkcs1_v15_verify`
408* `mbedtls_rsa_rsassa_pss_sign`, `mbedtls_rsa_rsassa_pss_verify`
409* `mbedtls_rsa_rsassa_pss_sign_ext`, `mbedtls_rsa_rsassa_pss_verify_ext`
410
411The signature functions in the PK module no longer accept 0 as the `hash_len` parameter. The `hash_len` parameter is now always the size that is read from the `hash` input buffer. This affects the following functions:
412
413* `mbedtls_pk_sign`, `mbedtls_pk_verify`
414* `mbedtls_pk_sign_restartable`, `mbedtls_pk_verify_restartable`
415* `mbedtls_pk_verify_ext`
416
417The migration path is to pass the correct value to those functions.
Dave Rodgman759c0102021-06-29 15:55:08 +0100418
Dave Rodgmana0e8db02021-06-29 18:05:38 +0100419### Remove the padding parameters from mbedtls_rsa_init()
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100420
421This affects all users who use the RSA encryption, decryption, sign and
422verify APIs.
423
424The function mbedtls_rsa_init() no longer supports selecting the PKCS#1 v2.1
425encoding and its hash. It just selects the PKCS#1 v1.5 encoding by default. If
426you were using the PKCS#1 v2.1 encoding you now need, subsequently to the call
427to mbedtls_rsa_init(), to call mbedtls_rsa_set_padding() to set it.
428
429To choose the padding type when initializing a context, instead of
Dave Rodgman30dc6032021-06-29 22:20:58 +0100430
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100431```C
432 mbedtls_rsa_init(ctx, padding, hash_id);
433```
Dave Rodgman30dc6032021-06-29 22:20:58 +0100434
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100435, use
Dave Rodgman30dc6032021-06-29 22:20:58 +0100436
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100437```C
438 mbedtls_rsa_init(ctx);
439 mbedtls_rsa_set_padding(ctx, padding, hash_id);
440```
441
442To use PKCS#1 v1.5 padding, instead of
Dave Rodgman30dc6032021-06-29 22:20:58 +0100443
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100444```C
445 mbedtls_rsa_init(ctx, MBEDTLS_RSA_PKCS_V15, <ignored>);
446```
Dave Rodgman30dc6032021-06-29 22:20:58 +0100447
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100448, just use
Dave Rodgman30dc6032021-06-29 22:20:58 +0100449
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100450```C
451 mbedtls_rsa_init(ctx);
452```
Dave Rodgman759c0102021-06-29 15:55:08 +0100453
Dave Rodgman30dc6032021-06-29 22:20:58 +0100454### SHA-512 and SHA-256 output type change
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100455
Dave Rodgman30dc6032021-06-29 22:20:58 +0100456The output parameter of `mbedtls_sha256_finish_ret()`, `mbedtls_sha256_ret()`, `mbedtls_sha512_finish_ret()`, `mbedtls_sha512_ret()` now has a pointer type rather than array type. This makes no difference in terms of C semantics, but removes spurious warnings in some compilers when outputting a SHA-384 hash into a 48-byte buffer or a SHA-224 hash into a 28-byte buffer.
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100457
Dave Rodgman30dc6032021-06-29 22:20:58 +0100458This makes no difference to a vast majority of applications. If your code takes a pointer to one of these functions, you may need to change the type of the pointer.
459
460Alternative implementations of the SHA256 and SHA512 modules must adjust their functions' prototype accordingly.
461
462### Some function parameters were made const
463
464Various functions in the PK and ASN.1 modules had a `const` qualifier added to
465some of their parameters.
466
467This normally doesn't affect your code, unless you use pointers to reference
468those functions. In this case, you'll need to update the type of your pointers
469in order to match the new signature.
470
471
472
473## PSA
474
475### Deprecated names for PSA constants and types were removed
476
477Some constants and types that were present in beta versions of the PSA Crypto
478API were removed from version 1.0 of specification. Please switch to the new
479names provided by the 1.0 specification instead.
480
481
482
483## The ALT interface
484
485### Internal / alt-focused headers were moved to a private location
486
487This shouldn't affect users who took care not to include headers that
488were documented as internal, despite being in the public include directory.
489
490If you're providing alt implementations of ECP or RSA, you'll need to add our
491`library` directory to your include path when building your alt
492implementations, and note that `ecp_internal.h` and `rsa_internal.h` have been
493renamed to `ecp_internal_alt.h` and `rsa_alt_helpers.h` respectively.
494
495If you're a library user and used to rely on having access to a structure or
496function that's now in a private header, please reach out on the mailing list
497and explain your need; we'll consider adding a new API in a future version.
498
499### CCM interface changes: impact for alternative implementations
500
501The CCM interface has changed with the addition of support for
502multi-part operations. Five new API functions have been defined:
503mbedtls_ccm_starts(), mbedtls_ccm_set_lengths(),
504mbedtls_ccm_update_ad(), mbedtls_ccm_update() and mbedtls_ccm_finish().
505Alternative implementations of CCM (`MBEDTLS_CCM_ALT`) have now to
506implement those additional five API functions.
507
508
509
510## X.509
511
512### Strengthen default algorithm selection for X.509 and TLS
513
514The default X.509 verification profile (`mbedtls_x509_crt_profile_default`) and the default curve and hash selection in TLS have changed. They are now aligned, except that the X.509 profile only lists curves that support signature verification.
515
516Hashes and curves weaker than 255 bits (security strength less than 128 bits) are no longer accepted by default. The following hashes have been removed: SHA-1 (formerly only accepted for key exchanges but not for certificate signatures), SHA-224 (weaker hashes were already not accepted). The following curves have been removed: secp192r1, secp224r1, secp192k1, secp224k1.
517
518The compile-time options `MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES` and `MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_KEY_EXCHANGE` are no longer available.
519
520The curve secp256k1 has also been removed from the default X.509 and TLS profiles. [RFC 8422](https://datatracker.ietf.org/doc/html/rfc8422#section-5.1.1) deprecates it in TLS, and it is very rarely used, although it is not known to be weak at the time of writing.
521
522If you still need to accept certificates signed with algorithms that have been removed from the default profile, call `mbedtls_x509_crt_verify_with_profile` instead of `mbedtls_x509_crt_verify` and pass a profile that allows the curves and hashes you want. For example, to allow SHA-224:
523```
524mbedtls_x509_crt_profile my_profile = mbedtls_x509_crt_profile_default;
525my_profile.allowed_mds |= MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA224 );
526```
527
528If you still need to allow hashes and curves in TLS that have been removed from the default configuration, call `mbedtls_ssl_conf_sig_hashes()` and `mbedtls_ssl_conf_curves()` with the desired lists.
529
530### Remove the certs module from the library
531
532This should not affect production use of the library, as the certificates and
533keys included there were never suitable for production use.
534
535However it might affect you if you relied on them for testing purposes. In
536that case, please embed your own test certificates in your test code; now that
537`certs.c` is out of the library there is no longer any stability guaranteed
538and it may change in incompatible ways at any time.
539
540### Change the API to allow adding critical extensions to CSRs
541
542This affects applications that call the `mbedtls_x509write_csr_set_extension`
543function.
544
545The API is changed to include the parameter `critical` which allow to mark an
546extension included in a CSR as critical. To get the previous behavior pass 0.
547
548### Remove the config option MBEDTLS_X509_ALLOW_UNSUPPORTED_CRITICAL_EXTENSION
549
550This change does not affect users of the default configuration; it only affects
551users who enable this option.
552
553The X.509 standard says that implementations must reject critical extensions that
554they don't recognize, and this is what Mbed TLS does by default. This option
555allowed to continue parsing those certificates but didn't provide a convenient
556way to handle those extensions.
557
558The migration path from that option is to use the
559`mbedtls_x509_crt_parse_der_with_ext_cb()` function which is functionally
560equivalent to `mbedtls_x509_crt_parse_der()`, and/or
561`mbedtls_x509_crt_parse_der_nocopy()` but it calls the callback with every
562unsupported certificate extension and additionally the "certificate policies"
563extension if it contains any unsupported certificate policies.
564
565### Remove `MBEDTLS_X509_CHECK_*_KEY_USAGE` options from `mbedtls_config.h`
566
567This change affects users who have chosen the configuration options to disable the
568library's verification of the `keyUsage` and `extendedKeyUsage` fields of x509
569certificates.
570
571The `MBEDTLS_X509_CHECK_KEY_USAGE` and `MBEDTLS_X509_CHECK_EXTENDED_KEY_USAGE`
572configuration options are removed and the X509 code now behaves as if they were
573always enabled. It is consequently not possible anymore to disable at compile
574time the verification of the `keyUsage` and `extendedKeyUsage` fields of X509
575certificates.
576
577The verification of the `keyUsage` and `extendedKeyUsage` fields is important,
578disabling it can cause security issues and it is thus not recommended. If the
579verification is for some reason undesirable, it can still be disabled by means
580of the verification callback function passed to `mbedtls_x509_crt_verify()` (see
581the documentation of this function for more information).
582
583### Remove the `MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3` option
584
585This change does not affect users who were using the default configuration, as
586this option was already disabled by default. Also, it does not affect users who
587are working with current V3 X.509 certificates.
588
589Extensions were added in V3 of the X.509 specification, so pre-V3 certificates
590containing extensions were never compliant. Mbed TLS now rejects them with a
591parsing error in all configurations, as it did previously in the default
592configuration.
593
594If you are working with the pre-V3 certificates you need to switch to the
595current ones.
596
597
598
599## SSL
600
601### Remove support for TLS 1.0, 1.1 and DTLS 1.0
602
603This change affects users of the TLS 1.0, 1.1 and DTLS 1.0 protocols.
604
605These versions have been deprecated by RFC 8996.
606Keeping them in the library creates opportunities for misconfiguration
607and possibly downgrade attacks. More generally, more code means a larger attack
608surface, even if the code is supposedly not used.
609
610The migration path is to adopt the latest versions of the protocol.
611
612As a consequence of removing TLS 1.0, support for CBC record splitting was
613also removed, as it was a work-around for a weakness in this particular
614version. There is no migration path since the feature is no longer relevant.
615
616As a consequence of currently supporting only one version of (D)TLS (and in the
617future 1.3 which will have a different version negotiation mechanism), support
618for fallback SCSV (RFC 7507) was also removed. There is no migration path as
619it's no longer useful with TLS 1.2 and later.
620
621As a consequence of currently supporting only one version of (D)TLS (and in the
622future 1.3 which will have a different concept of ciphersuites), support for
623configuring ciphersuites separately for each version via
624`mbedtls_ssl_conf_ciphersuites_for_version()` was removed. Use
625`mbedtls_ssl_conf_ciphersuites()` to configure ciphersuites to use with (D)TLS
6261.2; in the future a different API will be added for (D)TLS 1.3.
627
628### Remove support for SSL 3.0
629
630This doesn't affect people using the default configuration as it was already
631disabled by default.
632
633This only affects TLS users who explicitly enabled `MBEDTLS_SSL_PROTO_SSL3`
634and relied on that version in order to communicate with peers that are not up
635to date. If one of your peers is in that case, please try contacting them and
636encouraging them to upgrade their software.
637
638### Remove support for parsing SSLv2 ClientHello
639
640This doesn't affect people using the default configuration as it was already
641disabled by default.
642
643This only affects TLS servers that have clients who send an SSLv2 ClientHello.
644These days clients are very unlikely to do that. If you have a client that
645does, please try contacting them and encouraging them to upgrade their
646software.
647
648### Remove support for truncated HMAC
649
650This affects users of truncated HMAC, that is, users who called
651`mbedtls_ssl_conf_truncated_hmac( ..., MBEDTLS_SSL_TRUNC_HMAC_ENABLED)`,
652regardless of whether the standard version was used or compatibility version
653(`MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT`).
654
655The recommended migration path for people who want minimal overhead is to use a
656CCM-8 ciphersuite.
657
658### Remove support for TLS record-level compression
659
660This doesn't affect people using the default configuration as it was already
661disabled by default.
662
663This only affects TLS users who enabled `MBEDTLS_ZLIB_SUPPORT`. This will not
664cause any failures however if you used to enable TLS record-level compression
665you may find that your bandwidth usage increases without compression. There's
666no general solution to this problem; application protocols might have their
667own compression mechanisms and are in a better position than the TLS stack to
668avoid variants of the CRIME and BREACH attacks.
669
670### Remove support for TLS RC4-based ciphersuites
671
672This does not affect people who used the default `mbedtls_config.h` and the default
673list of ciphersuites, as RC4-based ciphersuites were already not negotiated in
674that case.
675
676Please switch to any of the modern, recommended ciphersuites (based on
677AES-GCM, AES-CCM or ChachaPoly for example) and if your peer doesn't support
678any, encourage them to upgrade their software.
679
680### Remove support for TLS single-DES ciphersuites
681
682This doesn't affect people using the default configuration as it was already
683disabled by default.
684
685Please switch to any of the modern, recommended ciphersuites (based on
686AES-GCM, AES-CCM or ChachaPoly for example) and if your peer doesn't support
687any, encourage them to upgrade their software.
688
689### Remove support for TLS record-level hardware acceleration
690
691This doesn't affect people using the default configuration as it was already
692disabled by default.
693
694This feature had been broken for a while so we doubt anyone still used it.
695However if you did, please reach out on the mailing list and let us know about
696your use case.
697
698### Remove config option `MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME`
699
700This doesn't affect people using the default configuration.
701
702This option has not had any effect for a long time. Please use the `lifetime`
703parameter of `mbedtls_ssl_ticket_setup()` instead.
704
705### Remove helpers for the transition from Mbed TLS 1.3 to Mbed TLS 2.0
706
707This only affects people who've been using Mbed TLS since before version 2.0
708and still relied on `compat-1.3.h` in their code.
709
710Please use the new names directly in your code; `scripts/rename.pl` (from any
711of the 2.x releases — no longer included in 3.0) might help you do that.
712
713### Combine the `MBEDTLS_SSL_CID_PADDING_GRANULARITY` and `MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY` options
714
715This change affects users who modified the default `mbedtls_config.h` padding granularity
716settings, i.e. enabled at least one of the options.
717
718The `mbedtls_config.h` options `MBEDTLS_SSL_CID_PADDING_GRANULARITY` and
719`MBEDTLS_SSL_TLS1_3_PADDING_GRANULARITY` were combined into one option because
720they used exactly the same padding mechanism and hence their respective padding
721granularities can be used in exactly the same way. This change simplifies the
722code maintenance.
723
724The new single option `MBEDTLS_SSL_CID_TLS1_3_PADDING_GRANULARITY` can be used
725for both DTLS-CID and TLS 1.3.
726
727### TLS now favors faster curves over larger curves
728
729The default preference order for curves in TLS now favors resource usage (performance and memory consumption) over size. The exact order is unspecified and may change, but generally you can expect 256-bit curves to be preferred over larger curves.
730
731If you prefer a different order, call `mbedtls_ssl_conf_curves()` when configuring a TLS connection.
732
733### SSL key export interface change
734
735This affects users of the SSL key export APIs:
736```
737 mbedtls_ssl_conf_export_keys_cb()
738 mbedtls_ssl_conf_export_keys_ext_cb()
739```
740
741Those APIs have been removed and replaced by the new API
742`mbedtls_ssl_set_export_keys_cb()`. This API differs from
743the previous key export API in the following ways:
744
745- It is no longer bound to an SSL configuration, but to an
746 SSL context. This allows users to more easily identify the
747 connection an exported key belongs to.
748- It no longer exports raw keys and IV.
749- A secret type parameter has been added to identify which key
750 is being exported. For TLS 1.2, only the master secret is
751 exported, but upcoming TLS 1.3 support will add other kinds of keys.
752- The callback now specifies a void return type, rather than
753 returning an error code. It is the responsibility of the application
754 to handle failures in the key export callback, for example by
755 shutting down the TLS connection.
756
757For users which do not rely on raw keys and IV, adjusting to the new
758callback type should be straightforward — see the example programs
759`programs/ssl/ssl_client2` and `programs/ssl/ssl_server2` for callbacks
760for NSSKeylog, EAP-TLS and DTLS-SRTP.
761
762Users which require access to the raw keys used to secure application
763traffic may derive those by hand based on the master secret and the
764handshake transcript hashes which can be obtained from the raw data
765on the wire. Such users are also encouraged to reach out to the
766Mbed TLS team on the mailing list, to let the team know about their
767use case.
768
769### Remove MaximumFragmentLength (MFL) query API
770
771This affects users which use the MFL query APIs
772`mbedtls_ssl_get_{input,output}_max_frag_len()` to
773infer upper bounds on the plaintext size of incoming and
774outgoing record.
775
776Users should switch to `mbedtls_ssl_get_max_{in,out}_record_payload()`
777instead, which also provides such upper bounds but takes more factors
778than just the MFL configuration into account.
779
780### Relaxed semantics for PSK configuration
781
782This affects users which call the PSK configuration APIs
783`mbedtlsl_ssl_conf_psk()` and `mbedtls_ssl_conf_psk_opaque()`
784multiple times on the same SSL configuration.
785
786In Mbed TLS 2.x, users would observe later calls overwriting
787the effect of earlier calls, with the prevailing PSK being
788the one that has been configured last. In Mbed TLS 3.0,
789calling `mbedtls_ssl_conf_[opaque_]psk()` multiple times
790will return an error, leaving the first PSK intact.
791
792To achieve equivalent functionality when migrating to Mbed TLS 3.0,
793users calling `mbedtls_ssl_conf_[opaque_]psk()` multiple times should
794remove all but the last call, so that only one call to _either_
795`mbedtls_ssl_conf_psk()` _or_ `mbedtls_ssl_conf_psk_opaque()`
796remains.
797
798### Remove the configuration to enable weak ciphersuites in SSL / TLS
799
800This does not affect users who use the default `mbedtls_config.h`, as this option was
801already off by default.
802
803If you were using a weak cipher, please switch to any of the modern,
804recommended ciphersuites (based on AES-GCM, AES-CCM or ChachaPoly for example)
805and if your peer doesn't support any, encourage them to upgrade their software.
806
807If you were using a ciphersuite without encryption, you just have to
808enable MBEDTLS_CIPHER_NULL_CIPHER now.
809
810### Remove the `MBEDTLS_SSL_MAX_CONTENT_LEN` configuration option
811
812This affects users who use the `MBEDTLS_SSL_MAX_CONTENT_LEN` option to
813set the maximum length of incoming and outgoing plaintext fragments,
814which can save memory by reducing the size of the TLS I/O buffers.
815
816This option is replaced by the more fine-grained options
817`MBEDTLS_SSL_IN_CONTENT_LEN` and `MBEDTLS_SSL_OUT_CONTENT_LEN` that set
818the maximum incoming and outgoing plaintext fragment lengths, respectively.
819
820### Remove the SSL API `mbedtls_ssl_get_session_pointer()`
821
822This affects two classes of users:
823
8241. Users who manually inspect parts of the current session through
825 direct structure field access.
826
8272. Users of session resumption who query the current session
828 via `mbedtls_ssl_get_session_pointer()` prior to saving or exporting
829 it via `mbedtls_ssl_session_copy()` or `mbedtls_ssl_session_save()`,
830 respectively.
831
832Migration paths:
833
8341. Mbed TLS 3.0 does not offer a migration path for the use case 1: Like many
835 other Mbed TLS structures, the structure of `mbedtls_ssl_session` is no
836 longer part of the public API in Mbed TLS 3.0, and direct structure field
837 access is no longer supported. Please see the corresponding migration guide.
838
8392. Users should replace calls to `mbedtls_ssl_get_session_pointer()` by
840 calls to `mbedtls_ssl_get_session()` as demonstrated in the example
841 program `programs/ssl/ssl_client2.c`.
842
843### Remove `MBEDTLS_SSL_DTLS_BADMAC_LIMIT` option
844
845This change does not affect users who used the default `mbedtls_config.h`, as the option
846MBEDTLS_SSL_DTLS_BADMAC_LIMIT was already on by default.
847
848This option was a trade-off between functionality and code size: it allowed
849users who didn't need that feature to avoid paying the cost in code size, by
850disabling it.
851
852This option is no longer present, but its functionality is now always enabled.
853
854### Deprecated functions were removed from SSL
855
856The function `mbedtls_ssl_conf_dh_param()` was removed. Please use
857`mbedtls_ssl_conf_dh_param_bin()` or `mbedtls_ssl_conf_dh_param_ctx()` instead.
858
859The function `mbedtls_ssl_get_max_frag_len()` was removed. Please use
860`mbedtls_ssl_get_max_out_record_payload()` and
861`mbedtls_ssl_get_max_in_record_payload()`
862instead.
863
864### Remove `MBEDTLS_SSL_RECORD_CHECKING` option and enable its action by default
865
866This change does not affect users who use the default mbedtls_config.h, as the
867option MBEDTLS_SSL_RECORD_CHECKING was already on by default.
868
869This option was added only to control compilation of one function,
870mbedtls_ssl_check_record(), which is only useful in some specific cases, so it
871was made optional to allow users who don't need it to save some code space.
872However, the same effect can be achieve by using link-time garbage collection.
873
874Users who changed the default setting of the option need to change the config/
875build system to remove that change.
Dave Rodgman759c0102021-06-29 15:55:08 +0100876
Dave Rodgmana0e8db02021-06-29 18:05:38 +0100877### Session Cache API Change
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100878
879This affects users who use `mbedtls_ssl_conf_session_cache()`
880to configure a custom session cache implementation different
881from the one Mbed TLS implements in `library/ssl_cache.c`.
882
883Those users will need to modify the API of their session cache
884implementation to that of a key-value store with keys being
885session IDs and values being instances of `mbedtls_ssl_session`:
886
887```
888typedef int mbedtls_ssl_cache_get_t( void *data,
889 unsigned char const *session_id,
890 size_t session_id_len,
891 mbedtls_ssl_session *session );
892typedef int mbedtls_ssl_cache_set_t( void *data,
893 unsigned char const *session_id,
894 size_t session_id_len,
895 const mbedtls_ssl_session *session );
896```
897
898Since the structure of `mbedtls_ssl_session` is no longer public from 3.0
899onwards, portable session cache implementations must not access fields of
900`mbedtls_ssl_session`. See the corresponding migration guide. Users that
901find themselves unable to migrate their session cache functionality without
Dave Rodgman759c0102021-06-29 15:55:08 +0100902accessing fields of `mbedtls_ssl_session` should describe their use case
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100903on the Mbed TLS mailing list.
Dave Rodgman759c0102021-06-29 15:55:08 +0100904
Dave Rodgmana0e8db02021-06-29 18:05:38 +0100905### Removal of some SSL error codes
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100906
907This affects users manually checking for the following error codes:
Dave Rodgman759c0102021-06-29 15:55:08 +0100908
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100909- `MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED`
910- `MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH`
911- `MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE`
912- `MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN`
913- `MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE`
914- `MBEDTLS_ERR_SSL_BAD_HS_XXX`
915
916Migration paths:
917- `MBEDTLS_ERR_SSL_CERTIFICATE_REQUIRED` and `MBEDTLS_ERR_SSL_INVALID_VERIFY_HASH`
918 should never be returned from Mbed TLS, and there is no need to check for it.
Dave Rodgman759c0102021-06-29 15:55:08 +0100919
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100920 Users should simply remove manual checks for those codes, and let the Mbed TLS
Dave Rodgman949c21b2021-06-29 18:05:04 +0100921 team know if contrary to the team's understanding — there is in fact a situation
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100922 where one of them was ever returned.
Dave Rodgman759c0102021-06-29 15:55:08 +0100923
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100924- `MBEDTLS_ERR_SSL_CERTIFICATE_TOO_LARGE` has been removed, and
925 `MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL` is returned instead if the user's own certificate
Dave Rodgman759c0102021-06-29 15:55:08 +0100926 is too large to fit into the output buffers.
927
928 Users should check for `MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL` instead, and potentially
929 compare the size of their own certificate against the configured size of the output buffer to
930 understand if the error is due to an overly large certificate.
931
932- `MBEDTLS_ERR_SSL_NO_CIPHER_CHOSEN` and `MBEDTLS_ERR_SSL_NO_USABLE_CIPHERSUITE` have been replaced by `MBEDTLS_ERR_SSL_HANDSHAKE_FAILURE`
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100933
Dave Rodgman759c0102021-06-29 15:55:08 +0100934- all codes of the form `MBEDTLS_ERR_SSL_BAD_HS_XXX` have been replaced by various alternatives.
935
Dave Rodgmand267ec32021-06-29 21:31:58 +0100936### Modified semantics of `mbedtls_ssl_{get,set}_session()`
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100937
938This affects users who call `mbedtls_ssl_get_session()` or
939`mbedtls_ssl_set_session()` multiple times on the same SSL context
940representing an established TLS 1.2 connection.
941Those users will now observe the second call to fail with
942`MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE`.
943
944Migration path:
945- Exporting the same TLS 1.2 connection multiple times via
946 `mbedtls_ssl_get_session()` leads to multiple copies of
947 the same session. This use of `mbedtls_ssl_get_session()`
948 is discouraged, and the following should be considered:
949 * If the various session copies are later loaded into
950 fresh SSL contexts via `mbedtls_ssl_set_session()`,
951 export via `mbedtls_ssl_get_session()` only once and
952 load the same session into different contexts via
953 `mbedtls_ssl_set_session()`. Since `mbedtls_ssl_set_session()`
954 makes a copy of the session that's being loaded, this
955 is functionally equivalent.
956 * If the various session copies are later serialized
957 via `mbedtls_ssl_session_save()`, export and serialize
958 the session only once via `mbedtls_ssl_get_session()` and
959 `mbedtls_ssl_session_save()` and make copies of the raw
960 data instead.
961- Calling `mbedtls_ssl_set_session()` multiple times in Mbed TLS 2.x
962 is not useful since subsequent calls overwrite the effect of previous
Dave Rodgman759c0102021-06-29 15:55:08 +0100963 calls. Applications achieve equivalent functional behavior by
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100964 issuing only the very last call to `mbedtls_ssl_set_session()`.
965
Dave Rodgmand267ec32021-06-29 21:31:58 +0100966### Turn `MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE` configuration option into a runtime option
Dave Rodgman8cccbe12021-06-29 13:15:50 +0100967
968This change affects users who were enabling MBEDTLS_SSL_SRV_RESPECT_CLIENT_PREFERENCE
969option in the `mbedtls_config.h`
970
971This option has been removed and a new function with similar functionality has
972been introduced into the SSL API.
973
974This new function `mbedtls_ssl_conf_preference_order()` can be used to
975change the preferred order of ciphersuites on the server to those used on the client,
976e.g.: `mbedtls_ssl_conf_preference_order(ssl_config, MBEDTLS_SSL_SRV_CIPHERSUITE_ORDER_CLIENT)`
977has the same effect as enabling the removed option. The default state is to use
978the server order of suites.
Dave Rodgmane45e6402021-06-29 13:21:55 +0100979