1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: ssl_versions.c,v 1.24 2022/09/11 18:13:30 jsing Exp $ */
272c33676SMaxim Ag /*
372c33676SMaxim Ag * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
472c33676SMaxim Ag *
572c33676SMaxim Ag * Permission to use, copy, modify, and distribute this software for any
672c33676SMaxim Ag * purpose with or without fee is hereby granted, provided that the above
772c33676SMaxim Ag * copyright notice and this permission notice appear in all copies.
872c33676SMaxim Ag *
972c33676SMaxim Ag * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1072c33676SMaxim Ag * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1172c33676SMaxim Ag * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1272c33676SMaxim Ag * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1372c33676SMaxim Ag * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1472c33676SMaxim Ag * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1572c33676SMaxim Ag * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1672c33676SMaxim Ag */
1772c33676SMaxim Ag
1872c33676SMaxim Ag #include "ssl_locl.h"
1972c33676SMaxim Ag
20*de0e0e4dSAntonio Huete Jimenez static uint16_t
ssl_dtls_to_tls_version(uint16_t dtls_ver)21*de0e0e4dSAntonio Huete Jimenez ssl_dtls_to_tls_version(uint16_t dtls_ver)
22*de0e0e4dSAntonio Huete Jimenez {
23*de0e0e4dSAntonio Huete Jimenez if (dtls_ver == DTLS1_VERSION)
24*de0e0e4dSAntonio Huete Jimenez return TLS1_1_VERSION;
25*de0e0e4dSAntonio Huete Jimenez if (dtls_ver == DTLS1_2_VERSION)
26*de0e0e4dSAntonio Huete Jimenez return TLS1_2_VERSION;
27*de0e0e4dSAntonio Huete Jimenez return 0;
28*de0e0e4dSAntonio Huete Jimenez }
29*de0e0e4dSAntonio Huete Jimenez
30*de0e0e4dSAntonio Huete Jimenez static uint16_t
ssl_tls_to_dtls_version(uint16_t tls_ver)31*de0e0e4dSAntonio Huete Jimenez ssl_tls_to_dtls_version(uint16_t tls_ver)
32*de0e0e4dSAntonio Huete Jimenez {
33*de0e0e4dSAntonio Huete Jimenez if (tls_ver == TLS1_1_VERSION)
34*de0e0e4dSAntonio Huete Jimenez return DTLS1_VERSION;
35*de0e0e4dSAntonio Huete Jimenez if (tls_ver == TLS1_2_VERSION)
36*de0e0e4dSAntonio Huete Jimenez return DTLS1_2_VERSION;
37*de0e0e4dSAntonio Huete Jimenez return 0;
38*de0e0e4dSAntonio Huete Jimenez }
39*de0e0e4dSAntonio Huete Jimenez
4072c33676SMaxim Ag static int
ssl_clamp_tls_version_range(uint16_t * min_ver,uint16_t * max_ver,uint16_t clamp_min,uint16_t clamp_max)41*de0e0e4dSAntonio Huete Jimenez ssl_clamp_tls_version_range(uint16_t *min_ver, uint16_t *max_ver,
4272c33676SMaxim Ag uint16_t clamp_min, uint16_t clamp_max)
4372c33676SMaxim Ag {
4472c33676SMaxim Ag if (clamp_min > clamp_max || *min_ver > *max_ver)
4572c33676SMaxim Ag return 0;
4672c33676SMaxim Ag if (clamp_max < *min_ver || clamp_min > *max_ver)
4772c33676SMaxim Ag return 0;
4872c33676SMaxim Ag
4972c33676SMaxim Ag if (*min_ver < clamp_min)
5072c33676SMaxim Ag *min_ver = clamp_min;
5172c33676SMaxim Ag if (*max_ver > clamp_max)
5272c33676SMaxim Ag *max_ver = clamp_max;
5372c33676SMaxim Ag
5472c33676SMaxim Ag return 1;
5572c33676SMaxim Ag }
5672c33676SMaxim Ag
5772c33676SMaxim Ag int
ssl_version_set_min(const SSL_METHOD * meth,uint16_t proto_ver,uint16_t max_tls_ver,uint16_t * out_tls_ver,uint16_t * out_proto_ver)58*de0e0e4dSAntonio Huete Jimenez ssl_version_set_min(const SSL_METHOD *meth, uint16_t proto_ver,
59*de0e0e4dSAntonio Huete Jimenez uint16_t max_tls_ver, uint16_t *out_tls_ver, uint16_t *out_proto_ver)
6072c33676SMaxim Ag {
61*de0e0e4dSAntonio Huete Jimenez uint16_t min_proto, min_version, max_version;
6272c33676SMaxim Ag
63*de0e0e4dSAntonio Huete Jimenez if (proto_ver == 0) {
64*de0e0e4dSAntonio Huete Jimenez *out_tls_ver = meth->min_tls_version;
65*de0e0e4dSAntonio Huete Jimenez *out_proto_ver = 0;
6672c33676SMaxim Ag return 1;
6772c33676SMaxim Ag }
6872c33676SMaxim Ag
69*de0e0e4dSAntonio Huete Jimenez min_version = proto_ver;
70*de0e0e4dSAntonio Huete Jimenez max_version = max_tls_ver;
7172c33676SMaxim Ag
72*de0e0e4dSAntonio Huete Jimenez if (meth->dtls) {
73*de0e0e4dSAntonio Huete Jimenez if ((min_version = ssl_dtls_to_tls_version(proto_ver)) == 0)
74*de0e0e4dSAntonio Huete Jimenez return 0;
75*de0e0e4dSAntonio Huete Jimenez }
76*de0e0e4dSAntonio Huete Jimenez
77*de0e0e4dSAntonio Huete Jimenez if (!ssl_clamp_tls_version_range(&min_version, &max_version,
78*de0e0e4dSAntonio Huete Jimenez meth->min_tls_version, meth->max_tls_version))
7972c33676SMaxim Ag return 0;
8072c33676SMaxim Ag
81*de0e0e4dSAntonio Huete Jimenez min_proto = min_version;
82*de0e0e4dSAntonio Huete Jimenez if (meth->dtls) {
83*de0e0e4dSAntonio Huete Jimenez if ((min_proto = ssl_tls_to_dtls_version(min_version)) == 0)
84*de0e0e4dSAntonio Huete Jimenez return 0;
85*de0e0e4dSAntonio Huete Jimenez }
86*de0e0e4dSAntonio Huete Jimenez *out_tls_ver = min_version;
87*de0e0e4dSAntonio Huete Jimenez *out_proto_ver = min_proto;
8872c33676SMaxim Ag
8972c33676SMaxim Ag return 1;
9072c33676SMaxim Ag }
9172c33676SMaxim Ag
9272c33676SMaxim Ag int
ssl_version_set_max(const SSL_METHOD * meth,uint16_t proto_ver,uint16_t min_tls_ver,uint16_t * out_tls_ver,uint16_t * out_proto_ver)93*de0e0e4dSAntonio Huete Jimenez ssl_version_set_max(const SSL_METHOD *meth, uint16_t proto_ver,
94*de0e0e4dSAntonio Huete Jimenez uint16_t min_tls_ver, uint16_t *out_tls_ver, uint16_t *out_proto_ver)
9572c33676SMaxim Ag {
96*de0e0e4dSAntonio Huete Jimenez uint16_t max_proto, min_version, max_version;
9772c33676SMaxim Ag
98*de0e0e4dSAntonio Huete Jimenez if (proto_ver == 0) {
99*de0e0e4dSAntonio Huete Jimenez *out_tls_ver = meth->max_tls_version;
100*de0e0e4dSAntonio Huete Jimenez *out_proto_ver = 0;
10172c33676SMaxim Ag return 1;
10272c33676SMaxim Ag }
10372c33676SMaxim Ag
104*de0e0e4dSAntonio Huete Jimenez min_version = min_tls_ver;
105*de0e0e4dSAntonio Huete Jimenez max_version = proto_ver;
10672c33676SMaxim Ag
107*de0e0e4dSAntonio Huete Jimenez if (meth->dtls) {
108*de0e0e4dSAntonio Huete Jimenez if ((max_version = ssl_dtls_to_tls_version(proto_ver)) == 0)
109*de0e0e4dSAntonio Huete Jimenez return 0;
110*de0e0e4dSAntonio Huete Jimenez }
111*de0e0e4dSAntonio Huete Jimenez
112*de0e0e4dSAntonio Huete Jimenez if (!ssl_clamp_tls_version_range(&min_version, &max_version,
113*de0e0e4dSAntonio Huete Jimenez meth->min_tls_version, meth->max_tls_version))
11472c33676SMaxim Ag return 0;
11572c33676SMaxim Ag
116*de0e0e4dSAntonio Huete Jimenez max_proto = max_version;
117*de0e0e4dSAntonio Huete Jimenez if (meth->dtls) {
118*de0e0e4dSAntonio Huete Jimenez if ((max_proto = ssl_tls_to_dtls_version(max_version)) == 0)
119*de0e0e4dSAntonio Huete Jimenez return 0;
120*de0e0e4dSAntonio Huete Jimenez }
121*de0e0e4dSAntonio Huete Jimenez *out_tls_ver = max_version;
122*de0e0e4dSAntonio Huete Jimenez *out_proto_ver = max_proto;
12372c33676SMaxim Ag
12472c33676SMaxim Ag return 1;
12572c33676SMaxim Ag }
12672c33676SMaxim Ag
12772c33676SMaxim Ag int
ssl_enabled_tls_version_range(SSL * s,uint16_t * min_ver,uint16_t * max_ver)128*de0e0e4dSAntonio Huete Jimenez ssl_enabled_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver)
12972c33676SMaxim Ag {
13072c33676SMaxim Ag uint16_t min_version, max_version;
131*de0e0e4dSAntonio Huete Jimenez unsigned long options;
13272c33676SMaxim Ag
13372c33676SMaxim Ag /*
13472c33676SMaxim Ag * The enabled versions have to be a contiguous range, which means we
13572c33676SMaxim Ag * cannot enable and disable single versions at our whim, even though
13672c33676SMaxim Ag * this is what the OpenSSL flags allow. The historical way this has
13772c33676SMaxim Ag * been handled is by making a flag mean that all higher versions
13872c33676SMaxim Ag * are disabled, if any version lower than the flag is enabled.
13972c33676SMaxim Ag */
14072c33676SMaxim Ag
14172c33676SMaxim Ag min_version = 0;
14272c33676SMaxim Ag max_version = TLS1_3_VERSION;
143*de0e0e4dSAntonio Huete Jimenez options = s->internal->options;
14472c33676SMaxim Ag
145*de0e0e4dSAntonio Huete Jimenez if (SSL_is_dtls(s)) {
146*de0e0e4dSAntonio Huete Jimenez options = 0;
147*de0e0e4dSAntonio Huete Jimenez if (s->internal->options & SSL_OP_NO_DTLSv1)
148*de0e0e4dSAntonio Huete Jimenez options |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1;
149*de0e0e4dSAntonio Huete Jimenez if (s->internal->options & SSL_OP_NO_DTLSv1_2)
150*de0e0e4dSAntonio Huete Jimenez options |= SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_2;
151*de0e0e4dSAntonio Huete Jimenez }
152*de0e0e4dSAntonio Huete Jimenez
153*de0e0e4dSAntonio Huete Jimenez if ((options & SSL_OP_NO_TLSv1) == 0)
15472c33676SMaxim Ag min_version = TLS1_VERSION;
155*de0e0e4dSAntonio Huete Jimenez else if ((options & SSL_OP_NO_TLSv1_1) == 0)
15672c33676SMaxim Ag min_version = TLS1_1_VERSION;
157*de0e0e4dSAntonio Huete Jimenez else if ((options & SSL_OP_NO_TLSv1_2) == 0)
15872c33676SMaxim Ag min_version = TLS1_2_VERSION;
159*de0e0e4dSAntonio Huete Jimenez else if ((options & SSL_OP_NO_TLSv1_3) == 0)
16072c33676SMaxim Ag min_version = TLS1_3_VERSION;
16172c33676SMaxim Ag
162*de0e0e4dSAntonio Huete Jimenez if ((options & SSL_OP_NO_TLSv1_3) && min_version < TLS1_3_VERSION)
16372c33676SMaxim Ag max_version = TLS1_2_VERSION;
164*de0e0e4dSAntonio Huete Jimenez if ((options & SSL_OP_NO_TLSv1_2) && min_version < TLS1_2_VERSION)
16572c33676SMaxim Ag max_version = TLS1_1_VERSION;
166*de0e0e4dSAntonio Huete Jimenez if ((options & SSL_OP_NO_TLSv1_1) && min_version < TLS1_1_VERSION)
16772c33676SMaxim Ag max_version = TLS1_VERSION;
168*de0e0e4dSAntonio Huete Jimenez if ((options & SSL_OP_NO_TLSv1) && min_version < TLS1_VERSION)
16972c33676SMaxim Ag max_version = 0;
17072c33676SMaxim Ag
17172c33676SMaxim Ag /* Everything has been disabled... */
17272c33676SMaxim Ag if (min_version == 0 || max_version == 0)
17372c33676SMaxim Ag return 0;
17472c33676SMaxim Ag
17572c33676SMaxim Ag /* Limit to configured version range. */
176*de0e0e4dSAntonio Huete Jimenez if (!ssl_clamp_tls_version_range(&min_version, &max_version,
177*de0e0e4dSAntonio Huete Jimenez s->internal->min_tls_version, s->internal->max_tls_version))
17872c33676SMaxim Ag return 0;
17972c33676SMaxim Ag
180*de0e0e4dSAntonio Huete Jimenez /* QUIC requires a minimum of TLSv1.3. */
181*de0e0e4dSAntonio Huete Jimenez if (SSL_is_quic(s)) {
182*de0e0e4dSAntonio Huete Jimenez if (max_version < TLS1_3_VERSION)
183*de0e0e4dSAntonio Huete Jimenez return 0;
184*de0e0e4dSAntonio Huete Jimenez if (min_version < TLS1_3_VERSION)
185*de0e0e4dSAntonio Huete Jimenez min_version = TLS1_3_VERSION;
186*de0e0e4dSAntonio Huete Jimenez }
187*de0e0e4dSAntonio Huete Jimenez
18872c33676SMaxim Ag if (min_ver != NULL)
18972c33676SMaxim Ag *min_ver = min_version;
19072c33676SMaxim Ag if (max_ver != NULL)
19172c33676SMaxim Ag *max_ver = max_version;
19272c33676SMaxim Ag
19372c33676SMaxim Ag return 1;
19472c33676SMaxim Ag }
19572c33676SMaxim Ag
19672c33676SMaxim Ag int
ssl_supported_tls_version_range(SSL * s,uint16_t * min_ver,uint16_t * max_ver)197*de0e0e4dSAntonio Huete Jimenez ssl_supported_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver)
19872c33676SMaxim Ag {
19972c33676SMaxim Ag uint16_t min_version, max_version;
20072c33676SMaxim Ag
201*de0e0e4dSAntonio Huete Jimenez if (!ssl_enabled_tls_version_range(s, &min_version, &max_version))
20272c33676SMaxim Ag return 0;
20372c33676SMaxim Ag
20472c33676SMaxim Ag /* Limit to the versions supported by this method. */
205*de0e0e4dSAntonio Huete Jimenez if (!ssl_clamp_tls_version_range(&min_version, &max_version,
206*de0e0e4dSAntonio Huete Jimenez s->method->min_tls_version, s->method->max_tls_version))
20772c33676SMaxim Ag return 0;
20872c33676SMaxim Ag
20972c33676SMaxim Ag if (min_ver != NULL)
21072c33676SMaxim Ag *min_ver = min_version;
21172c33676SMaxim Ag if (max_ver != NULL)
21272c33676SMaxim Ag *max_ver = max_version;
21372c33676SMaxim Ag
21472c33676SMaxim Ag return 1;
21572c33676SMaxim Ag }
21672c33676SMaxim Ag
217*de0e0e4dSAntonio Huete Jimenez uint16_t
ssl_tls_version(uint16_t version)218*de0e0e4dSAntonio Huete Jimenez ssl_tls_version(uint16_t version)
219*de0e0e4dSAntonio Huete Jimenez {
220*de0e0e4dSAntonio Huete Jimenez if (version == TLS1_VERSION || version == TLS1_1_VERSION ||
221*de0e0e4dSAntonio Huete Jimenez version == TLS1_2_VERSION || version == TLS1_3_VERSION)
222*de0e0e4dSAntonio Huete Jimenez return version;
223*de0e0e4dSAntonio Huete Jimenez
224*de0e0e4dSAntonio Huete Jimenez if (version == DTLS1_VERSION)
225*de0e0e4dSAntonio Huete Jimenez return TLS1_1_VERSION;
226*de0e0e4dSAntonio Huete Jimenez if (version == DTLS1_2_VERSION)
227*de0e0e4dSAntonio Huete Jimenez return TLS1_2_VERSION;
228*de0e0e4dSAntonio Huete Jimenez
229*de0e0e4dSAntonio Huete Jimenez return 0;
230*de0e0e4dSAntonio Huete Jimenez }
231*de0e0e4dSAntonio Huete Jimenez
232*de0e0e4dSAntonio Huete Jimenez uint16_t
ssl_effective_tls_version(SSL * s)233*de0e0e4dSAntonio Huete Jimenez ssl_effective_tls_version(SSL *s)
234*de0e0e4dSAntonio Huete Jimenez {
235*de0e0e4dSAntonio Huete Jimenez if (s->s3->hs.negotiated_tls_version > 0)
236*de0e0e4dSAntonio Huete Jimenez return s->s3->hs.negotiated_tls_version;
237*de0e0e4dSAntonio Huete Jimenez
238*de0e0e4dSAntonio Huete Jimenez return s->s3->hs.our_max_tls_version;
239*de0e0e4dSAntonio Huete Jimenez }
240*de0e0e4dSAntonio Huete Jimenez
241*de0e0e4dSAntonio Huete Jimenez int
ssl_max_supported_version(SSL * s,uint16_t * max_ver)242*de0e0e4dSAntonio Huete Jimenez ssl_max_supported_version(SSL *s, uint16_t *max_ver)
243*de0e0e4dSAntonio Huete Jimenez {
244*de0e0e4dSAntonio Huete Jimenez uint16_t max_version;
245*de0e0e4dSAntonio Huete Jimenez
246*de0e0e4dSAntonio Huete Jimenez *max_ver = 0;
247*de0e0e4dSAntonio Huete Jimenez
248*de0e0e4dSAntonio Huete Jimenez if (!ssl_supported_tls_version_range(s, NULL, &max_version))
249*de0e0e4dSAntonio Huete Jimenez return 0;
250*de0e0e4dSAntonio Huete Jimenez
251*de0e0e4dSAntonio Huete Jimenez if (SSL_is_dtls(s)) {
252*de0e0e4dSAntonio Huete Jimenez if ((max_version = ssl_tls_to_dtls_version(max_version)) == 0)
253*de0e0e4dSAntonio Huete Jimenez return 0;
254*de0e0e4dSAntonio Huete Jimenez }
255*de0e0e4dSAntonio Huete Jimenez
256*de0e0e4dSAntonio Huete Jimenez *max_ver = max_version;
257*de0e0e4dSAntonio Huete Jimenez
258*de0e0e4dSAntonio Huete Jimenez return 1;
259*de0e0e4dSAntonio Huete Jimenez }
260*de0e0e4dSAntonio Huete Jimenez
261*de0e0e4dSAntonio Huete Jimenez int
ssl_max_legacy_version(SSL * s,uint16_t * max_ver)262*de0e0e4dSAntonio Huete Jimenez ssl_max_legacy_version(SSL *s, uint16_t *max_ver)
263*de0e0e4dSAntonio Huete Jimenez {
264*de0e0e4dSAntonio Huete Jimenez uint16_t max_version;
265*de0e0e4dSAntonio Huete Jimenez
266*de0e0e4dSAntonio Huete Jimenez if ((max_version = s->s3->hs.our_max_tls_version) > TLS1_2_VERSION)
267*de0e0e4dSAntonio Huete Jimenez max_version = TLS1_2_VERSION;
268*de0e0e4dSAntonio Huete Jimenez
269*de0e0e4dSAntonio Huete Jimenez if (SSL_is_dtls(s)) {
270*de0e0e4dSAntonio Huete Jimenez if ((max_version = ssl_tls_to_dtls_version(max_version)) == 0)
271*de0e0e4dSAntonio Huete Jimenez return 0;
272*de0e0e4dSAntonio Huete Jimenez }
273*de0e0e4dSAntonio Huete Jimenez
274*de0e0e4dSAntonio Huete Jimenez *max_ver = max_version;
275*de0e0e4dSAntonio Huete Jimenez
276*de0e0e4dSAntonio Huete Jimenez return 1;
277*de0e0e4dSAntonio Huete Jimenez }
278*de0e0e4dSAntonio Huete Jimenez
27972c33676SMaxim Ag int
ssl_max_shared_version(SSL * s,uint16_t peer_ver,uint16_t * max_ver)28072c33676SMaxim Ag ssl_max_shared_version(SSL *s, uint16_t peer_ver, uint16_t *max_ver)
28172c33676SMaxim Ag {
282*de0e0e4dSAntonio Huete Jimenez uint16_t min_version, max_version, peer_tls_version, shared_version;
28372c33676SMaxim Ag
28472c33676SMaxim Ag *max_ver = 0;
285*de0e0e4dSAntonio Huete Jimenez peer_tls_version = peer_ver;
28672c33676SMaxim Ag
287*de0e0e4dSAntonio Huete Jimenez if (SSL_is_dtls(s)) {
288*de0e0e4dSAntonio Huete Jimenez if ((peer_ver >> 8) != DTLS1_VERSION_MAJOR)
28972c33676SMaxim Ag return 0;
290*de0e0e4dSAntonio Huete Jimenez
291*de0e0e4dSAntonio Huete Jimenez /*
292*de0e0e4dSAntonio Huete Jimenez * Convert the peer version to a TLS version - DTLS versions are
293*de0e0e4dSAntonio Huete Jimenez * the 1's complement of TLS version numbers (but not the actual
294*de0e0e4dSAntonio Huete Jimenez * protocol version numbers, that would be too sensible). Not to
295*de0e0e4dSAntonio Huete Jimenez * mention that DTLSv1.0 is really equivalent to DTLSv1.1.
296*de0e0e4dSAntonio Huete Jimenez */
297*de0e0e4dSAntonio Huete Jimenez peer_tls_version = ssl_dtls_to_tls_version(peer_ver);
298*de0e0e4dSAntonio Huete Jimenez
299*de0e0e4dSAntonio Huete Jimenez /*
300*de0e0e4dSAntonio Huete Jimenez * This may be a version that we do not know about, if it is
301*de0e0e4dSAntonio Huete Jimenez * newer than DTLS1_2_VERSION (yes, less than is correct due
302*de0e0e4dSAntonio Huete Jimenez * to the "clever" versioning scheme), use TLS1_2_VERSION.
303*de0e0e4dSAntonio Huete Jimenez */
304*de0e0e4dSAntonio Huete Jimenez if (peer_tls_version == 0) {
305*de0e0e4dSAntonio Huete Jimenez if (peer_ver < DTLS1_2_VERSION)
306*de0e0e4dSAntonio Huete Jimenez peer_tls_version = TLS1_2_VERSION;
307*de0e0e4dSAntonio Huete Jimenez }
30872c33676SMaxim Ag }
30972c33676SMaxim Ag
310*de0e0e4dSAntonio Huete Jimenez if (peer_tls_version >= TLS1_3_VERSION)
31172c33676SMaxim Ag shared_version = TLS1_3_VERSION;
312*de0e0e4dSAntonio Huete Jimenez else if (peer_tls_version >= TLS1_2_VERSION)
31372c33676SMaxim Ag shared_version = TLS1_2_VERSION;
314*de0e0e4dSAntonio Huete Jimenez else if (peer_tls_version >= TLS1_1_VERSION)
31572c33676SMaxim Ag shared_version = TLS1_1_VERSION;
316*de0e0e4dSAntonio Huete Jimenez else if (peer_tls_version >= TLS1_VERSION)
31772c33676SMaxim Ag shared_version = TLS1_VERSION;
31872c33676SMaxim Ag else
31972c33676SMaxim Ag return 0;
32072c33676SMaxim Ag
321*de0e0e4dSAntonio Huete Jimenez if (!ssl_supported_tls_version_range(s, &min_version, &max_version))
32272c33676SMaxim Ag return 0;
32372c33676SMaxim Ag
32472c33676SMaxim Ag if (shared_version < min_version)
32572c33676SMaxim Ag return 0;
32672c33676SMaxim Ag
32772c33676SMaxim Ag if (shared_version > max_version)
32872c33676SMaxim Ag shared_version = max_version;
32972c33676SMaxim Ag
330*de0e0e4dSAntonio Huete Jimenez if (SSL_is_dtls(s)) {
331*de0e0e4dSAntonio Huete Jimenez /*
332*de0e0e4dSAntonio Huete Jimenez * The resulting shared version will by definition be something
333*de0e0e4dSAntonio Huete Jimenez * that we know about. Switch back from TLS to DTLS.
334*de0e0e4dSAntonio Huete Jimenez */
335*de0e0e4dSAntonio Huete Jimenez shared_version = ssl_tls_to_dtls_version(shared_version);
336*de0e0e4dSAntonio Huete Jimenez if (shared_version == 0)
337*de0e0e4dSAntonio Huete Jimenez return 0;
338*de0e0e4dSAntonio Huete Jimenez }
339*de0e0e4dSAntonio Huete Jimenez
340*de0e0e4dSAntonio Huete Jimenez if (!ssl_security_version(s, shared_version))
341*de0e0e4dSAntonio Huete Jimenez return 0;
342*de0e0e4dSAntonio Huete Jimenez
34372c33676SMaxim Ag *max_ver = shared_version;
34472c33676SMaxim Ag
34572c33676SMaxim Ag return 1;
34672c33676SMaxim Ag }
34772c33676SMaxim Ag
3488edacedfSDaniel Fojt int
ssl_check_version_from_server(SSL * s,uint16_t server_version)349*de0e0e4dSAntonio Huete Jimenez ssl_check_version_from_server(SSL *s, uint16_t server_version)
35072c33676SMaxim Ag {
351*de0e0e4dSAntonio Huete Jimenez uint16_t min_tls_version, max_tls_version, server_tls_version;
35272c33676SMaxim Ag
353*de0e0e4dSAntonio Huete Jimenez /* Ensure that the version selected by the server is valid. */
3548edacedfSDaniel Fojt
355*de0e0e4dSAntonio Huete Jimenez server_tls_version = server_version;
356*de0e0e4dSAntonio Huete Jimenez if (SSL_is_dtls(s)) {
357*de0e0e4dSAntonio Huete Jimenez server_tls_version = ssl_dtls_to_tls_version(server_version);
358*de0e0e4dSAntonio Huete Jimenez if (server_tls_version == 0)
359*de0e0e4dSAntonio Huete Jimenez return 0;
3608edacedfSDaniel Fojt }
36172c33676SMaxim Ag
362*de0e0e4dSAntonio Huete Jimenez if (!ssl_supported_tls_version_range(s, &min_tls_version,
363*de0e0e4dSAntonio Huete Jimenez &max_tls_version))
36472c33676SMaxim Ag return 0;
36572c33676SMaxim Ag
366*de0e0e4dSAntonio Huete Jimenez if (server_tls_version < min_tls_version ||
367*de0e0e4dSAntonio Huete Jimenez server_tls_version > max_tls_version)
36872c33676SMaxim Ag return 0;
36972c33676SMaxim Ag
370*de0e0e4dSAntonio Huete Jimenez return ssl_security_version(s, server_tls_version);
371*de0e0e4dSAntonio Huete Jimenez }
3728edacedfSDaniel Fojt
373*de0e0e4dSAntonio Huete Jimenez int
ssl_legacy_stack_version(SSL * s,uint16_t version)374*de0e0e4dSAntonio Huete Jimenez ssl_legacy_stack_version(SSL *s, uint16_t version)
375*de0e0e4dSAntonio Huete Jimenez {
376*de0e0e4dSAntonio Huete Jimenez if (SSL_is_dtls(s))
377*de0e0e4dSAntonio Huete Jimenez return version == DTLS1_VERSION || version == DTLS1_2_VERSION;
378*de0e0e4dSAntonio Huete Jimenez
379*de0e0e4dSAntonio Huete Jimenez return version == TLS1_VERSION || version == TLS1_1_VERSION ||
380*de0e0e4dSAntonio Huete Jimenez version == TLS1_2_VERSION;
38172c33676SMaxim Ag }
382