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 ### Lowercase hexadecimal
    132 
    133 BoringSSL's `BN_bn2hex` function uses lowercase hexadecimal digits instead of
    134 uppercase. Some code may require changes to avoid being sensitive to this
    135 difference.
    136 
    137 ### Legacy ASN.1 functions
    138 
    139 OpenSSL's ASN.1 stack uses `d2i` functions for parsing. They have the form:
    140 
    141     RSA *d2i_RSAPrivateKey(RSA **out, const uint8_t **inp, long len);
    142 
    143 In addition to returning the result, OpenSSL places it in `*out` if `out` is
    144 not `NULL`. On input, if `*out` is not `NULL`, OpenSSL will usually (but not
    145 always) reuse that object rather than allocating a new one. In BoringSSL, these
    146 functions are compatibility wrappers over a newer ASN.1 stack. Even if `*out`
    147 is not `NULL`, these wrappers will always allocate a new object and free the
    148 previous one.
    149 
    150 Ensure that callers do not rely on this object reuse behavior. It is
    151 recommended to avoid the `out` parameter completely and always pass in `NULL`.
    152 Note that less error-prone APIs are available for BoringSSL-specific code (see
    153 below).
    154 
    155 ## Optional BoringSSL-specific simplifications
    156 
    157 BoringSSL makes some changes to OpenSSL which simplify the API but remain
    158 compatible with OpenSSL consumers. In general, consult the BoringSSL
    159 documentation for any functions in new BoringSSL-only code.
    160 
    161 ### Return values
    162 
    163 Most OpenSSL APIs return 1 on success and either 0 or -1 on failure. BoringSSL
    164 has narrowed most of these to 1 on success and 0 on failure. BoringSSL-specific
    165 code may take advantage of the less error-prone APIs and use `!` to check for
    166 errors.
    167 
    168 ### Initialization
    169 
    170 OpenSSL has a number of different initialization functions for setting up error
    171 strings and loading algorithms, etc. All of these functions still exist in
    172 BoringSSL for convenience, but they do nothing and are not necessary.
    173 
    174 The one exception is `CRYPTO_library_init`. In `BORINGSSL_NO_STATIC_INITIALIZER`
    175 builds, it must be called to query CPU capabitilies before the rest of the
    176 library. In the default configuration, this is done with a static initializer
    177 and is also unnecessary.
    178 
    179 ### Threading
    180 
    181 OpenSSL provides a number of APIs to configure threading callbacks and set up
    182 locks. Without initializing these, the library is not thread-safe. Configuring
    183 these does nothing in BoringSSL. Instead, BoringSSL calls pthreads and the
    184 corresponding Windows APIs internally and is always thread-safe where the API
    185 guarantees it.
    186 
    187 ### ASN.1
    188 
    189 BoringSSL is in the process of deprecating OpenSSL's `d2i` and `i2d` in favor of
    190 new functions using the much less error-prone `CBS` and `CBB` types.
    191 BoringSSL-only code should use those functions where available.
    192 
    193 
    194 ## Replacements for `CTRL` values
    195 
    196 When porting code which uses `SSL_CTX_ctrl` or `SSL_ctrl`, use the replacement
    197 functions below. If a function has both `SSL_CTX` and `SSL` variants, only the
    198 `SSL_CTX` version is listed.
    199 
    200 Note some values correspond to multiple functions depending on the `larg`
    201 parameter.
    202 
    203 `CTRL` value | Replacement function(s)
    204 -------------|-------------------------
    205 `DTLS_CTRL_GET_TIMEOUT` | `DTLSv1_get_timeout`
    206 `DTLS_CTRL_HANDLE_TIMEOUT` | `DTLSv1_handle_timeout`
    207 `SSL_CTRL_CHAIN` | `SSL_CTX_set0_chain` or `SSL_CTX_set1_chain`
    208 `SSL_CTRL_CHAIN_CERT` | `SSL_add0_chain_cert` or `SSL_add1_chain_cert`
    209 `SSL_CTRL_CLEAR_EXTRA_CHAIN_CERTS` | `SSL_CTX_clear_extra_chain_certs`
    210 `SSL_CTRL_CLEAR_MODE` | `SSL_CTX_clear_mode`
    211 `SSL_CTRL_CLEAR_OPTIONS` | `SSL_CTX_clear_options`
    212 `SSL_CTRL_EXTRA_CHAIN_CERT` | `SSL_CTX_add_extra_chain_cert`
    213 `SSL_CTRL_GET_CHAIN_CERTS` | `SSL_CTX_get0_chain_certs`
    214 `SSL_CTRL_GET_CLIENT_CERT_TYPES` | `SSL_get0_certificate_types`
    215 `SSL_CTRL_GET_EXTRA_CHAIN_CERTS` | `SSL_CTX_get_extra_chain_certs` or `SSL_CTX_get_extra_chain_certs_only`
    216 `SSL_CTRL_GET_MAX_CERT_LIST` | `SSL_CTX_get_max_cert_list`
    217 `SSL_CTRL_GET_NUM_RENEGOTIATIONS` | `SSL_num_renegotiations`
    218 `SSL_CTRL_GET_READ_AHEAD` | `SSL_CTX_get_read_ahead`
    219 `SSL_CTRL_GET_RI_SUPPORT` | `SSL_get_secure_renegotiation_support`
    220 `SSL_CTRL_GET_SESSION_REUSED` | `SSL_session_reused`
    221 `SSL_CTRL_GET_SESS_CACHE_MODE` | `SSL_CTX_get_session_cache_mode`
    222 `SSL_CTRL_GET_SESS_CACHE_SIZE` | `SSL_CTX_sess_get_cache_size`
    223 `SSL_CTRL_GET_TLSEXT_TICKET_KEYS` | `SSL_CTX_get_tlsext_ticket_keys`
    224 `SSL_CTRL_GET_TOTAL_RENEGOTIATIONS` | `SSL_total_renegotiations`
    225 `SSL_CTRL_MODE` | `SSL_CTX_get_mode` or `SSL_CTX_set_mode`
    226 `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.)
    227 `SSL_CTRL_OPTIONS` | `SSL_CTX_get_options` or `SSL_CTX_set_options`
    228 `SSL_CTRL_SESS_NUMBER` | `SSL_CTX_sess_number`
    229 `SSL_CTRL_SET_CURVES` | `SSL_CTX_set1_curves`
    230 `SSL_CTRL_SET_ECDH_AUTO` | `SSL_CTX_set_ecdh_auto`
    231 `SSL_CTRL_SET_MAX_CERT_LIST` | `SSL_CTX_set_max_cert_list`
    232 `SSL_CTRL_SET_MAX_SEND_FRAGMENT` | `SSL_CTX_set_max_send_fragment`
    233 `SSL_CTRL_SET_MSG_CALLBACK` | `SSL_set_msg_callback`
    234 `SSL_CTRL_SET_MSG_CALLBACK_ARG` | `SSL_set_msg_callback_arg`
    235 `SSL_CTRL_SET_MTU` | `SSL_set_mtu`
    236 `SSL_CTRL_SET_READ_AHEAD` | `SSL_CTX_set_read_ahead`
    237 `SSL_CTRL_SET_SESS_CACHE_MODE` | `SSL_CTX_set_session_cache_mode`
    238 `SSL_CTRL_SET_SESS_CACHE_SIZE` | `SSL_CTX_sess_set_cache_size`
    239 `SSL_CTRL_SET_TLSEXT_HOSTNAME` | `SSL_set_tlsext_host_name`
    240 `SSL_CTRL_SET_TLSEXT_SERVERNAME_ARG` | `SSL_CTX_set_tlsext_servername_arg`
    241 `SSL_CTRL_SET_TLSEXT_SERVERNAME_CB` | `SSL_CTX_set_tlsext_servername_callback`
    242 `SSL_CTRL_SET_TLSEXT_TICKET_KEYS` | `SSL_CTX_set_tlsext_ticket_keys`
    243 `SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB` | `SSL_CTX_set_tlsext_ticket_key_cb`
    244 `SSL_CTRL_SET_TMP_DH` | `SSL_CTX_set_tmp_dh`
    245 `SSL_CTRL_SET_TMP_DH_CB` | `SSL_CTX_set_tmp_dh_callback`
    246 `SSL_CTRL_SET_TMP_ECDH` | `SSL_CTX_set_tmp_ecdh`
    247 `SSL_CTRL_SET_TMP_ECDH_CB` | `SSL_CTX_set_tmp_ecdh_callback`
    248 `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.)
    249 `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.)
    250