blob: f6dea8c2f29d5c0d42d660abefc44eb0a56fe87c [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
Steven Valdez8f36c512017-06-20 10:55:02 -040028int ssl_protocol_version_from_wire(uint16_t *out, uint16_t version) {
29 switch (version) {
30 case SSL3_VERSION:
31 case TLS1_VERSION:
32 case TLS1_1_VERSION:
33 case TLS1_2_VERSION:
34 *out = version;
35 return 1;
36
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 Valdezdbe01582017-07-14 10:39:28 -040040 case TLS1_3_RECORD_TYPE_EXPERIMENT_VERSION:
Steven Valdez8f36c512017-06-20 10:55:02 -040041 *out = TLS1_3_VERSION;
42 return 1;
43
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;
47 return 1;
48
49 case DTLS1_2_VERSION:
50 *out = TLS1_2_VERSION;
51 return 1;
52
53 default:
54 return 0;
55 }
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 Valdez16821262017-09-08 17:03:42 -040062 TLS1_3_EXPERIMENT2_VERSION,
Steven Valdez520e1222017-06-13 12:45:25 -040063 TLS1_3_EXPERIMENT_VERSION,
Steven Valdezdbe01582017-07-14 10:39:28 -040064 TLS1_3_RECORD_TYPE_EXPERIMENT_VERSION,
65 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
88static int method_supports_version(const SSL_PROTOCOL_METHOD *method,
89 uint16_t version) {
90 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) {
95 return 1;
96 }
97 }
98 return 0;
99}
100
101static int 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 Valdezdbe01582017-07-14 10:39:28 -0400109 version == TLS1_3_RECORD_TYPE_EXPERIMENT_VERSION) {
David Benjamin353577c2017-06-29 15:54:58 -0400110 OPENSSL_PUT_ERROR(SSL, SSL_R_UNKNOWN_SSL_VERSION);
111 return 0;
112 }
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);
120 return 0;
121 }
122
123 return 1;
Steven Valdez8f36c512017-06-20 10:55:02 -0400124}
125
126static int 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;
132 return 1;
133 }
134
135 return set_version_bound(method, out, version);
136}
137
138static int 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;
143 return 1;
144 }
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
160int 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.
Steven Valdez8f36c512017-06-20 10:55:02 -0400185 int any_enabled = 0;
186 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) {
198 any_enabled = 1;
199 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);
214 return 0;
215 }
216
217 *out_min_version = min_version;
218 *out_max_version = max_version;
219 return 1;
220}
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 Valdezdbe01582017-07-14 10:39:28 -0400236 case TLS1_3_RECORD_TYPE_EXPERIMENT_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
274int 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 Valdezdbe01582017-07-14 10:39:28 -0400283 version == TLS1_3_RECORD_TYPE_EXPERIMENT_VERSION)) {
Steven Valdez520e1222017-06-13 12:45:25 -0400284 return 0;
285 }
286 } else {
Steven Valdez52586f92017-07-11 15:08:32 -0400287 if ((ssl->tls13_variant != tls13_experiment &&
Steven Valdez0e4a4482017-07-17 11:12:34 -0400288 ssl->tls13_variant != tls13_no_session_id_experiment &&
Steven Valdez520e1222017-06-13 12:45:25 -0400289 version == TLS1_3_EXPERIMENT_VERSION) ||
Steven Valdez16821262017-09-08 17:03:42 -0400290 (ssl->tls13_variant != tls13_experiment2 &&
291 version == TLS1_3_EXPERIMENT2_VERSION) ||
Steven Valdezdbe01582017-07-14 10:39:28 -0400292 (ssl->tls13_variant != tls13_record_type_experiment &&
293 version == TLS1_3_RECORD_TYPE_EXPERIMENT_VERSION) ||
Steven Valdez52586f92017-07-11 15:08:32 -0400294 (ssl->tls13_variant != tls13_default &&
Steven Valdez520e1222017-06-13 12:45:25 -0400295 version == TLS1_3_DRAFT_VERSION)) {
296 return 0;
297 }
298 }
299
Steven Valdez8f36c512017-06-20 10:55:02 -0400300 uint16_t protocol_version;
Steven Valdez520e1222017-06-13 12:45:25 -0400301 return method_supports_version(ssl->method, version) &&
Steven Valdez8f36c512017-06-20 10:55:02 -0400302 ssl_protocol_version_from_wire(&protocol_version, version) &&
303 hs->min_version <= protocol_version &&
304 protocol_version <= hs->max_version;
305}
306
307int ssl_add_supported_versions(SSL_HANDSHAKE *hs, CBB *cbb) {
308 const uint16_t *versions;
309 size_t num_versions;
310 get_method_versions(hs->ssl->method, &versions, &num_versions);
311 for (size_t i = 0; i < num_versions; i++) {
312 if (ssl_supports_version(hs, versions[i]) &&
313 !CBB_add_u16(cbb, versions[i])) {
314 return 0;
315 }
316 }
317 return 1;
318}
319
320int ssl_negotiate_version(SSL_HANDSHAKE *hs, uint8_t *out_alert,
321 uint16_t *out_version, const CBS *peer_versions) {
322 const uint16_t *versions;
323 size_t num_versions;
324 get_method_versions(hs->ssl->method, &versions, &num_versions);
325 for (size_t i = 0; i < num_versions; i++) {
326 if (!ssl_supports_version(hs, versions[i])) {
327 continue;
328 }
329
330 CBS copy = *peer_versions;
331 while (CBS_len(&copy) != 0) {
332 uint16_t version;
333 if (!CBS_get_u16(&copy, &version)) {
334 OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR);
335 *out_alert = SSL_AD_DECODE_ERROR;
336 return 0;
337 }
338
339 if (version == versions[i]) {
340 *out_version = version;
341 return 1;
342 }
343 }
344 }
345
346 OPENSSL_PUT_ERROR(SSL, SSL_R_UNSUPPORTED_PROTOCOL);
347 *out_alert = SSL_AD_PROTOCOL_VERSION;
348 return 0;
349}
David Benjamin86e95b82017-07-18 16:34:25 -0400350
Steven Valdez16821262017-09-08 17:03:42 -0400351bool ssl_is_resumption_experiment(uint16_t version) {
352 return version == TLS1_3_EXPERIMENT_VERSION ||
353 version == TLS1_3_EXPERIMENT2_VERSION;
354}
355
David Benjamin86e95b82017-07-18 16:34:25 -0400356} // namespace bssl
357
358using namespace bssl;
359
360int SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) {
361 return set_min_version(ctx->method, &ctx->conf_min_version, version);
362}
363
364int SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) {
365 return set_max_version(ctx->method, &ctx->conf_max_version, version);
366}
367
368int SSL_set_min_proto_version(SSL *ssl, uint16_t version) {
369 return set_min_version(ssl->method, &ssl->conf_min_version, version);
370}
371
372int SSL_set_max_proto_version(SSL *ssl, uint16_t version) {
373 return set_max_version(ssl->method, &ssl->conf_max_version, version);
374}
375
376int SSL_version(const SSL *ssl) {
377 uint16_t ret = ssl_version(ssl);
David Benjaminc11ea9422017-08-29 16:33:21 -0400378 // Report TLS 1.3 draft version as TLS 1.3 in the public API.
Steven Valdez16821262017-09-08 17:03:42 -0400379 if (ret == TLS1_3_DRAFT_VERSION ||
380 ret == TLS1_3_EXPERIMENT_VERSION ||
381 ret == TLS1_3_EXPERIMENT2_VERSION ||
David Benjamin86e95b82017-07-18 16:34:25 -0400382 ret == TLS1_3_RECORD_TYPE_EXPERIMENT_VERSION) {
383 return TLS1_3_VERSION;
384 }
385 return ret;
386}
387
388const char *SSL_get_version(const SSL *ssl) {
389 return ssl_version_to_string(ssl_version(ssl));
390}
391
392const char *SSL_SESSION_get_version(const SSL_SESSION *session) {
393 return ssl_version_to_string(session->ssl_version);
394}