Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 1 | Migrating from Mbed TLS 2.x to Mbed TLS 3.0 |
| 2 | =========================================== |
| 3 | |
| 4 | This guide details the steps required to migrate from Mbed TLS version 2.x to |
| 5 | Mbed TLS version 3.0 or greater. Unlike normal releases, Mbed TLS 3.0 breaks |
| 6 | compatibility with previous versions, so users (and alt implementors) might |
| 7 | need to change their own code in order to make it work with Mbed TLS 3.0. |
| 8 | |
| 9 | Here's the list of breaking changes; each entry should help you answer these |
| 10 | two questions: (1) am I affected? (2) if yes, what's my migration path? |
| 11 | |
| 12 | Some function parameters were made const |
| 13 | ---------------------------------------- |
| 14 | |
| 15 | Various functions in the PK and ASN.1 modules had a `const` qualifier added to |
| 16 | some of their parameters. |
| 17 | |
| 18 | This normally doesn't affect your code, unless you use pointers to reference |
| 19 | those functions. In this case, you'll need to update the type of your pointers |
| 20 | in order to match the new signature. |
| 21 | |
| 22 | Deprecated functions were removed from hashing modules |
| 23 | ------------------------------------------------------ |
| 24 | |
| 25 | Modules: MD2, MD4, MD5, SHA1, SHA256, SHA512, MD. |
| 26 | |
| 27 | - The functions `mbedtls_xxx_starts()`, `mbedtls_xxx_update()`, |
| 28 | `mbedtls_xxx_finish()` and `mbedtls_xxx()` were removed. Please use the |
| 29 | function with the same name with `_ret` appended and check the return value. |
| 30 | - The function `mbedtls_md_init_ctx()` was removed; please use |
| 31 | `mbedtls_md_setup()` instead. |
| 32 | - The functions `mbedtls_xxx_process()` were removed. You normally don't need |
Manuel Pégourié-Gonnard | 143b1e3 | 2021-05-05 09:46:01 +0200 | [diff] [blame^] | 33 | to call that from application code. However if you do (or if you want to |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 34 | provide your own version of that function), please use |
| 35 | `mbedtls_internal_xxx_process()` instead, and check the return value. |
| 36 | |
| 37 | Deprecated error codes for hardware failures were removed |
| 38 | --------------------------------------------------------- |
| 39 | |
| 40 | - The macros `MBEDTLS_ERR_xxx_FEATURE_UNSUPPORTED` from various crypto modules |
| 41 | were removed; `MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED` is now used |
| 42 | instead. |
| 43 | - The macros `MBEDTLS_ERR_xxx_HW_ACCEL_FAILED` from various crypto modules |
| 44 | were removed; `MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED` is now used instead. |
| 45 | |
| 46 | Deprecated names for PSA constants and types were removed |
| 47 | --------------------------------------------------------- |
| 48 | |
Manuel Pégourié-Gonnard | 2960b2e | 2021-04-26 09:57:36 +0200 | [diff] [blame] | 49 | Some constants and types that were present in beta versions of the PSA Crypto |
Manuel Pégourié-Gonnard | 143b1e3 | 2021-05-05 09:46:01 +0200 | [diff] [blame^] | 50 | API were removed from version 1.0 of specification. Please switch to the new |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 51 | names provided by the 1.0 specification instead. |
| 52 | |
| 53 | Internal / alt-focused headers were moved to a private location |
| 54 | ---------------------------------------------------------------- |
| 55 | |
| 56 | This shouldn't affect users who took care not to include headers that |
| 57 | were documented as internal, despite being in the public include directory. |
| 58 | |
| 59 | If you're providing alt implementations of ECP or RSA, you'll need to add our |
| 60 | `library` directory to your include path when building your alt |
| 61 | implementations, and note that `ecp_internal.h` and `rsa_internal.h` have been |
| 62 | renamed to `ecp_alt.h` and `rsa_alt_helpers.h` respectively. |
| 63 | |
| 64 | If you're a library user and used to rely on having access to a structure or |
| 65 | function that's now in a private header, please reach out on the mailing list |
| 66 | and explain your need; we'll consider adding a new API in a future version. |
| 67 | |
| 68 | Remove the option to allow SHA-1 by default in certificates |
| 69 | ----------------------------------------------------------- |
| 70 | |
| 71 | This does not affect users who use the default `config.h`, as this option was |
| 72 | already off by default. |
| 73 | |
| 74 | If you used to enable `MBEDTLS_TLS_DEFAULT_ALLOW_SHA1_IN_CERTIFICATES` in your |
| 75 | `config.h`, first please take a moment to consider whether you really still |
| 76 | want to accept certificates signed with SHA-1 as those are considered insecure |
| 77 | and no CA has issued them for a while. If you really need to allow SHA-1 in |
Manuel Pégourié-Gonnard | e756306 | 2021-04-26 10:08:29 +0200 | [diff] [blame] | 78 | certificates, please set up a custom profile as follows: |
| 79 | |
| 80 | ``` |
| 81 | const mbedtls_x509_crt_profile mbedtls_x509_crt_custom = { |
| 82 | MBEDTLS_X509_ID_FLAG( MBEDTLS_MD_SHA1 ) | |
| 83 | MBEDTLS_X509_ID_FLAG( /* other hash */ ) /* | etc */, |
| 84 | 0xFFFFFFF, /* Or specific PK algs */ |
| 85 | 0xFFFFFFF, /* Or specific curves */ |
| 86 | 2048 /* Or another RSA min bitlen */ |
| 87 | }; |
| 88 | ``` |
| 89 | Then pass it to `mbedtls_x509_crt_verify_with_profile()` if you're verifying |
| 90 | a certificate chain directly, or to `mbedtls_ssl_conf_cert_profile()` if the |
| 91 | verification happens during a TLS handshake. |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 92 | |
| 93 | Remove the certs module from the library |
| 94 | ---------------------------------------- |
| 95 | |
| 96 | This should not affect production use of the library, as the certificates and |
| 97 | keys included there were never suitable for production use. |
| 98 | |
| 99 | However it might affect you if you relied on them for testing purposes. In |
| 100 | that case, please embed your own test certificates in your test code; now that |
| 101 | `certs.c` is out of the library there is no longer any stability guaranteed |
| 102 | and it may change in incompatible ways at any time. |
| 103 | |
| 104 | Remove the HAVEGE module |
| 105 | ------------------------ |
| 106 | |
| 107 | This doesn't affect people using the default configuration as it was already |
| 108 | disabled by default. |
| 109 | |
| 110 | This only affects users who called the HAVEGE modules directly (not |
Manuel Pégourié-Gonnard | 143b1e3 | 2021-05-05 09:46:01 +0200 | [diff] [blame^] | 111 | recommended), or users who used it through the entropy module but had it as the |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 112 | only source of entropy. If you're in that case, please declare OS or hardware |
| 113 | RNG interfaces with `mbedtls_entropy_add_source()` and/or use an entropy seed |
| 114 | file created securely during device provisioning. See |
| 115 | <https://tls.mbed.org/kb/how-to/add-entropy-sources-to-entropy-pool> for more |
| 116 | information. |
| 117 | |
| 118 | Remove support for parsing SSLv2 ClientHello |
| 119 | -------------------------------------------- |
| 120 | |
| 121 | This doesn't affect people using the default configuration as it was already |
| 122 | disabled by default. |
| 123 | |
Manuel Pégourié-Gonnard | 143b1e3 | 2021-05-05 09:46:01 +0200 | [diff] [blame^] | 124 | This only affects TLS servers that have clients who send an SSLv2 ClientHello. |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 125 | These days clients are very unlikely to do that. If you have a client that |
| 126 | does, please try contacting them and encouraging them to upgrade their |
| 127 | software. |
| 128 | |
| 129 | Remove support for SSL 3.0 |
| 130 | -------------------------- |
| 131 | |
| 132 | This doesn't affect people using the default configuration as it was already |
| 133 | disabled by default. |
| 134 | |
| 135 | This only affects TLS users who explicitly enabled `MBEDTLS_SSL_PROTO_SSL3` |
| 136 | and relied on that version in order to communicate with peers that are not up |
Manuel Pégourié-Gonnard | 143b1e3 | 2021-05-05 09:46:01 +0200 | [diff] [blame^] | 137 | to date. If one of your peers is in that case, please try contacting them and |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 138 | encouraging them to upgrade their software. |
| 139 | |
| 140 | Remove support for compatibility with old Mbed TLS's truncated HMAC |
| 141 | ------------------------------------------------------------------- |
| 142 | |
| 143 | This doesn't affect people using the default configuration as it was already |
| 144 | disabled by default. |
| 145 | |
Manuel Pégourié-Gonnard | 143b1e3 | 2021-05-05 09:46:01 +0200 | [diff] [blame^] | 146 | This only affects TLS users who enabled `MBEDTLS_SSL_TRUNCATED_HMAC_COMPAT` and |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 147 | used the Truncated HMAC extension to communicate with peers using old version |
| 148 | of Mbed TLS. Please consider using a CCM-8 ciphersuite instead of the |
Manuel Pégourié-Gonnard | 143b1e3 | 2021-05-05 09:46:01 +0200 | [diff] [blame^] | 149 | Truncated HMAC extension, or convincing your peer to upgrade their version of |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 150 | Mbed TLS. |
| 151 | |
| 152 | Remove support for TLS record-level compression |
| 153 | ----------------------------------------------- |
| 154 | |
| 155 | This doesn't affect people using the default configuration as it was already |
| 156 | disabled by default. |
| 157 | |
| 158 | This only affects TLS users who enabled `MBEDTLS_ZLIB_SUPPORT`. This will not |
| 159 | cause any failures however if you used to enable TLS record-level compression |
| 160 | you may find that your bandwidth usage increases without compression. There's |
| 161 | no general solution to this problem; application protocols might have their |
| 162 | own compression mechanisms and are in a better position than the TLS stack to |
| 163 | avoid variants of the CRIME and BREACH attacks. |
| 164 | |
| 165 | Remove support for TLS RC4-based ciphersuites |
| 166 | --------------------------------------------- |
| 167 | |
| 168 | This does not affect people who used the default `config.h` and the default |
Manuel Pégourié-Gonnard | 2960b2e | 2021-04-26 09:57:36 +0200 | [diff] [blame] | 169 | list of ciphersuites, as RC4-based ciphersuites were already not negotiated in |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 170 | that case. |
| 171 | |
| 172 | Please switch to any of the modern, recommended ciphersuites (based on |
| 173 | AES-GCM, AES-CCM or ChachaPoly for example) and if your peer doesn't support |
| 174 | any, encourage them to upgrade their software. |
| 175 | |
| 176 | Remove support for TLS single-DES ciphersuites |
| 177 | ---------------------------------------------- |
| 178 | |
| 179 | This doesn't affect people using the default configuration as it was already |
| 180 | disabled by default. |
| 181 | |
| 182 | Please switch to any of the modern, recommended ciphersuites (based on |
| 183 | AES-GCM, AES-CCM or ChachaPoly for example) and if your peer doesn't support |
| 184 | any, encourage them to upgrade their software. |
| 185 | |
| 186 | Remove support for TLS record-level hardware acceleration |
| 187 | --------------------------------------------------------- |
| 188 | |
| 189 | This doesn't affect people using the default configuration as it was already |
| 190 | disabled by default. |
| 191 | |
| 192 | This feature had been broken for a while so we doubt anyone still used it. |
| 193 | However if you did, please reach out on the mailing list and let us know about |
| 194 | your use case. |
| 195 | |
| 196 | Remove wrapper for libpkcs11-helper |
| 197 | ----------------------------------- |
| 198 | |
| 199 | This doesn't affect people using the default configuration as it was already |
| 200 | disabled by default. |
| 201 | |
| 202 | If you used to rely on this module in order to store your private keys |
| 203 | securely, please have a look at the key management facilities provided by the |
| 204 | PSA crypto API. If you have a use case that's not covered yet by this API, |
| 205 | please reach out on the mailing list. |
| 206 | |
| 207 | Remove config option `MBEDTLS_SSL_DEFAULT_TICKET_LIFETIME` |
| 208 | ---------------------------------------------------------- |
| 209 | |
| 210 | This doesn't affect people using the default configuration. |
| 211 | |
Manuel Pégourié-Gonnard | 57e93e5 | 2021-04-26 09:59:47 +0200 | [diff] [blame] | 212 | This option has not had any effect for a long time. Please use the `lifetime` |
Manuel Pégourié-Gonnard | 89d4ab0 | 2021-04-23 11:54:27 +0200 | [diff] [blame] | 213 | parameter of `mbedtls_ssl_ticket_setup()` instead. |
| 214 | |
| 215 | Remove helpers for the transition from Mbed TLS 1.3 to Mbed TLS 2.0 |
| 216 | ------------------------------------------------------------------- |
| 217 | |
| 218 | This only affects people who've been using Mbed TLS since before version 2.0 |
| 219 | and still relied on `compat-1.3.h` in their code. |
| 220 | |
| 221 | Please use the new names directly in your code; `scripts/rename.pl` (from any |
| 222 | of the 2.x releases - no longer included in 3.0) might help you do that. |