summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/ssl_lib.c26
-rw-r--r--src/lib/libssl/ssl_locl.h20
-rw-r--r--src/lib/libssl/ssl_versions.c12
3 files changed, 41 insertions, 17 deletions
diff --git a/src/lib/libssl/ssl_lib.c b/src/lib/libssl/ssl_lib.c
index f802875274..6a182f2e3b 100644
--- a/src/lib/libssl/ssl_lib.c
+++ b/src/lib/libssl/ssl_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_lib.c,v 1.246 2021/02/20 08:30:52 jsing Exp $ */ 1/* $OpenBSD: ssl_lib.c,v 1.247 2021/02/20 09:43:29 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -256,6 +256,8 @@ SSL_new(SSL_CTX *ctx)
256 256
257 s->internal->min_version = ctx->internal->min_version; 257 s->internal->min_version = ctx->internal->min_version;
258 s->internal->max_version = ctx->internal->max_version; 258 s->internal->max_version = ctx->internal->max_version;
259 s->internal->min_proto_version = ctx->internal->min_proto_version;
260 s->internal->max_proto_version = ctx->internal->max_proto_version;
259 261
260 s->internal->options = ctx->internal->options; 262 s->internal->options = ctx->internal->options;
261 s->internal->mode = ctx->internal->mode; 263 s->internal->mode = ctx->internal->mode;
@@ -1829,6 +1831,8 @@ SSL_CTX_new(const SSL_METHOD *meth)
1829 ret->method = meth; 1831 ret->method = meth;
1830 ret->internal->min_version = meth->internal->min_version; 1832 ret->internal->min_version = meth->internal->min_version;
1831 ret->internal->max_version = meth->internal->max_version; 1833 ret->internal->max_version = meth->internal->max_version;
1834 ret->internal->min_proto_version = 0;
1835 ret->internal->max_proto_version = 0;
1832 ret->internal->mode = SSL_MODE_AUTO_RETRY; 1836 ret->internal->mode = SSL_MODE_AUTO_RETRY;
1833 1837
1834 ret->cert_store = NULL; 1838 ret->cert_store = NULL;
@@ -3016,52 +3020,56 @@ SSL_cache_hit(SSL *s)
3016int 3020int
3017SSL_CTX_get_min_proto_version(SSL_CTX *ctx) 3021SSL_CTX_get_min_proto_version(SSL_CTX *ctx)
3018{ 3022{
3019 return ctx->internal->min_version; 3023 return ctx->internal->min_proto_version;
3020} 3024}
3021 3025
3022int 3026int
3023SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version) 3027SSL_CTX_set_min_proto_version(SSL_CTX *ctx, uint16_t version)
3024{ 3028{
3025 return ssl_version_set_min(ctx->method, version, 3029 return ssl_version_set_min(ctx->method, version,
3026 ctx->internal->max_version, &ctx->internal->min_version); 3030 ctx->internal->max_version, &ctx->internal->min_version,
3031 &ctx->internal->min_proto_version);
3027} 3032}
3028 3033
3029int 3034int
3030SSL_CTX_get_max_proto_version(SSL_CTX *ctx) 3035SSL_CTX_get_max_proto_version(SSL_CTX *ctx)
3031{ 3036{
3032 return ctx->internal->max_version; 3037 return ctx->internal->max_proto_version;
3033} 3038}
3034 3039
3035int 3040int
3036SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version) 3041SSL_CTX_set_max_proto_version(SSL_CTX *ctx, uint16_t version)
3037{ 3042{
3038 return ssl_version_set_max(ctx->method, version, 3043 return ssl_version_set_max(ctx->method, version,
3039 ctx->internal->min_version, &ctx->internal->max_version); 3044 ctx->internal->min_version, &ctx->internal->max_version,
3045 &ctx->internal->max_proto_version);
3040} 3046}
3041 3047
3042int 3048int
3043SSL_get_min_proto_version(SSL *ssl) 3049SSL_get_min_proto_version(SSL *ssl)
3044{ 3050{
3045 return ssl->internal->min_version; 3051 return ssl->internal->min_proto_version;
3046} 3052}
3047 3053
3048int 3054int
3049SSL_set_min_proto_version(SSL *ssl, uint16_t version) 3055SSL_set_min_proto_version(SSL *ssl, uint16_t version)
3050{ 3056{
3051 return ssl_version_set_min(ssl->method, version, 3057 return ssl_version_set_min(ssl->method, version,
3052 ssl->internal->max_version, &ssl->internal->min_version); 3058 ssl->internal->max_version, &ssl->internal->min_version,
3059 &ssl->internal->min_proto_version);
3053} 3060}
3054int 3061int
3055SSL_get_max_proto_version(SSL *ssl) 3062SSL_get_max_proto_version(SSL *ssl)
3056{ 3063{
3057 return ssl->internal->max_version; 3064 return ssl->internal->max_proto_version;
3058} 3065}
3059 3066
3060int 3067int
3061SSL_set_max_proto_version(SSL *ssl, uint16_t version) 3068SSL_set_max_proto_version(SSL *ssl, uint16_t version)
3062{ 3069{
3063 return ssl_version_set_max(ssl->method, version, 3070 return ssl_version_set_max(ssl->method, version,
3064 ssl->internal->min_version, &ssl->internal->max_version); 3071 ssl->internal->min_version, &ssl->internal->max_version,
3072 &ssl->internal->max_proto_version);
3065} 3073}
3066 3074
3067static int 3075static int
diff --git a/src/lib/libssl/ssl_locl.h b/src/lib/libssl/ssl_locl.h
index edb8223fe2..fc61ffee4f 100644
--- a/src/lib/libssl/ssl_locl.h
+++ b/src/lib/libssl/ssl_locl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssl_locl.h,v 1.320 2021/02/07 15:26:32 jsing Exp $ */ 1/* $OpenBSD: ssl_locl.h,v 1.321 2021/02/20 09:43:29 jsing Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -520,6 +520,13 @@ typedef struct ssl_ctx_internal_st {
520 uint16_t min_version; 520 uint16_t min_version;
521 uint16_t max_version; 521 uint16_t max_version;
522 522
523 /*
524 * These may be zero to imply minimum or maximum version supported by
525 * the method.
526 */
527 uint16_t min_proto_version;
528 uint16_t max_proto_version;
529
523 unsigned long options; 530 unsigned long options;
524 unsigned long mode; 531 unsigned long mode;
525 532
@@ -682,6 +689,13 @@ typedef struct ssl_internal_st {
682 uint16_t min_version; 689 uint16_t min_version;
683 uint16_t max_version; 690 uint16_t max_version;
684 691
692 /*
693 * These may be zero to imply minimum or maximum version supported by
694 * the method.
695 */
696 uint16_t min_proto_version;
697 uint16_t max_proto_version;
698
685 unsigned long options; /* protocol behaviour */ 699 unsigned long options; /* protocol behaviour */
686 unsigned long mode; /* API behaviour */ 700 unsigned long mode; /* API behaviour */
687 701
@@ -1111,9 +1125,9 @@ int ssl_enabled_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver);
1111int ssl_supported_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver); 1125int ssl_supported_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver);
1112int ssl_max_shared_version(SSL *s, uint16_t peer_ver, uint16_t *max_ver); 1126int ssl_max_shared_version(SSL *s, uint16_t peer_ver, uint16_t *max_ver);
1113int ssl_version_set_min(const SSL_METHOD *meth, uint16_t ver, uint16_t max_ver, 1127int ssl_version_set_min(const SSL_METHOD *meth, uint16_t ver, uint16_t max_ver,
1114 uint16_t *out_ver); 1128 uint16_t *out_ver, uint16_t *out_proto_ver);
1115int ssl_version_set_max(const SSL_METHOD *meth, uint16_t ver, uint16_t min_ver, 1129int ssl_version_set_max(const SSL_METHOD *meth, uint16_t ver, uint16_t min_ver,
1116 uint16_t *out_ver); 1130 uint16_t *out_ver, uint16_t *out_proto_ver);
1117int ssl_downgrade_max_version(SSL *s, uint16_t *max_ver); 1131int ssl_downgrade_max_version(SSL *s, uint16_t *max_ver);
1118int ssl_legacy_stack_version(SSL *s, uint16_t version); 1132int ssl_legacy_stack_version(SSL *s, uint16_t version);
1119int ssl_cipher_in_list(STACK_OF(SSL_CIPHER) *ciphers, const SSL_CIPHER *cipher); 1133int ssl_cipher_in_list(STACK_OF(SSL_CIPHER) *ciphers, const SSL_CIPHER *cipher);
diff --git a/src/lib/libssl/ssl_versions.c b/src/lib/libssl/ssl_versions.c
index 2245ae15b5..1ee5ed312c 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.10 2021/02/20 08:30:52 jsing Exp $ */ 1/* $OpenBSD: ssl_versions.c,v 1.11 2021/02/20 09:43:29 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 *
@@ -36,12 +36,13 @@ ssl_clamp_version_range(uint16_t *min_ver, uint16_t *max_ver,
36 36
37int 37int
38ssl_version_set_min(const SSL_METHOD *meth, uint16_t ver, uint16_t max_ver, 38ssl_version_set_min(const SSL_METHOD *meth, uint16_t ver, uint16_t max_ver,
39 uint16_t *out_ver) 39 uint16_t *out_ver, uint16_t *out_proto_ver)
40{ 40{
41 uint16_t min_version, max_version; 41 uint16_t min_version, max_version;
42 42
43 if (ver == 0) { 43 if (ver == 0) {
44 *out_ver = meth->internal->min_version; 44 *out_ver = meth->internal->min_version;
45 *out_proto_ver = 0;
45 return 1; 46 return 1;
46 } 47 }
47 48
@@ -52,19 +53,20 @@ ssl_version_set_min(const SSL_METHOD *meth, uint16_t ver, uint16_t max_ver,
52 meth->internal->min_version, meth->internal->max_version)) 53 meth->internal->min_version, meth->internal->max_version))
53 return 0; 54 return 0;
54 55
55 *out_ver = min_version; 56 *out_ver = *out_proto_ver = min_version;
56 57
57 return 1; 58 return 1;
58} 59}
59 60
60int 61int
61ssl_version_set_max(const SSL_METHOD *meth, uint16_t ver, uint16_t min_ver, 62ssl_version_set_max(const SSL_METHOD *meth, uint16_t ver, uint16_t min_ver,
62 uint16_t *out_ver) 63 uint16_t *out_ver, uint16_t *out_proto_ver)
63{ 64{
64 uint16_t min_version, max_version; 65 uint16_t min_version, max_version;
65 66
66 if (ver == 0) { 67 if (ver == 0) {
67 *out_ver = meth->internal->max_version; 68 *out_ver = meth->internal->max_version;
69 *out_proto_ver = 0;
68 return 1; 70 return 1;
69 } 71 }
70 72
@@ -75,7 +77,7 @@ ssl_version_set_max(const SSL_METHOD *meth, uint16_t ver, uint16_t min_ver,
75 meth->internal->min_version, meth->internal->max_version)) 77 meth->internal->min_version, meth->internal->max_version))
76 return 0; 78 return 0;
77 79
78 *out_ver = max_version; 80 *out_ver = *out_proto_ver = max_version;
79 81
80 return 1; 82 return 1;
81} 83}