Home | History | Annotate | Download | only in src
      1 # Porting from OpenSSL to BoringSSL
      2 
      3 BoringSSL is an OpenSSL derivative and is mostly source-compatible, for the
      4 subset of OpenSSL retained. Libraries ideally need little to no changes for
      5 BoringSSL support, provided they do not use removed APIs. In general, see if the
      6 library compiles and, on failure, consult the documentation in the header files
      7 and see if problematic features can be removed.
      8 
      9 In some cases, BoringSSL-specific code may be necessary. In that case, the
     10 `OPENSSL_IS_BORINGSSL` preprocessor macro may be used in `#ifdef`s. This macro
     11 should also be used in lieu of the presence of any particular function to detect
     12 OpenSSL vs BoringSSL in configure scripts, etc., where those are necessary.
     13 Before using the preprocessor, however, contact the BoringSSL maintainers about
     14 the missing APIs. If not an intentionally removed feature, BoringSSL will
     15 typically add compatibility functions for convenience.
     16 
     17 For convenience, BoringSSL defines upstream's `OPENSSL_NO_*` feature macros
     18 corresponding to removed features. These may also be used to disable code which
     19 uses a removed feature.
     20 
     21 Note: BoringSSL does *not* have a stable API or ABI. It must be updated with its
     22 consumers. It is not suitable for, say, a system library in a traditional Linux
     23 distribution. For instance, Chromium statically links the specific revision of
     24 BoringSSL it was built against. Likewise, Android's system-internal copy of
     25 BoringSSL is not exposed by the NDK and must not be used by third-party
     26 applications.
     27 
     28 
     29 ## Major API changes
     30 
     31 ### Integer types
     32 
     33 Some APIs have been converted to use `size_t` for consistency and to avoid
     34 integer overflows at the API boundary. (Existing logic uses a mismash of `int`,
     35 `long`, and `unsigned`.)  For the most part, implicit casts mean that existing
     36 code continues to compile. In some cases, this may require BoringSSL-specific
     37 code, particularly to avoid compiler warnings.
     38 
     39 Most notably, the `STACK_OF(T)` types have all been converted to use `size_t`
     40 instead of `int` for indices and lengths.
     41 
     42 ### Reference counts
     43 
     44 Some external consumers increment reference counts directly by calling
     45 `CRYPTO_add` with the corresponding `CRYPTO_LOCK_*` value.
     46 
     47 These APIs no longer exist in BoringSSL. Instead, code which increments
     48 reference counts should call the corresponding `FOO_up_ref` function, such as
     49 `EVP_PKEY_up_ref`. Note that not all of these APIs are present in OpenSSL and
     50 may require `#ifdef`s.
     51 
     52 ### Error codes
     53 
     54 OpenSSL's errors are extremely specific, leaking internals of the library,
     55 including even a function code for the function which emitted the error! As some
     56 logic in BoringSSL has been rewritten, code which conditions on the error may
     57 break (grep for `ERR_GET_REASON` and `ERR_GET_FUNC`). This danger also exists
     58 when upgrading OpenSSL versions.
     59 
     60 Where possible, avoid conditioning on the exact error reason. Otherwise, a
     61 BoringSSL `#ifdef` may be necessary. Exactly how best to resolve this issue is
     62 still being determined. It's possible some new APIs will be added in the future.
     63 
     64 Function codes have been completely removed. Remove code which conditions on
     65 these as it will break with the slightest change in the library, OpenSSL or
     66 BoringSSL.
     67 
     68 ### `*_ctrl` functions
     69 
     70 Some OpenSSL APIs are implemented with `ioctl`-style functions such as
     71 `SSL_ctrl` and `EVP_PKEY_CTX_ctrl`, combined with convenience macros, such as
     72 
     73     # define SSL_CTX_set_mode(ctx,op) \
     74             SSL_CTX_ctrl((ctx),SSL_CTRL_MODE,(op),NULL)
     75 
     76 In BoringSSL, these macros have been replaced with proper functions. The
     77 underlying `_ctrl` functions have been removed.
     78 
     79 For convenience, `SSL_CTRL_*` values are retained as macros to `doesnt_exist` so
     80 existing code which uses them (or the wrapper macros) in `#ifdef` expressions
     81 will continue to function. However, the macros themselves will not work.
     82 
     83 Switch any `*_ctrl` callers to the macro/function versions. This works in both
     84 OpenSSL and BoringSSL. Note that BoringSSL's function versions will be
     85 type-checked and may require more care with types. See the end of this
     86 document for a table of functions to use.
     87 
     88 ### HMAC `EVP_PKEY`s
     89 
     90 `EVP_PKEY_HMAC` is removed. Use the `HMAC_*` functions in `hmac.h` instead. This
     91 is compatible with OpenSSL.
     92 
     93 ### DSA `EVP_PKEY`s
     94 
     95 `EVP_PKEY_DSA` is deprecated. It is currently still possible to parse DER into a
     96 DSA `EVP_PKEY`, but signing or verifying with those objects will not work.
     97 
     98 ### DES
     99 
    100 The `DES_cblock` type has been switched from an array to a struct to avoid the
    101 pitfalls around array types in C. Where features which require DES cannot be
    102 disabled, BoringSSL-specific codepaths may be necessary.
    103 
    104 ### TLS renegotiation
    105 
    106 OpenSSL enables TLS renegotiation by default and accepts renegotiation requests
    107 from the peer transparently. Renegotiation is an extremely problematic protocol
    108 feature, so BoringSSL rejects peer renegotiations by default.
    109 
    110 To enable renegotiation, call `SSL_set_renegotiate_mode` and set it to
    111 `ssl_renegotiate_once` or `ssl_renegotiate_freely`. Renegotiation is only
    112 supported as a client in SSL3/TLS and the HelloRequest must be received at a
    113 quiet point in the application protocol. This is sufficient to support the
    114 common use of requesting a new client certificate between an HTTP request and
    115 response in (unpipelined) HTTP/1.1.
    116 
    117 Things which do not work:
    118 
    119 * There is no support for renegotiation as a server.
    120 
    121 * There is no support for renegotiation in DTLS.
    122 
    123 * There is no support for initiating renegotiation; `SSL_renegotiate` always
    124   fails and `SSL_set_state` does nothing.
    125 
    126 * Interleaving application data with the new handshake is forbidden.
    127 
    128 * If a HelloRequest is received while `SSL_write` has unsent application data,
    129   the renegotiation is rejected.
    130 
    131 * Renegotiation does not participate in session resumption. The client will
    132   not offer a session on renegotiation or resume any session established by a
    133   renegotiation handshake.
    134 
    135 * The server may not change its certificate in the renegotiation. This mitigates
    136   the [triple handshake attack](https://mitls.org/pages/attacks/3SHAKE). Any new
    137   stapled OCSP response and SCT list will be ignored. As no authentication state
    138   may change, BoringSSL will not re-verify the certificate on a renegotiation.
    139   Callbacks such as `SSL_CTX_set_custom_verify` will only run on the initial
    140   handshake.
    141 
    142 ### Lowercase hexadecimal
    143 
    144 BoringSSL's `BN_bn2hex` function uses lowercase hexadecimal digits instead of
    145 uppercase. Some code may require changes to avoid being sensitive to this
    146 difference.
    147 
    148 ### Legacy ASN.1 functions
    149 
    150 OpenSSL's ASN.1 stack uses `d2i` functions for parsing. They have the form:
    151 
    152     RSA *d2i_RSAPrivateKey(RSA **out, const uint8_t **inp, long len);
    153 
    154 In addition to returning the result, OpenSSL places it in `*out` if `out` is
    155 not `NULL`. On input, if `*out` is not `NULL`, OpenSSL will usually (but not
    156 always) reuse that object rather than allocating a new one. In BoringSSL, these
    157 functions are compatibility wrappers over a newer ASN.1 stack. Even if `*out`
    158 is not `NULL`, these wrappers will always allocate a new object and free the
    159 previous one.
    160 
    161 Ensure that callers do not rely on this object reuse behavior. It is
    162 recommended to avoid the `out` parameter completely and always pass in `NULL`.
    163 Note that less error-prone APIs are available for BoringSSL-specific code (see
    164 below).
    165 
    166 ## Optional BoringSSL-specific simplifications
    167 
    168 BoringSSL makes some changes to OpenSSL which simplify the API but remain
    169 compatible with OpenSSL consumers. In general, consult the BoringSSL
    170 documentation for any functions in new BoringSSL-only code.
    171 
    172 ### Return values
    173 
    174 Most OpenSSL APIs return 1 on success and either 0 or -1 on failure. BoringSSL
    175 has narrowed most of these to 1 on success and 0 on failure. BoringSSL-specific
    176 code may take advantage of the less error-prone APIs and use `!` to check for
    177 errors.
    178 
    179 ### Initialization
    180 
    181 OpenSSL has a number of different initialization functions for setting up error
    182 strings and loading algorithms, etc. All of these functions still exist in
    183 BoringSSL for convenience, but they do nothing and are not necessary.
    184 
    185 The one exception is `CRYPTO_library_init`. In `BORINGSSL_NO_STATIC_INITIALIZER`
    186 builds, it must be called to query CPU capabitilies before the rest of the
    187 library. In the default configuration, this is done with a static initializer
    188 and is also unnecessary.
    189 
    190 ### Threading
    191 
    192 OpenSSL provides a number of APIs to configure threading callbacks and set up
    193 locks. Without initializing these, the library is not thread-safe. Configuring
    194 these does nothing in BoringSSL. Instead, BoringSSL calls pthreads and the
    195 corresponding Windows APIs internally and is always thread-safe where the API
    196 guarantees it.
    197 
    198 ### ASN.1
    199 
    200 BoringSSL is in the process of deprecating OpenSSL's `d2i` and `i2d` in favor of
    201 new functions using the much less error-prone `CBS` and `CBB` types.
    202 BoringSSL-only code should use those functions where available.
    203 
    204 
    205 ## Replacements for `CTRL` values
    206 
    207 When porting code which uses `SSL_CTX_ctrl` or `SSL_ctrl`, use the replacement
    208 functions below. If a function has both `SSL_CTX` and `SSL` variants, only the
    209 `SSL_CTX` version is listed.
    210 
    211 Note some values correspond to multiple functions depending on the `larg`
    212 parameter.
    213 
    214 `CTRL` value | Replacement function(s)
    215 -------------|-------------------------
    216 `DTLS_CTRL_GET_TIMEOUT` | `DTLSv1_get_timeout`
    217 `DTLS_CTRL_HANDLE_TIMEOUT` | `DTLSv1_handle_timeout`
    218 `SSL_CTRL_CHAIN` | `SSL_CTX_set0_chain` or `SSL_CTX_set1_chain`
    219 `SSL_CTRL_CHAIN_CERT` | `SSL_add0_chain_cert` or `SSL_add1_chain_cert`
    220 `SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS` | `SSL_CTX_clear_extra_chain_certs`
    221 `SSL_CTRL_CLEAR_MODE` | `SSL_CTX_clear_mode`
    222 `SSL_CTRL_CLEAR_OPTIONS` | `SSL_CTX_clear_options`
    223 `SSL_CTRL_EXTRA_CHAIN_CERT` | `SSL_CTX_add_extra_chain_cert`
    224 `SSL_CTRL_GET_CHAIN_CERTS` | `SSL_CTX_get0_chain_certs`
    225 `SSL_CTRL_GET_CLIENT_CERT_TYPES` | `SSL_get0_certificate_types`
    226 `SSL_CTRL_GET_EXTRA_CHAIN_CERTS` | `SSL_CTX_get_extra_chain_certs` or `SSL_CTX_get_extra_chain_certs_only`
    227 `SSL_CTRL_GET_MAX_CERT_LIST` | `SSL_CTX_get_max_cert_list`
    228 `SSL_CTRL_GET_NUM_RENEGOTIATIONS` | `SSL_num_renegotiations`
    229 `SSL_CTRL_GET_READ_AHEAD` | `SSL_CTX_get_read_ahead`
    230 `SSL_CTRL_GET_RI_SUPPORT` | `SSL_get_secure_renegotiation_support`
    231 `SSL_CTRL_GET_SESSION_REUSED` | `SSL_session_reused`
    232 `SSL_CTRL_GET_SESS_CACHE_MODE` | `SSL_CTX_get_session_cache_mode`
    233 `SSL_CTRL_GET_SESS_CACHE_SIZE` | `SSL_CTX_sess_get_cache_size`
    234 `SSL_CTRL_GET_TLSEXT_TICKET_KEYS` | `SSL_CTX_get_tlsext_ticket_keys`
    235 `SSL_CTRL_GET_TOTAL_RENEGOTIATIONS` | `SSL_total_renegotiations`
    236 `SSL_CTRL_MODE` | `SSL_CTX_get_mode` or `SSL_CTX_set_mode`
    237 `SSL_CTRL_NEED_TMP_RSA` | `SSL_CTX_need_tmp_RSA` is equivalent, but [*do not use this function*](https://freakattack.com/). (It is a no-op in BoringSSL.)
    238 `SSL_CTRL_OPTIONS` | `SSL_CTX_get_options` or `SSL_CTX_set_options`
    239 `SSL_CTRL_SESS_NUMBER` | `SSL_CTX_sess_number`
    240 `SSL_CTRL_SET_CURVES` | `SSL_CTX_set1_curves`
    241 `SSL_CTRL_SET_ECDH_AUTO` | `SSL_CTX_set_ecdh_auto`
    242 `SSL_CTRL_SET_MAX_CERT_LIST` | `SSL_CTX_set_max_cert_list`
    243 `SSL_CTRL_SET_MAX_SEND_FRAGMENT` | `SSL_CTX_set_max_send_fragment`
    244 `SSL_CTRL_SET_MSG_CALLBACK` | `SSL_set_msg_callback`
    245 `SSL_CTRL_SET_MSG_CALLBACK_ARG` | `SSL_set_msg_callback_arg`
    246 `SSL_CTRL_SET_MTU` | `SSL_set_mtu`
    247 `SSL_CTRL_SET_READ_AHEAD` | `SSL_CTX_set_read_ahead`
    248 `SSL_CTRL_SET_SESS_CACHE_MODE` | `SSL_CTX_set_session_cache_mode`
    249 `SSL_CTRL_SET_SESS_CACHE_SIZE` | `SSL_CTX_sess_set_cache_size`
    250 `SSL_CTRL_SET_TLSEXT_HOSTNAME` | `SSL_set_tlsext_host_name`
    251 `SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG` | `SSL_CTX_set_tlsext_servername_arg`
    252 `SSL_CTRL_SET_TLSEXT_SERVERNAME_CB` | `SSL_CTX_set_tlsext_servername_callback`
    253 `SSL_CTRL_SET_TLSEXT_TICKET_KEYS` | `SSL_CTX_set_tlsext_ticket_keys`
    254 `SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB` | `SSL_CTX_set_tlsext_ticket_key_cb`
    255 `SSL_CTRL_SET_TMP_DH` | `SSL_CTX_set_tmp_dh`
    256 `SSL_CTRL_SET_TMP_DH_CB` | `SSL_CTX_set_tmp_dh_callback`
    257 `SSL_CTRL_SET_TMP_ECDH` | `SSL_CTX_set_tmp_ecdh`
    258 `SSL_CTRL_SET_TMP_ECDH_CB` | `SSL_CTX_set_tmp_ecdh_callback`
    259 `SSL_CTRL_SET_TMP_RSA` | `SSL_CTX_set_tmp_rsa` is equivalent, but [*do not use this function*](https://freakattack.com/). (It is a no-op in BoringSSL.)
    260 `SSL_CTRL_SET_TMP_RSA_CB` | `SSL_CTX_set_tmp_rsa_callback` is equivalent, but [*do not use this function*](https://freakattack.com/). (It is a no-op in BoringSSL.)
    261