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