summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorjsing <>2021-02-20 09:43:29 +0000
committerjsing <>2021-02-20 09:43:29 +0000
commitbd364ca9f4fae8a2b7897e24cf7658d9c8d965d3 (patch)
treeb003a2f9929caeeede1312592aff61b58a88eb00 /src/lib
parent141f3ab66d9950038d21604bc59e4b0055b7983b (diff)
downloadopenbsd-bd364ca9f4fae8a2b7897e24cf7658d9c8d965d3.tar.gz
openbsd-bd364ca9f4fae8a2b7897e24cf7658d9c8d965d3.tar.bz2
openbsd-bd364ca9f4fae8a2b7897e24cf7658d9c8d965d3.zip
Return a min/max version of zero if set to zero.
OpenSSL's SSL{_CTX,}_get_{min,max}_proto_version() return a version of zero if the minimum or maximum has been set to zero (which means the minimum or maximum version supported by the method). Previously we returned the minimum or maximum version supported by the method, instead of zero. Match OpenSSL's behaviour by using shadow variables. Discussed with tb@
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}