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