diff options
Diffstat (limited to 'src/lib/libssl/ssl_versions.c')
| -rw-r--r-- | src/lib/libssl/ssl_versions.c | 98 |
1 files changed, 56 insertions, 42 deletions
diff --git a/src/lib/libssl/ssl_versions.c b/src/lib/libssl/ssl_versions.c index 3c4801971e..a216de6e81 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.12 2021/02/22 15:59:10 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_versions.c,v 1.13 2021/02/25 17:06:05 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 | * |
| @@ -18,7 +18,7 @@ | |||
| 18 | #include "ssl_locl.h" | 18 | #include "ssl_locl.h" |
| 19 | 19 | ||
| 20 | static int | 20 | static int |
| 21 | ssl_clamp_version_range(uint16_t *min_ver, uint16_t *max_ver, | 21 | ssl_clamp_tls_version_range(uint16_t *min_ver, uint16_t *max_ver, |
| 22 | uint16_t clamp_min, uint16_t clamp_max) | 22 | uint16_t clamp_min, uint16_t clamp_max) |
| 23 | { | 23 | { |
| 24 | if (clamp_min > clamp_max || *min_ver > *max_ver) | 24 | if (clamp_min > clamp_max || *min_ver > *max_ver) |
| @@ -35,55 +35,71 @@ ssl_clamp_version_range(uint16_t *min_ver, uint16_t *max_ver, | |||
| 35 | } | 35 | } |
| 36 | 36 | ||
| 37 | int | 37 | int |
| 38 | ssl_version_set_min(const SSL_METHOD *meth, uint16_t ver, uint16_t max_ver, | 38 | ssl_version_set_min(const SSL_METHOD *meth, uint16_t proto_ver, |
| 39 | uint16_t *out_ver, uint16_t *out_proto_ver) | 39 | uint16_t max_tls_ver, uint16_t *out_tls_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 (proto_ver == 0) { |
| 44 | *out_ver = meth->internal->min_version; | 44 | *out_tls_ver = meth->internal->min_tls_version; |
| 45 | *out_proto_ver = 0; | 45 | *out_proto_ver = 0; |
| 46 | return 1; | 46 | return 1; |
| 47 | } | 47 | } |
| 48 | if (meth->internal->dtls) { | ||
| 49 | if (proto_ver != DTLS1_VERSION) | ||
| 50 | return 0; | ||
| 51 | *out_tls_ver = TLS1_1_VERSION; | ||
| 52 | *out_proto_ver = proto_ver; | ||
| 53 | return 1; | ||
| 54 | } | ||
| 48 | 55 | ||
| 49 | min_version = ver; | 56 | min_version = proto_ver; |
| 50 | max_version = max_ver; | 57 | max_version = max_tls_ver; |
| 51 | 58 | ||
| 52 | if (!ssl_clamp_version_range(&min_version, &max_version, | 59 | if (!ssl_clamp_tls_version_range(&min_version, &max_version, |
| 53 | meth->internal->min_version, meth->internal->max_version)) | 60 | meth->internal->min_tls_version, meth->internal->max_tls_version)) |
| 54 | return 0; | 61 | return 0; |
| 55 | 62 | ||
| 56 | *out_ver = *out_proto_ver = min_version; | 63 | *out_tls_ver = min_version; |
| 64 | *out_proto_ver = min_version; | ||
| 57 | 65 | ||
| 58 | return 1; | 66 | return 1; |
| 59 | } | 67 | } |
| 60 | 68 | ||
| 61 | int | 69 | int |
| 62 | ssl_version_set_max(const SSL_METHOD *meth, uint16_t ver, uint16_t min_ver, | 70 | ssl_version_set_max(const SSL_METHOD *meth, uint16_t proto_ver, |
| 63 | uint16_t *out_ver, uint16_t *out_proto_ver) | 71 | uint16_t min_tls_ver, uint16_t *out_tls_ver, uint16_t *out_proto_ver) |
| 64 | { | 72 | { |
| 65 | uint16_t min_version, max_version; | 73 | uint16_t min_version, max_version; |
| 66 | 74 | ||
| 67 | if (ver == 0) { | 75 | if (proto_ver == 0) { |
| 68 | *out_ver = meth->internal->max_version; | 76 | *out_tls_ver = meth->internal->max_tls_version; |
| 69 | *out_proto_ver = 0; | 77 | *out_proto_ver = 0; |
| 70 | return 1; | 78 | return 1; |
| 71 | } | 79 | } |
| 80 | if (meth->internal->dtls) { | ||
| 81 | if (proto_ver != DTLS1_VERSION) | ||
| 82 | return 0; | ||
| 83 | *out_tls_ver = TLS1_1_VERSION; | ||
| 84 | *out_proto_ver = proto_ver; | ||
| 85 | return 1; | ||
| 86 | } | ||
| 72 | 87 | ||
| 73 | min_version = min_ver; | 88 | min_version = min_tls_ver; |
| 74 | max_version = ver; | 89 | max_version = proto_ver; |
| 75 | 90 | ||
| 76 | if (!ssl_clamp_version_range(&min_version, &max_version, | 91 | if (!ssl_clamp_tls_version_range(&min_version, &max_version, |
| 77 | meth->internal->min_version, meth->internal->max_version)) | 92 | meth->internal->min_tls_version, meth->internal->max_tls_version)) |
| 78 | return 0; | 93 | return 0; |
| 79 | 94 | ||
| 80 | *out_ver = *out_proto_ver = max_version; | 95 | *out_tls_ver = max_version; |
| 96 | *out_proto_ver = max_version; | ||
| 81 | 97 | ||
| 82 | return 1; | 98 | return 1; |
| 83 | } | 99 | } |
| 84 | 100 | ||
| 85 | int | 101 | int |
| 86 | ssl_enabled_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver) | 102 | ssl_enabled_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver) |
| 87 | { | 103 | { |
| 88 | uint16_t min_version, max_version; | 104 | uint16_t min_version, max_version; |
| 89 | 105 | ||
| @@ -121,8 +137,8 @@ ssl_enabled_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver) | |||
| 121 | return 0; | 137 | return 0; |
| 122 | 138 | ||
| 123 | /* Limit to configured version range. */ | 139 | /* Limit to configured version range. */ |
| 124 | if (!ssl_clamp_version_range(&min_version, &max_version, | 140 | if (!ssl_clamp_tls_version_range(&min_version, &max_version, |
| 125 | s->internal->min_version, s->internal->max_version)) | 141 | s->internal->min_tls_version, s->internal->max_tls_version)) |
| 126 | return 0; | 142 | return 0; |
| 127 | 143 | ||
| 128 | if (min_ver != NULL) | 144 | if (min_ver != NULL) |
| @@ -134,26 +150,19 @@ ssl_enabled_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver) | |||
| 134 | } | 150 | } |
| 135 | 151 | ||
| 136 | int | 152 | int |
| 137 | ssl_supported_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver) | 153 | ssl_supported_tls_version_range(SSL *s, uint16_t *min_ver, uint16_t *max_ver) |
| 138 | { | 154 | { |
| 139 | uint16_t min_version, max_version; | 155 | uint16_t min_version, max_version; |
| 140 | 156 | ||
| 141 | /* DTLS cannot currently be disabled... */ | 157 | if (!ssl_enabled_tls_version_range(s, &min_version, &max_version)) |
| 142 | if (SSL_is_dtls(s)) { | ||
| 143 | min_version = max_version = DTLS1_VERSION; | ||
| 144 | goto done; | ||
| 145 | } | ||
| 146 | |||
| 147 | if (!ssl_enabled_version_range(s, &min_version, &max_version)) | ||
| 148 | return 0; | 158 | return 0; |
| 149 | 159 | ||
| 150 | /* Limit to the versions supported by this method. */ | 160 | /* Limit to the versions supported by this method. */ |
| 151 | if (!ssl_clamp_version_range(&min_version, &max_version, | 161 | if (!ssl_clamp_tls_version_range(&min_version, &max_version, |
| 152 | s->method->internal->min_version, | 162 | s->method->internal->min_tls_version, |
| 153 | s->method->internal->max_version)) | 163 | s->method->internal->max_tls_version)) |
| 154 | return 0; | 164 | return 0; |
| 155 | 165 | ||
| 156 | done: | ||
| 157 | if (min_ver != NULL) | 166 | if (min_ver != NULL) |
| 158 | *min_ver = min_version; | 167 | *min_ver = min_version; |
| 159 | if (max_ver != NULL) | 168 | if (max_ver != NULL) |
| @@ -167,7 +176,12 @@ ssl_max_supported_version(SSL *s, uint16_t *max_ver) | |||
| 167 | { | 176 | { |
| 168 | *max_ver = 0; | 177 | *max_ver = 0; |
| 169 | 178 | ||
| 170 | if (!ssl_supported_version_range(s, NULL, max_ver)) | 179 | if (SSL_is_dtls(s)) { |
| 180 | *max_ver = DTLS1_VERSION; | ||
| 181 | return 1; | ||
| 182 | } | ||
| 183 | |||
| 184 | if (!ssl_supported_tls_version_range(s, NULL, max_ver)) | ||
| 171 | return 0; | 185 | return 0; |
| 172 | 186 | ||
| 173 | return 1; | 187 | return 1; |
| @@ -199,7 +213,7 @@ ssl_max_shared_version(SSL *s, uint16_t peer_ver, uint16_t *max_ver) | |||
| 199 | else | 213 | else |
| 200 | return 0; | 214 | return 0; |
| 201 | 215 | ||
| 202 | if (!ssl_supported_version_range(s, &min_version, &max_version)) | 216 | if (!ssl_supported_tls_version_range(s, &min_version, &max_version)) |
| 203 | return 0; | 217 | return 0; |
| 204 | 218 | ||
| 205 | if (shared_version < min_version) | 219 | if (shared_version < min_version) |
| @@ -232,12 +246,12 @@ ssl_downgrade_max_version(SSL *s, uint16_t *max_ver) | |||
| 232 | return 1; | 246 | return 1; |
| 233 | } | 247 | } |
| 234 | 248 | ||
| 235 | if (!ssl_enabled_version_range(s, &min_version, &max_version)) | 249 | if (!ssl_enabled_tls_version_range(s, &min_version, &max_version)) |
| 236 | return 0; | 250 | return 0; |
| 237 | 251 | ||
| 238 | if (!ssl_clamp_version_range(&min_version, &max_version, | 252 | if (!ssl_clamp_tls_version_range(&min_version, &max_version, |
| 239 | s->ctx->method->internal->min_version, | 253 | s->ctx->method->internal->min_tls_version, |
| 240 | s->ctx->method->internal->max_version)) | 254 | s->ctx->method->internal->max_tls_version)) |
| 241 | return 0; | 255 | return 0; |
| 242 | 256 | ||
| 243 | *max_ver = max_version; | 257 | *max_ver = max_version; |
| @@ -255,7 +269,7 @@ ssl_check_version_from_server(SSL *s, uint16_t server_version) | |||
| 255 | if (SSL_is_dtls(s)) | 269 | if (SSL_is_dtls(s)) |
| 256 | return (server_version == DTLS1_VERSION); | 270 | return (server_version == DTLS1_VERSION); |
| 257 | 271 | ||
| 258 | if (!ssl_supported_version_range(s, &min_version, &max_version)) | 272 | if (!ssl_supported_tls_version_range(s, &min_version, &max_version)) |
| 259 | return 0; | 273 | return 0; |
| 260 | 274 | ||
| 261 | return (server_version >= min_version && server_version <= max_version); | 275 | return (server_version >= min_version && server_version <= max_version); |
