diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/s23_clnt.c | 47 |
1 files changed, 9 insertions, 38 deletions
diff --git a/src/lib/libssl/s23_clnt.c b/src/lib/libssl/s23_clnt.c index 8674cdf627..2511a94b28 100644 --- a/src/lib/libssl/s23_clnt.c +++ b/src/lib/libssl/s23_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: s23_clnt.c,v 1.47 2016/12/04 14:32:30 jsing Exp $ */ | 1 | /* $OpenBSD: s23_clnt.c,v 1.48 2016/12/30 16:57:01 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 | * |
| @@ -231,43 +231,15 @@ ssl23_client_hello(SSL *s) | |||
| 231 | unsigned char *buf; | 231 | unsigned char *buf; |
| 232 | unsigned char *p, *d; | 232 | unsigned char *p, *d; |
| 233 | unsigned long l; | 233 | unsigned long l; |
| 234 | int version = 0, version_major, version_minor; | 234 | uint16_t version; |
| 235 | int ret; | ||
| 236 | unsigned long mask, options = s->options; | ||
| 237 | size_t outlen; | 235 | size_t outlen; |
| 238 | 236 | int ret; | |
| 239 | /* | ||
| 240 | * SSL_OP_NO_X disables all protocols above X *if* there are | ||
| 241 | * some protocols below X enabled. This is required in order | ||
| 242 | * to maintain "version capability" vector contiguous. So | ||
| 243 | * that if application wants to disable TLS1.0 in favour of | ||
| 244 | * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the | ||
| 245 | * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. | ||
| 246 | */ | ||
| 247 | mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1; | ||
| 248 | version = TLS1_2_VERSION; | ||
| 249 | |||
| 250 | if ((options & SSL_OP_NO_TLSv1_2) && (options & mask) != mask) | ||
| 251 | version = TLS1_1_VERSION; | ||
| 252 | mask &= ~SSL_OP_NO_TLSv1_1; | ||
| 253 | if ((options & SSL_OP_NO_TLSv1_1) && (options & mask) != mask) | ||
| 254 | version = TLS1_VERSION; | ||
| 255 | mask &= ~SSL_OP_NO_TLSv1; | ||
| 256 | 237 | ||
| 257 | buf = (unsigned char *)s->init_buf->data; | 238 | buf = (unsigned char *)s->init_buf->data; |
| 258 | if (s->state == SSL23_ST_CW_CLNT_HELLO_A) { | 239 | if (s->state == SSL23_ST_CW_CLNT_HELLO_A) { |
| 259 | arc4random_buf(s->s3->client_random, SSL3_RANDOM_SIZE); | 240 | arc4random_buf(s->s3->client_random, SSL3_RANDOM_SIZE); |
| 260 | 241 | ||
| 261 | if (version == TLS1_2_VERSION) { | 242 | if (ssl_enabled_version_range(s, NULL, &version) == -1) { |
| 262 | version_major = TLS1_2_VERSION_MAJOR; | ||
| 263 | version_minor = TLS1_2_VERSION_MINOR; | ||
| 264 | } else if (version == TLS1_1_VERSION) { | ||
| 265 | version_major = TLS1_1_VERSION_MAJOR; | ||
| 266 | version_minor = TLS1_1_VERSION_MINOR; | ||
| 267 | } else if (version == TLS1_VERSION) { | ||
| 268 | version_major = TLS1_VERSION_MAJOR; | ||
| 269 | version_minor = TLS1_VERSION_MINOR; | ||
| 270 | } else { | ||
| 271 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, | 243 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, |
| 272 | SSL_R_NO_PROTOCOLS_AVAILABLE); | 244 | SSL_R_NO_PROTOCOLS_AVAILABLE); |
| 273 | return (-1); | 245 | return (-1); |
| @@ -283,8 +255,8 @@ ssl23_client_hello(SSL *s) | |||
| 283 | */ | 255 | */ |
| 284 | d = p = &(buf[SSL3_RT_HEADER_LENGTH + SSL3_HM_HEADER_LENGTH]); | 256 | d = p = &(buf[SSL3_RT_HEADER_LENGTH + SSL3_HM_HEADER_LENGTH]); |
| 285 | 257 | ||
| 286 | *(p++) = version_major; | 258 | *(p++) = version >> 8; |
| 287 | *(p++) = version_minor; | 259 | *(p++) = version & 0xff; |
| 288 | 260 | ||
| 289 | /* Random stuff */ | 261 | /* Random stuff */ |
| 290 | memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE); | 262 | memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE); |
| @@ -334,7 +306,7 @@ ssl23_client_hello(SSL *s) | |||
| 334 | /* fill in 5-byte record header */ | 306 | /* fill in 5-byte record header */ |
| 335 | d = buf; | 307 | d = buf; |
| 336 | *(d++) = SSL3_RT_HANDSHAKE; | 308 | *(d++) = SSL3_RT_HANDSHAKE; |
| 337 | *(d++) = version_major; | 309 | *(d++) = version >> 8; |
| 338 | 310 | ||
| 339 | /* | 311 | /* |
| 340 | * Some servers hang if we use long client hellos | 312 | * Some servers hang if we use long client hellos |
| @@ -343,7 +315,7 @@ ssl23_client_hello(SSL *s) | |||
| 343 | if (TLS1_get_client_version(s) > TLS1_VERSION) | 315 | if (TLS1_get_client_version(s) > TLS1_VERSION) |
| 344 | *(d++) = 1; | 316 | *(d++) = 1; |
| 345 | else | 317 | else |
| 346 | *(d++) = version_minor; | 318 | *(d++) = version & 0xff; |
| 347 | s2n((int)l, d); | 319 | s2n((int)l, d); |
| 348 | 320 | ||
| 349 | /* number of bytes to write */ | 321 | /* number of bytes to write */ |
| @@ -362,8 +334,7 @@ ssl23_client_hello(SSL *s) | |||
| 362 | 334 | ||
| 363 | if ((ret >= 2) && s->msg_callback) { | 335 | if ((ret >= 2) && s->msg_callback) { |
| 364 | /* Client Hello has been sent; tell msg_callback */ | 336 | /* Client Hello has been sent; tell msg_callback */ |
| 365 | 337 | s->msg_callback(1, s->client_version, SSL3_RT_HANDSHAKE, | |
| 366 | s->msg_callback(1, version, SSL3_RT_HANDSHAKE, | ||
| 367 | s->init_buf->data + 5, ret - 5, s, s->msg_callback_arg); | 338 | s->init_buf->data + 5, ret - 5, s, s->msg_callback_arg); |
| 368 | } | 339 | } |
| 369 | 340 | ||
