summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_versions.c
diff options
context:
space:
mode:
authorjsing <>2020-05-31 16:36:35 +0000
committerjsing <>2020-05-31 16:36:35 +0000
commita49dcaedc471e79508b3e5674c538ca90f5c4e2e (patch)
tree1ce257d0fa239a96e7594d053190347cb2b42c4a /src/lib/libssl/ssl_versions.c
parentf05dbe69dd53b7d5eabcdb912115a58a46ab676a (diff)
downloadopenbsd-a49dcaedc471e79508b3e5674c538ca90f5c4e2e.tar.gz
openbsd-a49dcaedc471e79508b3e5674c538ca90f5c4e2e.tar.bz2
openbsd-a49dcaedc471e79508b3e5674c538ca90f5c4e2e.zip
Correct downgrade sentinels when a version pinned method is in use.
Previously only the enabled protocol versions were considered, however we also have to consider the method in use which may be version pinned. Found the hard way by danj@ with haproxy and force-tlsv12. ok beck@ inoguchi@ tb@
Diffstat (limited to 'src/lib/libssl/ssl_versions.c')
-rw-r--r--src/lib/libssl/ssl_versions.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/lib/libssl/ssl_versions.c b/src/lib/libssl/ssl_versions.c
index 2b5e94e5b8..03eb41582a 100644
--- a/src/lib/libssl/ssl_versions.c
+++ b/src/lib/libssl/ssl_versions.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_versions.c,v 1.4 2018/11/06 01:40:23 jsing Exp $ */ 1/* $OpenBSD: ssl_versions.c,v 1.5 2020/05/31 16:36:35 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2016, 2017 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -223,3 +223,35 @@ ssl_max_server_version(SSL *s)
223 223
224 return (max_version); 224 return (max_version);
225} 225}
226
227int
228ssl_downgrade_max_version(SSL *s, uint16_t *max_ver)
229{
230 uint16_t min_version, max_version;
231
232 /*
233 * The downgrade maximum version is based on the versions that are
234 * enabled, however we also have to then limit to the versions
235 * supported by the method. The SSL method will be changed during
236 * version negotiation and when switching from the new stack to
237 * the legacy context, as such we want to use the method from the
238 * context.
239 */
240
241 if (SSL_IS_DTLS(s)) {
242 *max_ver = DTLS1_VERSION;
243 return 1;
244 }
245
246 if (!ssl_enabled_version_range(s, &min_version, &max_version))
247 return 0;
248
249 if (!ssl_clamp_version_range(&min_version, &max_version,
250 s->ctx->method->internal->min_version,
251 s->ctx->method->internal->max_version))
252 return 0;
253
254 *max_ver = max_version;
255
256 return 1;
257}