Home | History | Annotate | Download | only in ssl
      1 /* Copyright (c) 2017, Google Inc.
      2  *
      3  * Permission to use, copy, modify, and/or distribute this software for any
      4  * purpose with or without fee is hereby granted, provided that the above
      5  * copyright notice and this permission notice appear in all copies.
      6  *
      7  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      8  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
      9  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     10  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     11  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
     12  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     13  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
     14 
     15 #include <openssl/ssl.h>
     16 
     17 #include <assert.h>
     18 
     19 #include <openssl/bytestring.h>
     20 #include <openssl/err.h>
     21 
     22 #include "internal.h"
     23 #include "../crypto/internal.h"
     24 
     25 
     26 BSSL_NAMESPACE_BEGIN
     27 
     28 bool ssl_protocol_version_from_wire(uint16_t *out, uint16_t version) {
     29   switch (version) {
     30     case TLS1_VERSION:
     31     case TLS1_1_VERSION:
     32     case TLS1_2_VERSION:
     33     case TLS1_3_VERSION:
     34       *out = version;
     35       return true;
     36 
     37     case DTLS1_VERSION:
     38       // DTLS 1.0 is analogous to TLS 1.1, not TLS 1.0.
     39       *out = TLS1_1_VERSION;
     40       return true;
     41 
     42     case DTLS1_2_VERSION:
     43       *out = TLS1_2_VERSION;
     44       return true;
     45 
     46     default:
     47       return false;
     48   }
     49 }
     50 
     51 // The follow arrays are the supported versions for TLS and DTLS, in order of
     52 // decreasing preference.
     53 
     54 static const uint16_t kTLSVersions[] = {
     55     TLS1_3_VERSION,
     56     TLS1_2_VERSION,
     57     TLS1_1_VERSION,
     58     TLS1_VERSION,
     59 };
     60 
     61 static const uint16_t kDTLSVersions[] = {
     62     DTLS1_2_VERSION,
     63     DTLS1_VERSION,
     64 };
     65 
     66 static void get_method_versions(const SSL_PROTOCOL_METHOD *method,
     67                                 const uint16_t **out, size_t *out_num) {
     68   if (method->is_dtls) {
     69     *out = kDTLSVersions;
     70     *out_num = OPENSSL_ARRAY_SIZE(kDTLSVersions);
     71   } else {
     72     *out = kTLSVersions;
     73     *out_num = OPENSSL_ARRAY_SIZE(kTLSVersions);
     74   }
     75 }
     76 
     77 bool ssl_method_supports_version(const SSL_PROTOCOL_METHOD *method,
     78                                  uint16_t version) {
     79   const uint16_t *versions;
     80   size_t num_versions;
     81   get_method_versions(method, &versions, &num_versions);
     82   for (size_t i = 0; i < num_versions; i++) {
     83     if (versions[i] == version) {
     84       return true;
     85     }
     86   }
     87   return false;
     88 }
     89 
     90 // The following functions map between API versions and wire versions. The
     91 // public API works on wire versions.
     92 
     93 static const char *ssl_version_to_string(uint16_t version) {
     94   switch (version) {
     95     case TLS1_3_VERSION:
     96       return "TLSv1.3";
     97 
     98     case TLS1_2_VERSION:
     99       return "TLSv1.2";
    100 
    101     case TLS1_1_VERSION:
    102       return "TLSv1.1";
    103 
    104     case TLS1_VERSION:
    105       return "TLSv1";
    106 
    107     case DTLS1_VERSION:
    108       return "DTLSv1";
    109 
    110     case DTLS1_2_VERSION:
    111       return "DTLSv1.2";
    112 
    113     default:
    114       return "unknown";
    115   }
    116 }
    117 
    118 static uint16_t wire_version_to_api(uint16_t version) {
    119   return version;
    120 }
    121 
    122 // api_version_to_wire maps |version| to some representative wire version.
    123 static bool api_version_to_wire(uint16_t *out, uint16_t version) {
    124   // Check it is a real protocol version.
    125   uint16_t unused;
    126   if (!ssl_protocol_version_from_wire(&unused, version)) {
    127     return false;
    128   }
    129 
    130   *out = version;
    131   return true;
    132 }
    133 
    134 static bool set_version_bound(const SSL_PROTOCOL_METHOD *method, uint16_t *out,
    135                               uint16_t version) {
    136   if (!api_version_to_wire(&version, version) ||
    137       !ssl_method_supports_version(method, version) ||
    138       !ssl_protocol_version_from_wire(out, version)) {
    139     OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_SSL_VERSION);
    140     return false;
    141   }
    142 
    143   return true;
    144 }
    145 
    146 static bool set_min_version(const SSL_PROTOCOL_METHOD *method, uint16_t *out,
    147                             uint16_t version) {
    148   // Zero is interpreted as the default minimum version.
    149   if (version == 0) {
    150     // TLS 1.0 does not exist in DTLS.
    151     *out = method->is_dtls ? TLS1_1_VERSION : TLS1_VERSION;
    152     return true;
    153   }
    154 
    155   return set_version_bound(method, out, version);
    156 }
    157 
    158 static bool set_max_version(const SSL_PROTOCOL_METHOD *method, uint16_t *out,
    159                             uint16_t version) {
    160   // Zero is interpreted as the default maximum version.
    161   if (version == 0) {
    162     *out = TLS1_2_VERSION;
    163     return true;
    164   }
    165 
    166   return set_version_bound(method, out, version);
    167 }
    168 
    169 const struct {
    170   uint16_t version;
    171   uint32_t flag;
    172 } kProtocolVersions[] = {
    173     {TLS1_VERSION, SSL_OP_NO_TLSv1},
    174     {TLS1_1_VERSION, SSL_OP_NO_TLSv1_1},
    175     {TLS1_2_VERSION, SSL_OP_NO_TLSv1_2},
    176     {TLS1_3_VERSION, SSL_OP_NO_TLSv1_3},
    177 };
    178 
    179 bool ssl_get_version_range(const SSL_HANDSHAKE *hs, uint16_t *out_min_version,
    180                            uint16_t *out_max_version) {
    181   // For historical reasons, |SSL_OP_NO_DTLSv1| aliases |SSL_OP_NO_TLSv1|, but
    182   // DTLS 1.0 should be mapped to TLS 1.1.
    183   uint32_t options = hs->ssl->options;
    184   if (SSL_is_dtls(hs->ssl)) {
    185     options &= ~SSL_OP_NO_TLSv1_1;
    186     if (options & SSL_OP_NO_DTLSv1) {
    187       options |= SSL_OP_NO_TLSv1_1;
    188     }
    189   }
    190 
    191   uint16_t min_version = hs->config->conf_min_version;
    192   uint16_t max_version = hs->config->conf_max_version;
    193 
    194   // QUIC requires TLS 1.3.
    195   if (hs->ssl->quic_method && min_version < TLS1_3_VERSION) {
    196     min_version = TLS1_3_VERSION;
    197   }
    198 
    199   // OpenSSL's API for controlling versions entails blacklisting individual
    200   // protocols. This has two problems. First, on the client, the protocol can
    201   // only express a contiguous range of versions. Second, a library consumer
    202   // trying to set a maximum version cannot disable protocol versions that get
    203   // added in a future version of the library.
    204   //
    205   // To account for both of these, OpenSSL interprets the client-side bitmask
    206   // as a min/max range by picking the lowest contiguous non-empty range of
    207   // enabled protocols. Note that this means it is impossible to set a maximum
    208   // version of the higest supported TLS version in a future-proof way.
    209   bool any_enabled = false;
    210   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kProtocolVersions); i++) {
    211     // Only look at the versions already enabled.
    212     if (min_version > kProtocolVersions[i].version) {
    213       continue;
    214     }
    215     if (max_version < kProtocolVersions[i].version) {
    216       break;
    217     }
    218 
    219     if (!(options & kProtocolVersions[i].flag)) {
    220       // The minimum version is the first enabled version.
    221       if (!any_enabled) {
    222         any_enabled = true;
    223         min_version = kProtocolVersions[i].version;
    224       }
    225       continue;
    226     }
    227 
    228     // If there is a disabled version after the first enabled one, all versions
    229     // after it are implicitly disabled.
    230     if (any_enabled) {
    231       max_version = kProtocolVersions[i-1].version;
    232       break;
    233     }
    234   }
    235 
    236   if (!any_enabled) {
    237     OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SUPPORTED_VERSIONS_ENABLED);
    238     return false;
    239   }
    240 
    241   *out_min_version = min_version;
    242   *out_max_version = max_version;
    243   return true;
    244 }
    245 
    246 static uint16_t ssl_version(const SSL *ssl) {
    247   // In early data, we report the predicted version.
    248   if (SSL_in_early_data(ssl) && !ssl->server) {
    249     return ssl->s3->hs->early_session->ssl_version;
    250   }
    251   return ssl->version;
    252 }
    253 
    254 uint16_t ssl_protocol_version(const SSL *ssl) {
    255   assert(ssl->s3->have_version);
    256   uint16_t version;
    257   if (!ssl_protocol_version_from_wire(&version, ssl->version)) {
    258     // |ssl->version| will always be set to a valid version.
    259     assert(0);
    260     return 0;
    261   }
    262 
    263   return version;
    264 }
    265 
    266 bool ssl_supports_version(SSL_HANDSHAKE *hs, uint16_t version) {
    267   SSL *const ssl = hs->ssl;
    268   uint16_t protocol_version;
    269   if (!ssl_method_supports_version(ssl->method, version) ||
    270       !ssl_protocol_version_from_wire(&protocol_version, version) ||
    271       hs->min_version > protocol_version ||
    272       protocol_version > hs->max_version) {
    273     return false;
    274   }
    275 
    276   return true;
    277 }
    278 
    279 bool ssl_add_supported_versions(SSL_HANDSHAKE *hs, CBB *cbb) {
    280   const uint16_t *versions;
    281   size_t num_versions;
    282   get_method_versions(hs->ssl->method, &versions, &num_versions);
    283   for (size_t i = 0; i < num_versions; i++) {
    284     if (ssl_supports_version(hs, versions[i]) &&
    285         !CBB_add_u16(cbb, versions[i])) {
    286       return false;
    287     }
    288   }
    289   return true;
    290 }
    291 
    292 bool ssl_negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
    293                            uint16_t *out_version, const CBS *peer_versions) {
    294   const uint16_t *versions;
    295   size_t num_versions;
    296   get_method_versions(hs->ssl->method, &versions, &num_versions);
    297   for (size_t i = 0; i < num_versions; i++) {
    298     if (!ssl_supports_version(hs, versions[i])) {
    299       continue;
    300     }
    301 
    302     // JDK 11, prior to 11.0.2, has a buggy TLS 1.3 implementation which fails
    303     // to send SNI when offering 1.3 sessions. Disable TLS 1.3 for such
    304     // clients. We apply this logic here rather than |ssl_supports_version| so
    305     // the downgrade signal continues to query the true capabilities. (The
    306     // workaround is a limitation of the peer's capabilities rather than our
    307     // own.)
    308     //
    309     // See https://bugs.openjdk.java.net/browse/JDK-8211806.
    310     if (versions[i] == TLS1_3_VERSION && hs->apply_jdk11_workaround) {
    311       continue;
    312     }
    313 
    314     CBS copy = *peer_versions;
    315     while (CBS_len(&copy) != 0) {
    316       uint16_t version;
    317       if (!CBS_get_u16(&copy, &version)) {
    318         OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
    319         *out_alert = SSL_AD_DECODE_ERROR;
    320         return false;
    321       }
    322 
    323       if (version == versions[i]) {
    324         *out_version = version;
    325         return true;
    326       }
    327     }
    328   }
    329 
    330   OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_PROTOCOL);
    331   *out_alert = SSL_AD_PROTOCOL_VERSION;
    332   return false;
    333 }
    334 
    335 BSSL_NAMESPACE_END
    336 
    337 using namespace bssl;
    338 
    339 int SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) {
    340   return set_min_version(ctx->method, &ctx->conf_min_version, version);
    341 }
    342 
    343 int SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) {
    344   return set_max_version(ctx->method, &ctx->conf_max_version, version);
    345 }
    346 
    347 int SSL_set_min_proto_version(SSL *ssl, uint16_t version) {
    348   if (!ssl->config) {
    349     return 0;
    350   }
    351   return set_min_version(ssl->method, &ssl->config->conf_min_version, version);
    352 }
    353 
    354 int SSL_set_max_proto_version(SSL *ssl, uint16_t version) {
    355   if (!ssl->config) {
    356     return 0;
    357   }
    358   return set_max_version(ssl->method, &ssl->config->conf_max_version, version);
    359 }
    360 
    361 int SSL_version(const SSL *ssl) {
    362   return wire_version_to_api(ssl_version(ssl));
    363 }
    364 
    365 const char *SSL_get_version(const SSL *ssl) {
    366   return ssl_version_to_string(ssl_version(ssl));
    367 }
    368 
    369 const char *SSL_SESSION_get_version(const SSL_SESSION *session) {
    370   return ssl_version_to_string(session->ssl_version);
    371 }
    372 
    373 uint16_t SSL_SESSION_get_protocol_version(const SSL_SESSION *session) {
    374   return wire_version_to_api(session->ssl_version);
    375 }
    376 
    377 int SSL_SESSION_set_protocol_version(SSL_SESSION *session, uint16_t version) {
    378   // This picks a representative TLS 1.3 version, but this API should only be
    379   // used on unit test sessions anyway.
    380   return api_version_to_wire(&session->ssl_version, version);
    381 }
    382