blob: c06c5ab0571e79f5c14bb73a0a7ec0ae2803b814 [file] [log] [blame]
Steven Valdez8f36c512017-06-20 10:55:02 -04001/* 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
David Benjamin86e95b82017-07-18 16:34:25 -040026namespace bssl {
27
David Benjamined9aed12017-09-27 19:24:09 -040028bool ssl_protocol_version_from_wire(uint16_t *out, uint16_t version) {
Steven Valdez8f36c512017-06-20 10:55:02 -040029 switch (version) {
30 case SSL3_VERSION:
31 case TLS1_VERSION:
32 case TLS1_1_VERSION:
33 case TLS1_2_VERSION:
34 *out = version;
David Benjamined9aed12017-09-27 19:24:09 -040035 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -040036
37 case TLS1_3_DRAFT_VERSION:
Steven Valdez520e1222017-06-13 12:45:25 -040038 case TLS1_3_EXPERIMENT_VERSION:
Steven Valdez16821262017-09-08 17:03:42 -040039 case TLS1_3_EXPERIMENT2_VERSION:
Steven Valdezc7d4d212017-09-11 13:53:08 -040040 case TLS1_3_EXPERIMENT3_VERSION:
Steven Valdez8f36c512017-06-20 10:55:02 -040041 *out = TLS1_3_VERSION;
David Benjamined9aed12017-09-27 19:24:09 -040042 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -040043
44 case DTLS1_VERSION:
David Benjaminc11ea9422017-08-29 16:33:21 -040045 // DTLS 1.0 is analogous to TLS 1.1, not TLS 1.0.
Steven Valdez8f36c512017-06-20 10:55:02 -040046 *out = TLS1_1_VERSION;
David Benjamined9aed12017-09-27 19:24:09 -040047 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -040048
49 case DTLS1_2_VERSION:
50 *out = TLS1_2_VERSION;
David Benjamined9aed12017-09-27 19:24:09 -040051 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -040052
53 default:
David Benjamined9aed12017-09-27 19:24:09 -040054 return false;
Steven Valdez8f36c512017-06-20 10:55:02 -040055 }
56}
57
David Benjaminc11ea9422017-08-29 16:33:21 -040058// The follow arrays are the supported versions for TLS and DTLS, in order of
59// decreasing preference.
Steven Valdez8f36c512017-06-20 10:55:02 -040060
61static const uint16_t kTLSVersions[] = {
Steven Valdezc7d4d212017-09-11 13:53:08 -040062 TLS1_3_EXPERIMENT3_VERSION,
Steven Valdez16821262017-09-08 17:03:42 -040063 TLS1_3_EXPERIMENT2_VERSION,
Steven Valdez520e1222017-06-13 12:45:25 -040064 TLS1_3_EXPERIMENT_VERSION,
Steven Valdezdbe01582017-07-14 10:39:28 -040065 TLS1_3_DRAFT_VERSION,
Steven Valdez8f36c512017-06-20 10:55:02 -040066 TLS1_2_VERSION,
67 TLS1_1_VERSION,
68 TLS1_VERSION,
69 SSL3_VERSION,
70};
71
72static const uint16_t kDTLSVersions[] = {
73 DTLS1_2_VERSION,
74 DTLS1_VERSION,
75};
76
77static void get_method_versions(const SSL_PROTOCOL_METHOD *method,
78 const uint16_t **out, size_t *out_num) {
79 if (method->is_dtls) {
80 *out = kDTLSVersions;
81 *out_num = OPENSSL_ARRAY_SIZE(kDTLSVersions);
82 } else {
83 *out = kTLSVersions;
84 *out_num = OPENSSL_ARRAY_SIZE(kTLSVersions);
85 }
86}
87
David Benjamined9aed12017-09-27 19:24:09 -040088static bool method_supports_version(const SSL_PROTOCOL_METHOD *method,
89 uint16_t version) {
Steven Valdez8f36c512017-06-20 10:55:02 -040090 const uint16_t *versions;
91 size_t num_versions;
92 get_method_versions(method, &versions, &num_versions);
93 for (size_t i = 0; i < num_versions; i++) {
94 if (versions[i] == version) {
David Benjamined9aed12017-09-27 19:24:09 -040095 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -040096 }
97 }
David Benjamined9aed12017-09-27 19:24:09 -040098 return false;
Steven Valdez8f36c512017-06-20 10:55:02 -040099}
100
David Benjamined9aed12017-09-27 19:24:09 -0400101static bool set_version_bound(const SSL_PROTOCOL_METHOD *method, uint16_t *out,
102 uint16_t version) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400103 // The public API uses wire versions, except we use |TLS1_3_VERSION|
104 // everywhere to refer to any draft TLS 1.3 versions. In this direction, we
105 // map it to some representative TLS 1.3 draft version.
Steven Valdez520e1222017-06-13 12:45:25 -0400106 if (version == TLS1_3_DRAFT_VERSION ||
Steven Valdezdbe01582017-07-14 10:39:28 -0400107 version == TLS1_3_EXPERIMENT_VERSION ||
Steven Valdez16821262017-09-08 17:03:42 -0400108 version == TLS1_3_EXPERIMENT2_VERSION ||
Steven Valdez4c7f5fa2017-10-02 15:53:57 -0400109 version == TLS1_3_EXPERIMENT3_VERSION) {
David Benjamin353577c2017-06-29 15:54:58 -0400110 OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_SSL_VERSION);
David Benjamined9aed12017-09-27 19:24:09 -0400111 return false;
David Benjamin353577c2017-06-29 15:54:58 -0400112 }
Steven Valdez8f36c512017-06-20 10:55:02 -0400113 if (version == TLS1_3_VERSION) {
114 version = TLS1_3_DRAFT_VERSION;
115 }
116
David Benjamin353577c2017-06-29 15:54:58 -0400117 if (!method_supports_version(method, version) ||
118 !ssl_protocol_version_from_wire(out, version)) {
119 OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_SSL_VERSION);
David Benjamined9aed12017-09-27 19:24:09 -0400120 return false;
David Benjamin353577c2017-06-29 15:54:58 -0400121 }
122
David Benjamined9aed12017-09-27 19:24:09 -0400123 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -0400124}
125
David Benjamined9aed12017-09-27 19:24:09 -0400126static bool set_min_version(const SSL_PROTOCOL_METHOD *method, uint16_t *out,
127 uint16_t version) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400128 // Zero is interpreted as the default minimum version.
Steven Valdez8f36c512017-06-20 10:55:02 -0400129 if (version == 0) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400130 // SSL 3.0 is disabled by default and TLS 1.0 does not exist in DTLS.
Steven Valdez8f36c512017-06-20 10:55:02 -0400131 *out = method->is_dtls ? TLS1_1_VERSION : TLS1_VERSION;
David Benjamined9aed12017-09-27 19:24:09 -0400132 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -0400133 }
134
135 return set_version_bound(method, out, version);
136}
137
David Benjamined9aed12017-09-27 19:24:09 -0400138static bool set_max_version(const SSL_PROTOCOL_METHOD *method, uint16_t *out,
139 uint16_t version) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400140 // Zero is interpreted as the default maximum version.
Steven Valdez8f36c512017-06-20 10:55:02 -0400141 if (version == 0) {
142 *out = TLS1_2_VERSION;
David Benjamined9aed12017-09-27 19:24:09 -0400143 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -0400144 }
145
146 return set_version_bound(method, out, version);
147}
148
Steven Valdez8f36c512017-06-20 10:55:02 -0400149const struct {
150 uint16_t version;
151 uint32_t flag;
152} kProtocolVersions[] = {
153 {SSL3_VERSION, SSL_OP_NO_SSLv3},
154 {TLS1_VERSION, SSL_OP_NO_TLSv1},
155 {TLS1_1_VERSION, SSL_OP_NO_TLSv1_1},
156 {TLS1_2_VERSION, SSL_OP_NO_TLSv1_2},
157 {TLS1_3_VERSION, SSL_OP_NO_TLSv1_3},
158};
159
David Benjamined9aed12017-09-27 19:24:09 -0400160bool ssl_get_version_range(const SSL *ssl, uint16_t *out_min_version,
161 uint16_t *out_max_version) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400162 // For historical reasons, |SSL_OP_NO_DTLSv1| aliases |SSL_OP_NO_TLSv1|, but
163 // DTLS 1.0 should be mapped to TLS 1.1.
Steven Valdez8f36c512017-06-20 10:55:02 -0400164 uint32_t options = ssl->options;
165 if (SSL_is_dtls(ssl)) {
166 options &= ~SSL_OP_NO_TLSv1_1;
167 if (options & SSL_OP_NO_DTLSv1) {
168 options |= SSL_OP_NO_TLSv1_1;
169 }
170 }
171
172 uint16_t min_version = ssl->conf_min_version;
173 uint16_t max_version = ssl->conf_max_version;
174
David Benjaminc11ea9422017-08-29 16:33:21 -0400175 // OpenSSL's API for controlling versions entails blacklisting individual
176 // protocols. This has two problems. First, on the client, the protocol can
177 // only express a contiguous range of versions. Second, a library consumer
178 // trying to set a maximum version cannot disable protocol versions that get
179 // added in a future version of the library.
180 //
181 // To account for both of these, OpenSSL interprets the client-side bitmask
182 // as a min/max range by picking the lowest contiguous non-empty range of
183 // enabled protocols. Note that this means it is impossible to set a maximum
184 // version of the higest supported TLS version in a future-proof way.
David Benjamined9aed12017-09-27 19:24:09 -0400185 bool any_enabled = false;
Steven Valdez8f36c512017-06-20 10:55:02 -0400186 for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kProtocolVersions); i++) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400187 // Only look at the versions already enabled.
Steven Valdez8f36c512017-06-20 10:55:02 -0400188 if (min_version > kProtocolVersions[i].version) {
189 continue;
190 }
191 if (max_version < kProtocolVersions[i].version) {
192 break;
193 }
194
195 if (!(options & kProtocolVersions[i].flag)) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400196 // The minimum version is the first enabled version.
Steven Valdez8f36c512017-06-20 10:55:02 -0400197 if (!any_enabled) {
David Benjamined9aed12017-09-27 19:24:09 -0400198 any_enabled = true;
Steven Valdez8f36c512017-06-20 10:55:02 -0400199 min_version = kProtocolVersions[i].version;
200 }
201 continue;
202 }
203
David Benjaminc11ea9422017-08-29 16:33:21 -0400204 // If there is a disabled version after the first enabled one, all versions
205 // after it are implicitly disabled.
Steven Valdez8f36c512017-06-20 10:55:02 -0400206 if (any_enabled) {
207 max_version = kProtocolVersions[i-1].version;
208 break;
209 }
210 }
211
212 if (!any_enabled) {
213 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_SUPPORTED_VERSIONS_ENABLED);
David Benjamined9aed12017-09-27 19:24:09 -0400214 return false;
Steven Valdez8f36c512017-06-20 10:55:02 -0400215 }
216
217 *out_min_version = min_version;
218 *out_max_version = max_version;
David Benjamined9aed12017-09-27 19:24:09 -0400219 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -0400220}
221
David Benjamind9cbb532017-07-07 13:17:19 -0400222static uint16_t ssl_version(const SSL *ssl) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400223 // In early data, we report the predicted version.
David Benjamind9cbb532017-07-07 13:17:19 -0400224 if (SSL_in_early_data(ssl) && !ssl->server) {
225 return ssl->s3->hs->early_session->ssl_version;
226 }
227 return ssl->version;
228}
229
David Benjamin86e95b82017-07-18 16:34:25 -0400230static const char *ssl_version_to_string(uint16_t version) {
Steven Valdez8f36c512017-06-20 10:55:02 -0400231 switch (version) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400232 // Report TLS 1.3 draft version as TLS 1.3 in the public API.
Steven Valdez8f36c512017-06-20 10:55:02 -0400233 case TLS1_3_DRAFT_VERSION:
Steven Valdez520e1222017-06-13 12:45:25 -0400234 case TLS1_3_EXPERIMENT_VERSION:
Steven Valdez16821262017-09-08 17:03:42 -0400235 case TLS1_3_EXPERIMENT2_VERSION:
Steven Valdezc7d4d212017-09-11 13:53:08 -0400236 case TLS1_3_EXPERIMENT3_VERSION:
Steven Valdez8f36c512017-06-20 10:55:02 -0400237 return "TLSv1.3";
238
239 case TLS1_2_VERSION:
240 return "TLSv1.2";
241
242 case TLS1_1_VERSION:
243 return "TLSv1.1";
244
245 case TLS1_VERSION:
246 return "TLSv1";
247
248 case SSL3_VERSION:
249 return "SSLv3";
250
251 case DTLS1_VERSION:
252 return "DTLSv1";
253
254 case DTLS1_2_VERSION:
255 return "DTLSv1.2";
256
257 default:
258 return "unknown";
259 }
260}
261
Steven Valdez8f36c512017-06-20 10:55:02 -0400262uint16_t ssl3_protocol_version(const SSL *ssl) {
263 assert(ssl->s3->have_version);
264 uint16_t version;
265 if (!ssl_protocol_version_from_wire(&version, ssl->version)) {
David Benjaminc11ea9422017-08-29 16:33:21 -0400266 // |ssl->version| will always be set to a valid version.
Steven Valdez8f36c512017-06-20 10:55:02 -0400267 assert(0);
268 return 0;
269 }
270
271 return version;
272}
273
David Benjamined9aed12017-09-27 19:24:09 -0400274bool ssl_supports_version(SSL_HANDSHAKE *hs, uint16_t version) {
Steven Valdez520e1222017-06-13 12:45:25 -0400275 SSL *const ssl = hs->ssl;
David Benjaminc11ea9422017-08-29 16:33:21 -0400276 // As a client, only allow the configured TLS 1.3 variant. As a server,
277 // support all TLS 1.3 variants as long as tls13_variant is set to a
278 // non-default value.
Steven Valdez520e1222017-06-13 12:45:25 -0400279 if (ssl->server) {
Steven Valdez52586f92017-07-11 15:08:32 -0400280 if (ssl->tls13_variant == tls13_default &&
Steven Valdezdbe01582017-07-14 10:39:28 -0400281 (version == TLS1_3_EXPERIMENT_VERSION ||
Steven Valdez16821262017-09-08 17:03:42 -0400282 version == TLS1_3_EXPERIMENT2_VERSION ||
Steven Valdez4c7f5fa2017-10-02 15:53:57 -0400283 version == TLS1_3_EXPERIMENT3_VERSION)) {
David Benjamined9aed12017-09-27 19:24:09 -0400284 return false;
Steven Valdez520e1222017-06-13 12:45:25 -0400285 }
286 } else {
Steven Valdez52586f92017-07-11 15:08:32 -0400287 if ((ssl->tls13_variant != tls13_experiment &&
Steven Valdez520e1222017-06-13 12:45:25 -0400288 version == TLS1_3_EXPERIMENT_VERSION) ||
Steven Valdez16821262017-09-08 17:03:42 -0400289 (ssl->tls13_variant != tls13_experiment2 &&
290 version == TLS1_3_EXPERIMENT2_VERSION) ||
Steven Valdezc7d4d212017-09-11 13:53:08 -0400291 (ssl->tls13_variant != tls13_experiment3 &&
292 version == TLS1_3_EXPERIMENT3_VERSION) ||
Steven Valdez52586f92017-07-11 15:08:32 -0400293 (ssl->tls13_variant != tls13_default &&
Steven Valdez520e1222017-06-13 12:45:25 -0400294 version == TLS1_3_DRAFT_VERSION)) {
David Benjamined9aed12017-09-27 19:24:09 -0400295 return false;
Steven Valdez520e1222017-06-13 12:45:25 -0400296 }
297 }
298
Steven Valdez8f36c512017-06-20 10:55:02 -0400299 uint16_t protocol_version;
Steven Valdez520e1222017-06-13 12:45:25 -0400300 return method_supports_version(ssl->method, version) &&
Steven Valdez8f36c512017-06-20 10:55:02 -0400301 ssl_protocol_version_from_wire(&protocol_version, version) &&
302 hs->min_version <= protocol_version &&
303 protocol_version <= hs->max_version;
304}
305
David Benjamined9aed12017-09-27 19:24:09 -0400306bool ssl_add_supported_versions(SSL_HANDSHAKE *hs, CBB *cbb) {
Steven Valdez8f36c512017-06-20 10:55:02 -0400307 const uint16_t *versions;
308 size_t num_versions;
309 get_method_versions(hs->ssl->method, &versions, &num_versions);
310 for (size_t i = 0; i < num_versions; i++) {
311 if (ssl_supports_version(hs, versions[i]) &&
312 !CBB_add_u16(cbb, versions[i])) {
David Benjamined9aed12017-09-27 19:24:09 -0400313 return false;
Steven Valdez8f36c512017-06-20 10:55:02 -0400314 }
315 }
David Benjamined9aed12017-09-27 19:24:09 -0400316 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -0400317}
318
David Benjamined9aed12017-09-27 19:24:09 -0400319bool ssl_negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
320 uint16_t *out_version, const CBS *peer_versions) {
Steven Valdez8f36c512017-06-20 10:55:02 -0400321 const uint16_t *versions;
322 size_t num_versions;
323 get_method_versions(hs->ssl->method, &versions, &num_versions);
324 for (size_t i = 0; i < num_versions; i++) {
325 if (!ssl_supports_version(hs, versions[i])) {
326 continue;
327 }
328
329 CBS copy = *peer_versions;
330 while (CBS_len(&copy) != 0) {
331 uint16_t version;
332 if (!CBS_get_u16(&copy, &version)) {
333 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
334 *out_alert = SSL_AD_DECODE_ERROR;
David Benjamined9aed12017-09-27 19:24:09 -0400335 return false;
Steven Valdez8f36c512017-06-20 10:55:02 -0400336 }
337
338 if (version == versions[i]) {
339 *out_version = version;
David Benjamined9aed12017-09-27 19:24:09 -0400340 return true;
Steven Valdez8f36c512017-06-20 10:55:02 -0400341 }
342 }
343 }
344
345 OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_PROTOCOL);
346 *out_alert = SSL_AD_PROTOCOL_VERSION;
David Benjamined9aed12017-09-27 19:24:09 -0400347 return false;
Steven Valdez8f36c512017-06-20 10:55:02 -0400348}
David Benjamin86e95b82017-07-18 16:34:25 -0400349
Steven Valdez16821262017-09-08 17:03:42 -0400350bool ssl_is_resumption_experiment(uint16_t version) {
351 return version == TLS1_3_EXPERIMENT_VERSION ||
Steven Valdezc7d4d212017-09-11 13:53:08 -0400352 version == TLS1_3_EXPERIMENT2_VERSION ||
353 version == TLS1_3_EXPERIMENT3_VERSION;
354}
355
356bool ssl_is_resumption_variant(enum tls13_variant_t variant) {
357 return variant == tls13_experiment || variant == tls13_experiment2 ||
358 variant == tls13_experiment3;
359}
360
361bool ssl_is_resumption_client_ccs_experiment(uint16_t version) {
362 return version == TLS1_3_EXPERIMENT_VERSION ||
Steven Valdez16821262017-09-08 17:03:42 -0400363 version == TLS1_3_EXPERIMENT2_VERSION;
364}
365
Steven Valdezc7d4d212017-09-11 13:53:08 -0400366bool ssl_is_resumption_record_version_experiment(uint16_t version) {
367 return version == TLS1_3_EXPERIMENT2_VERSION ||
368 version == TLS1_3_EXPERIMENT3_VERSION;
369}
370
David Benjamin86e95b82017-07-18 16:34:25 -0400371} // namespace bssl
372
373using namespace bssl;
374
375int SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) {
376 return set_min_version(ctx->method, &ctx->conf_min_version, version);
377}
378
379int SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) {
380 return set_max_version(ctx->method, &ctx->conf_max_version, version);
381}
382
383int SSL_set_min_proto_version(SSL *ssl, uint16_t version) {
384 return set_min_version(ssl->method, &ssl->conf_min_version, version);
385}
386
387int SSL_set_max_proto_version(SSL *ssl, uint16_t version) {
388 return set_max_version(ssl->method, &ssl->conf_max_version, version);
389}
390
391int SSL_version(const SSL *ssl) {
392 uint16_t ret = ssl_version(ssl);
David Benjaminc11ea9422017-08-29 16:33:21 -0400393 // Report TLS 1.3 draft version as TLS 1.3 in the public API.
Steven Valdez16821262017-09-08 17:03:42 -0400394 if (ret == TLS1_3_DRAFT_VERSION ||
395 ret == TLS1_3_EXPERIMENT_VERSION ||
396 ret == TLS1_3_EXPERIMENT2_VERSION ||
Steven Valdez4c7f5fa2017-10-02 15:53:57 -0400397 ret == TLS1_3_EXPERIMENT3_VERSION) {
David Benjamin86e95b82017-07-18 16:34:25 -0400398 return TLS1_3_VERSION;
399 }
400 return ret;
401}
402
403const char *SSL_get_version(const SSL *ssl) {
404 return ssl_version_to_string(ssl_version(ssl));
405}
406
407const char *SSL_SESSION_get_version(const SSL_SESSION *session) {
408 return ssl_version_to_string(session->ssl_version);
409}