diff options
author | jsing <> | 2014-04-14 15:15:33 +0000 |
---|---|---|
committer | jsing <> | 2014-04-14 15:15:33 +0000 |
commit | 30f92658fa4e1357cfcee9c077a21e928970d290 (patch) | |
tree | 225d880512d3748d996f5d84d5d01521efe52b02 /src | |
parent | 6c233db50b8fc1d31e373868a83572c35271ca51 (diff) | |
download | openbsd-30f92658fa4e1357cfcee9c077a21e928970d290.tar.gz openbsd-30f92658fa4e1357cfcee9c077a21e928970d290.tar.bz2 openbsd-30f92658fa4e1357cfcee9c077a21e928970d290.zip |
First pass at applying KNF to the OpenSSL code, which almost makes it
readable. This pass is whitespace only and can readily be verified using
tr and md5.
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/libssl/s23_clnt.c | 620 | ||||
-rw-r--r-- | src/lib/libssl/s23_lib.c | 158 | ||||
-rw-r--r-- | src/lib/libssl/s23_pkt.c | 74 | ||||
-rw-r--r-- | src/lib/libssl/s23_srvr.c | 564 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s23_clnt.c | 620 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s23_lib.c | 158 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s23_meth.c | 23 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s23_pkt.c | 74 | ||||
-rw-r--r-- | src/lib/libssl/src/ssl/s23_srvr.c | 564 |
9 files changed, 1339 insertions, 1516 deletions
diff --git a/src/lib/libssl/s23_clnt.c b/src/lib/libssl/s23_clnt.c index 6315e9d876..0fd388a05a 100644 --- a/src/lib/libssl/s23_clnt.c +++ b/src/lib/libssl/s23_clnt.c | |||
@@ -119,160 +119,163 @@ | |||
119 | static const SSL_METHOD *ssl23_get_client_method(int ver); | 119 | static const SSL_METHOD *ssl23_get_client_method(int ver); |
120 | static int ssl23_client_hello(SSL *s); | 120 | static int ssl23_client_hello(SSL *s); |
121 | static int ssl23_get_server_hello(SSL *s); | 121 | static int ssl23_get_server_hello(SSL *s); |
122 | static const SSL_METHOD *ssl23_get_client_method(int ver) | 122 | static const SSL_METHOD |
123 | { | 123 | *ssl23_get_client_method(int ver) |
124 | { | ||
124 | #ifndef OPENSSL_NO_SSL2 | 125 | #ifndef OPENSSL_NO_SSL2 |
125 | if (ver == SSL2_VERSION) | 126 | if (ver == SSL2_VERSION) |
126 | return(SSLv2_client_method()); | 127 | return (SSLv2_client_method()); |
127 | #endif | 128 | #endif |
128 | if (ver == SSL3_VERSION) | 129 | if (ver == SSL3_VERSION) |
129 | return(SSLv3_client_method()); | 130 | return (SSLv3_client_method()); |
130 | else if (ver == TLS1_VERSION) | 131 | else if (ver == TLS1_VERSION) |
131 | return(TLSv1_client_method()); | 132 | return (TLSv1_client_method()); |
132 | else if (ver == TLS1_1_VERSION) | 133 | else if (ver == TLS1_1_VERSION) |
133 | return(TLSv1_1_client_method()); | 134 | return (TLSv1_1_client_method()); |
134 | else if (ver == TLS1_2_VERSION) | 135 | else if (ver == TLS1_2_VERSION) |
135 | return(TLSv1_2_client_method()); | 136 | return (TLSv1_2_client_method()); |
136 | else | 137 | else |
137 | return(NULL); | 138 | return (NULL); |
138 | } | 139 | } |
139 | 140 | ||
140 | IMPLEMENT_ssl23_meth_func(SSLv23_client_method, | 141 | IMPLEMENT_ssl23_meth_func(SSLv23_client_method, |
141 | ssl_undefined_function, | 142 | ssl_undefined_function, ssl23_connect, ssl23_get_client_method) |
142 | ssl23_connect, | 143 | |
143 | ssl23_get_client_method) | 144 | int |
144 | 145 | ssl23_connect(SSL *s) | |
145 | int ssl23_connect(SSL *s) | 146 | { |
146 | { | 147 | BUF_MEM *buf = NULL; |
147 | BUF_MEM *buf=NULL; | 148 | unsigned long Time = (unsigned long)time(NULL); |
148 | unsigned long Time=(unsigned long)time(NULL); | 149 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
149 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 150 | int ret = -1; |
150 | int ret= -1; | 151 | int new_state, state; |
151 | int new_state,state; | 152 | |
152 | 153 | RAND_add(&Time, sizeof(Time), 0); | |
153 | RAND_add(&Time,sizeof(Time),0); | ||
154 | ERR_clear_error(); | 154 | ERR_clear_error(); |
155 | errno = 0; | 155 | errno = 0; |
156 | 156 | ||
157 | if (s->info_callback != NULL) | 157 | if (s->info_callback != NULL) |
158 | cb=s->info_callback; | 158 | cb = s->info_callback; |
159 | else if (s->ctx->info_callback != NULL) | 159 | else if (s->ctx->info_callback != NULL) |
160 | cb=s->ctx->info_callback; | 160 | cb = s->ctx->info_callback; |
161 | 161 | ||
162 | s->in_handshake++; | 162 | s->in_handshake++; |
163 | if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); | 163 | if (!SSL_in_init(s) || SSL_in_before(s)) |
164 | SSL_clear(s); | ||
164 | 165 | ||
165 | for (;;) | 166 | for (;;) { |
166 | { | 167 | state = s->state; |
167 | state=s->state; | ||
168 | 168 | ||
169 | switch(s->state) | 169 | switch (s->state) { |
170 | { | ||
171 | case SSL_ST_BEFORE: | 170 | case SSL_ST_BEFORE: |
172 | case SSL_ST_CONNECT: | 171 | case SSL_ST_CONNECT: |
173 | case SSL_ST_BEFORE|SSL_ST_CONNECT: | 172 | case SSL_ST_BEFORE|SSL_ST_CONNECT: |
174 | case SSL_ST_OK|SSL_ST_CONNECT: | 173 | case SSL_ST_OK|SSL_ST_CONNECT: |
175 | 174 | ||
176 | if (s->session != NULL) | 175 | if (s->session != NULL) { |
177 | { | 176 | SSLerr(SSL_F_SSL23_CONNECT, SSL_R_SSL23_DOING_SESSION_ID_REUSE); |
178 | SSLerr(SSL_F_SSL23_CONNECT,SSL_R_SSL23_DOING_SESSION_ID_REUSE); | 177 | ret = -1; |
179 | ret= -1; | ||
180 | goto end; | 178 | goto end; |
181 | } | 179 | } |
182 | s->server=0; | 180 | s->server = 0; |
183 | if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); | 181 | if (cb != NULL) |
182 | cb(s, SSL_CB_HANDSHAKE_START, 1); | ||
184 | 183 | ||
185 | /* s->version=TLS1_VERSION; */ | 184 | /* s->version=TLS1_VERSION; */ |
186 | s->type=SSL_ST_CONNECT; | 185 | s->type = SSL_ST_CONNECT; |
187 | 186 | ||
188 | if (s->init_buf == NULL) | 187 | if (s->init_buf == NULL) { |
189 | { | 188 | if ((buf = BUF_MEM_new()) == NULL) { |
190 | if ((buf=BUF_MEM_new()) == NULL) | 189 | ret = -1; |
191 | { | ||
192 | ret= -1; | ||
193 | goto end; | 190 | goto end; |
194 | } | 191 | } |
195 | if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH)) | 192 | if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { |
196 | { | 193 | ret = -1; |
197 | ret= -1; | ||
198 | goto end; | 194 | goto end; |
199 | } | ||
200 | s->init_buf=buf; | ||
201 | buf=NULL; | ||
202 | } | 195 | } |
196 | s->init_buf = buf; | ||
197 | buf = NULL; | ||
198 | } | ||
203 | 199 | ||
204 | if (!ssl3_setup_buffers(s)) { ret= -1; goto end; } | 200 | if (!ssl3_setup_buffers(s)) { |
201 | ret = -1; | ||
202 | goto end; | ||
203 | } | ||
205 | 204 | ||
206 | ssl3_init_finished_mac(s); | 205 | ssl3_init_finished_mac(s); |
207 | 206 | ||
208 | s->state=SSL23_ST_CW_CLNT_HELLO_A; | 207 | s->state = SSL23_ST_CW_CLNT_HELLO_A; |
209 | s->ctx->stats.sess_connect++; | 208 | s->ctx->stats.sess_connect++; |
210 | s->init_num=0; | 209 | s->init_num = 0; |
211 | break; | 210 | break; |
212 | 211 | ||
213 | case SSL23_ST_CW_CLNT_HELLO_A: | 212 | case SSL23_ST_CW_CLNT_HELLO_A: |
214 | case SSL23_ST_CW_CLNT_HELLO_B: | 213 | case SSL23_ST_CW_CLNT_HELLO_B: |
215 | 214 | ||
216 | s->shutdown=0; | 215 | s->shutdown = 0; |
217 | ret=ssl23_client_hello(s); | 216 | ret = ssl23_client_hello(s); |
218 | if (ret <= 0) goto end; | 217 | if (ret <= 0) |
219 | s->state=SSL23_ST_CR_SRVR_HELLO_A; | 218 | goto end; |
220 | s->init_num=0; | 219 | s->state = SSL23_ST_CR_SRVR_HELLO_A; |
220 | s->init_num = 0; | ||
221 | 221 | ||
222 | break; | 222 | break; |
223 | 223 | ||
224 | case SSL23_ST_CR_SRVR_HELLO_A: | 224 | case SSL23_ST_CR_SRVR_HELLO_A: |
225 | case SSL23_ST_CR_SRVR_HELLO_B: | 225 | case SSL23_ST_CR_SRVR_HELLO_B: |
226 | ret=ssl23_get_server_hello(s); | 226 | ret = ssl23_get_server_hello(s); |
227 | if (ret >= 0) cb=NULL; | 227 | if (ret >= 0) |
228 | cb = NULL; | ||
228 | goto end; | 229 | goto end; |
229 | /* break; */ | 230 | /* break; */ |
230 | 231 | ||
231 | default: | 232 | default: |
232 | SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE); | 233 | SSLerr(SSL_F_SSL23_CONNECT, SSL_R_UNKNOWN_STATE); |
233 | ret= -1; | 234 | ret = -1; |
234 | goto end; | 235 | goto end; |
235 | /* break; */ | 236 | /* break; */ |
236 | } | 237 | } |
237 | 238 | ||
238 | if (s->debug) { (void)BIO_flush(s->wbio); } | 239 | if (s->debug) { |
240 | (void)BIO_flush(s->wbio); | ||
241 | } | ||
239 | 242 | ||
240 | if ((cb != NULL) && (s->state != state)) | 243 | if ((cb != NULL) && (s->state != state)) { |
241 | { | 244 | new_state = s->state; |
242 | new_state=s->state; | 245 | s->state = state; |
243 | s->state=state; | 246 | cb(s, SSL_CB_CONNECT_LOOP, 1); |
244 | cb(s,SSL_CB_CONNECT_LOOP,1); | 247 | s->state = new_state; |
245 | s->state=new_state; | ||
246 | } | ||
247 | } | 248 | } |
249 | } | ||
248 | end: | 250 | end: |
249 | s->in_handshake--; | 251 | s->in_handshake--; |
250 | if (buf != NULL) | 252 | if (buf != NULL) |
251 | BUF_MEM_free(buf); | 253 | BUF_MEM_free(buf); |
252 | if (cb != NULL) | 254 | if (cb != NULL) |
253 | cb(s,SSL_CB_CONNECT_EXIT,ret); | 255 | cb(s, SSL_CB_CONNECT_EXIT, ret); |
254 | return(ret); | 256 | return (ret); |
255 | } | 257 | } |
256 | 258 | ||
257 | static int ssl23_no_ssl2_ciphers(SSL *s) | 259 | static int |
258 | { | 260 | ssl23_no_ssl2_ciphers(SSL *s) |
261 | { | ||
259 | SSL_CIPHER *cipher; | 262 | SSL_CIPHER *cipher; |
260 | STACK_OF(SSL_CIPHER) *ciphers; | 263 | STACK_OF(SSL_CIPHER) *ciphers; |
261 | int i; | 264 | int i; |
262 | ciphers = SSL_get_ciphers(s); | 265 | ciphers = SSL_get_ciphers(s); |
263 | for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) | 266 | for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { |
264 | { | ||
265 | cipher = sk_SSL_CIPHER_value(ciphers, i); | 267 | cipher = sk_SSL_CIPHER_value(ciphers, i); |
266 | if (cipher->algorithm_ssl == SSL_SSLV2) | 268 | if (cipher->algorithm_ssl == SSL_SSLV2) |
267 | return 0; | 269 | return 0; |
268 | } | ||
269 | return 1; | ||
270 | } | 270 | } |
271 | return 1; | ||
272 | } | ||
271 | 273 | ||
272 | /* Fill a ClientRandom or ServerRandom field of length len. Returns <= 0 | 274 | /* Fill a ClientRandom or ServerRandom field of length len. Returns <= 0 |
273 | * on failure, 1 on success. */ | 275 | * on failure, 1 on success. */ |
274 | int ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len) | 276 | int |
275 | { | 277 | ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len) |
278 | { | ||
276 | int send_time = 0; | 279 | int send_time = 0; |
277 | 280 | ||
278 | if (len < 4) | 281 | if (len < 4) |
@@ -281,22 +284,21 @@ int ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len) | |||
281 | send_time = (s->mode & SSL_MODE_SEND_SERVERHELLO_TIME) != 0; | 284 | send_time = (s->mode & SSL_MODE_SEND_SERVERHELLO_TIME) != 0; |
282 | else | 285 | else |
283 | send_time = (s->mode & SSL_MODE_SEND_CLIENTHELLO_TIME) != 0; | 286 | send_time = (s->mode & SSL_MODE_SEND_CLIENTHELLO_TIME) != 0; |
284 | if (send_time) | 287 | if (send_time) { |
285 | { | ||
286 | unsigned long Time = (unsigned long)time(NULL); | 288 | unsigned long Time = (unsigned long)time(NULL); |
287 | unsigned char *p = result; | 289 | unsigned char *p = result; |
288 | l2n(Time, p); | 290 | l2n(Time, p); |
289 | return RAND_pseudo_bytes(p, len-4); | 291 | return RAND_pseudo_bytes(p, len - 4); |
290 | } | 292 | } else |
291 | else | ||
292 | return RAND_pseudo_bytes(result, len); | 293 | return RAND_pseudo_bytes(result, len); |
293 | } | 294 | } |
294 | 295 | ||
295 | static int ssl23_client_hello(SSL *s) | 296 | static int |
296 | { | 297 | ssl23_client_hello(SSL *s) |
298 | { | ||
297 | unsigned char *buf; | 299 | unsigned char *buf; |
298 | unsigned char *p,*d; | 300 | unsigned char *p, *d; |
299 | int i,ch_len; | 301 | int i, ch_len; |
300 | unsigned long l; | 302 | unsigned long l; |
301 | int ssl2_compat; | 303 | int ssl2_compat; |
302 | int version = 0, version_major, version_minor; | 304 | int version = 0, version_major, version_minor; |
@@ -320,14 +322,14 @@ static int ssl23_client_hello(SSL *s) | |||
320 | * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the | 322 | * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the |
321 | * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. | 323 | * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. |
322 | */ | 324 | */ |
323 | mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 | 325 | mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 |
324 | #if !defined(OPENSSL_NO_SSL3) | 326 | #if !defined(OPENSSL_NO_SSL3) |
325 | |SSL_OP_NO_SSLv3 | 327 | |SSL_OP_NO_SSLv3 |
326 | #endif | 328 | #endif |
327 | #if !defined(OPENSSL_NO_SSL2) | 329 | #if !defined(OPENSSL_NO_SSL2) |
328 | |(ssl2_compat?SSL_OP_NO_SSLv2:0) | 330 | |(ssl2_compat ? SSL_OP_NO_SSLv2 : 0) |
329 | #endif | 331 | #endif |
330 | ; | 332 | ; |
331 | #if !defined(OPENSSL_NO_TLS1_2_CLIENT) | 333 | #if !defined(OPENSSL_NO_TLS1_2_CLIENT) |
332 | version = TLS1_2_VERSION; | 334 | version = TLS1_2_VERSION; |
333 | 335 | ||
@@ -351,8 +353,7 @@ static int ssl23_client_hello(SSL *s) | |||
351 | #endif | 353 | #endif |
352 | 354 | ||
353 | #ifndef OPENSSL_NO_TLSEXT | 355 | #ifndef OPENSSL_NO_TLSEXT |
354 | if (version != SSL2_VERSION) | 356 | if (version != SSL2_VERSION) { |
355 | { | ||
356 | /* have to disable SSL 2.0 compatibility if we need TLS extensions */ | 357 | /* have to disable SSL 2.0 compatibility if we need TLS extensions */ |
357 | 358 | ||
358 | if (s->tlsext_hostname != NULL) | 359 | if (s->tlsext_hostname != NULL) |
@@ -363,67 +364,53 @@ static int ssl23_client_hello(SSL *s) | |||
363 | if (s->ctx->tlsext_opaque_prf_input_callback != 0 || s->tlsext_opaque_prf_input != NULL) | 364 | if (s->ctx->tlsext_opaque_prf_input_callback != 0 || s->tlsext_opaque_prf_input != NULL) |
364 | ssl2_compat = 0; | 365 | ssl2_compat = 0; |
365 | #endif | 366 | #endif |
366 | } | 367 | } |
367 | #endif | 368 | #endif |
368 | 369 | ||
369 | buf=(unsigned char *)s->init_buf->data; | 370 | buf = (unsigned char *)s->init_buf->data; |
370 | if (s->state == SSL23_ST_CW_CLNT_HELLO_A) | 371 | if (s->state == SSL23_ST_CW_CLNT_HELLO_A) { |
371 | { | ||
372 | #if 0 | 372 | #if 0 |
373 | /* don't reuse session-id's */ | 373 | /* don't reuse session-id's */ |
374 | if (!ssl_get_new_session(s,0)) | 374 | if (!ssl_get_new_session(s, 0)) { |
375 | { | 375 | return (-1); |
376 | return(-1); | 376 | } |
377 | } | ||
378 | #endif | 377 | #endif |
379 | 378 | ||
380 | p=s->s3->client_random; | 379 | p = s->s3->client_random; |
381 | if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0) | 380 | if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0) |
382 | return -1; | 381 | return -1; |
383 | 382 | ||
384 | if (version == TLS1_2_VERSION) | 383 | if (version == TLS1_2_VERSION) { |
385 | { | ||
386 | version_major = TLS1_2_VERSION_MAJOR; | 384 | version_major = TLS1_2_VERSION_MAJOR; |
387 | version_minor = TLS1_2_VERSION_MINOR; | 385 | version_minor = TLS1_2_VERSION_MINOR; |
388 | } | 386 | } else if (version == TLS1_1_VERSION) { |
389 | else if (version == TLS1_1_VERSION) | ||
390 | { | ||
391 | version_major = TLS1_1_VERSION_MAJOR; | 387 | version_major = TLS1_1_VERSION_MAJOR; |
392 | version_minor = TLS1_1_VERSION_MINOR; | 388 | version_minor = TLS1_1_VERSION_MINOR; |
393 | } | 389 | } else if (version == TLS1_VERSION) { |
394 | else if (version == TLS1_VERSION) | ||
395 | { | ||
396 | version_major = TLS1_VERSION_MAJOR; | 390 | version_major = TLS1_VERSION_MAJOR; |
397 | version_minor = TLS1_VERSION_MINOR; | 391 | version_minor = TLS1_VERSION_MINOR; |
398 | } | 392 | } |
399 | #ifdef OPENSSL_FIPS | 393 | #ifdef OPENSSL_FIPS |
400 | else if(FIPS_mode()) | 394 | else if (FIPS_mode()) { |
401 | { | ||
402 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, | 395 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, |
403 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | 396 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); |
404 | return -1; | 397 | return -1; |
405 | } | 398 | } |
406 | #endif | 399 | #endif |
407 | else if (version == SSL3_VERSION) | 400 | else if (version == SSL3_VERSION) { |
408 | { | ||
409 | version_major = SSL3_VERSION_MAJOR; | 401 | version_major = SSL3_VERSION_MAJOR; |
410 | version_minor = SSL3_VERSION_MINOR; | 402 | version_minor = SSL3_VERSION_MINOR; |
411 | } | 403 | } else if (version == SSL2_VERSION) { |
412 | else if (version == SSL2_VERSION) | ||
413 | { | ||
414 | version_major = SSL2_VERSION_MAJOR; | 404 | version_major = SSL2_VERSION_MAJOR; |
415 | version_minor = SSL2_VERSION_MINOR; | 405 | version_minor = SSL2_VERSION_MINOR; |
416 | } | 406 | } else { |
417 | else | 407 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_PROTOCOLS_AVAILABLE); |
418 | { | 408 | return (-1); |
419 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_PROTOCOLS_AVAILABLE); | 409 | } |
420 | return(-1); | ||
421 | } | ||
422 | 410 | ||
423 | s->client_version = version; | 411 | s->client_version = version; |
424 | 412 | ||
425 | if (ssl2_compat) | 413 | if (ssl2_compat) { |
426 | { | ||
427 | /* create SSL 2.0 compatible Client Hello */ | 414 | /* create SSL 2.0 compatible Client Hello */ |
428 | 415 | ||
429 | /* two byte record header will be written last */ | 416 | /* two byte record header will be written last */ |
@@ -433,28 +420,27 @@ static int ssl23_client_hello(SSL *s) | |||
433 | *(d++) = SSL2_MT_CLIENT_HELLO; | 420 | *(d++) = SSL2_MT_CLIENT_HELLO; |
434 | *(d++) = version_major; | 421 | *(d++) = version_major; |
435 | *(d++) = version_minor; | 422 | *(d++) = version_minor; |
436 | 423 | ||
437 | /* Ciphers supported */ | 424 | /* Ciphers supported */ |
438 | i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p,0); | 425 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), p, 0); |
439 | if (i == 0) | 426 | if (i == 0) { |
440 | { | ||
441 | /* no ciphers */ | 427 | /* no ciphers */ |
442 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); | 428 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE); |
443 | return -1; | 429 | return -1; |
444 | } | 430 | } |
445 | s2n(i,d); | 431 | s2n(i, d); |
446 | p+=i; | 432 | p += i; |
447 | 433 | ||
448 | /* put in the session-id length (zero since there is no reuse) */ | 434 | /* put in the session-id length (zero since there is no reuse) */ |
449 | #if 0 | 435 | #if 0 |
450 | s->session->session_id_length=0; | 436 | s->session->session_id_length = 0; |
451 | #endif | 437 | #endif |
452 | s2n(0,d); | 438 | s2n(0, d); |
453 | 439 | ||
454 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) | 440 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) |
455 | ch_len=SSL2_CHALLENGE_LENGTH; | 441 | ch_len = SSL2_CHALLENGE_LENGTH; |
456 | else | 442 | else |
457 | ch_len=SSL2_MAX_CHALLENGE_LENGTH; | 443 | ch_len = SSL2_MAX_CHALLENGE_LENGTH; |
458 | 444 | ||
459 | /* write out sslv2 challenge */ | 445 | /* write out sslv2 challenge */ |
460 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), | 446 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), |
@@ -462,34 +448,32 @@ static int ssl23_client_hello(SSL *s) | |||
462 | or SSL2_MAX_CHALLENGE_LENGTH (16), but leave the | 448 | or SSL2_MAX_CHALLENGE_LENGTH (16), but leave the |
463 | check in for futurproofing */ | 449 | check in for futurproofing */ |
464 | if (SSL3_RANDOM_SIZE < ch_len) | 450 | if (SSL3_RANDOM_SIZE < ch_len) |
465 | i=SSL3_RANDOM_SIZE; | 451 | i = SSL3_RANDOM_SIZE; |
466 | else | 452 | else |
467 | i=ch_len; | 453 | i = ch_len; |
468 | s2n(i,d); | 454 | s2n(i, d); |
469 | memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE); | 455 | memset(&(s->s3->client_random[0]), 0, SSL3_RANDOM_SIZE); |
470 | if (RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i) <= 0) | 456 | if (RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i) <= 0) |
471 | return -1; | 457 | return -1; |
472 | 458 | ||
473 | memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i); | 459 | memcpy(p, &(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i); |
474 | p+=i; | 460 | p += i; |
475 | 461 | ||
476 | i= p- &(buf[2]); | 462 | i = p- &(buf[2]); |
477 | buf[0]=((i>>8)&0xff)|0x80; | 463 | buf[0] = ((i >> 8)&0xff)|0x80; |
478 | buf[1]=(i&0xff); | 464 | buf[1] = (i&0xff); |
479 | 465 | ||
480 | /* number of bytes to write */ | 466 | /* number of bytes to write */ |
481 | s->init_num=i+2; | 467 | s->init_num = i + 2; |
482 | s->init_off=0; | 468 | s->init_off = 0; |
483 | 469 | ||
484 | ssl3_finish_mac(s,&(buf[2]),i); | 470 | ssl3_finish_mac(s, &(buf[2]), i); |
485 | } | 471 | } else { |
486 | else | ||
487 | { | ||
488 | /* create Client Hello in SSL 3.0/TLS 1.0 format */ | 472 | /* create Client Hello in SSL 3.0/TLS 1.0 format */ |
489 | 473 | ||
490 | /* do the record header (5 bytes) and handshake message header (4 bytes) last */ | 474 | /* do the record header (5 bytes) and handshake message header (4 bytes) last */ |
491 | d = p = &(buf[9]); | 475 | d = p = &(buf[9]); |
492 | 476 | ||
493 | *(p++) = version_major; | 477 | *(p++) = version_major; |
494 | *(p++) = version_minor; | 478 | *(p++) = version_minor; |
495 | 479 | ||
@@ -501,73 +485,68 @@ static int ssl23_client_hello(SSL *s) | |||
501 | *(p++) = 0; | 485 | *(p++) = 0; |
502 | 486 | ||
503 | /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */ | 487 | /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */ |
504 | i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),ssl3_put_cipher_by_char); | 488 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &(p[2]), ssl3_put_cipher_by_char); |
505 | if (i == 0) | 489 | if (i == 0) { |
506 | { | 490 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE); |
507 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); | ||
508 | return -1; | 491 | return -1; |
509 | } | 492 | } |
510 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH | 493 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH |
511 | /* Some servers hang if client hello > 256 bytes | 494 | /* Some servers hang if client hello > 256 bytes |
512 | * as hack workaround chop number of supported ciphers | 495 | * as hack workaround chop number of supported ciphers |
513 | * to keep it well below this if we use TLS v1.2 | 496 | * to keep it well below this if we use TLS v1.2 |
514 | */ | 497 | */ |
515 | if (TLS1_get_version(s) >= TLS1_2_VERSION | 498 | if (TLS1_get_version(s) >= TLS1_2_VERSION && |
516 | && i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH) | 499 | i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH) |
517 | i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1; | 500 | i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1; |
518 | #endif | 501 | #endif |
519 | s2n(i,p); | 502 | s2n(i, p); |
520 | p+=i; | 503 | p += i; |
521 | 504 | ||
522 | /* COMPRESSION */ | 505 | /* COMPRESSION */ |
523 | #ifdef OPENSSL_NO_COMP | 506 | #ifdef OPENSSL_NO_COMP |
524 | *(p++)=1; | 507 | *(p++) = 1; |
525 | #else | 508 | #else |
526 | if ((s->options & SSL_OP_NO_COMPRESSION) | 509 | if ((s->options & SSL_OP_NO_COMPRESSION) || |
527 | || !s->ctx->comp_methods) | 510 | !s->ctx->comp_methods) |
528 | j=0; | 511 | j = 0; |
529 | else | 512 | else |
530 | j=sk_SSL_COMP_num(s->ctx->comp_methods); | 513 | j = sk_SSL_COMP_num(s->ctx->comp_methods); |
531 | *(p++)=1+j; | 514 | *(p++) = 1 + j; |
532 | for (i=0; i<j; i++) | 515 | for (i = 0; i < j; i++) { |
533 | { | 516 | comp = sk_SSL_COMP_value(s->ctx->comp_methods, i); |
534 | comp=sk_SSL_COMP_value(s->ctx->comp_methods,i); | 517 | *(p++) = comp->id; |
535 | *(p++)=comp->id; | 518 | } |
536 | } | ||
537 | #endif | 519 | #endif |
538 | *(p++)=0; /* Add the NULL method */ | 520 | *(p++)=0; /* Add the NULL method */ |
539 | 521 | ||
540 | #ifndef OPENSSL_NO_TLSEXT | 522 | #ifndef OPENSSL_NO_TLSEXT |
541 | /* TLS extensions*/ | 523 | /* TLS extensions*/ |
542 | if (ssl_prepare_clienthello_tlsext(s) <= 0) | 524 | if (ssl_prepare_clienthello_tlsext(s) <= 0) { |
543 | { | 525 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_CLIENTHELLO_TLSEXT); |
544 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT); | ||
545 | return -1; | 526 | return -1; |
546 | } | 527 | } |
547 | if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) | 528 | if ((p = ssl_add_clienthello_tlsext(s, p, buf + SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) { |
548 | { | 529 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); |
549 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR); | ||
550 | return -1; | 530 | return -1; |
551 | } | 531 | } |
552 | #endif | 532 | #endif |
553 | 533 | ||
554 | l = p-d; | 534 | l = p - d; |
555 | 535 | ||
556 | /* fill in 4-byte handshake header */ | 536 | /* fill in 4-byte handshake header */ |
557 | d=&(buf[5]); | 537 | d = &(buf[5]); |
558 | *(d++)=SSL3_MT_CLIENT_HELLO; | 538 | *(d++) = SSL3_MT_CLIENT_HELLO; |
559 | l2n3(l,d); | 539 | l2n3(l, d); |
560 | 540 | ||
561 | l += 4; | 541 | l += 4; |
562 | 542 | ||
563 | if (l > SSL3_RT_MAX_PLAIN_LENGTH) | 543 | if (l > SSL3_RT_MAX_PLAIN_LENGTH) { |
564 | { | 544 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); |
565 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR); | ||
566 | return -1; | 545 | return -1; |
567 | } | 546 | } |
568 | 547 | ||
569 | /* fill in 5-byte record header */ | 548 | /* fill in 5-byte record header */ |
570 | d=buf; | 549 | d = buf; |
571 | *(d++) = SSL3_RT_HANDSHAKE; | 550 | *(d++) = SSL3_RT_HANDSHAKE; |
572 | *(d++) = version_major; | 551 | *(d++) = version_major; |
573 | /* Some servers hang if we use long client hellos | 552 | /* Some servers hang if we use long client hellos |
@@ -577,54 +556,54 @@ static int ssl23_client_hello(SSL *s) | |||
577 | *(d++) = 1; | 556 | *(d++) = 1; |
578 | else | 557 | else |
579 | *(d++) = version_minor; | 558 | *(d++) = version_minor; |
580 | s2n((int)l,d); | 559 | s2n((int)l, d); |
581 | 560 | ||
582 | /* number of bytes to write */ | 561 | /* number of bytes to write */ |
583 | s->init_num=p-buf; | 562 | s->init_num = p - buf; |
584 | s->init_off=0; | 563 | s->init_off = 0; |
585 | |||
586 | ssl3_finish_mac(s,&(buf[5]), s->init_num - 5); | ||
587 | } | ||
588 | 564 | ||
589 | s->state=SSL23_ST_CW_CLNT_HELLO_B; | 565 | ssl3_finish_mac(s, &(buf[5]), s->init_num - 5); |
590 | s->init_off=0; | ||
591 | } | 566 | } |
592 | 567 | ||
568 | s->state = SSL23_ST_CW_CLNT_HELLO_B; | ||
569 | s->init_off = 0; | ||
570 | } | ||
571 | |||
593 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 572 | /* SSL3_ST_CW_CLNT_HELLO_B */ |
594 | ret = ssl23_write_bytes(s); | 573 | ret = ssl23_write_bytes(s); |
595 | 574 | ||
596 | if ((ret >= 2) && s->msg_callback) | 575 | if ((ret >= 2) && s->msg_callback) { |
597 | { | ||
598 | /* Client Hello has been sent; tell msg_callback */ | 576 | /* Client Hello has been sent; tell msg_callback */ |
599 | 577 | ||
600 | if (ssl2_compat) | 578 | if (ssl2_compat) |
601 | s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); | 579 | s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data + 2, ret - 2, s, s->msg_callback_arg); |
602 | else | 580 | else |
603 | s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data+5, ret-5, s, s->msg_callback_arg); | 581 | s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data + 5, ret - 5, s, s->msg_callback_arg); |
604 | } | 582 | } |
605 | 583 | ||
606 | return ret; | 584 | return ret; |
607 | } | 585 | } |
608 | 586 | ||
609 | static int ssl23_get_server_hello(SSL *s) | 587 | static int |
610 | { | 588 | ssl23_get_server_hello(SSL *s) |
589 | { | ||
611 | char buf[8]; | 590 | char buf[8]; |
612 | unsigned char *p; | 591 | unsigned char *p; |
613 | int i; | 592 | int i; |
614 | int n; | 593 | int n; |
615 | 594 | ||
616 | n=ssl23_read_bytes(s,7); | 595 | n = ssl23_read_bytes(s, 7); |
617 | 596 | ||
618 | if (n != 7) return(n); | 597 | if (n != 7) |
619 | p=s->packet; | 598 | return (n); |
599 | p = s->packet; | ||
620 | 600 | ||
621 | memcpy(buf,p,n); | 601 | memcpy(buf, p, n); |
622 | 602 | ||
623 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) && | 603 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) && |
624 | (p[5] == 0x00) && (p[6] == 0x02)) | 604 | (p[5] == 0x00) && (p[6] == 0x02)) { |
625 | { | ||
626 | #ifdef OPENSSL_NO_SSL2 | 605 | #ifdef OPENSSL_NO_SSL2 |
627 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 606 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); |
628 | goto err; | 607 | goto err; |
629 | #else | 608 | #else |
630 | /* we are talking sslv2 */ | 609 | /* we are talking sslv2 */ |
@@ -632,169 +611,150 @@ static int ssl23_get_server_hello(SSL *s) | |||
632 | * sslv2 stuff. */ | 611 | * sslv2 stuff. */ |
633 | int ch_len; | 612 | int ch_len; |
634 | 613 | ||
635 | if (s->options & SSL_OP_NO_SSLv2) | 614 | if (s->options & SSL_OP_NO_SSLv2) { |
636 | { | 615 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); |
637 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | ||
638 | goto err; | 616 | goto err; |
639 | } | 617 | } |
640 | if (s->s2 == NULL) | 618 | if (s->s2 == NULL) { |
641 | { | ||
642 | if (!ssl2_new(s)) | 619 | if (!ssl2_new(s)) |
643 | goto err; | 620 | goto err; |
644 | } | 621 | } else |
645 | else | ||
646 | ssl2_clear(s); | 622 | ssl2_clear(s); |
647 | 623 | ||
648 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) | 624 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) |
649 | ch_len=SSL2_CHALLENGE_LENGTH; | 625 | ch_len = SSL2_CHALLENGE_LENGTH; |
650 | else | 626 | else |
651 | ch_len=SSL2_MAX_CHALLENGE_LENGTH; | 627 | ch_len = SSL2_MAX_CHALLENGE_LENGTH; |
652 | 628 | ||
653 | /* write out sslv2 challenge */ | 629 | /* write out sslv2 challenge */ |
654 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), because | 630 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), because |
655 | it is one of SSL2_MAX_CHALLENGE_LENGTH (32) or | 631 | it is one of SSL2_MAX_CHALLENGE_LENGTH (32) or |
656 | SSL2_MAX_CHALLENGE_LENGTH (16), but leave the check in for | 632 | SSL2_MAX_CHALLENGE_LENGTH (16), but leave the check in for |
657 | futurproofing */ | 633 | futurproofing */ |
658 | i=(SSL3_RANDOM_SIZE < ch_len) | 634 | i = (SSL3_RANDOM_SIZE < ch_len) ? SSL3_RANDOM_SIZE : ch_len; |
659 | ?SSL3_RANDOM_SIZE:ch_len; | 635 | s->s2->challenge_length = i; |
660 | s->s2->challenge_length=i; | ||
661 | memcpy(s->s2->challenge, | 636 | memcpy(s->s2->challenge, |
662 | &(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i); | 637 | &(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i); |
663 | 638 | ||
664 | if (s->s3 != NULL) ssl3_free(s); | 639 | if (s->s3 != NULL) |
640 | ssl3_free(s); | ||
665 | 641 | ||
666 | if (!BUF_MEM_grow_clean(s->init_buf, | 642 | if (!BUF_MEM_grow_clean(s->init_buf, |
667 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) | 643 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) { |
668 | { | 644 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, ERR_R_BUF_LIB); |
669 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,ERR_R_BUF_LIB); | ||
670 | goto err; | 645 | goto err; |
671 | } | 646 | } |
672 | 647 | ||
673 | s->state=SSL2_ST_GET_SERVER_HELLO_A; | 648 | s->state = SSL2_ST_GET_SERVER_HELLO_A; |
674 | if (!(s->client_version == SSL2_VERSION)) | 649 | if (!(s->client_version == SSL2_VERSION)) |
675 | /* use special padding (SSL 3.0 draft/RFC 2246, App. E.2) */ | 650 | /* use special padding (SSL 3.0 draft/RFC 2246, App. E.2) */ |
676 | s->s2->ssl2_rollback=1; | 651 | s->s2->ssl2_rollback = 1; |
677 | 652 | ||
678 | /* setup the 7 bytes we have read so we get them from | 653 | /* setup the 7 bytes we have read so we get them from |
679 | * the sslv2 buffer */ | 654 | * the sslv2 buffer */ |
680 | s->rstate=SSL_ST_READ_HEADER; | 655 | s->rstate = SSL_ST_READ_HEADER; |
681 | s->packet_length=n; | 656 | s->packet_length = n; |
682 | s->packet= &(s->s2->rbuf[0]); | 657 | s->packet = &(s->s2->rbuf[0]); |
683 | memcpy(s->packet,buf,n); | 658 | memcpy(s->packet, buf, n); |
684 | s->s2->rbuf_left=n; | 659 | s->s2->rbuf_left = n; |
685 | s->s2->rbuf_offs=0; | 660 | s->s2->rbuf_offs = 0; |
686 | 661 | ||
687 | /* we have already written one */ | 662 | /* we have already written one */ |
688 | s->s2->write_sequence=1; | 663 | s->s2->write_sequence = 1; |
689 | 664 | ||
690 | s->method=SSLv2_client_method(); | 665 | s->method = SSLv2_client_method(); |
691 | s->handshake_func=s->method->ssl_connect; | 666 | s->handshake_func = s->method->ssl_connect; |
692 | #endif | 667 | #endif |
693 | } | 668 | } else if (p[1] == SSL3_VERSION_MAJOR && |
694 | else if (p[1] == SSL3_VERSION_MAJOR && | 669 | p[2] <= TLS1_2_VERSION_MINOR && |
695 | p[2] <= TLS1_2_VERSION_MINOR && | 670 | ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) || |
696 | ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) || | 671 | (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2))) { |
697 | (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2))) | ||
698 | { | ||
699 | /* we have sslv3 or tls1 (server hello or alert) */ | 672 | /* we have sslv3 or tls1 (server hello or alert) */ |
700 | 673 | ||
701 | if ((p[2] == SSL3_VERSION_MINOR) && | 674 | if ((p[2] == SSL3_VERSION_MINOR) && |
702 | !(s->options & SSL_OP_NO_SSLv3)) | 675 | !(s->options & SSL_OP_NO_SSLv3)) { |
703 | { | ||
704 | #ifdef OPENSSL_FIPS | 676 | #ifdef OPENSSL_FIPS |
705 | if(FIPS_mode()) | 677 | if (FIPS_mode()) { |
706 | { | ||
707 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, | 678 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, |
708 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | 679 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); |
709 | goto err; | 680 | goto err; |
710 | } | ||
711 | #endif | ||
712 | s->version=SSL3_VERSION; | ||
713 | s->method=SSLv3_client_method(); | ||
714 | } | ||
715 | else if ((p[2] == TLS1_VERSION_MINOR) && | ||
716 | !(s->options & SSL_OP_NO_TLSv1)) | ||
717 | { | ||
718 | s->version=TLS1_VERSION; | ||
719 | s->method=TLSv1_client_method(); | ||
720 | } | 681 | } |
721 | else if ((p[2] == TLS1_1_VERSION_MINOR) && | 682 | #endif |
722 | !(s->options & SSL_OP_NO_TLSv1_1)) | 683 | s->version = SSL3_VERSION; |
723 | { | 684 | s->method = SSLv3_client_method(); |
724 | s->version=TLS1_1_VERSION; | 685 | } else if ((p[2] == TLS1_VERSION_MINOR) && |
725 | s->method=TLSv1_1_client_method(); | 686 | !(s->options & SSL_OP_NO_TLSv1)) { |
726 | } | 687 | s->version = TLS1_VERSION; |
727 | else if ((p[2] == TLS1_2_VERSION_MINOR) && | 688 | s->method = TLSv1_client_method(); |
728 | !(s->options & SSL_OP_NO_TLSv1_2)) | 689 | } else if ((p[2] == TLS1_1_VERSION_MINOR) && |
729 | { | 690 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
730 | s->version=TLS1_2_VERSION; | 691 | s->version = TLS1_1_VERSION; |
731 | s->method=TLSv1_2_client_method(); | 692 | s->method = TLSv1_1_client_method(); |
732 | } | 693 | } else if ((p[2] == TLS1_2_VERSION_MINOR) && |
733 | else | 694 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
734 | { | 695 | s->version = TLS1_2_VERSION; |
735 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 696 | s->method = TLSv1_2_client_method(); |
697 | } else { | ||
698 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); | ||
736 | goto err; | 699 | goto err; |
737 | } | 700 | } |
738 | 701 | ||
739 | if (p[0] == SSL3_RT_ALERT && p[5] != SSL3_AL_WARNING) | 702 | if (p[0] == SSL3_RT_ALERT && p[5] != SSL3_AL_WARNING) { |
740 | { | ||
741 | /* fatal alert */ | 703 | /* fatal alert */ |
742 | 704 | ||
743 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 705 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
744 | int j; | 706 | int j; |
745 | 707 | ||
746 | if (s->info_callback != NULL) | 708 | if (s->info_callback != NULL) |
747 | cb=s->info_callback; | 709 | cb = s->info_callback; |
748 | else if (s->ctx->info_callback != NULL) | 710 | else if (s->ctx->info_callback != NULL) |
749 | cb=s->ctx->info_callback; | 711 | cb = s->ctx->info_callback; |
750 | 712 | ||
751 | i=p[5]; | 713 | i = p[5]; |
752 | if (cb != NULL) | 714 | if (cb != NULL) { |
753 | { | 715 | j = (i << 8) | p[6]; |
754 | j=(i<<8)|p[6]; | 716 | cb(s, SSL_CB_READ_ALERT, j); |
755 | cb(s,SSL_CB_READ_ALERT,j); | 717 | } |
756 | } | 718 | |
757 | |||
758 | if (s->msg_callback) | 719 | if (s->msg_callback) |
759 | s->msg_callback(0, s->version, SSL3_RT_ALERT, p+5, 2, s, s->msg_callback_arg); | 720 | s->msg_callback(0, s->version, SSL3_RT_ALERT, p + 5, 2, s, s->msg_callback_arg); |
760 | 721 | ||
761 | s->rwstate=SSL_NOTHING; | 722 | s->rwstate = SSL_NOTHING; |
762 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_AD_REASON_OFFSET+p[6]); | 723 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_AD_REASON_OFFSET + p[6]); |
763 | goto err; | 724 | goto err; |
764 | } | 725 | } |
765 | 726 | ||
766 | if (!ssl_init_wbio_buffer(s,1)) goto err; | 727 | if (!ssl_init_wbio_buffer(s, 1)) |
728 | goto err; | ||
767 | 729 | ||
768 | /* we are in this state */ | 730 | /* we are in this state */ |
769 | s->state=SSL3_ST_CR_SRVR_HELLO_A; | 731 | s->state = SSL3_ST_CR_SRVR_HELLO_A; |
770 | 732 | ||
771 | /* put the 7 bytes we have read into the input buffer | 733 | /* put the 7 bytes we have read into the input buffer |
772 | * for SSLv3 */ | 734 | * for SSLv3 */ |
773 | s->rstate=SSL_ST_READ_HEADER; | 735 | s->rstate = SSL_ST_READ_HEADER; |
774 | s->packet_length=n; | 736 | s->packet_length = n; |
775 | if (s->s3->rbuf.buf == NULL) | 737 | if (s->s3->rbuf.buf == NULL) |
776 | if (!ssl3_setup_read_buffer(s)) | 738 | if (!ssl3_setup_read_buffer(s)) |
777 | goto err; | 739 | goto err; |
778 | s->packet= &(s->s3->rbuf.buf[0]); | 740 | s->packet = &(s->s3->rbuf.buf[0]); |
779 | memcpy(s->packet,buf,n); | 741 | memcpy(s->packet, buf, n); |
780 | s->s3->rbuf.left=n; | 742 | s->s3->rbuf.left = n; |
781 | s->s3->rbuf.offset=0; | 743 | s->s3->rbuf.offset = 0; |
782 | 744 | ||
783 | s->handshake_func=s->method->ssl_connect; | 745 | s->handshake_func = s->method->ssl_connect; |
784 | } | 746 | } else { |
785 | else | 747 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNKNOWN_PROTOCOL); |
786 | { | ||
787 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNKNOWN_PROTOCOL); | ||
788 | goto err; | 748 | goto err; |
789 | } | 749 | } |
790 | s->init_num=0; | 750 | s->init_num = 0; |
791 | 751 | ||
792 | /* Since, if we are sending a ssl23 client hello, we are not | 752 | /* Since, if we are sending a ssl23 client hello, we are not |
793 | * reusing a session-id */ | 753 | * reusing a session-id */ |
794 | if (!ssl_get_new_session(s,0)) | 754 | if (!ssl_get_new_session(s, 0)) |
795 | goto err; | 755 | goto err; |
796 | 756 | ||
797 | return(SSL_connect(s)); | 757 | return (SSL_connect(s)); |
798 | err: | 758 | err: |
799 | return(-1); | 759 | return (-1); |
800 | } | 760 | } |
diff --git a/src/lib/libssl/s23_lib.c b/src/lib/libssl/s23_lib.c index a6285b767f..3a4d5a6ecb 100644 --- a/src/lib/libssl/s23_lib.c +++ b/src/lib/libssl/s23_lib.c | |||
@@ -60,128 +60,126 @@ | |||
60 | #include <openssl/objects.h> | 60 | #include <openssl/objects.h> |
61 | #include "ssl_locl.h" | 61 | #include "ssl_locl.h" |
62 | 62 | ||
63 | long ssl23_default_timeout(void) | 63 | long |
64 | { | 64 | ssl23_default_timeout(void) |
65 | return(300); | 65 | { |
66 | } | 66 | return (300); |
67 | } | ||
67 | 68 | ||
68 | int ssl23_num_ciphers(void) | 69 | int |
69 | { | 70 | ssl23_num_ciphers(void) |
71 | { | ||
70 | return(ssl3_num_ciphers() | 72 | return(ssl3_num_ciphers() |
71 | #ifndef OPENSSL_NO_SSL2 | 73 | #ifndef OPENSSL_NO_SSL2 |
72 | + ssl2_num_ciphers() | 74 | + ssl2_num_ciphers() |
73 | #endif | 75 | #endif |
74 | ); | 76 | ); |
75 | } | 77 | } |
76 | 78 | ||
77 | const SSL_CIPHER *ssl23_get_cipher(unsigned int u) | 79 | const SSL_CIPHER |
78 | { | 80 | *ssl23_get_cipher(unsigned int u) |
79 | unsigned int uu=ssl3_num_ciphers(); | 81 | { |
82 | unsigned int uu = ssl3_num_ciphers(); | ||
80 | 83 | ||
81 | if (u < uu) | 84 | if (u < uu) |
82 | return(ssl3_get_cipher(u)); | 85 | return (ssl3_get_cipher(u)); |
83 | else | 86 | else |
84 | #ifndef OPENSSL_NO_SSL2 | 87 | #ifndef OPENSSL_NO_SSL2 |
85 | return(ssl2_get_cipher(u-uu)); | 88 | return (ssl2_get_cipher(u - uu)); |
86 | #else | 89 | #else |
87 | return(NULL); | 90 | return (NULL); |
88 | #endif | 91 | #endif |
89 | } | 92 | } |
90 | 93 | ||
91 | /* This function needs to check if the ciphers required are actually | 94 | /* This function needs to check if the ciphers required are actually |
92 | * available */ | 95 | * available */ |
93 | const SSL_CIPHER *ssl23_get_cipher_by_char(const unsigned char *p) | 96 | const SSL_CIPHER |
94 | { | 97 | *ssl23_get_cipher_by_char(const unsigned char *p) |
98 | { | ||
95 | const SSL_CIPHER *cp; | 99 | const SSL_CIPHER *cp; |
96 | 100 | ||
97 | cp=ssl3_get_cipher_by_char(p); | 101 | cp = ssl3_get_cipher_by_char(p); |
98 | #ifndef OPENSSL_NO_SSL2 | 102 | #ifndef OPENSSL_NO_SSL2 |
99 | if (cp == NULL) | 103 | if (cp == NULL) |
100 | cp=ssl2_get_cipher_by_char(p); | 104 | cp = ssl2_get_cipher_by_char(p); |
101 | #endif | 105 | #endif |
102 | return(cp); | 106 | return (cp); |
103 | } | 107 | } |
104 | 108 | ||
105 | int ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | 109 | int |
106 | { | 110 | ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) |
111 | { | ||
107 | long l; | 112 | long l; |
108 | 113 | ||
109 | /* We can write SSLv2 and SSLv3 ciphers */ | 114 | /* We can write SSLv2 and SSLv3 ciphers */ |
110 | if (p != NULL) | 115 | if (p != NULL) { |
111 | { | 116 | l = c->id; |
112 | l=c->id; | 117 | p[0] = ((unsigned char)(l >> 16L))&0xFF; |
113 | p[0]=((unsigned char)(l>>16L))&0xFF; | 118 | p[1] = ((unsigned char)(l >> 8L))&0xFF; |
114 | p[1]=((unsigned char)(l>> 8L))&0xFF; | 119 | p[2] = ((unsigned char)(l ))&0xFF; |
115 | p[2]=((unsigned char)(l ))&0xFF; | ||
116 | } | ||
117 | return(3); | ||
118 | } | 120 | } |
121 | return (3); | ||
122 | } | ||
119 | 123 | ||
120 | int ssl23_read(SSL *s, void *buf, int len) | 124 | int |
121 | { | 125 | ssl23_read(SSL *s, void *buf, int len) |
126 | { | ||
122 | int n; | 127 | int n; |
123 | 128 | ||
124 | errno = 0; | 129 | errno = 0; |
125 | if (SSL_in_init(s) && (!s->in_handshake)) | 130 | if (SSL_in_init(s) && (!s->in_handshake)) { |
126 | { | 131 | n = s->handshake_func(s); |
127 | n=s->handshake_func(s); | 132 | if (n < 0) |
128 | if (n < 0) return(n); | 133 | return (n); |
129 | if (n == 0) | 134 | if (n == 0) { |
130 | { | 135 | SSLerr(SSL_F_SSL23_READ, SSL_R_SSL_HANDSHAKE_FAILURE); |
131 | SSLerr(SSL_F_SSL23_READ,SSL_R_SSL_HANDSHAKE_FAILURE); | 136 | return (-1); |
132 | return(-1); | ||
133 | } | ||
134 | return(SSL_read(s,buf,len)); | ||
135 | } | 137 | } |
136 | else | 138 | return (SSL_read(s, buf, len)); |
137 | { | 139 | } else { |
138 | ssl_undefined_function(s); | 140 | ssl_undefined_function(s); |
139 | return(-1); | 141 | return (-1); |
140 | } | ||
141 | } | 142 | } |
143 | } | ||
142 | 144 | ||
143 | int ssl23_peek(SSL *s, void *buf, int len) | 145 | int |
144 | { | 146 | ssl23_peek(SSL *s, void *buf, int len) |
147 | { | ||
145 | int n; | 148 | int n; |
146 | 149 | ||
147 | errno = 0; | 150 | errno = 0; |
148 | if (SSL_in_init(s) && (!s->in_handshake)) | 151 | if (SSL_in_init(s) && (!s->in_handshake)) { |
149 | { | 152 | n = s->handshake_func(s); |
150 | n=s->handshake_func(s); | 153 | if (n < 0) |
151 | if (n < 0) return(n); | 154 | return (n); |
152 | if (n == 0) | 155 | if (n == 0) { |
153 | { | 156 | SSLerr(SSL_F_SSL23_PEEK, SSL_R_SSL_HANDSHAKE_FAILURE); |
154 | SSLerr(SSL_F_SSL23_PEEK,SSL_R_SSL_HANDSHAKE_FAILURE); | 157 | return (-1); |
155 | return(-1); | ||
156 | } | ||
157 | return(SSL_peek(s,buf,len)); | ||
158 | } | 158 | } |
159 | else | 159 | return (SSL_peek(s, buf, len)); |
160 | { | 160 | } else { |
161 | ssl_undefined_function(s); | 161 | ssl_undefined_function(s); |
162 | return(-1); | 162 | return (-1); |
163 | } | ||
164 | } | 163 | } |
164 | } | ||
165 | 165 | ||
166 | int ssl23_write(SSL *s, const void *buf, int len) | 166 | int |
167 | { | 167 | ssl23_write(SSL *s, const void *buf, int len) |
168 | { | ||
168 | int n; | 169 | int n; |
169 | 170 | ||
170 | errno = 0; | 171 | errno = 0; |
171 | if (SSL_in_init(s) && (!s->in_handshake)) | 172 | if (SSL_in_init(s) && (!s->in_handshake)) { |
172 | { | 173 | n = s->handshake_func(s); |
173 | n=s->handshake_func(s); | 174 | if (n < 0) |
174 | if (n < 0) return(n); | 175 | return (n); |
175 | if (n == 0) | 176 | if (n == 0) { |
176 | { | 177 | SSLerr(SSL_F_SSL23_WRITE, SSL_R_SSL_HANDSHAKE_FAILURE); |
177 | SSLerr(SSL_F_SSL23_WRITE,SSL_R_SSL_HANDSHAKE_FAILURE); | 178 | return (-1); |
178 | return(-1); | ||
179 | } | ||
180 | return(SSL_write(s,buf,len)); | ||
181 | } | 179 | } |
182 | else | 180 | return (SSL_write(s, buf, len)); |
183 | { | 181 | } else { |
184 | ssl_undefined_function(s); | 182 | ssl_undefined_function(s); |
185 | return(-1); | 183 | return (-1); |
186 | } | ||
187 | } | 184 | } |
185 | } | ||
diff --git a/src/lib/libssl/s23_pkt.c b/src/lib/libssl/s23_pkt.c index eba8d9d8fc..28d07a2212 100644 --- a/src/lib/libssl/s23_pkt.c +++ b/src/lib/libssl/s23_pkt.c | |||
@@ -62,55 +62,53 @@ | |||
62 | #include <openssl/evp.h> | 62 | #include <openssl/evp.h> |
63 | #include <openssl/buffer.h> | 63 | #include <openssl/buffer.h> |
64 | 64 | ||
65 | int ssl23_write_bytes(SSL *s) | 65 | int |
66 | { | 66 | ssl23_write_bytes(SSL *s) |
67 | int i,num,tot; | 67 | { |
68 | int i, num, tot; | ||
68 | char *buf; | 69 | char *buf; |
69 | 70 | ||
70 | buf=s->init_buf->data; | 71 | buf = s->init_buf->data; |
71 | tot=s->init_off; | 72 | tot = s->init_off; |
72 | num=s->init_num; | 73 | num = s->init_num; |
73 | for (;;) | 74 | for (;;) { |
74 | { | 75 | s->rwstate = SSL_WRITING; |
75 | s->rwstate=SSL_WRITING; | 76 | i = BIO_write(s->wbio, &(buf[tot]), num); |
76 | i=BIO_write(s->wbio,&(buf[tot]),num); | 77 | if (i <= 0) { |
77 | if (i <= 0) | 78 | s->init_off = tot; |
78 | { | 79 | s->init_num = num; |
79 | s->init_off=tot; | 80 | return (i); |
80 | s->init_num=num; | ||
81 | return(i); | ||
82 | } | ||
83 | s->rwstate=SSL_NOTHING; | ||
84 | if (i == num) return(tot+i); | ||
85 | |||
86 | num-=i; | ||
87 | tot+=i; | ||
88 | } | 81 | } |
82 | s->rwstate = SSL_NOTHING; | ||
83 | if (i == num) | ||
84 | return (tot + i); | ||
85 | |||
86 | num -= i; | ||
87 | tot += i; | ||
89 | } | 88 | } |
89 | } | ||
90 | 90 | ||
91 | /* return regularly only when we have read (at least) 'n' bytes */ | 91 | /* return regularly only when we have read (at least) 'n' bytes */ |
92 | int ssl23_read_bytes(SSL *s, int n) | 92 | int |
93 | { | 93 | ssl23_read_bytes(SSL *s, int n) |
94 | { | ||
94 | unsigned char *p; | 95 | unsigned char *p; |
95 | int j; | 96 | int j; |
96 | 97 | ||
97 | if (s->packet_length < (unsigned int)n) | 98 | if (s->packet_length < (unsigned int)n) { |
98 | { | 99 | p = s->packet; |
99 | p=s->packet; | ||
100 | 100 | ||
101 | for (;;) | 101 | for (;;) { |
102 | { | 102 | s->rwstate = SSL_READING; |
103 | s->rwstate=SSL_READING; | 103 | j = BIO_read(s->rbio,(char *)&(p[s->packet_length]), |
104 | j=BIO_read(s->rbio,(char *)&(p[s->packet_length]), | 104 | n - s->packet_length); |
105 | n-s->packet_length); | ||
106 | if (j <= 0) | 105 | if (j <= 0) |
107 | return(j); | 106 | return (j); |
108 | s->rwstate=SSL_NOTHING; | 107 | s->rwstate = SSL_NOTHING; |
109 | s->packet_length+=j; | 108 | s->packet_length += j; |
110 | if (s->packet_length >= (unsigned int)n) | 109 | if (s->packet_length >= (unsigned int)n) |
111 | return(s->packet_length); | 110 | return (s->packet_length); |
112 | } | ||
113 | } | 111 | } |
114 | return(n); | ||
115 | } | 112 | } |
116 | 113 | return (n); | |
114 | } | ||
diff --git a/src/lib/libssl/s23_srvr.c b/src/lib/libssl/s23_srvr.c index 2ac8786c62..35db7b4992 100644 --- a/src/lib/libssl/s23_srvr.c +++ b/src/lib/libssl/s23_srvr.c | |||
@@ -121,227 +121,209 @@ | |||
121 | 121 | ||
122 | static const SSL_METHOD *ssl23_get_server_method(int ver); | 122 | static const SSL_METHOD *ssl23_get_server_method(int ver); |
123 | int ssl23_get_client_hello(SSL *s); | 123 | int ssl23_get_client_hello(SSL *s); |
124 | static const SSL_METHOD *ssl23_get_server_method(int ver) | 124 | static const SSL_METHOD |
125 | { | 125 | *ssl23_get_server_method(int ver) |
126 | { | ||
126 | #ifndef OPENSSL_NO_SSL2 | 127 | #ifndef OPENSSL_NO_SSL2 |
127 | if (ver == SSL2_VERSION) | 128 | if (ver == SSL2_VERSION) |
128 | return(SSLv2_server_method()); | 129 | return (SSLv2_server_method()); |
129 | #endif | 130 | #endif |
130 | if (ver == SSL3_VERSION) | 131 | if (ver == SSL3_VERSION) |
131 | return(SSLv3_server_method()); | 132 | return (SSLv3_server_method()); |
132 | else if (ver == TLS1_VERSION) | 133 | else if (ver == TLS1_VERSION) |
133 | return(TLSv1_server_method()); | 134 | return (TLSv1_server_method()); |
134 | else if (ver == TLS1_1_VERSION) | 135 | else if (ver == TLS1_1_VERSION) |
135 | return(TLSv1_1_server_method()); | 136 | return (TLSv1_1_server_method()); |
136 | else if (ver == TLS1_2_VERSION) | 137 | else if (ver == TLS1_2_VERSION) |
137 | return(TLSv1_2_server_method()); | 138 | return (TLSv1_2_server_method()); |
138 | else | 139 | else |
139 | return(NULL); | 140 | return (NULL); |
140 | } | 141 | } |
141 | 142 | ||
142 | IMPLEMENT_ssl23_meth_func(SSLv23_server_method, | 143 | IMPLEMENT_ssl23_meth_func(SSLv23_server_method, |
143 | ssl23_accept, | 144 | ssl23_accept, ssl_undefined_function, ssl23_get_server_method) |
144 | ssl_undefined_function, | ||
145 | ssl23_get_server_method) | ||
146 | 145 | ||
147 | int ssl23_accept(SSL *s) | 146 | int |
148 | { | 147 | ssl23_accept(SSL *s) |
148 | { | ||
149 | BUF_MEM *buf; | 149 | BUF_MEM *buf; |
150 | unsigned long Time=(unsigned long)time(NULL); | 150 | unsigned long Time = (unsigned long)time(NULL); |
151 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 151 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
152 | int ret= -1; | 152 | int ret = -1; |
153 | int new_state,state; | 153 | int new_state, state; |
154 | 154 | ||
155 | RAND_add(&Time,sizeof(Time),0); | 155 | RAND_add(&Time, sizeof(Time), 0); |
156 | ERR_clear_error(); | 156 | ERR_clear_error(); |
157 | errno = 0; | 157 | errno = 0; |
158 | 158 | ||
159 | if (s->info_callback != NULL) | 159 | if (s->info_callback != NULL) |
160 | cb=s->info_callback; | 160 | cb = s->info_callback; |
161 | else if (s->ctx->info_callback != NULL) | 161 | else if (s->ctx->info_callback != NULL) |
162 | cb=s->ctx->info_callback; | 162 | cb = s->ctx->info_callback; |
163 | 163 | ||
164 | s->in_handshake++; | 164 | s->in_handshake++; |
165 | if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); | 165 | if (!SSL_in_init(s) || SSL_in_before(s)) |
166 | SSL_clear(s); | ||
166 | 167 | ||
167 | for (;;) | 168 | for (;;) { |
168 | { | 169 | state = s->state; |
169 | state=s->state; | ||
170 | 170 | ||
171 | switch(s->state) | 171 | switch (s->state) { |
172 | { | ||
173 | case SSL_ST_BEFORE: | 172 | case SSL_ST_BEFORE: |
174 | case SSL_ST_ACCEPT: | 173 | case SSL_ST_ACCEPT: |
175 | case SSL_ST_BEFORE|SSL_ST_ACCEPT: | 174 | case SSL_ST_BEFORE|SSL_ST_ACCEPT: |
176 | case SSL_ST_OK|SSL_ST_ACCEPT: | 175 | case SSL_ST_OK|SSL_ST_ACCEPT: |
177 | 176 | ||
178 | s->server=1; | 177 | s->server = 1; |
179 | if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); | 178 | if (cb != NULL) |
179 | cb(s, SSL_CB_HANDSHAKE_START, 1); | ||
180 | 180 | ||
181 | /* s->version=SSL3_VERSION; */ | 181 | /* s->version=SSL3_VERSION; */ |
182 | s->type=SSL_ST_ACCEPT; | 182 | s->type = SSL_ST_ACCEPT; |
183 | 183 | ||
184 | if (s->init_buf == NULL) | 184 | if (s->init_buf == NULL) { |
185 | { | 185 | if ((buf = BUF_MEM_new()) == NULL) { |
186 | if ((buf=BUF_MEM_new()) == NULL) | 186 | ret = -1; |
187 | { | ||
188 | ret= -1; | ||
189 | goto end; | 187 | goto end; |
190 | } | 188 | } |
191 | if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH)) | 189 | if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { |
192 | { | 190 | ret = -1; |
193 | ret= -1; | ||
194 | goto end; | 191 | goto end; |
195 | } | ||
196 | s->init_buf=buf; | ||
197 | } | 192 | } |
193 | s->init_buf = buf; | ||
194 | } | ||
198 | 195 | ||
199 | ssl3_init_finished_mac(s); | 196 | ssl3_init_finished_mac(s); |
200 | 197 | ||
201 | s->state=SSL23_ST_SR_CLNT_HELLO_A; | 198 | s->state = SSL23_ST_SR_CLNT_HELLO_A; |
202 | s->ctx->stats.sess_accept++; | 199 | s->ctx->stats.sess_accept++; |
203 | s->init_num=0; | 200 | s->init_num = 0; |
204 | break; | 201 | break; |
205 | 202 | ||
206 | case SSL23_ST_SR_CLNT_HELLO_A: | 203 | case SSL23_ST_SR_CLNT_HELLO_A: |
207 | case SSL23_ST_SR_CLNT_HELLO_B: | 204 | case SSL23_ST_SR_CLNT_HELLO_B: |
208 | 205 | ||
209 | s->shutdown=0; | 206 | s->shutdown = 0; |
210 | ret=ssl23_get_client_hello(s); | 207 | ret = ssl23_get_client_hello(s); |
211 | if (ret >= 0) cb=NULL; | 208 | if (ret >= 0) |
209 | cb = NULL; | ||
212 | goto end; | 210 | goto end; |
213 | /* break; */ | 211 | /* break; */ |
214 | 212 | ||
215 | default: | 213 | default: |
216 | SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE); | 214 | SSLerr(SSL_F_SSL23_ACCEPT, SSL_R_UNKNOWN_STATE); |
217 | ret= -1; | 215 | ret = -1; |
218 | goto end; | 216 | goto end; |
219 | /* break; */ | 217 | /* break; */ |
220 | } | 218 | } |
221 | 219 | ||
222 | if ((cb != NULL) && (s->state != state)) | 220 | if ((cb != NULL) && (s->state != state)) { |
223 | { | 221 | new_state = s->state; |
224 | new_state=s->state; | 222 | s->state = state; |
225 | s->state=state; | 223 | cb(s, SSL_CB_ACCEPT_LOOP, 1); |
226 | cb(s,SSL_CB_ACCEPT_LOOP,1); | 224 | s->state = new_state; |
227 | s->state=new_state; | ||
228 | } | ||
229 | } | 225 | } |
226 | } | ||
230 | end: | 227 | end: |
231 | s->in_handshake--; | 228 | s->in_handshake--; |
232 | if (cb != NULL) | 229 | if (cb != NULL) |
233 | cb(s,SSL_CB_ACCEPT_EXIT,ret); | 230 | cb(s, SSL_CB_ACCEPT_EXIT, ret); |
234 | return(ret); | 231 | return (ret); |
235 | } | 232 | } |
236 | 233 | ||
237 | 234 | ||
238 | int ssl23_get_client_hello(SSL *s) | 235 | int |
239 | { | 236 | ssl23_get_client_hello(SSL *s) |
237 | { | ||
240 | char buf_space[11]; /* Request this many bytes in initial read. | 238 | char buf_space[11]; /* Request this many bytes in initial read. |
241 | * We can detect SSL 3.0/TLS 1.0 Client Hellos | 239 | * We can detect SSL 3.0/TLS 1.0 Client Hellos |
242 | * ('type == 3') correctly only when the following | 240 | * ('type == 3') correctly only when the following |
243 | * is in a single record, which is not guaranteed by | 241 | * is in a single record, which is not guaranteed by |
244 | * the protocol specification: | 242 | * the protocol specification: |
245 | * Byte Content | 243 | * Byte Content |
246 | * 0 type \ | 244 | * 0 type \ |
247 | * 1/2 version > record header | 245 | * 1/2 version > record header |
248 | * 3/4 length / | 246 | * 3/4 length / |
249 | * 5 msg_type \ | 247 | * 5 msg_type \ |
250 | * 6-8 length > Client Hello message | 248 | * 6-8 length > Client Hello message |
251 | * 9/10 client_version / | 249 | * 9/10 client_version / |
252 | */ | 250 | */ |
253 | char *buf= &(buf_space[0]); | 251 | char *buf = &(buf_space[0]); |
254 | unsigned char *p,*d,*d_len,*dd; | 252 | unsigned char *p, *d, *d_len, *dd; |
255 | unsigned int i; | 253 | unsigned int i; |
256 | unsigned int csl,sil,cl; | 254 | unsigned int csl, sil, cl; |
257 | int n=0,j; | 255 | int n = 0, j; |
258 | int type=0; | 256 | int type = 0; |
259 | int v[2]; | 257 | int v[2]; |
260 | 258 | ||
261 | if (s->state == SSL23_ST_SR_CLNT_HELLO_A) | 259 | if (s->state == SSL23_ST_SR_CLNT_HELLO_A) { |
262 | { | ||
263 | /* read the initial header */ | 260 | /* read the initial header */ |
264 | v[0]=v[1]=0; | 261 | v[0] = v[1] = 0; |
265 | 262 | ||
266 | if (!ssl3_setup_buffers(s)) goto err; | 263 | if (!ssl3_setup_buffers(s)) |
264 | goto err; | ||
267 | 265 | ||
268 | n=ssl23_read_bytes(s, sizeof buf_space); | 266 | n = ssl23_read_bytes(s, sizeof buf_space); |
269 | if (n != sizeof buf_space) return(n); /* n == -1 || n == 0 */ | 267 | if (n != sizeof buf_space) |
268 | return(n); /* n == -1 || n == 0 */ | ||
270 | 269 | ||
271 | p=s->packet; | 270 | p = s->packet; |
272 | 271 | ||
273 | memcpy(buf,p,n); | 272 | memcpy(buf, p, n); |
274 | 273 | ||
275 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO)) | 274 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO)) { |
276 | { | ||
277 | /* | 275 | /* |
278 | * SSLv2 header | 276 | * SSLv2 header |
279 | */ | 277 | */ |
280 | if ((p[3] == 0x00) && (p[4] == 0x02)) | 278 | if ((p[3] == 0x00) && (p[4] == 0x02)) { |
281 | { | 279 | v[0] = p[3]; |
282 | v[0]=p[3]; v[1]=p[4]; | 280 | v[1] = p[4]; |
283 | /* SSLv2 */ | 281 | /* SSLv2 */ |
284 | if (!(s->options & SSL_OP_NO_SSLv2)) | 282 | if (!(s->options & SSL_OP_NO_SSLv2)) |
285 | type=1; | 283 | type = 1; |
286 | } | 284 | } else if (p[3] == SSL3_VERSION_MAJOR) { |
287 | else if (p[3] == SSL3_VERSION_MAJOR) | 285 | v[0] = p[3]; |
288 | { | 286 | v[1] = p[4]; |
289 | v[0]=p[3]; v[1]=p[4]; | ||
290 | /* SSLv3/TLSv1 */ | 287 | /* SSLv3/TLSv1 */ |
291 | if (p[4] >= TLS1_VERSION_MINOR) | 288 | if (p[4] >= TLS1_VERSION_MINOR) { |
292 | { | ||
293 | if (p[4] >= TLS1_2_VERSION_MINOR && | 289 | if (p[4] >= TLS1_2_VERSION_MINOR && |
294 | !(s->options & SSL_OP_NO_TLSv1_2)) | 290 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
295 | { | 291 | s->version = TLS1_2_VERSION; |
296 | s->version=TLS1_2_VERSION; | 292 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
297 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 293 | } else if (p[4] >= TLS1_1_VERSION_MINOR && |
298 | } | 294 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
299 | else if (p[4] >= TLS1_1_VERSION_MINOR && | 295 | s->version = TLS1_1_VERSION; |
300 | !(s->options & SSL_OP_NO_TLSv1_1)) | ||
301 | { | ||
302 | s->version=TLS1_1_VERSION; | ||
303 | /* type=2; */ /* done later to survive restarts */ | 296 | /* type=2; */ /* done later to survive restarts */ |
304 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 297 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
305 | } | 298 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
306 | else if (!(s->options & SSL_OP_NO_TLSv1)) | 299 | s->version = TLS1_VERSION; |
307 | { | ||
308 | s->version=TLS1_VERSION; | ||
309 | /* type=2; */ /* done later to survive restarts */ | 300 | /* type=2; */ /* done later to survive restarts */ |
310 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 301 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
311 | } | 302 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
312 | else if (!(s->options & SSL_OP_NO_SSLv3)) | 303 | s->version = SSL3_VERSION; |
313 | { | ||
314 | s->version=SSL3_VERSION; | ||
315 | /* type=2; */ | 304 | /* type=2; */ |
316 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 305 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
317 | } | 306 | } else if (!(s->options & SSL_OP_NO_SSLv2)) { |
318 | else if (!(s->options & SSL_OP_NO_SSLv2)) | 307 | type = 1; |
319 | { | ||
320 | type=1; | ||
321 | } | ||
322 | } | 308 | } |
323 | else if (!(s->options & SSL_OP_NO_SSLv3)) | 309 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
324 | { | 310 | s->version = SSL3_VERSION; |
325 | s->version=SSL3_VERSION; | ||
326 | /* type=2; */ | 311 | /* type=2; */ |
327 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 312 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
328 | } | 313 | } else if (!(s->options & SSL_OP_NO_SSLv2)) |
329 | else if (!(s->options & SSL_OP_NO_SSLv2)) | 314 | type = 1; |
330 | type=1; | ||
331 | 315 | ||
332 | } | ||
333 | } | 316 | } |
334 | else if ((p[0] == SSL3_RT_HANDSHAKE) && | 317 | } else if ((p[0] == SSL3_RT_HANDSHAKE) && |
335 | (p[1] == SSL3_VERSION_MAJOR) && | 318 | (p[1] == SSL3_VERSION_MAJOR) && |
336 | (p[5] == SSL3_MT_CLIENT_HELLO) && | 319 | (p[5] == SSL3_MT_CLIENT_HELLO) && |
337 | ((p[3] == 0 && p[4] < 5 /* silly record length? */) | 320 | ((p[3] == 0 && p[4] < 5 /* silly record length? */) |
338 | || (p[9] >= p[1]))) | 321 | || (p[9] >= p[1]))) { |
339 | { | ||
340 | /* | 322 | /* |
341 | * SSLv3 or tls1 header | 323 | * SSLv3 or tls1 header |
342 | */ | 324 | */ |
343 | 325 | ||
344 | v[0]=p[1]; /* major version (= SSL3_VERSION_MAJOR) */ | 326 | v[0] = p[1]; /* major version (= SSL3_VERSION_MAJOR) */ |
345 | /* We must look at client_version inside the Client Hello message | 327 | /* We must look at client_version inside the Client Hello message |
346 | * to get the correct minor version. | 328 | * to get the correct minor version. |
347 | * However if we have only a pathologically small fragment of the | 329 | * However if we have only a pathologically small fragment of the |
@@ -350,127 +332,108 @@ int ssl23_get_client_hello(SSL *s) | |||
350 | * No known SSL 3.0 client fragments ClientHello like this, | 332 | * No known SSL 3.0 client fragments ClientHello like this, |
351 | * so we simply assume TLS 1.0 to avoid protocol version downgrade | 333 | * so we simply assume TLS 1.0 to avoid protocol version downgrade |
352 | * attacks. */ | 334 | * attacks. */ |
353 | if (p[3] == 0 && p[4] < 6) | 335 | if (p[3] == 0 && p[4] < 6) { |
354 | { | ||
355 | #if 0 | 336 | #if 0 |
356 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_SMALL); | 337 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_TOO_SMALL); |
357 | goto err; | 338 | goto err; |
358 | #else | 339 | #else |
359 | v[1] = TLS1_VERSION_MINOR; | 340 | v[1] = TLS1_VERSION_MINOR; |
360 | #endif | 341 | #endif |
361 | } | 342 | } |
362 | /* if major version number > 3 set minor to a value | 343 | /* if major version number > 3 set minor to a value |
363 | * which will use the highest version 3 we support. | 344 | * which will use the highest version 3 we support. |
364 | * If TLS 2.0 ever appears we will need to revise | 345 | * If TLS 2.0 ever appears we will need to revise |
365 | * this.... | 346 | * this.... |
366 | */ | 347 | */ |
367 | else if (p[9] > SSL3_VERSION_MAJOR) | 348 | else if (p[9] > SSL3_VERSION_MAJOR) |
368 | v[1]=0xff; | 349 | v[1] = 0xff; |
369 | else | 350 | else |
370 | v[1]=p[10]; /* minor version according to client_version */ | 351 | v[1] = p[10]; /* minor version according to client_version */ |
371 | if (v[1] >= TLS1_VERSION_MINOR) | 352 | if (v[1] >= TLS1_VERSION_MINOR) { |
372 | { | ||
373 | if (v[1] >= TLS1_2_VERSION_MINOR && | 353 | if (v[1] >= TLS1_2_VERSION_MINOR && |
374 | !(s->options & SSL_OP_NO_TLSv1_2)) | 354 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
375 | { | 355 | s->version = TLS1_2_VERSION; |
376 | s->version=TLS1_2_VERSION; | 356 | type = 3; |
377 | type=3; | 357 | } else if (v[1] >= TLS1_1_VERSION_MINOR && |
378 | } | 358 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
379 | else if (v[1] >= TLS1_1_VERSION_MINOR && | 359 | s->version = TLS1_1_VERSION; |
380 | !(s->options & SSL_OP_NO_TLSv1_1)) | 360 | type = 3; |
381 | { | 361 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
382 | s->version=TLS1_1_VERSION; | 362 | s->version = TLS1_VERSION; |
383 | type=3; | 363 | type = 3; |
384 | } | 364 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
385 | else if (!(s->options & SSL_OP_NO_TLSv1)) | 365 | s->version = SSL3_VERSION; |
386 | { | 366 | type = 3; |
387 | s->version=TLS1_VERSION; | ||
388 | type=3; | ||
389 | } | ||
390 | else if (!(s->options & SSL_OP_NO_SSLv3)) | ||
391 | { | ||
392 | s->version=SSL3_VERSION; | ||
393 | type=3; | ||
394 | } | ||
395 | } | 367 | } |
396 | else | 368 | } else { |
397 | { | ||
398 | /* client requests SSL 3.0 */ | 369 | /* client requests SSL 3.0 */ |
399 | if (!(s->options & SSL_OP_NO_SSLv3)) | 370 | if (!(s->options & SSL_OP_NO_SSLv3)) { |
400 | { | 371 | s->version = SSL3_VERSION; |
401 | s->version=SSL3_VERSION; | 372 | type = 3; |
402 | type=3; | 373 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
403 | } | ||
404 | else if (!(s->options & SSL_OP_NO_TLSv1)) | ||
405 | { | ||
406 | /* we won't be able to use TLS of course, | 374 | /* we won't be able to use TLS of course, |
407 | * but this will send an appropriate alert */ | 375 | * but this will send an appropriate alert */ |
408 | s->version=TLS1_VERSION; | 376 | s->version = TLS1_VERSION; |
409 | type=3; | 377 | type = 3; |
410 | } | ||
411 | } | 378 | } |
412 | } | 379 | } |
413 | else if ((strncmp("GET ", (char *)p,4) == 0) || | 380 | } |
414 | (strncmp("POST ",(char *)p,5) == 0) || | 381 | else if ((strncmp("GET ", (char *)p, 4) == 0) || |
415 | (strncmp("HEAD ",(char *)p,5) == 0) || | 382 | (strncmp("POST ",(char *)p, 5) == 0) || |
416 | (strncmp("PUT ", (char *)p,4) == 0)) | 383 | (strncmp("HEAD ",(char *)p, 5) == 0) || |
417 | { | 384 | (strncmp("PUT ", (char *)p, 4) == 0)) { |
418 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST); | 385 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_HTTP_REQUEST); |
419 | goto err; | 386 | goto err; |
420 | } | 387 | } else if (strncmp("CONNECT", (char *)p, 7) == 0) { |
421 | else if (strncmp("CONNECT",(char *)p,7) == 0) | 388 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_HTTPS_PROXY_REQUEST); |
422 | { | ||
423 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST); | ||
424 | goto err; | 389 | goto err; |
425 | } | ||
426 | } | 390 | } |
391 | } | ||
427 | 392 | ||
428 | #ifdef OPENSSL_FIPS | 393 | #ifdef OPENSSL_FIPS |
429 | if (FIPS_mode() && (s->version < TLS1_VERSION)) | 394 | if (FIPS_mode() && (s->version < TLS1_VERSION)) { |
430 | { | ||
431 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, | 395 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, |
432 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | 396 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); |
433 | goto err; | 397 | goto err; |
434 | } | 398 | } |
435 | #endif | 399 | #endif |
436 | 400 | ||
437 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) | 401 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) { |
438 | { | ||
439 | /* we have SSLv3/TLSv1 in an SSLv2 header | 402 | /* we have SSLv3/TLSv1 in an SSLv2 header |
440 | * (other cases skip this state) */ | 403 | * (other cases skip this state) */ |
441 | 404 | ||
442 | type=2; | 405 | type = 2; |
443 | p=s->packet; | 406 | p = s->packet; |
444 | v[0] = p[3]; /* == SSL3_VERSION_MAJOR */ | 407 | v[0] = p[3]; /* == SSL3_VERSION_MAJOR */ |
445 | v[1] = p[4]; | 408 | v[1] = p[4]; |
446 | 409 | ||
447 | n=((p[0]&0x7f)<<8)|p[1]; | 410 | n = ((p[0] & 0x7f) << 8) | p[1]; |
448 | if (n > (1024*4)) | 411 | if (n > (1024 * 4)) { |
449 | { | 412 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_TOO_LARGE); |
450 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_LARGE); | ||
451 | goto err; | 413 | goto err; |
452 | } | 414 | } |
453 | 415 | ||
454 | j=ssl23_read_bytes(s,n+2); | 416 | j = ssl23_read_bytes(s, n + 2); |
455 | if (j <= 0) return(j); | 417 | if (j <= 0) |
418 | return (j); | ||
456 | 419 | ||
457 | ssl3_finish_mac(s, s->packet+2, s->packet_length-2); | 420 | ssl3_finish_mac(s, s->packet + 2, s->packet_length - 2); |
458 | if (s->msg_callback) | 421 | if (s->msg_callback) |
459 | s->msg_callback(0, SSL2_VERSION, 0, s->packet+2, s->packet_length-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ | 422 | s->msg_callback(0, SSL2_VERSION, 0, s->packet + 2, s->packet_length-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ |
460 | 423 | ||
461 | p=s->packet; | 424 | p = s->packet; |
462 | p+=5; | 425 | p += 5; |
463 | n2s(p,csl); | 426 | n2s(p, csl); |
464 | n2s(p,sil); | 427 | n2s(p, sil); |
465 | n2s(p,cl); | 428 | n2s(p, cl); |
466 | d=(unsigned char *)s->init_buf->data; | 429 | d = (unsigned char *)s->init_buf->data; |
467 | if ((csl+sil+cl+11) != s->packet_length) /* We can't have TLS extensions in SSL 2.0 format | 430 | if ((csl + sil + cl + 11) != s->packet_length) /* We can't have TLS extensions in SSL 2.0 format |
468 | * Client Hello, can we? Error condition should be | 431 | * Client Hello, can we ? Error condition should be |
469 | * '>' otherweise */ | 432 | * '>' otherweise */ |
470 | { | 433 | { |
471 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_LENGTH_MISMATCH); | 434 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_LENGTH_MISMATCH); |
472 | goto err; | 435 | goto err; |
473 | } | 436 | } |
474 | 437 | ||
475 | /* record header: msg_type ... */ | 438 | /* record header: msg_type ... */ |
476 | *(d++) = SSL3_MT_CLIENT_HELLO; | 439 | *(d++) = SSL3_MT_CLIENT_HELLO; |
@@ -484,130 +447,122 @@ int ssl23_get_client_hello(SSL *s) | |||
484 | 447 | ||
485 | /* lets populate the random area */ | 448 | /* lets populate the random area */ |
486 | /* get the challenge_length */ | 449 | /* get the challenge_length */ |
487 | i=(cl > SSL3_RANDOM_SIZE)?SSL3_RANDOM_SIZE:cl; | 450 | i = (cl > SSL3_RANDOM_SIZE) ? SSL3_RANDOM_SIZE : cl; |
488 | memset(d,0,SSL3_RANDOM_SIZE); | 451 | memset(d, 0, SSL3_RANDOM_SIZE); |
489 | memcpy(&(d[SSL3_RANDOM_SIZE-i]),&(p[csl+sil]),i); | 452 | memcpy(&(d[SSL3_RANDOM_SIZE - i]), &(p[csl + sil]), i); |
490 | d+=SSL3_RANDOM_SIZE; | 453 | d += SSL3_RANDOM_SIZE; |
491 | 454 | ||
492 | /* no session-id reuse */ | 455 | /* no session-id reuse */ |
493 | *(d++)=0; | 456 | *(d++) = 0; |
494 | 457 | ||
495 | /* ciphers */ | 458 | /* ciphers */ |
496 | j=0; | 459 | j = 0; |
497 | dd=d; | 460 | dd = d; |
498 | d+=2; | 461 | d += 2; |
499 | for (i=0; i<csl; i+=3) | 462 | for (i = 0; i < csl; i += 3) { |
500 | { | 463 | if (p[i] != 0) |
501 | if (p[i] != 0) continue; | 464 | continue; |
502 | *(d++)=p[i+1]; | 465 | *(d++) = p[i + 1]; |
503 | *(d++)=p[i+2]; | 466 | *(d++) = p[i + 2]; |
504 | j+=2; | 467 | j += 2; |
505 | } | 468 | } |
506 | s2n(j,dd); | 469 | s2n(j, dd); |
507 | 470 | ||
508 | /* COMPRESSION */ | 471 | /* COMPRESSION */ |
509 | *(d++)=1; | 472 | *(d++) = 1; |
510 | *(d++)=0; | 473 | *(d++) = 0; |
511 | 474 | ||
512 | #if 0 | 475 | #if 0 |
513 | /* copy any remaining data with may be extensions */ | 476 | /* copy any remaining data with may be extensions */ |
514 | p = p+csl+sil+cl; | 477 | p = p + csl + sil + cl; |
515 | while (p < s->packet+s->packet_length) | 478 | while (p < s->packet + s->packet_length) { |
516 | { | ||
517 | *(d++)=*(p++); | 479 | *(d++)=*(p++); |
518 | } | 480 | } |
519 | #endif | 481 | #endif |
520 | 482 | ||
521 | i = (d-(unsigned char *)s->init_buf->data) - 4; | 483 | i = (d - (unsigned char *)s->init_buf->data) - 4; |
522 | l2n3((long)i, d_len); | 484 | l2n3((long)i, d_len); |
523 | 485 | ||
524 | /* get the data reused from the init_buf */ | 486 | /* get the data reused from the init_buf */ |
525 | s->s3->tmp.reuse_message=1; | 487 | s->s3->tmp.reuse_message = 1; |
526 | s->s3->tmp.message_type=SSL3_MT_CLIENT_HELLO; | 488 | s->s3->tmp.message_type = SSL3_MT_CLIENT_HELLO; |
527 | s->s3->tmp.message_size=i; | 489 | s->s3->tmp.message_size = i; |
528 | } | 490 | } |
529 | 491 | ||
530 | /* imaginary new state (for program structure): */ | 492 | /* imaginary new state (for program structure): */ |
531 | /* s->state = SSL23_SR_CLNT_HELLO_C */ | 493 | /* s->state = SSL23_SR_CLNT_HELLO_C */ |
532 | 494 | ||
533 | if (type == 1) | 495 | if (type == 1) { |
534 | { | ||
535 | #ifdef OPENSSL_NO_SSL2 | 496 | #ifdef OPENSSL_NO_SSL2 |
536 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 497 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); |
537 | goto err; | 498 | goto err; |
538 | #else | 499 | #else |
539 | /* we are talking sslv2 */ | 500 | /* we are talking sslv2 */ |
540 | /* we need to clean up the SSLv3/TLSv1 setup and put in the | 501 | /* we need to clean up the SSLv3/TLSv1 setup and put in the |
541 | * sslv2 stuff. */ | 502 | * sslv2 stuff. */ |
542 | 503 | ||
543 | if (s->s2 == NULL) | 504 | if (s->s2 == NULL) { |
544 | { | ||
545 | if (!ssl2_new(s)) | 505 | if (!ssl2_new(s)) |
546 | goto err; | 506 | goto err; |
547 | } | 507 | } else |
548 | else | ||
549 | ssl2_clear(s); | 508 | ssl2_clear(s); |
550 | 509 | ||
551 | if (s->s3 != NULL) ssl3_free(s); | 510 | if (s->s3 != NULL) |
511 | ssl3_free(s); | ||
552 | 512 | ||
553 | if (!BUF_MEM_grow_clean(s->init_buf, | 513 | if (!BUF_MEM_grow_clean(s->init_buf, |
554 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) | 514 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) { |
555 | { | ||
556 | goto err; | 515 | goto err; |
557 | } | 516 | } |
558 | 517 | ||
559 | s->state=SSL2_ST_GET_CLIENT_HELLO_A; | 518 | s->state = SSL2_ST_GET_CLIENT_HELLO_A; |
560 | if (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3) | 519 | if (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3) |
561 | s->s2->ssl2_rollback=0; | 520 | s->s2->ssl2_rollback = 0; |
562 | else | 521 | else |
563 | /* reject SSL 2.0 session if client supports SSL 3.0 or TLS 1.0 | 522 | /* reject SSL 2.0 session if client supports SSL 3.0 or TLS 1.0 |
564 | * (SSL 3.0 draft/RFC 2246, App. E.2) */ | 523 | * (SSL 3.0 draft/RFC 2246, App. E.2) */ |
565 | s->s2->ssl2_rollback=1; | 524 | s->s2->ssl2_rollback = 1; |
566 | 525 | ||
567 | /* setup the n bytes we have read so we get them from | 526 | /* setup the n bytes we have read so we get them from |
568 | * the sslv2 buffer */ | 527 | * the sslv2 buffer */ |
569 | s->rstate=SSL_ST_READ_HEADER; | 528 | s->rstate = SSL_ST_READ_HEADER; |
570 | s->packet_length=n; | 529 | s->packet_length = n; |
571 | s->packet= &(s->s2->rbuf[0]); | 530 | s->packet = &(s->s2->rbuf[0]); |
572 | memcpy(s->packet,buf,n); | 531 | memcpy(s->packet, buf, n); |
573 | s->s2->rbuf_left=n; | 532 | s->s2->rbuf_left = n; |
574 | s->s2->rbuf_offs=0; | 533 | s->s2->rbuf_offs = 0; |
575 | 534 | ||
576 | s->method=SSLv2_server_method(); | 535 | s->method = SSLv2_server_method(); |
577 | s->handshake_func=s->method->ssl_accept; | 536 | s->handshake_func = s->method->ssl_accept; |
578 | #endif | 537 | #endif |
579 | } | 538 | } |
580 | 539 | ||
581 | if ((type == 2) || (type == 3)) | 540 | if ((type == 2) || (type == 3)) { |
582 | { | ||
583 | /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */ | 541 | /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */ |
584 | 542 | ||
585 | if (!ssl_init_wbio_buffer(s,1)) goto err; | 543 | if (!ssl_init_wbio_buffer(s, 1)) goto err; |
586 | 544 | ||
587 | /* we are in this state */ | 545 | /* we are in this state */ |
588 | s->state=SSL3_ST_SR_CLNT_HELLO_A; | 546 | s->state = SSL3_ST_SR_CLNT_HELLO_A; |
589 | 547 | ||
590 | if (type == 3) | 548 | if (type == 3) { |
591 | { | ||
592 | /* put the 'n' bytes we have read into the input buffer | 549 | /* put the 'n' bytes we have read into the input buffer |
593 | * for SSLv3 */ | 550 | * for SSLv3 */ |
594 | s->rstate=SSL_ST_READ_HEADER; | 551 | s->rstate = SSL_ST_READ_HEADER; |
595 | s->packet_length=n; | 552 | s->packet_length = n; |
596 | if (s->s3->rbuf.buf == NULL) | 553 | if (s->s3->rbuf.buf == NULL) |
597 | if (!ssl3_setup_read_buffer(s)) | 554 | if (!ssl3_setup_read_buffer(s)) |
598 | goto err; | 555 | goto err; |
599 | 556 | ||
600 | s->packet= &(s->s3->rbuf.buf[0]); | 557 | s->packet = &(s->s3->rbuf.buf[0]); |
601 | memcpy(s->packet,buf,n); | 558 | memcpy(s->packet, buf, n); |
602 | s->s3->rbuf.left=n; | 559 | s->s3->rbuf.left = n; |
603 | s->s3->rbuf.offset=0; | 560 | s->s3->rbuf.offset = 0; |
604 | } | 561 | } else { |
605 | else | 562 | s->packet_length = 0; |
606 | { | 563 | s->s3->rbuf.left = 0; |
607 | s->packet_length=0; | 564 | s->s3->rbuf.offset = 0; |
608 | s->s3->rbuf.left=0; | 565 | } |
609 | s->s3->rbuf.offset=0; | ||
610 | } | ||
611 | if (s->version == TLS1_2_VERSION) | 566 | if (s->version == TLS1_2_VERSION) |
612 | s->method = TLSv1_2_server_method(); | 567 | s->method = TLSv1_2_server_method(); |
613 | else if (s->version == TLS1_1_VERSION) | 568 | else if (s->version == TLS1_1_VERSION) |
@@ -617,22 +572,23 @@ int ssl23_get_client_hello(SSL *s) | |||
617 | else | 572 | else |
618 | s->method = SSLv3_server_method(); | 573 | s->method = SSLv3_server_method(); |
619 | #if 0 /* ssl3_get_client_hello does this */ | 574 | #if 0 /* ssl3_get_client_hello does this */ |
620 | s->client_version=(v[0]<<8)|v[1]; | 575 | s->client_version = (v[0]<<8)|v[1]; |
621 | #endif | 576 | #endif |
622 | s->handshake_func=s->method->ssl_accept; | 577 | s->handshake_func = s->method->ssl_accept; |
623 | } | 578 | } |
624 | 579 | ||
625 | if ((type < 1) || (type > 3)) | 580 | if ((type < 1) || (type > 3)) { |
626 | { | ||
627 | /* bad, very bad */ | 581 | /* bad, very bad */ |
628 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNKNOWN_PROTOCOL); | 582 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL); |
629 | goto err; | 583 | goto err; |
630 | } | 584 | } |
631 | s->init_num=0; | 585 | s->init_num = 0; |
632 | 586 | ||
633 | if (buf != buf_space) OPENSSL_free(buf); | 587 | if (buf != buf_space) |
634 | return(SSL_accept(s)); | 588 | OPENSSL_free(buf); |
589 | return (SSL_accept(s)); | ||
635 | err: | 590 | err: |
636 | if (buf != buf_space) OPENSSL_free(buf); | 591 | if (buf != buf_space) |
637 | return(-1); | 592 | OPENSSL_free(buf); |
638 | } | 593 | return (-1); |
594 | } | ||
diff --git a/src/lib/libssl/src/ssl/s23_clnt.c b/src/lib/libssl/src/ssl/s23_clnt.c index 6315e9d876..0fd388a05a 100644 --- a/src/lib/libssl/src/ssl/s23_clnt.c +++ b/src/lib/libssl/src/ssl/s23_clnt.c | |||
@@ -119,160 +119,163 @@ | |||
119 | static const SSL_METHOD *ssl23_get_client_method(int ver); | 119 | static const SSL_METHOD *ssl23_get_client_method(int ver); |
120 | static int ssl23_client_hello(SSL *s); | 120 | static int ssl23_client_hello(SSL *s); |
121 | static int ssl23_get_server_hello(SSL *s); | 121 | static int ssl23_get_server_hello(SSL *s); |
122 | static const SSL_METHOD *ssl23_get_client_method(int ver) | 122 | static const SSL_METHOD |
123 | { | 123 | *ssl23_get_client_method(int ver) |
124 | { | ||
124 | #ifndef OPENSSL_NO_SSL2 | 125 | #ifndef OPENSSL_NO_SSL2 |
125 | if (ver == SSL2_VERSION) | 126 | if (ver == SSL2_VERSION) |
126 | return(SSLv2_client_method()); | 127 | return (SSLv2_client_method()); |
127 | #endif | 128 | #endif |
128 | if (ver == SSL3_VERSION) | 129 | if (ver == SSL3_VERSION) |
129 | return(SSLv3_client_method()); | 130 | return (SSLv3_client_method()); |
130 | else if (ver == TLS1_VERSION) | 131 | else if (ver == TLS1_VERSION) |
131 | return(TLSv1_client_method()); | 132 | return (TLSv1_client_method()); |
132 | else if (ver == TLS1_1_VERSION) | 133 | else if (ver == TLS1_1_VERSION) |
133 | return(TLSv1_1_client_method()); | 134 | return (TLSv1_1_client_method()); |
134 | else if (ver == TLS1_2_VERSION) | 135 | else if (ver == TLS1_2_VERSION) |
135 | return(TLSv1_2_client_method()); | 136 | return (TLSv1_2_client_method()); |
136 | else | 137 | else |
137 | return(NULL); | 138 | return (NULL); |
138 | } | 139 | } |
139 | 140 | ||
140 | IMPLEMENT_ssl23_meth_func(SSLv23_client_method, | 141 | IMPLEMENT_ssl23_meth_func(SSLv23_client_method, |
141 | ssl_undefined_function, | 142 | ssl_undefined_function, ssl23_connect, ssl23_get_client_method) |
142 | ssl23_connect, | 143 | |
143 | ssl23_get_client_method) | 144 | int |
144 | 145 | ssl23_connect(SSL *s) | |
145 | int ssl23_connect(SSL *s) | 146 | { |
146 | { | 147 | BUF_MEM *buf = NULL; |
147 | BUF_MEM *buf=NULL; | 148 | unsigned long Time = (unsigned long)time(NULL); |
148 | unsigned long Time=(unsigned long)time(NULL); | 149 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
149 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 150 | int ret = -1; |
150 | int ret= -1; | 151 | int new_state, state; |
151 | int new_state,state; | 152 | |
152 | 153 | RAND_add(&Time, sizeof(Time), 0); | |
153 | RAND_add(&Time,sizeof(Time),0); | ||
154 | ERR_clear_error(); | 154 | ERR_clear_error(); |
155 | errno = 0; | 155 | errno = 0; |
156 | 156 | ||
157 | if (s->info_callback != NULL) | 157 | if (s->info_callback != NULL) |
158 | cb=s->info_callback; | 158 | cb = s->info_callback; |
159 | else if (s->ctx->info_callback != NULL) | 159 | else if (s->ctx->info_callback != NULL) |
160 | cb=s->ctx->info_callback; | 160 | cb = s->ctx->info_callback; |
161 | 161 | ||
162 | s->in_handshake++; | 162 | s->in_handshake++; |
163 | if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); | 163 | if (!SSL_in_init(s) || SSL_in_before(s)) |
164 | SSL_clear(s); | ||
164 | 165 | ||
165 | for (;;) | 166 | for (;;) { |
166 | { | 167 | state = s->state; |
167 | state=s->state; | ||
168 | 168 | ||
169 | switch(s->state) | 169 | switch (s->state) { |
170 | { | ||
171 | case SSL_ST_BEFORE: | 170 | case SSL_ST_BEFORE: |
172 | case SSL_ST_CONNECT: | 171 | case SSL_ST_CONNECT: |
173 | case SSL_ST_BEFORE|SSL_ST_CONNECT: | 172 | case SSL_ST_BEFORE|SSL_ST_CONNECT: |
174 | case SSL_ST_OK|SSL_ST_CONNECT: | 173 | case SSL_ST_OK|SSL_ST_CONNECT: |
175 | 174 | ||
176 | if (s->session != NULL) | 175 | if (s->session != NULL) { |
177 | { | 176 | SSLerr(SSL_F_SSL23_CONNECT, SSL_R_SSL23_DOING_SESSION_ID_REUSE); |
178 | SSLerr(SSL_F_SSL23_CONNECT,SSL_R_SSL23_DOING_SESSION_ID_REUSE); | 177 | ret = -1; |
179 | ret= -1; | ||
180 | goto end; | 178 | goto end; |
181 | } | 179 | } |
182 | s->server=0; | 180 | s->server = 0; |
183 | if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); | 181 | if (cb != NULL) |
182 | cb(s, SSL_CB_HANDSHAKE_START, 1); | ||
184 | 183 | ||
185 | /* s->version=TLS1_VERSION; */ | 184 | /* s->version=TLS1_VERSION; */ |
186 | s->type=SSL_ST_CONNECT; | 185 | s->type = SSL_ST_CONNECT; |
187 | 186 | ||
188 | if (s->init_buf == NULL) | 187 | if (s->init_buf == NULL) { |
189 | { | 188 | if ((buf = BUF_MEM_new()) == NULL) { |
190 | if ((buf=BUF_MEM_new()) == NULL) | 189 | ret = -1; |
191 | { | ||
192 | ret= -1; | ||
193 | goto end; | 190 | goto end; |
194 | } | 191 | } |
195 | if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH)) | 192 | if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { |
196 | { | 193 | ret = -1; |
197 | ret= -1; | ||
198 | goto end; | 194 | goto end; |
199 | } | ||
200 | s->init_buf=buf; | ||
201 | buf=NULL; | ||
202 | } | 195 | } |
196 | s->init_buf = buf; | ||
197 | buf = NULL; | ||
198 | } | ||
203 | 199 | ||
204 | if (!ssl3_setup_buffers(s)) { ret= -1; goto end; } | 200 | if (!ssl3_setup_buffers(s)) { |
201 | ret = -1; | ||
202 | goto end; | ||
203 | } | ||
205 | 204 | ||
206 | ssl3_init_finished_mac(s); | 205 | ssl3_init_finished_mac(s); |
207 | 206 | ||
208 | s->state=SSL23_ST_CW_CLNT_HELLO_A; | 207 | s->state = SSL23_ST_CW_CLNT_HELLO_A; |
209 | s->ctx->stats.sess_connect++; | 208 | s->ctx->stats.sess_connect++; |
210 | s->init_num=0; | 209 | s->init_num = 0; |
211 | break; | 210 | break; |
212 | 211 | ||
213 | case SSL23_ST_CW_CLNT_HELLO_A: | 212 | case SSL23_ST_CW_CLNT_HELLO_A: |
214 | case SSL23_ST_CW_CLNT_HELLO_B: | 213 | case SSL23_ST_CW_CLNT_HELLO_B: |
215 | 214 | ||
216 | s->shutdown=0; | 215 | s->shutdown = 0; |
217 | ret=ssl23_client_hello(s); | 216 | ret = ssl23_client_hello(s); |
218 | if (ret <= 0) goto end; | 217 | if (ret <= 0) |
219 | s->state=SSL23_ST_CR_SRVR_HELLO_A; | 218 | goto end; |
220 | s->init_num=0; | 219 | s->state = SSL23_ST_CR_SRVR_HELLO_A; |
220 | s->init_num = 0; | ||
221 | 221 | ||
222 | break; | 222 | break; |
223 | 223 | ||
224 | case SSL23_ST_CR_SRVR_HELLO_A: | 224 | case SSL23_ST_CR_SRVR_HELLO_A: |
225 | case SSL23_ST_CR_SRVR_HELLO_B: | 225 | case SSL23_ST_CR_SRVR_HELLO_B: |
226 | ret=ssl23_get_server_hello(s); | 226 | ret = ssl23_get_server_hello(s); |
227 | if (ret >= 0) cb=NULL; | 227 | if (ret >= 0) |
228 | cb = NULL; | ||
228 | goto end; | 229 | goto end; |
229 | /* break; */ | 230 | /* break; */ |
230 | 231 | ||
231 | default: | 232 | default: |
232 | SSLerr(SSL_F_SSL23_CONNECT,SSL_R_UNKNOWN_STATE); | 233 | SSLerr(SSL_F_SSL23_CONNECT, SSL_R_UNKNOWN_STATE); |
233 | ret= -1; | 234 | ret = -1; |
234 | goto end; | 235 | goto end; |
235 | /* break; */ | 236 | /* break; */ |
236 | } | 237 | } |
237 | 238 | ||
238 | if (s->debug) { (void)BIO_flush(s->wbio); } | 239 | if (s->debug) { |
240 | (void)BIO_flush(s->wbio); | ||
241 | } | ||
239 | 242 | ||
240 | if ((cb != NULL) && (s->state != state)) | 243 | if ((cb != NULL) && (s->state != state)) { |
241 | { | 244 | new_state = s->state; |
242 | new_state=s->state; | 245 | s->state = state; |
243 | s->state=state; | 246 | cb(s, SSL_CB_CONNECT_LOOP, 1); |
244 | cb(s,SSL_CB_CONNECT_LOOP,1); | 247 | s->state = new_state; |
245 | s->state=new_state; | ||
246 | } | ||
247 | } | 248 | } |
249 | } | ||
248 | end: | 250 | end: |
249 | s->in_handshake--; | 251 | s->in_handshake--; |
250 | if (buf != NULL) | 252 | if (buf != NULL) |
251 | BUF_MEM_free(buf); | 253 | BUF_MEM_free(buf); |
252 | if (cb != NULL) | 254 | if (cb != NULL) |
253 | cb(s,SSL_CB_CONNECT_EXIT,ret); | 255 | cb(s, SSL_CB_CONNECT_EXIT, ret); |
254 | return(ret); | 256 | return (ret); |
255 | } | 257 | } |
256 | 258 | ||
257 | static int ssl23_no_ssl2_ciphers(SSL *s) | 259 | static int |
258 | { | 260 | ssl23_no_ssl2_ciphers(SSL *s) |
261 | { | ||
259 | SSL_CIPHER *cipher; | 262 | SSL_CIPHER *cipher; |
260 | STACK_OF(SSL_CIPHER) *ciphers; | 263 | STACK_OF(SSL_CIPHER) *ciphers; |
261 | int i; | 264 | int i; |
262 | ciphers = SSL_get_ciphers(s); | 265 | ciphers = SSL_get_ciphers(s); |
263 | for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) | 266 | for (i = 0; i < sk_SSL_CIPHER_num(ciphers); i++) { |
264 | { | ||
265 | cipher = sk_SSL_CIPHER_value(ciphers, i); | 267 | cipher = sk_SSL_CIPHER_value(ciphers, i); |
266 | if (cipher->algorithm_ssl == SSL_SSLV2) | 268 | if (cipher->algorithm_ssl == SSL_SSLV2) |
267 | return 0; | 269 | return 0; |
268 | } | ||
269 | return 1; | ||
270 | } | 270 | } |
271 | return 1; | ||
272 | } | ||
271 | 273 | ||
272 | /* Fill a ClientRandom or ServerRandom field of length len. Returns <= 0 | 274 | /* Fill a ClientRandom or ServerRandom field of length len. Returns <= 0 |
273 | * on failure, 1 on success. */ | 275 | * on failure, 1 on success. */ |
274 | int ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len) | 276 | int |
275 | { | 277 | ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len) |
278 | { | ||
276 | int send_time = 0; | 279 | int send_time = 0; |
277 | 280 | ||
278 | if (len < 4) | 281 | if (len < 4) |
@@ -281,22 +284,21 @@ int ssl_fill_hello_random(SSL *s, int server, unsigned char *result, int len) | |||
281 | send_time = (s->mode & SSL_MODE_SEND_SERVERHELLO_TIME) != 0; | 284 | send_time = (s->mode & SSL_MODE_SEND_SERVERHELLO_TIME) != 0; |
282 | else | 285 | else |
283 | send_time = (s->mode & SSL_MODE_SEND_CLIENTHELLO_TIME) != 0; | 286 | send_time = (s->mode & SSL_MODE_SEND_CLIENTHELLO_TIME) != 0; |
284 | if (send_time) | 287 | if (send_time) { |
285 | { | ||
286 | unsigned long Time = (unsigned long)time(NULL); | 288 | unsigned long Time = (unsigned long)time(NULL); |
287 | unsigned char *p = result; | 289 | unsigned char *p = result; |
288 | l2n(Time, p); | 290 | l2n(Time, p); |
289 | return RAND_pseudo_bytes(p, len-4); | 291 | return RAND_pseudo_bytes(p, len - 4); |
290 | } | 292 | } else |
291 | else | ||
292 | return RAND_pseudo_bytes(result, len); | 293 | return RAND_pseudo_bytes(result, len); |
293 | } | 294 | } |
294 | 295 | ||
295 | static int ssl23_client_hello(SSL *s) | 296 | static int |
296 | { | 297 | ssl23_client_hello(SSL *s) |
298 | { | ||
297 | unsigned char *buf; | 299 | unsigned char *buf; |
298 | unsigned char *p,*d; | 300 | unsigned char *p, *d; |
299 | int i,ch_len; | 301 | int i, ch_len; |
300 | unsigned long l; | 302 | unsigned long l; |
301 | int ssl2_compat; | 303 | int ssl2_compat; |
302 | int version = 0, version_major, version_minor; | 304 | int version = 0, version_major, version_minor; |
@@ -320,14 +322,14 @@ static int ssl23_client_hello(SSL *s) | |||
320 | * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the | 322 | * TLS1>=1, it would be insufficient to pass SSL_NO_TLSv1, the |
321 | * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. | 323 | * answer is SSL_OP_NO_TLSv1|SSL_OP_NO_SSLv3|SSL_OP_NO_SSLv2. |
322 | */ | 324 | */ |
323 | mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 | 325 | mask = SSL_OP_NO_TLSv1_1|SSL_OP_NO_TLSv1 |
324 | #if !defined(OPENSSL_NO_SSL3) | 326 | #if !defined(OPENSSL_NO_SSL3) |
325 | |SSL_OP_NO_SSLv3 | 327 | |SSL_OP_NO_SSLv3 |
326 | #endif | 328 | #endif |
327 | #if !defined(OPENSSL_NO_SSL2) | 329 | #if !defined(OPENSSL_NO_SSL2) |
328 | |(ssl2_compat?SSL_OP_NO_SSLv2:0) | 330 | |(ssl2_compat ? SSL_OP_NO_SSLv2 : 0) |
329 | #endif | 331 | #endif |
330 | ; | 332 | ; |
331 | #if !defined(OPENSSL_NO_TLS1_2_CLIENT) | 333 | #if !defined(OPENSSL_NO_TLS1_2_CLIENT) |
332 | version = TLS1_2_VERSION; | 334 | version = TLS1_2_VERSION; |
333 | 335 | ||
@@ -351,8 +353,7 @@ static int ssl23_client_hello(SSL *s) | |||
351 | #endif | 353 | #endif |
352 | 354 | ||
353 | #ifndef OPENSSL_NO_TLSEXT | 355 | #ifndef OPENSSL_NO_TLSEXT |
354 | if (version != SSL2_VERSION) | 356 | if (version != SSL2_VERSION) { |
355 | { | ||
356 | /* have to disable SSL 2.0 compatibility if we need TLS extensions */ | 357 | /* have to disable SSL 2.0 compatibility if we need TLS extensions */ |
357 | 358 | ||
358 | if (s->tlsext_hostname != NULL) | 359 | if (s->tlsext_hostname != NULL) |
@@ -363,67 +364,53 @@ static int ssl23_client_hello(SSL *s) | |||
363 | if (s->ctx->tlsext_opaque_prf_input_callback != 0 || s->tlsext_opaque_prf_input != NULL) | 364 | if (s->ctx->tlsext_opaque_prf_input_callback != 0 || s->tlsext_opaque_prf_input != NULL) |
364 | ssl2_compat = 0; | 365 | ssl2_compat = 0; |
365 | #endif | 366 | #endif |
366 | } | 367 | } |
367 | #endif | 368 | #endif |
368 | 369 | ||
369 | buf=(unsigned char *)s->init_buf->data; | 370 | buf = (unsigned char *)s->init_buf->data; |
370 | if (s->state == SSL23_ST_CW_CLNT_HELLO_A) | 371 | if (s->state == SSL23_ST_CW_CLNT_HELLO_A) { |
371 | { | ||
372 | #if 0 | 372 | #if 0 |
373 | /* don't reuse session-id's */ | 373 | /* don't reuse session-id's */ |
374 | if (!ssl_get_new_session(s,0)) | 374 | if (!ssl_get_new_session(s, 0)) { |
375 | { | 375 | return (-1); |
376 | return(-1); | 376 | } |
377 | } | ||
378 | #endif | 377 | #endif |
379 | 378 | ||
380 | p=s->s3->client_random; | 379 | p = s->s3->client_random; |
381 | if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0) | 380 | if (ssl_fill_hello_random(s, 0, p, SSL3_RANDOM_SIZE) <= 0) |
382 | return -1; | 381 | return -1; |
383 | 382 | ||
384 | if (version == TLS1_2_VERSION) | 383 | if (version == TLS1_2_VERSION) { |
385 | { | ||
386 | version_major = TLS1_2_VERSION_MAJOR; | 384 | version_major = TLS1_2_VERSION_MAJOR; |
387 | version_minor = TLS1_2_VERSION_MINOR; | 385 | version_minor = TLS1_2_VERSION_MINOR; |
388 | } | 386 | } else if (version == TLS1_1_VERSION) { |
389 | else if (version == TLS1_1_VERSION) | ||
390 | { | ||
391 | version_major = TLS1_1_VERSION_MAJOR; | 387 | version_major = TLS1_1_VERSION_MAJOR; |
392 | version_minor = TLS1_1_VERSION_MINOR; | 388 | version_minor = TLS1_1_VERSION_MINOR; |
393 | } | 389 | } else if (version == TLS1_VERSION) { |
394 | else if (version == TLS1_VERSION) | ||
395 | { | ||
396 | version_major = TLS1_VERSION_MAJOR; | 390 | version_major = TLS1_VERSION_MAJOR; |
397 | version_minor = TLS1_VERSION_MINOR; | 391 | version_minor = TLS1_VERSION_MINOR; |
398 | } | 392 | } |
399 | #ifdef OPENSSL_FIPS | 393 | #ifdef OPENSSL_FIPS |
400 | else if(FIPS_mode()) | 394 | else if (FIPS_mode()) { |
401 | { | ||
402 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, | 395 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, |
403 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | 396 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); |
404 | return -1; | 397 | return -1; |
405 | } | 398 | } |
406 | #endif | 399 | #endif |
407 | else if (version == SSL3_VERSION) | 400 | else if (version == SSL3_VERSION) { |
408 | { | ||
409 | version_major = SSL3_VERSION_MAJOR; | 401 | version_major = SSL3_VERSION_MAJOR; |
410 | version_minor = SSL3_VERSION_MINOR; | 402 | version_minor = SSL3_VERSION_MINOR; |
411 | } | 403 | } else if (version == SSL2_VERSION) { |
412 | else if (version == SSL2_VERSION) | ||
413 | { | ||
414 | version_major = SSL2_VERSION_MAJOR; | 404 | version_major = SSL2_VERSION_MAJOR; |
415 | version_minor = SSL2_VERSION_MINOR; | 405 | version_minor = SSL2_VERSION_MINOR; |
416 | } | 406 | } else { |
417 | else | 407 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_PROTOCOLS_AVAILABLE); |
418 | { | 408 | return (-1); |
419 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_PROTOCOLS_AVAILABLE); | 409 | } |
420 | return(-1); | ||
421 | } | ||
422 | 410 | ||
423 | s->client_version = version; | 411 | s->client_version = version; |
424 | 412 | ||
425 | if (ssl2_compat) | 413 | if (ssl2_compat) { |
426 | { | ||
427 | /* create SSL 2.0 compatible Client Hello */ | 414 | /* create SSL 2.0 compatible Client Hello */ |
428 | 415 | ||
429 | /* two byte record header will be written last */ | 416 | /* two byte record header will be written last */ |
@@ -433,28 +420,27 @@ static int ssl23_client_hello(SSL *s) | |||
433 | *(d++) = SSL2_MT_CLIENT_HELLO; | 420 | *(d++) = SSL2_MT_CLIENT_HELLO; |
434 | *(d++) = version_major; | 421 | *(d++) = version_major; |
435 | *(d++) = version_minor; | 422 | *(d++) = version_minor; |
436 | 423 | ||
437 | /* Ciphers supported */ | 424 | /* Ciphers supported */ |
438 | i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),p,0); | 425 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), p, 0); |
439 | if (i == 0) | 426 | if (i == 0) { |
440 | { | ||
441 | /* no ciphers */ | 427 | /* no ciphers */ |
442 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); | 428 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE); |
443 | return -1; | 429 | return -1; |
444 | } | 430 | } |
445 | s2n(i,d); | 431 | s2n(i, d); |
446 | p+=i; | 432 | p += i; |
447 | 433 | ||
448 | /* put in the session-id length (zero since there is no reuse) */ | 434 | /* put in the session-id length (zero since there is no reuse) */ |
449 | #if 0 | 435 | #if 0 |
450 | s->session->session_id_length=0; | 436 | s->session->session_id_length = 0; |
451 | #endif | 437 | #endif |
452 | s2n(0,d); | 438 | s2n(0, d); |
453 | 439 | ||
454 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) | 440 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) |
455 | ch_len=SSL2_CHALLENGE_LENGTH; | 441 | ch_len = SSL2_CHALLENGE_LENGTH; |
456 | else | 442 | else |
457 | ch_len=SSL2_MAX_CHALLENGE_LENGTH; | 443 | ch_len = SSL2_MAX_CHALLENGE_LENGTH; |
458 | 444 | ||
459 | /* write out sslv2 challenge */ | 445 | /* write out sslv2 challenge */ |
460 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), | 446 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), |
@@ -462,34 +448,32 @@ static int ssl23_client_hello(SSL *s) | |||
462 | or SSL2_MAX_CHALLENGE_LENGTH (16), but leave the | 448 | or SSL2_MAX_CHALLENGE_LENGTH (16), but leave the |
463 | check in for futurproofing */ | 449 | check in for futurproofing */ |
464 | if (SSL3_RANDOM_SIZE < ch_len) | 450 | if (SSL3_RANDOM_SIZE < ch_len) |
465 | i=SSL3_RANDOM_SIZE; | 451 | i = SSL3_RANDOM_SIZE; |
466 | else | 452 | else |
467 | i=ch_len; | 453 | i = ch_len; |
468 | s2n(i,d); | 454 | s2n(i, d); |
469 | memset(&(s->s3->client_random[0]),0,SSL3_RANDOM_SIZE); | 455 | memset(&(s->s3->client_random[0]), 0, SSL3_RANDOM_SIZE); |
470 | if (RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i) <= 0) | 456 | if (RAND_pseudo_bytes(&(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i) <= 0) |
471 | return -1; | 457 | return -1; |
472 | 458 | ||
473 | memcpy(p,&(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i); | 459 | memcpy(p, &(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i); |
474 | p+=i; | 460 | p += i; |
475 | 461 | ||
476 | i= p- &(buf[2]); | 462 | i = p- &(buf[2]); |
477 | buf[0]=((i>>8)&0xff)|0x80; | 463 | buf[0] = ((i >> 8)&0xff)|0x80; |
478 | buf[1]=(i&0xff); | 464 | buf[1] = (i&0xff); |
479 | 465 | ||
480 | /* number of bytes to write */ | 466 | /* number of bytes to write */ |
481 | s->init_num=i+2; | 467 | s->init_num = i + 2; |
482 | s->init_off=0; | 468 | s->init_off = 0; |
483 | 469 | ||
484 | ssl3_finish_mac(s,&(buf[2]),i); | 470 | ssl3_finish_mac(s, &(buf[2]), i); |
485 | } | 471 | } else { |
486 | else | ||
487 | { | ||
488 | /* create Client Hello in SSL 3.0/TLS 1.0 format */ | 472 | /* create Client Hello in SSL 3.0/TLS 1.0 format */ |
489 | 473 | ||
490 | /* do the record header (5 bytes) and handshake message header (4 bytes) last */ | 474 | /* do the record header (5 bytes) and handshake message header (4 bytes) last */ |
491 | d = p = &(buf[9]); | 475 | d = p = &(buf[9]); |
492 | 476 | ||
493 | *(p++) = version_major; | 477 | *(p++) = version_major; |
494 | *(p++) = version_minor; | 478 | *(p++) = version_minor; |
495 | 479 | ||
@@ -501,73 +485,68 @@ static int ssl23_client_hello(SSL *s) | |||
501 | *(p++) = 0; | 485 | *(p++) = 0; |
502 | 486 | ||
503 | /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */ | 487 | /* Ciphers supported (using SSL 3.0/TLS 1.0 format) */ |
504 | i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),ssl3_put_cipher_by_char); | 488 | i = ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &(p[2]), ssl3_put_cipher_by_char); |
505 | if (i == 0) | 489 | if (i == 0) { |
506 | { | 490 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_NO_CIPHERS_AVAILABLE); |
507 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE); | ||
508 | return -1; | 491 | return -1; |
509 | } | 492 | } |
510 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH | 493 | #ifdef OPENSSL_MAX_TLS1_2_CIPHER_LENGTH |
511 | /* Some servers hang if client hello > 256 bytes | 494 | /* Some servers hang if client hello > 256 bytes |
512 | * as hack workaround chop number of supported ciphers | 495 | * as hack workaround chop number of supported ciphers |
513 | * to keep it well below this if we use TLS v1.2 | 496 | * to keep it well below this if we use TLS v1.2 |
514 | */ | 497 | */ |
515 | if (TLS1_get_version(s) >= TLS1_2_VERSION | 498 | if (TLS1_get_version(s) >= TLS1_2_VERSION && |
516 | && i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH) | 499 | i > OPENSSL_MAX_TLS1_2_CIPHER_LENGTH) |
517 | i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1; | 500 | i = OPENSSL_MAX_TLS1_2_CIPHER_LENGTH & ~1; |
518 | #endif | 501 | #endif |
519 | s2n(i,p); | 502 | s2n(i, p); |
520 | p+=i; | 503 | p += i; |
521 | 504 | ||
522 | /* COMPRESSION */ | 505 | /* COMPRESSION */ |
523 | #ifdef OPENSSL_NO_COMP | 506 | #ifdef OPENSSL_NO_COMP |
524 | *(p++)=1; | 507 | *(p++) = 1; |
525 | #else | 508 | #else |
526 | if ((s->options & SSL_OP_NO_COMPRESSION) | 509 | if ((s->options & SSL_OP_NO_COMPRESSION) || |
527 | || !s->ctx->comp_methods) | 510 | !s->ctx->comp_methods) |
528 | j=0; | 511 | j = 0; |
529 | else | 512 | else |
530 | j=sk_SSL_COMP_num(s->ctx->comp_methods); | 513 | j = sk_SSL_COMP_num(s->ctx->comp_methods); |
531 | *(p++)=1+j; | 514 | *(p++) = 1 + j; |
532 | for (i=0; i<j; i++) | 515 | for (i = 0; i < j; i++) { |
533 | { | 516 | comp = sk_SSL_COMP_value(s->ctx->comp_methods, i); |
534 | comp=sk_SSL_COMP_value(s->ctx->comp_methods,i); | 517 | *(p++) = comp->id; |
535 | *(p++)=comp->id; | 518 | } |
536 | } | ||
537 | #endif | 519 | #endif |
538 | *(p++)=0; /* Add the NULL method */ | 520 | *(p++)=0; /* Add the NULL method */ |
539 | 521 | ||
540 | #ifndef OPENSSL_NO_TLSEXT | 522 | #ifndef OPENSSL_NO_TLSEXT |
541 | /* TLS extensions*/ | 523 | /* TLS extensions*/ |
542 | if (ssl_prepare_clienthello_tlsext(s) <= 0) | 524 | if (ssl_prepare_clienthello_tlsext(s) <= 0) { |
543 | { | 525 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, SSL_R_CLIENTHELLO_TLSEXT); |
544 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,SSL_R_CLIENTHELLO_TLSEXT); | ||
545 | return -1; | 526 | return -1; |
546 | } | 527 | } |
547 | if ((p = ssl_add_clienthello_tlsext(s, p, buf+SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) | 528 | if ((p = ssl_add_clienthello_tlsext(s, p, buf + SSL3_RT_MAX_PLAIN_LENGTH)) == NULL) { |
548 | { | 529 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); |
549 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR); | ||
550 | return -1; | 530 | return -1; |
551 | } | 531 | } |
552 | #endif | 532 | #endif |
553 | 533 | ||
554 | l = p-d; | 534 | l = p - d; |
555 | 535 | ||
556 | /* fill in 4-byte handshake header */ | 536 | /* fill in 4-byte handshake header */ |
557 | d=&(buf[5]); | 537 | d = &(buf[5]); |
558 | *(d++)=SSL3_MT_CLIENT_HELLO; | 538 | *(d++) = SSL3_MT_CLIENT_HELLO; |
559 | l2n3(l,d); | 539 | l2n3(l, d); |
560 | 540 | ||
561 | l += 4; | 541 | l += 4; |
562 | 542 | ||
563 | if (l > SSL3_RT_MAX_PLAIN_LENGTH) | 543 | if (l > SSL3_RT_MAX_PLAIN_LENGTH) { |
564 | { | 544 | SSLerr(SSL_F_SSL23_CLIENT_HELLO, ERR_R_INTERNAL_ERROR); |
565 | SSLerr(SSL_F_SSL23_CLIENT_HELLO,ERR_R_INTERNAL_ERROR); | ||
566 | return -1; | 545 | return -1; |
567 | } | 546 | } |
568 | 547 | ||
569 | /* fill in 5-byte record header */ | 548 | /* fill in 5-byte record header */ |
570 | d=buf; | 549 | d = buf; |
571 | *(d++) = SSL3_RT_HANDSHAKE; | 550 | *(d++) = SSL3_RT_HANDSHAKE; |
572 | *(d++) = version_major; | 551 | *(d++) = version_major; |
573 | /* Some servers hang if we use long client hellos | 552 | /* Some servers hang if we use long client hellos |
@@ -577,54 +556,54 @@ static int ssl23_client_hello(SSL *s) | |||
577 | *(d++) = 1; | 556 | *(d++) = 1; |
578 | else | 557 | else |
579 | *(d++) = version_minor; | 558 | *(d++) = version_minor; |
580 | s2n((int)l,d); | 559 | s2n((int)l, d); |
581 | 560 | ||
582 | /* number of bytes to write */ | 561 | /* number of bytes to write */ |
583 | s->init_num=p-buf; | 562 | s->init_num = p - buf; |
584 | s->init_off=0; | 563 | s->init_off = 0; |
585 | |||
586 | ssl3_finish_mac(s,&(buf[5]), s->init_num - 5); | ||
587 | } | ||
588 | 564 | ||
589 | s->state=SSL23_ST_CW_CLNT_HELLO_B; | 565 | ssl3_finish_mac(s, &(buf[5]), s->init_num - 5); |
590 | s->init_off=0; | ||
591 | } | 566 | } |
592 | 567 | ||
568 | s->state = SSL23_ST_CW_CLNT_HELLO_B; | ||
569 | s->init_off = 0; | ||
570 | } | ||
571 | |||
593 | /* SSL3_ST_CW_CLNT_HELLO_B */ | 572 | /* SSL3_ST_CW_CLNT_HELLO_B */ |
594 | ret = ssl23_write_bytes(s); | 573 | ret = ssl23_write_bytes(s); |
595 | 574 | ||
596 | if ((ret >= 2) && s->msg_callback) | 575 | if ((ret >= 2) && s->msg_callback) { |
597 | { | ||
598 | /* Client Hello has been sent; tell msg_callback */ | 576 | /* Client Hello has been sent; tell msg_callback */ |
599 | 577 | ||
600 | if (ssl2_compat) | 578 | if (ssl2_compat) |
601 | s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data+2, ret-2, s, s->msg_callback_arg); | 579 | s->msg_callback(1, SSL2_VERSION, 0, s->init_buf->data + 2, ret - 2, s, s->msg_callback_arg); |
602 | else | 580 | else |
603 | s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data+5, ret-5, s, s->msg_callback_arg); | 581 | s->msg_callback(1, version, SSL3_RT_HANDSHAKE, s->init_buf->data + 5, ret - 5, s, s->msg_callback_arg); |
604 | } | 582 | } |
605 | 583 | ||
606 | return ret; | 584 | return ret; |
607 | } | 585 | } |
608 | 586 | ||
609 | static int ssl23_get_server_hello(SSL *s) | 587 | static int |
610 | { | 588 | ssl23_get_server_hello(SSL *s) |
589 | { | ||
611 | char buf[8]; | 590 | char buf[8]; |
612 | unsigned char *p; | 591 | unsigned char *p; |
613 | int i; | 592 | int i; |
614 | int n; | 593 | int n; |
615 | 594 | ||
616 | n=ssl23_read_bytes(s,7); | 595 | n = ssl23_read_bytes(s, 7); |
617 | 596 | ||
618 | if (n != 7) return(n); | 597 | if (n != 7) |
619 | p=s->packet; | 598 | return (n); |
599 | p = s->packet; | ||
620 | 600 | ||
621 | memcpy(buf,p,n); | 601 | memcpy(buf, p, n); |
622 | 602 | ||
623 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) && | 603 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_SERVER_HELLO) && |
624 | (p[5] == 0x00) && (p[6] == 0x02)) | 604 | (p[5] == 0x00) && (p[6] == 0x02)) { |
625 | { | ||
626 | #ifdef OPENSSL_NO_SSL2 | 605 | #ifdef OPENSSL_NO_SSL2 |
627 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 606 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); |
628 | goto err; | 607 | goto err; |
629 | #else | 608 | #else |
630 | /* we are talking sslv2 */ | 609 | /* we are talking sslv2 */ |
@@ -632,169 +611,150 @@ static int ssl23_get_server_hello(SSL *s) | |||
632 | * sslv2 stuff. */ | 611 | * sslv2 stuff. */ |
633 | int ch_len; | 612 | int ch_len; |
634 | 613 | ||
635 | if (s->options & SSL_OP_NO_SSLv2) | 614 | if (s->options & SSL_OP_NO_SSLv2) { |
636 | { | 615 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); |
637 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | ||
638 | goto err; | 616 | goto err; |
639 | } | 617 | } |
640 | if (s->s2 == NULL) | 618 | if (s->s2 == NULL) { |
641 | { | ||
642 | if (!ssl2_new(s)) | 619 | if (!ssl2_new(s)) |
643 | goto err; | 620 | goto err; |
644 | } | 621 | } else |
645 | else | ||
646 | ssl2_clear(s); | 622 | ssl2_clear(s); |
647 | 623 | ||
648 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) | 624 | if (s->options & SSL_OP_NETSCAPE_CHALLENGE_BUG) |
649 | ch_len=SSL2_CHALLENGE_LENGTH; | 625 | ch_len = SSL2_CHALLENGE_LENGTH; |
650 | else | 626 | else |
651 | ch_len=SSL2_MAX_CHALLENGE_LENGTH; | 627 | ch_len = SSL2_MAX_CHALLENGE_LENGTH; |
652 | 628 | ||
653 | /* write out sslv2 challenge */ | 629 | /* write out sslv2 challenge */ |
654 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), because | 630 | /* Note that ch_len must be <= SSL3_RANDOM_SIZE (32), because |
655 | it is one of SSL2_MAX_CHALLENGE_LENGTH (32) or | 631 | it is one of SSL2_MAX_CHALLENGE_LENGTH (32) or |
656 | SSL2_MAX_CHALLENGE_LENGTH (16), but leave the check in for | 632 | SSL2_MAX_CHALLENGE_LENGTH (16), but leave the check in for |
657 | futurproofing */ | 633 | futurproofing */ |
658 | i=(SSL3_RANDOM_SIZE < ch_len) | 634 | i = (SSL3_RANDOM_SIZE < ch_len) ? SSL3_RANDOM_SIZE : ch_len; |
659 | ?SSL3_RANDOM_SIZE:ch_len; | 635 | s->s2->challenge_length = i; |
660 | s->s2->challenge_length=i; | ||
661 | memcpy(s->s2->challenge, | 636 | memcpy(s->s2->challenge, |
662 | &(s->s3->client_random[SSL3_RANDOM_SIZE-i]),i); | 637 | &(s->s3->client_random[SSL3_RANDOM_SIZE - i]), i); |
663 | 638 | ||
664 | if (s->s3 != NULL) ssl3_free(s); | 639 | if (s->s3 != NULL) |
640 | ssl3_free(s); | ||
665 | 641 | ||
666 | if (!BUF_MEM_grow_clean(s->init_buf, | 642 | if (!BUF_MEM_grow_clean(s->init_buf, |
667 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) | 643 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) { |
668 | { | 644 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, ERR_R_BUF_LIB); |
669 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,ERR_R_BUF_LIB); | ||
670 | goto err; | 645 | goto err; |
671 | } | 646 | } |
672 | 647 | ||
673 | s->state=SSL2_ST_GET_SERVER_HELLO_A; | 648 | s->state = SSL2_ST_GET_SERVER_HELLO_A; |
674 | if (!(s->client_version == SSL2_VERSION)) | 649 | if (!(s->client_version == SSL2_VERSION)) |
675 | /* use special padding (SSL 3.0 draft/RFC 2246, App. E.2) */ | 650 | /* use special padding (SSL 3.0 draft/RFC 2246, App. E.2) */ |
676 | s->s2->ssl2_rollback=1; | 651 | s->s2->ssl2_rollback = 1; |
677 | 652 | ||
678 | /* setup the 7 bytes we have read so we get them from | 653 | /* setup the 7 bytes we have read so we get them from |
679 | * the sslv2 buffer */ | 654 | * the sslv2 buffer */ |
680 | s->rstate=SSL_ST_READ_HEADER; | 655 | s->rstate = SSL_ST_READ_HEADER; |
681 | s->packet_length=n; | 656 | s->packet_length = n; |
682 | s->packet= &(s->s2->rbuf[0]); | 657 | s->packet = &(s->s2->rbuf[0]); |
683 | memcpy(s->packet,buf,n); | 658 | memcpy(s->packet, buf, n); |
684 | s->s2->rbuf_left=n; | 659 | s->s2->rbuf_left = n; |
685 | s->s2->rbuf_offs=0; | 660 | s->s2->rbuf_offs = 0; |
686 | 661 | ||
687 | /* we have already written one */ | 662 | /* we have already written one */ |
688 | s->s2->write_sequence=1; | 663 | s->s2->write_sequence = 1; |
689 | 664 | ||
690 | s->method=SSLv2_client_method(); | 665 | s->method = SSLv2_client_method(); |
691 | s->handshake_func=s->method->ssl_connect; | 666 | s->handshake_func = s->method->ssl_connect; |
692 | #endif | 667 | #endif |
693 | } | 668 | } else if (p[1] == SSL3_VERSION_MAJOR && |
694 | else if (p[1] == SSL3_VERSION_MAJOR && | 669 | p[2] <= TLS1_2_VERSION_MINOR && |
695 | p[2] <= TLS1_2_VERSION_MINOR && | 670 | ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) || |
696 | ((p[0] == SSL3_RT_HANDSHAKE && p[5] == SSL3_MT_SERVER_HELLO) || | 671 | (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2))) { |
697 | (p[0] == SSL3_RT_ALERT && p[3] == 0 && p[4] == 2))) | ||
698 | { | ||
699 | /* we have sslv3 or tls1 (server hello or alert) */ | 672 | /* we have sslv3 or tls1 (server hello or alert) */ |
700 | 673 | ||
701 | if ((p[2] == SSL3_VERSION_MINOR) && | 674 | if ((p[2] == SSL3_VERSION_MINOR) && |
702 | !(s->options & SSL_OP_NO_SSLv3)) | 675 | !(s->options & SSL_OP_NO_SSLv3)) { |
703 | { | ||
704 | #ifdef OPENSSL_FIPS | 676 | #ifdef OPENSSL_FIPS |
705 | if(FIPS_mode()) | 677 | if (FIPS_mode()) { |
706 | { | ||
707 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, | 678 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, |
708 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | 679 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); |
709 | goto err; | 680 | goto err; |
710 | } | ||
711 | #endif | ||
712 | s->version=SSL3_VERSION; | ||
713 | s->method=SSLv3_client_method(); | ||
714 | } | ||
715 | else if ((p[2] == TLS1_VERSION_MINOR) && | ||
716 | !(s->options & SSL_OP_NO_TLSv1)) | ||
717 | { | ||
718 | s->version=TLS1_VERSION; | ||
719 | s->method=TLSv1_client_method(); | ||
720 | } | 681 | } |
721 | else if ((p[2] == TLS1_1_VERSION_MINOR) && | 682 | #endif |
722 | !(s->options & SSL_OP_NO_TLSv1_1)) | 683 | s->version = SSL3_VERSION; |
723 | { | 684 | s->method = SSLv3_client_method(); |
724 | s->version=TLS1_1_VERSION; | 685 | } else if ((p[2] == TLS1_VERSION_MINOR) && |
725 | s->method=TLSv1_1_client_method(); | 686 | !(s->options & SSL_OP_NO_TLSv1)) { |
726 | } | 687 | s->version = TLS1_VERSION; |
727 | else if ((p[2] == TLS1_2_VERSION_MINOR) && | 688 | s->method = TLSv1_client_method(); |
728 | !(s->options & SSL_OP_NO_TLSv1_2)) | 689 | } else if ((p[2] == TLS1_1_VERSION_MINOR) && |
729 | { | 690 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
730 | s->version=TLS1_2_VERSION; | 691 | s->version = TLS1_1_VERSION; |
731 | s->method=TLSv1_2_client_method(); | 692 | s->method = TLSv1_1_client_method(); |
732 | } | 693 | } else if ((p[2] == TLS1_2_VERSION_MINOR) && |
733 | else | 694 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
734 | { | 695 | s->version = TLS1_2_VERSION; |
735 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 696 | s->method = TLSv1_2_client_method(); |
697 | } else { | ||
698 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); | ||
736 | goto err; | 699 | goto err; |
737 | } | 700 | } |
738 | 701 | ||
739 | if (p[0] == SSL3_RT_ALERT && p[5] != SSL3_AL_WARNING) | 702 | if (p[0] == SSL3_RT_ALERT && p[5] != SSL3_AL_WARNING) { |
740 | { | ||
741 | /* fatal alert */ | 703 | /* fatal alert */ |
742 | 704 | ||
743 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 705 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
744 | int j; | 706 | int j; |
745 | 707 | ||
746 | if (s->info_callback != NULL) | 708 | if (s->info_callback != NULL) |
747 | cb=s->info_callback; | 709 | cb = s->info_callback; |
748 | else if (s->ctx->info_callback != NULL) | 710 | else if (s->ctx->info_callback != NULL) |
749 | cb=s->ctx->info_callback; | 711 | cb = s->ctx->info_callback; |
750 | 712 | ||
751 | i=p[5]; | 713 | i = p[5]; |
752 | if (cb != NULL) | 714 | if (cb != NULL) { |
753 | { | 715 | j = (i << 8) | p[6]; |
754 | j=(i<<8)|p[6]; | 716 | cb(s, SSL_CB_READ_ALERT, j); |
755 | cb(s,SSL_CB_READ_ALERT,j); | 717 | } |
756 | } | 718 | |
757 | |||
758 | if (s->msg_callback) | 719 | if (s->msg_callback) |
759 | s->msg_callback(0, s->version, SSL3_RT_ALERT, p+5, 2, s, s->msg_callback_arg); | 720 | s->msg_callback(0, s->version, SSL3_RT_ALERT, p + 5, 2, s, s->msg_callback_arg); |
760 | 721 | ||
761 | s->rwstate=SSL_NOTHING; | 722 | s->rwstate = SSL_NOTHING; |
762 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_AD_REASON_OFFSET+p[6]); | 723 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_AD_REASON_OFFSET + p[6]); |
763 | goto err; | 724 | goto err; |
764 | } | 725 | } |
765 | 726 | ||
766 | if (!ssl_init_wbio_buffer(s,1)) goto err; | 727 | if (!ssl_init_wbio_buffer(s, 1)) |
728 | goto err; | ||
767 | 729 | ||
768 | /* we are in this state */ | 730 | /* we are in this state */ |
769 | s->state=SSL3_ST_CR_SRVR_HELLO_A; | 731 | s->state = SSL3_ST_CR_SRVR_HELLO_A; |
770 | 732 | ||
771 | /* put the 7 bytes we have read into the input buffer | 733 | /* put the 7 bytes we have read into the input buffer |
772 | * for SSLv3 */ | 734 | * for SSLv3 */ |
773 | s->rstate=SSL_ST_READ_HEADER; | 735 | s->rstate = SSL_ST_READ_HEADER; |
774 | s->packet_length=n; | 736 | s->packet_length = n; |
775 | if (s->s3->rbuf.buf == NULL) | 737 | if (s->s3->rbuf.buf == NULL) |
776 | if (!ssl3_setup_read_buffer(s)) | 738 | if (!ssl3_setup_read_buffer(s)) |
777 | goto err; | 739 | goto err; |
778 | s->packet= &(s->s3->rbuf.buf[0]); | 740 | s->packet = &(s->s3->rbuf.buf[0]); |
779 | memcpy(s->packet,buf,n); | 741 | memcpy(s->packet, buf, n); |
780 | s->s3->rbuf.left=n; | 742 | s->s3->rbuf.left = n; |
781 | s->s3->rbuf.offset=0; | 743 | s->s3->rbuf.offset = 0; |
782 | 744 | ||
783 | s->handshake_func=s->method->ssl_connect; | 745 | s->handshake_func = s->method->ssl_connect; |
784 | } | 746 | } else { |
785 | else | 747 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO, SSL_R_UNKNOWN_PROTOCOL); |
786 | { | ||
787 | SSLerr(SSL_F_SSL23_GET_SERVER_HELLO,SSL_R_UNKNOWN_PROTOCOL); | ||
788 | goto err; | 748 | goto err; |
789 | } | 749 | } |
790 | s->init_num=0; | 750 | s->init_num = 0; |
791 | 751 | ||
792 | /* Since, if we are sending a ssl23 client hello, we are not | 752 | /* Since, if we are sending a ssl23 client hello, we are not |
793 | * reusing a session-id */ | 753 | * reusing a session-id */ |
794 | if (!ssl_get_new_session(s,0)) | 754 | if (!ssl_get_new_session(s, 0)) |
795 | goto err; | 755 | goto err; |
796 | 756 | ||
797 | return(SSL_connect(s)); | 757 | return (SSL_connect(s)); |
798 | err: | 758 | err: |
799 | return(-1); | 759 | return (-1); |
800 | } | 760 | } |
diff --git a/src/lib/libssl/src/ssl/s23_lib.c b/src/lib/libssl/src/ssl/s23_lib.c index a6285b767f..3a4d5a6ecb 100644 --- a/src/lib/libssl/src/ssl/s23_lib.c +++ b/src/lib/libssl/src/ssl/s23_lib.c | |||
@@ -60,128 +60,126 @@ | |||
60 | #include <openssl/objects.h> | 60 | #include <openssl/objects.h> |
61 | #include "ssl_locl.h" | 61 | #include "ssl_locl.h" |
62 | 62 | ||
63 | long ssl23_default_timeout(void) | 63 | long |
64 | { | 64 | ssl23_default_timeout(void) |
65 | return(300); | 65 | { |
66 | } | 66 | return (300); |
67 | } | ||
67 | 68 | ||
68 | int ssl23_num_ciphers(void) | 69 | int |
69 | { | 70 | ssl23_num_ciphers(void) |
71 | { | ||
70 | return(ssl3_num_ciphers() | 72 | return(ssl3_num_ciphers() |
71 | #ifndef OPENSSL_NO_SSL2 | 73 | #ifndef OPENSSL_NO_SSL2 |
72 | + ssl2_num_ciphers() | 74 | + ssl2_num_ciphers() |
73 | #endif | 75 | #endif |
74 | ); | 76 | ); |
75 | } | 77 | } |
76 | 78 | ||
77 | const SSL_CIPHER *ssl23_get_cipher(unsigned int u) | 79 | const SSL_CIPHER |
78 | { | 80 | *ssl23_get_cipher(unsigned int u) |
79 | unsigned int uu=ssl3_num_ciphers(); | 81 | { |
82 | unsigned int uu = ssl3_num_ciphers(); | ||
80 | 83 | ||
81 | if (u < uu) | 84 | if (u < uu) |
82 | return(ssl3_get_cipher(u)); | 85 | return (ssl3_get_cipher(u)); |
83 | else | 86 | else |
84 | #ifndef OPENSSL_NO_SSL2 | 87 | #ifndef OPENSSL_NO_SSL2 |
85 | return(ssl2_get_cipher(u-uu)); | 88 | return (ssl2_get_cipher(u - uu)); |
86 | #else | 89 | #else |
87 | return(NULL); | 90 | return (NULL); |
88 | #endif | 91 | #endif |
89 | } | 92 | } |
90 | 93 | ||
91 | /* This function needs to check if the ciphers required are actually | 94 | /* This function needs to check if the ciphers required are actually |
92 | * available */ | 95 | * available */ |
93 | const SSL_CIPHER *ssl23_get_cipher_by_char(const unsigned char *p) | 96 | const SSL_CIPHER |
94 | { | 97 | *ssl23_get_cipher_by_char(const unsigned char *p) |
98 | { | ||
95 | const SSL_CIPHER *cp; | 99 | const SSL_CIPHER *cp; |
96 | 100 | ||
97 | cp=ssl3_get_cipher_by_char(p); | 101 | cp = ssl3_get_cipher_by_char(p); |
98 | #ifndef OPENSSL_NO_SSL2 | 102 | #ifndef OPENSSL_NO_SSL2 |
99 | if (cp == NULL) | 103 | if (cp == NULL) |
100 | cp=ssl2_get_cipher_by_char(p); | 104 | cp = ssl2_get_cipher_by_char(p); |
101 | #endif | 105 | #endif |
102 | return(cp); | 106 | return (cp); |
103 | } | 107 | } |
104 | 108 | ||
105 | int ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) | 109 | int |
106 | { | 110 | ssl23_put_cipher_by_char(const SSL_CIPHER *c, unsigned char *p) |
111 | { | ||
107 | long l; | 112 | long l; |
108 | 113 | ||
109 | /* We can write SSLv2 and SSLv3 ciphers */ | 114 | /* We can write SSLv2 and SSLv3 ciphers */ |
110 | if (p != NULL) | 115 | if (p != NULL) { |
111 | { | 116 | l = c->id; |
112 | l=c->id; | 117 | p[0] = ((unsigned char)(l >> 16L))&0xFF; |
113 | p[0]=((unsigned char)(l>>16L))&0xFF; | 118 | p[1] = ((unsigned char)(l >> 8L))&0xFF; |
114 | p[1]=((unsigned char)(l>> 8L))&0xFF; | 119 | p[2] = ((unsigned char)(l ))&0xFF; |
115 | p[2]=((unsigned char)(l ))&0xFF; | ||
116 | } | ||
117 | return(3); | ||
118 | } | 120 | } |
121 | return (3); | ||
122 | } | ||
119 | 123 | ||
120 | int ssl23_read(SSL *s, void *buf, int len) | 124 | int |
121 | { | 125 | ssl23_read(SSL *s, void *buf, int len) |
126 | { | ||
122 | int n; | 127 | int n; |
123 | 128 | ||
124 | errno = 0; | 129 | errno = 0; |
125 | if (SSL_in_init(s) && (!s->in_handshake)) | 130 | if (SSL_in_init(s) && (!s->in_handshake)) { |
126 | { | 131 | n = s->handshake_func(s); |
127 | n=s->handshake_func(s); | 132 | if (n < 0) |
128 | if (n < 0) return(n); | 133 | return (n); |
129 | if (n == 0) | 134 | if (n == 0) { |
130 | { | 135 | SSLerr(SSL_F_SSL23_READ, SSL_R_SSL_HANDSHAKE_FAILURE); |
131 | SSLerr(SSL_F_SSL23_READ,SSL_R_SSL_HANDSHAKE_FAILURE); | 136 | return (-1); |
132 | return(-1); | ||
133 | } | ||
134 | return(SSL_read(s,buf,len)); | ||
135 | } | 137 | } |
136 | else | 138 | return (SSL_read(s, buf, len)); |
137 | { | 139 | } else { |
138 | ssl_undefined_function(s); | 140 | ssl_undefined_function(s); |
139 | return(-1); | 141 | return (-1); |
140 | } | ||
141 | } | 142 | } |
143 | } | ||
142 | 144 | ||
143 | int ssl23_peek(SSL *s, void *buf, int len) | 145 | int |
144 | { | 146 | ssl23_peek(SSL *s, void *buf, int len) |
147 | { | ||
145 | int n; | 148 | int n; |
146 | 149 | ||
147 | errno = 0; | 150 | errno = 0; |
148 | if (SSL_in_init(s) && (!s->in_handshake)) | 151 | if (SSL_in_init(s) && (!s->in_handshake)) { |
149 | { | 152 | n = s->handshake_func(s); |
150 | n=s->handshake_func(s); | 153 | if (n < 0) |
151 | if (n < 0) return(n); | 154 | return (n); |
152 | if (n == 0) | 155 | if (n == 0) { |
153 | { | 156 | SSLerr(SSL_F_SSL23_PEEK, SSL_R_SSL_HANDSHAKE_FAILURE); |
154 | SSLerr(SSL_F_SSL23_PEEK,SSL_R_SSL_HANDSHAKE_FAILURE); | 157 | return (-1); |
155 | return(-1); | ||
156 | } | ||
157 | return(SSL_peek(s,buf,len)); | ||
158 | } | 158 | } |
159 | else | 159 | return (SSL_peek(s, buf, len)); |
160 | { | 160 | } else { |
161 | ssl_undefined_function(s); | 161 | ssl_undefined_function(s); |
162 | return(-1); | 162 | return (-1); |
163 | } | ||
164 | } | 163 | } |
164 | } | ||
165 | 165 | ||
166 | int ssl23_write(SSL *s, const void *buf, int len) | 166 | int |
167 | { | 167 | ssl23_write(SSL *s, const void *buf, int len) |
168 | { | ||
168 | int n; | 169 | int n; |
169 | 170 | ||
170 | errno = 0; | 171 | errno = 0; |
171 | if (SSL_in_init(s) && (!s->in_handshake)) | 172 | if (SSL_in_init(s) && (!s->in_handshake)) { |
172 | { | 173 | n = s->handshake_func(s); |
173 | n=s->handshake_func(s); | 174 | if (n < 0) |
174 | if (n < 0) return(n); | 175 | return (n); |
175 | if (n == 0) | 176 | if (n == 0) { |
176 | { | 177 | SSLerr(SSL_F_SSL23_WRITE, SSL_R_SSL_HANDSHAKE_FAILURE); |
177 | SSLerr(SSL_F_SSL23_WRITE,SSL_R_SSL_HANDSHAKE_FAILURE); | 178 | return (-1); |
178 | return(-1); | ||
179 | } | ||
180 | return(SSL_write(s,buf,len)); | ||
181 | } | 179 | } |
182 | else | 180 | return (SSL_write(s, buf, len)); |
183 | { | 181 | } else { |
184 | ssl_undefined_function(s); | 182 | ssl_undefined_function(s); |
185 | return(-1); | 183 | return (-1); |
186 | } | ||
187 | } | 184 | } |
185 | } | ||
diff --git a/src/lib/libssl/src/ssl/s23_meth.c b/src/lib/libssl/src/ssl/s23_meth.c index 40eae0f0be..ca1bb6819f 100644 --- a/src/lib/libssl/src/ssl/s23_meth.c +++ b/src/lib/libssl/src/ssl/s23_meth.c | |||
@@ -61,32 +61,31 @@ | |||
61 | #include "ssl_locl.h" | 61 | #include "ssl_locl.h" |
62 | 62 | ||
63 | static const SSL_METHOD *ssl23_get_method(int ver); | 63 | static const SSL_METHOD *ssl23_get_method(int ver); |
64 | static const SSL_METHOD *ssl23_get_method(int ver) | 64 | static const SSL_METHOD |
65 | { | 65 | *ssl23_get_method(int ver) |
66 | { | ||
66 | #ifndef OPENSSL_NO_SSL2 | 67 | #ifndef OPENSSL_NO_SSL2 |
67 | if (ver == SSL2_VERSION) | 68 | if (ver == SSL2_VERSION) |
68 | return(SSLv2_method()); | 69 | return (SSLv2_method()); |
69 | else | 70 | else |
70 | #endif | 71 | #endif |
71 | #ifndef OPENSSL_NO_SSL3 | 72 | #ifndef OPENSSL_NO_SSL3 |
72 | if (ver == SSL3_VERSION) | 73 | if (ver == SSL3_VERSION) |
73 | return(SSLv3_method()); | 74 | return (SSLv3_method()); |
74 | else | 75 | else |
75 | #endif | 76 | #endif |
76 | #ifndef OPENSSL_NO_TLS1 | 77 | #ifndef OPENSSL_NO_TLS1 |
77 | if (ver == TLS1_VERSION) | 78 | if (ver == TLS1_VERSION) |
78 | return(TLSv1_method()); | 79 | return (TLSv1_method()); |
79 | else if (ver == TLS1_1_VERSION) | 80 | else if (ver == TLS1_1_VERSION) |
80 | return(TLSv1_1_method()); | 81 | return (TLSv1_1_method()); |
81 | else if (ver == TLS1_2_VERSION) | 82 | else if (ver == TLS1_2_VERSION) |
82 | return(TLSv1_2_method()); | 83 | return (TLSv1_2_method()); |
83 | else | 84 | else |
84 | #endif | 85 | #endif |
85 | return(NULL); | 86 | return (NULL); |
86 | } | 87 | } |
87 | 88 | ||
88 | IMPLEMENT_ssl23_meth_func(SSLv23_method, | 89 | IMPLEMENT_ssl23_meth_func(SSLv23_method, |
89 | ssl23_accept, | 90 | ssl23_accept, ssl23_connect, ssl23_get_method) |
90 | ssl23_connect, | ||
91 | ssl23_get_method) | ||
92 | 91 | ||
diff --git a/src/lib/libssl/src/ssl/s23_pkt.c b/src/lib/libssl/src/ssl/s23_pkt.c index eba8d9d8fc..28d07a2212 100644 --- a/src/lib/libssl/src/ssl/s23_pkt.c +++ b/src/lib/libssl/src/ssl/s23_pkt.c | |||
@@ -62,55 +62,53 @@ | |||
62 | #include <openssl/evp.h> | 62 | #include <openssl/evp.h> |
63 | #include <openssl/buffer.h> | 63 | #include <openssl/buffer.h> |
64 | 64 | ||
65 | int ssl23_write_bytes(SSL *s) | 65 | int |
66 | { | 66 | ssl23_write_bytes(SSL *s) |
67 | int i,num,tot; | 67 | { |
68 | int i, num, tot; | ||
68 | char *buf; | 69 | char *buf; |
69 | 70 | ||
70 | buf=s->init_buf->data; | 71 | buf = s->init_buf->data; |
71 | tot=s->init_off; | 72 | tot = s->init_off; |
72 | num=s->init_num; | 73 | num = s->init_num; |
73 | for (;;) | 74 | for (;;) { |
74 | { | 75 | s->rwstate = SSL_WRITING; |
75 | s->rwstate=SSL_WRITING; | 76 | i = BIO_write(s->wbio, &(buf[tot]), num); |
76 | i=BIO_write(s->wbio,&(buf[tot]),num); | 77 | if (i <= 0) { |
77 | if (i <= 0) | 78 | s->init_off = tot; |
78 | { | 79 | s->init_num = num; |
79 | s->init_off=tot; | 80 | return (i); |
80 | s->init_num=num; | ||
81 | return(i); | ||
82 | } | ||
83 | s->rwstate=SSL_NOTHING; | ||
84 | if (i == num) return(tot+i); | ||
85 | |||
86 | num-=i; | ||
87 | tot+=i; | ||
88 | } | 81 | } |
82 | s->rwstate = SSL_NOTHING; | ||
83 | if (i == num) | ||
84 | return (tot + i); | ||
85 | |||
86 | num -= i; | ||
87 | tot += i; | ||
89 | } | 88 | } |
89 | } | ||
90 | 90 | ||
91 | /* return regularly only when we have read (at least) 'n' bytes */ | 91 | /* return regularly only when we have read (at least) 'n' bytes */ |
92 | int ssl23_read_bytes(SSL *s, int n) | 92 | int |
93 | { | 93 | ssl23_read_bytes(SSL *s, int n) |
94 | { | ||
94 | unsigned char *p; | 95 | unsigned char *p; |
95 | int j; | 96 | int j; |
96 | 97 | ||
97 | if (s->packet_length < (unsigned int)n) | 98 | if (s->packet_length < (unsigned int)n) { |
98 | { | 99 | p = s->packet; |
99 | p=s->packet; | ||
100 | 100 | ||
101 | for (;;) | 101 | for (;;) { |
102 | { | 102 | s->rwstate = SSL_READING; |
103 | s->rwstate=SSL_READING; | 103 | j = BIO_read(s->rbio,(char *)&(p[s->packet_length]), |
104 | j=BIO_read(s->rbio,(char *)&(p[s->packet_length]), | 104 | n - s->packet_length); |
105 | n-s->packet_length); | ||
106 | if (j <= 0) | 105 | if (j <= 0) |
107 | return(j); | 106 | return (j); |
108 | s->rwstate=SSL_NOTHING; | 107 | s->rwstate = SSL_NOTHING; |
109 | s->packet_length+=j; | 108 | s->packet_length += j; |
110 | if (s->packet_length >= (unsigned int)n) | 109 | if (s->packet_length >= (unsigned int)n) |
111 | return(s->packet_length); | 110 | return (s->packet_length); |
112 | } | ||
113 | } | 111 | } |
114 | return(n); | ||
115 | } | 112 | } |
116 | 113 | return (n); | |
114 | } | ||
diff --git a/src/lib/libssl/src/ssl/s23_srvr.c b/src/lib/libssl/src/ssl/s23_srvr.c index 2ac8786c62..35db7b4992 100644 --- a/src/lib/libssl/src/ssl/s23_srvr.c +++ b/src/lib/libssl/src/ssl/s23_srvr.c | |||
@@ -121,227 +121,209 @@ | |||
121 | 121 | ||
122 | static const SSL_METHOD *ssl23_get_server_method(int ver); | 122 | static const SSL_METHOD *ssl23_get_server_method(int ver); |
123 | int ssl23_get_client_hello(SSL *s); | 123 | int ssl23_get_client_hello(SSL *s); |
124 | static const SSL_METHOD *ssl23_get_server_method(int ver) | 124 | static const SSL_METHOD |
125 | { | 125 | *ssl23_get_server_method(int ver) |
126 | { | ||
126 | #ifndef OPENSSL_NO_SSL2 | 127 | #ifndef OPENSSL_NO_SSL2 |
127 | if (ver == SSL2_VERSION) | 128 | if (ver == SSL2_VERSION) |
128 | return(SSLv2_server_method()); | 129 | return (SSLv2_server_method()); |
129 | #endif | 130 | #endif |
130 | if (ver == SSL3_VERSION) | 131 | if (ver == SSL3_VERSION) |
131 | return(SSLv3_server_method()); | 132 | return (SSLv3_server_method()); |
132 | else if (ver == TLS1_VERSION) | 133 | else if (ver == TLS1_VERSION) |
133 | return(TLSv1_server_method()); | 134 | return (TLSv1_server_method()); |
134 | else if (ver == TLS1_1_VERSION) | 135 | else if (ver == TLS1_1_VERSION) |
135 | return(TLSv1_1_server_method()); | 136 | return (TLSv1_1_server_method()); |
136 | else if (ver == TLS1_2_VERSION) | 137 | else if (ver == TLS1_2_VERSION) |
137 | return(TLSv1_2_server_method()); | 138 | return (TLSv1_2_server_method()); |
138 | else | 139 | else |
139 | return(NULL); | 140 | return (NULL); |
140 | } | 141 | } |
141 | 142 | ||
142 | IMPLEMENT_ssl23_meth_func(SSLv23_server_method, | 143 | IMPLEMENT_ssl23_meth_func(SSLv23_server_method, |
143 | ssl23_accept, | 144 | ssl23_accept, ssl_undefined_function, ssl23_get_server_method) |
144 | ssl_undefined_function, | ||
145 | ssl23_get_server_method) | ||
146 | 145 | ||
147 | int ssl23_accept(SSL *s) | 146 | int |
148 | { | 147 | ssl23_accept(SSL *s) |
148 | { | ||
149 | BUF_MEM *buf; | 149 | BUF_MEM *buf; |
150 | unsigned long Time=(unsigned long)time(NULL); | 150 | unsigned long Time = (unsigned long)time(NULL); |
151 | void (*cb)(const SSL *ssl,int type,int val)=NULL; | 151 | void (*cb)(const SSL *ssl, int type, int val) = NULL; |
152 | int ret= -1; | 152 | int ret = -1; |
153 | int new_state,state; | 153 | int new_state, state; |
154 | 154 | ||
155 | RAND_add(&Time,sizeof(Time),0); | 155 | RAND_add(&Time, sizeof(Time), 0); |
156 | ERR_clear_error(); | 156 | ERR_clear_error(); |
157 | errno = 0; | 157 | errno = 0; |
158 | 158 | ||
159 | if (s->info_callback != NULL) | 159 | if (s->info_callback != NULL) |
160 | cb=s->info_callback; | 160 | cb = s->info_callback; |
161 | else if (s->ctx->info_callback != NULL) | 161 | else if (s->ctx->info_callback != NULL) |
162 | cb=s->ctx->info_callback; | 162 | cb = s->ctx->info_callback; |
163 | 163 | ||
164 | s->in_handshake++; | 164 | s->in_handshake++; |
165 | if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s); | 165 | if (!SSL_in_init(s) || SSL_in_before(s)) |
166 | SSL_clear(s); | ||
166 | 167 | ||
167 | for (;;) | 168 | for (;;) { |
168 | { | 169 | state = s->state; |
169 | state=s->state; | ||
170 | 170 | ||
171 | switch(s->state) | 171 | switch (s->state) { |
172 | { | ||
173 | case SSL_ST_BEFORE: | 172 | case SSL_ST_BEFORE: |
174 | case SSL_ST_ACCEPT: | 173 | case SSL_ST_ACCEPT: |
175 | case SSL_ST_BEFORE|SSL_ST_ACCEPT: | 174 | case SSL_ST_BEFORE|SSL_ST_ACCEPT: |
176 | case SSL_ST_OK|SSL_ST_ACCEPT: | 175 | case SSL_ST_OK|SSL_ST_ACCEPT: |
177 | 176 | ||
178 | s->server=1; | 177 | s->server = 1; |
179 | if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1); | 178 | if (cb != NULL) |
179 | cb(s, SSL_CB_HANDSHAKE_START, 1); | ||
180 | 180 | ||
181 | /* s->version=SSL3_VERSION; */ | 181 | /* s->version=SSL3_VERSION; */ |
182 | s->type=SSL_ST_ACCEPT; | 182 | s->type = SSL_ST_ACCEPT; |
183 | 183 | ||
184 | if (s->init_buf == NULL) | 184 | if (s->init_buf == NULL) { |
185 | { | 185 | if ((buf = BUF_MEM_new()) == NULL) { |
186 | if ((buf=BUF_MEM_new()) == NULL) | 186 | ret = -1; |
187 | { | ||
188 | ret= -1; | ||
189 | goto end; | 187 | goto end; |
190 | } | 188 | } |
191 | if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH)) | 189 | if (!BUF_MEM_grow(buf, SSL3_RT_MAX_PLAIN_LENGTH)) { |
192 | { | 190 | ret = -1; |
193 | ret= -1; | ||
194 | goto end; | 191 | goto end; |
195 | } | ||
196 | s->init_buf=buf; | ||
197 | } | 192 | } |
193 | s->init_buf = buf; | ||
194 | } | ||
198 | 195 | ||
199 | ssl3_init_finished_mac(s); | 196 | ssl3_init_finished_mac(s); |
200 | 197 | ||
201 | s->state=SSL23_ST_SR_CLNT_HELLO_A; | 198 | s->state = SSL23_ST_SR_CLNT_HELLO_A; |
202 | s->ctx->stats.sess_accept++; | 199 | s->ctx->stats.sess_accept++; |
203 | s->init_num=0; | 200 | s->init_num = 0; |
204 | break; | 201 | break; |
205 | 202 | ||
206 | case SSL23_ST_SR_CLNT_HELLO_A: | 203 | case SSL23_ST_SR_CLNT_HELLO_A: |
207 | case SSL23_ST_SR_CLNT_HELLO_B: | 204 | case SSL23_ST_SR_CLNT_HELLO_B: |
208 | 205 | ||
209 | s->shutdown=0; | 206 | s->shutdown = 0; |
210 | ret=ssl23_get_client_hello(s); | 207 | ret = ssl23_get_client_hello(s); |
211 | if (ret >= 0) cb=NULL; | 208 | if (ret >= 0) |
209 | cb = NULL; | ||
212 | goto end; | 210 | goto end; |
213 | /* break; */ | 211 | /* break; */ |
214 | 212 | ||
215 | default: | 213 | default: |
216 | SSLerr(SSL_F_SSL23_ACCEPT,SSL_R_UNKNOWN_STATE); | 214 | SSLerr(SSL_F_SSL23_ACCEPT, SSL_R_UNKNOWN_STATE); |
217 | ret= -1; | 215 | ret = -1; |
218 | goto end; | 216 | goto end; |
219 | /* break; */ | 217 | /* break; */ |
220 | } | 218 | } |
221 | 219 | ||
222 | if ((cb != NULL) && (s->state != state)) | 220 | if ((cb != NULL) && (s->state != state)) { |
223 | { | 221 | new_state = s->state; |
224 | new_state=s->state; | 222 | s->state = state; |
225 | s->state=state; | 223 | cb(s, SSL_CB_ACCEPT_LOOP, 1); |
226 | cb(s,SSL_CB_ACCEPT_LOOP,1); | 224 | s->state = new_state; |
227 | s->state=new_state; | ||
228 | } | ||
229 | } | 225 | } |
226 | } | ||
230 | end: | 227 | end: |
231 | s->in_handshake--; | 228 | s->in_handshake--; |
232 | if (cb != NULL) | 229 | if (cb != NULL) |
233 | cb(s,SSL_CB_ACCEPT_EXIT,ret); | 230 | cb(s, SSL_CB_ACCEPT_EXIT, ret); |
234 | return(ret); | 231 | return (ret); |
235 | } | 232 | } |
236 | 233 | ||
237 | 234 | ||
238 | int ssl23_get_client_hello(SSL *s) | 235 | int |
239 | { | 236 | ssl23_get_client_hello(SSL *s) |
237 | { | ||
240 | char buf_space[11]; /* Request this many bytes in initial read. | 238 | char buf_space[11]; /* Request this many bytes in initial read. |
241 | * We can detect SSL 3.0/TLS 1.0 Client Hellos | 239 | * We can detect SSL 3.0/TLS 1.0 Client Hellos |
242 | * ('type == 3') correctly only when the following | 240 | * ('type == 3') correctly only when the following |
243 | * is in a single record, which is not guaranteed by | 241 | * is in a single record, which is not guaranteed by |
244 | * the protocol specification: | 242 | * the protocol specification: |
245 | * Byte Content | 243 | * Byte Content |
246 | * 0 type \ | 244 | * 0 type \ |
247 | * 1/2 version > record header | 245 | * 1/2 version > record header |
248 | * 3/4 length / | 246 | * 3/4 length / |
249 | * 5 msg_type \ | 247 | * 5 msg_type \ |
250 | * 6-8 length > Client Hello message | 248 | * 6-8 length > Client Hello message |
251 | * 9/10 client_version / | 249 | * 9/10 client_version / |
252 | */ | 250 | */ |
253 | char *buf= &(buf_space[0]); | 251 | char *buf = &(buf_space[0]); |
254 | unsigned char *p,*d,*d_len,*dd; | 252 | unsigned char *p, *d, *d_len, *dd; |
255 | unsigned int i; | 253 | unsigned int i; |
256 | unsigned int csl,sil,cl; | 254 | unsigned int csl, sil, cl; |
257 | int n=0,j; | 255 | int n = 0, j; |
258 | int type=0; | 256 | int type = 0; |
259 | int v[2]; | 257 | int v[2]; |
260 | 258 | ||
261 | if (s->state == SSL23_ST_SR_CLNT_HELLO_A) | 259 | if (s->state == SSL23_ST_SR_CLNT_HELLO_A) { |
262 | { | ||
263 | /* read the initial header */ | 260 | /* read the initial header */ |
264 | v[0]=v[1]=0; | 261 | v[0] = v[1] = 0; |
265 | 262 | ||
266 | if (!ssl3_setup_buffers(s)) goto err; | 263 | if (!ssl3_setup_buffers(s)) |
264 | goto err; | ||
267 | 265 | ||
268 | n=ssl23_read_bytes(s, sizeof buf_space); | 266 | n = ssl23_read_bytes(s, sizeof buf_space); |
269 | if (n != sizeof buf_space) return(n); /* n == -1 || n == 0 */ | 267 | if (n != sizeof buf_space) |
268 | return(n); /* n == -1 || n == 0 */ | ||
270 | 269 | ||
271 | p=s->packet; | 270 | p = s->packet; |
272 | 271 | ||
273 | memcpy(buf,p,n); | 272 | memcpy(buf, p, n); |
274 | 273 | ||
275 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO)) | 274 | if ((p[0] & 0x80) && (p[2] == SSL2_MT_CLIENT_HELLO)) { |
276 | { | ||
277 | /* | 275 | /* |
278 | * SSLv2 header | 276 | * SSLv2 header |
279 | */ | 277 | */ |
280 | if ((p[3] == 0x00) && (p[4] == 0x02)) | 278 | if ((p[3] == 0x00) && (p[4] == 0x02)) { |
281 | { | 279 | v[0] = p[3]; |
282 | v[0]=p[3]; v[1]=p[4]; | 280 | v[1] = p[4]; |
283 | /* SSLv2 */ | 281 | /* SSLv2 */ |
284 | if (!(s->options & SSL_OP_NO_SSLv2)) | 282 | if (!(s->options & SSL_OP_NO_SSLv2)) |
285 | type=1; | 283 | type = 1; |
286 | } | 284 | } else if (p[3] == SSL3_VERSION_MAJOR) { |
287 | else if (p[3] == SSL3_VERSION_MAJOR) | 285 | v[0] = p[3]; |
288 | { | 286 | v[1] = p[4]; |
289 | v[0]=p[3]; v[1]=p[4]; | ||
290 | /* SSLv3/TLSv1 */ | 287 | /* SSLv3/TLSv1 */ |
291 | if (p[4] >= TLS1_VERSION_MINOR) | 288 | if (p[4] >= TLS1_VERSION_MINOR) { |
292 | { | ||
293 | if (p[4] >= TLS1_2_VERSION_MINOR && | 289 | if (p[4] >= TLS1_2_VERSION_MINOR && |
294 | !(s->options & SSL_OP_NO_TLSv1_2)) | 290 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
295 | { | 291 | s->version = TLS1_2_VERSION; |
296 | s->version=TLS1_2_VERSION; | 292 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
297 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 293 | } else if (p[4] >= TLS1_1_VERSION_MINOR && |
298 | } | 294 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
299 | else if (p[4] >= TLS1_1_VERSION_MINOR && | 295 | s->version = TLS1_1_VERSION; |
300 | !(s->options & SSL_OP_NO_TLSv1_1)) | ||
301 | { | ||
302 | s->version=TLS1_1_VERSION; | ||
303 | /* type=2; */ /* done later to survive restarts */ | 296 | /* type=2; */ /* done later to survive restarts */ |
304 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 297 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
305 | } | 298 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
306 | else if (!(s->options & SSL_OP_NO_TLSv1)) | 299 | s->version = TLS1_VERSION; |
307 | { | ||
308 | s->version=TLS1_VERSION; | ||
309 | /* type=2; */ /* done later to survive restarts */ | 300 | /* type=2; */ /* done later to survive restarts */ |
310 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 301 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
311 | } | 302 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
312 | else if (!(s->options & SSL_OP_NO_SSLv3)) | 303 | s->version = SSL3_VERSION; |
313 | { | ||
314 | s->version=SSL3_VERSION; | ||
315 | /* type=2; */ | 304 | /* type=2; */ |
316 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 305 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
317 | } | 306 | } else if (!(s->options & SSL_OP_NO_SSLv2)) { |
318 | else if (!(s->options & SSL_OP_NO_SSLv2)) | 307 | type = 1; |
319 | { | ||
320 | type=1; | ||
321 | } | ||
322 | } | 308 | } |
323 | else if (!(s->options & SSL_OP_NO_SSLv3)) | 309 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
324 | { | 310 | s->version = SSL3_VERSION; |
325 | s->version=SSL3_VERSION; | ||
326 | /* type=2; */ | 311 | /* type=2; */ |
327 | s->state=SSL23_ST_SR_CLNT_HELLO_B; | 312 | s->state = SSL23_ST_SR_CLNT_HELLO_B; |
328 | } | 313 | } else if (!(s->options & SSL_OP_NO_SSLv2)) |
329 | else if (!(s->options & SSL_OP_NO_SSLv2)) | 314 | type = 1; |
330 | type=1; | ||
331 | 315 | ||
332 | } | ||
333 | } | 316 | } |
334 | else if ((p[0] == SSL3_RT_HANDSHAKE) && | 317 | } else if ((p[0] == SSL3_RT_HANDSHAKE) && |
335 | (p[1] == SSL3_VERSION_MAJOR) && | 318 | (p[1] == SSL3_VERSION_MAJOR) && |
336 | (p[5] == SSL3_MT_CLIENT_HELLO) && | 319 | (p[5] == SSL3_MT_CLIENT_HELLO) && |
337 | ((p[3] == 0 && p[4] < 5 /* silly record length? */) | 320 | ((p[3] == 0 && p[4] < 5 /* silly record length? */) |
338 | || (p[9] >= p[1]))) | 321 | || (p[9] >= p[1]))) { |
339 | { | ||
340 | /* | 322 | /* |
341 | * SSLv3 or tls1 header | 323 | * SSLv3 or tls1 header |
342 | */ | 324 | */ |
343 | 325 | ||
344 | v[0]=p[1]; /* major version (= SSL3_VERSION_MAJOR) */ | 326 | v[0] = p[1]; /* major version (= SSL3_VERSION_MAJOR) */ |
345 | /* We must look at client_version inside the Client Hello message | 327 | /* We must look at client_version inside the Client Hello message |
346 | * to get the correct minor version. | 328 | * to get the correct minor version. |
347 | * However if we have only a pathologically small fragment of the | 329 | * However if we have only a pathologically small fragment of the |
@@ -350,127 +332,108 @@ int ssl23_get_client_hello(SSL *s) | |||
350 | * No known SSL 3.0 client fragments ClientHello like this, | 332 | * No known SSL 3.0 client fragments ClientHello like this, |
351 | * so we simply assume TLS 1.0 to avoid protocol version downgrade | 333 | * so we simply assume TLS 1.0 to avoid protocol version downgrade |
352 | * attacks. */ | 334 | * attacks. */ |
353 | if (p[3] == 0 && p[4] < 6) | 335 | if (p[3] == 0 && p[4] < 6) { |
354 | { | ||
355 | #if 0 | 336 | #if 0 |
356 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_SMALL); | 337 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_TOO_SMALL); |
357 | goto err; | 338 | goto err; |
358 | #else | 339 | #else |
359 | v[1] = TLS1_VERSION_MINOR; | 340 | v[1] = TLS1_VERSION_MINOR; |
360 | #endif | 341 | #endif |
361 | } | 342 | } |
362 | /* if major version number > 3 set minor to a value | 343 | /* if major version number > 3 set minor to a value |
363 | * which will use the highest version 3 we support. | 344 | * which will use the highest version 3 we support. |
364 | * If TLS 2.0 ever appears we will need to revise | 345 | * If TLS 2.0 ever appears we will need to revise |
365 | * this.... | 346 | * this.... |
366 | */ | 347 | */ |
367 | else if (p[9] > SSL3_VERSION_MAJOR) | 348 | else if (p[9] > SSL3_VERSION_MAJOR) |
368 | v[1]=0xff; | 349 | v[1] = 0xff; |
369 | else | 350 | else |
370 | v[1]=p[10]; /* minor version according to client_version */ | 351 | v[1] = p[10]; /* minor version according to client_version */ |
371 | if (v[1] >= TLS1_VERSION_MINOR) | 352 | if (v[1] >= TLS1_VERSION_MINOR) { |
372 | { | ||
373 | if (v[1] >= TLS1_2_VERSION_MINOR && | 353 | if (v[1] >= TLS1_2_VERSION_MINOR && |
374 | !(s->options & SSL_OP_NO_TLSv1_2)) | 354 | !(s->options & SSL_OP_NO_TLSv1_2)) { |
375 | { | 355 | s->version = TLS1_2_VERSION; |
376 | s->version=TLS1_2_VERSION; | 356 | type = 3; |
377 | type=3; | 357 | } else if (v[1] >= TLS1_1_VERSION_MINOR && |
378 | } | 358 | !(s->options & SSL_OP_NO_TLSv1_1)) { |
379 | else if (v[1] >= TLS1_1_VERSION_MINOR && | 359 | s->version = TLS1_1_VERSION; |
380 | !(s->options & SSL_OP_NO_TLSv1_1)) | 360 | type = 3; |
381 | { | 361 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
382 | s->version=TLS1_1_VERSION; | 362 | s->version = TLS1_VERSION; |
383 | type=3; | 363 | type = 3; |
384 | } | 364 | } else if (!(s->options & SSL_OP_NO_SSLv3)) { |
385 | else if (!(s->options & SSL_OP_NO_TLSv1)) | 365 | s->version = SSL3_VERSION; |
386 | { | 366 | type = 3; |
387 | s->version=TLS1_VERSION; | ||
388 | type=3; | ||
389 | } | ||
390 | else if (!(s->options & SSL_OP_NO_SSLv3)) | ||
391 | { | ||
392 | s->version=SSL3_VERSION; | ||
393 | type=3; | ||
394 | } | ||
395 | } | 367 | } |
396 | else | 368 | } else { |
397 | { | ||
398 | /* client requests SSL 3.0 */ | 369 | /* client requests SSL 3.0 */ |
399 | if (!(s->options & SSL_OP_NO_SSLv3)) | 370 | if (!(s->options & SSL_OP_NO_SSLv3)) { |
400 | { | 371 | s->version = SSL3_VERSION; |
401 | s->version=SSL3_VERSION; | 372 | type = 3; |
402 | type=3; | 373 | } else if (!(s->options & SSL_OP_NO_TLSv1)) { |
403 | } | ||
404 | else if (!(s->options & SSL_OP_NO_TLSv1)) | ||
405 | { | ||
406 | /* we won't be able to use TLS of course, | 374 | /* we won't be able to use TLS of course, |
407 | * but this will send an appropriate alert */ | 375 | * but this will send an appropriate alert */ |
408 | s->version=TLS1_VERSION; | 376 | s->version = TLS1_VERSION; |
409 | type=3; | 377 | type = 3; |
410 | } | ||
411 | } | 378 | } |
412 | } | 379 | } |
413 | else if ((strncmp("GET ", (char *)p,4) == 0) || | 380 | } |
414 | (strncmp("POST ",(char *)p,5) == 0) || | 381 | else if ((strncmp("GET ", (char *)p, 4) == 0) || |
415 | (strncmp("HEAD ",(char *)p,5) == 0) || | 382 | (strncmp("POST ",(char *)p, 5) == 0) || |
416 | (strncmp("PUT ", (char *)p,4) == 0)) | 383 | (strncmp("HEAD ",(char *)p, 5) == 0) || |
417 | { | 384 | (strncmp("PUT ", (char *)p, 4) == 0)) { |
418 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTP_REQUEST); | 385 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_HTTP_REQUEST); |
419 | goto err; | 386 | goto err; |
420 | } | 387 | } else if (strncmp("CONNECT", (char *)p, 7) == 0) { |
421 | else if (strncmp("CONNECT",(char *)p,7) == 0) | 388 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_HTTPS_PROXY_REQUEST); |
422 | { | ||
423 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_HTTPS_PROXY_REQUEST); | ||
424 | goto err; | 389 | goto err; |
425 | } | ||
426 | } | 390 | } |
391 | } | ||
427 | 392 | ||
428 | #ifdef OPENSSL_FIPS | 393 | #ifdef OPENSSL_FIPS |
429 | if (FIPS_mode() && (s->version < TLS1_VERSION)) | 394 | if (FIPS_mode() && (s->version < TLS1_VERSION)) { |
430 | { | ||
431 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, | 395 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, |
432 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); | 396 | SSL_R_ONLY_TLS_ALLOWED_IN_FIPS_MODE); |
433 | goto err; | 397 | goto err; |
434 | } | 398 | } |
435 | #endif | 399 | #endif |
436 | 400 | ||
437 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) | 401 | if (s->state == SSL23_ST_SR_CLNT_HELLO_B) { |
438 | { | ||
439 | /* we have SSLv3/TLSv1 in an SSLv2 header | 402 | /* we have SSLv3/TLSv1 in an SSLv2 header |
440 | * (other cases skip this state) */ | 403 | * (other cases skip this state) */ |
441 | 404 | ||
442 | type=2; | 405 | type = 2; |
443 | p=s->packet; | 406 | p = s->packet; |
444 | v[0] = p[3]; /* == SSL3_VERSION_MAJOR */ | 407 | v[0] = p[3]; /* == SSL3_VERSION_MAJOR */ |
445 | v[1] = p[4]; | 408 | v[1] = p[4]; |
446 | 409 | ||
447 | n=((p[0]&0x7f)<<8)|p[1]; | 410 | n = ((p[0] & 0x7f) << 8) | p[1]; |
448 | if (n > (1024*4)) | 411 | if (n > (1024 * 4)) { |
449 | { | 412 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_TOO_LARGE); |
450 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_TOO_LARGE); | ||
451 | goto err; | 413 | goto err; |
452 | } | 414 | } |
453 | 415 | ||
454 | j=ssl23_read_bytes(s,n+2); | 416 | j = ssl23_read_bytes(s, n + 2); |
455 | if (j <= 0) return(j); | 417 | if (j <= 0) |
418 | return (j); | ||
456 | 419 | ||
457 | ssl3_finish_mac(s, s->packet+2, s->packet_length-2); | 420 | ssl3_finish_mac(s, s->packet + 2, s->packet_length - 2); |
458 | if (s->msg_callback) | 421 | if (s->msg_callback) |
459 | s->msg_callback(0, SSL2_VERSION, 0, s->packet+2, s->packet_length-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ | 422 | s->msg_callback(0, SSL2_VERSION, 0, s->packet + 2, s->packet_length-2, s, s->msg_callback_arg); /* CLIENT-HELLO */ |
460 | 423 | ||
461 | p=s->packet; | 424 | p = s->packet; |
462 | p+=5; | 425 | p += 5; |
463 | n2s(p,csl); | 426 | n2s(p, csl); |
464 | n2s(p,sil); | 427 | n2s(p, sil); |
465 | n2s(p,cl); | 428 | n2s(p, cl); |
466 | d=(unsigned char *)s->init_buf->data; | 429 | d = (unsigned char *)s->init_buf->data; |
467 | if ((csl+sil+cl+11) != s->packet_length) /* We can't have TLS extensions in SSL 2.0 format | 430 | if ((csl + sil + cl + 11) != s->packet_length) /* We can't have TLS extensions in SSL 2.0 format |
468 | * Client Hello, can we? Error condition should be | 431 | * Client Hello, can we ? Error condition should be |
469 | * '>' otherweise */ | 432 | * '>' otherweise */ |
470 | { | 433 | { |
471 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_RECORD_LENGTH_MISMATCH); | 434 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_RECORD_LENGTH_MISMATCH); |
472 | goto err; | 435 | goto err; |
473 | } | 436 | } |
474 | 437 | ||
475 | /* record header: msg_type ... */ | 438 | /* record header: msg_type ... */ |
476 | *(d++) = SSL3_MT_CLIENT_HELLO; | 439 | *(d++) = SSL3_MT_CLIENT_HELLO; |
@@ -484,130 +447,122 @@ int ssl23_get_client_hello(SSL *s) | |||
484 | 447 | ||
485 | /* lets populate the random area */ | 448 | /* lets populate the random area */ |
486 | /* get the challenge_length */ | 449 | /* get the challenge_length */ |
487 | i=(cl > SSL3_RANDOM_SIZE)?SSL3_RANDOM_SIZE:cl; | 450 | i = (cl > SSL3_RANDOM_SIZE) ? SSL3_RANDOM_SIZE : cl; |
488 | memset(d,0,SSL3_RANDOM_SIZE); | 451 | memset(d, 0, SSL3_RANDOM_SIZE); |
489 | memcpy(&(d[SSL3_RANDOM_SIZE-i]),&(p[csl+sil]),i); | 452 | memcpy(&(d[SSL3_RANDOM_SIZE - i]), &(p[csl + sil]), i); |
490 | d+=SSL3_RANDOM_SIZE; | 453 | d += SSL3_RANDOM_SIZE; |
491 | 454 | ||
492 | /* no session-id reuse */ | 455 | /* no session-id reuse */ |
493 | *(d++)=0; | 456 | *(d++) = 0; |
494 | 457 | ||
495 | /* ciphers */ | 458 | /* ciphers */ |
496 | j=0; | 459 | j = 0; |
497 | dd=d; | 460 | dd = d; |
498 | d+=2; | 461 | d += 2; |
499 | for (i=0; i<csl; i+=3) | 462 | for (i = 0; i < csl; i += 3) { |
500 | { | 463 | if (p[i] != 0) |
501 | if (p[i] != 0) continue; | 464 | continue; |
502 | *(d++)=p[i+1]; | 465 | *(d++) = p[i + 1]; |
503 | *(d++)=p[i+2]; | 466 | *(d++) = p[i + 2]; |
504 | j+=2; | 467 | j += 2; |
505 | } | 468 | } |
506 | s2n(j,dd); | 469 | s2n(j, dd); |
507 | 470 | ||
508 | /* COMPRESSION */ | 471 | /* COMPRESSION */ |
509 | *(d++)=1; | 472 | *(d++) = 1; |
510 | *(d++)=0; | 473 | *(d++) = 0; |
511 | 474 | ||
512 | #if 0 | 475 | #if 0 |
513 | /* copy any remaining data with may be extensions */ | 476 | /* copy any remaining data with may be extensions */ |
514 | p = p+csl+sil+cl; | 477 | p = p + csl + sil + cl; |
515 | while (p < s->packet+s->packet_length) | 478 | while (p < s->packet + s->packet_length) { |
516 | { | ||
517 | *(d++)=*(p++); | 479 | *(d++)=*(p++); |
518 | } | 480 | } |
519 | #endif | 481 | #endif |
520 | 482 | ||
521 | i = (d-(unsigned char *)s->init_buf->data) - 4; | 483 | i = (d - (unsigned char *)s->init_buf->data) - 4; |
522 | l2n3((long)i, d_len); | 484 | l2n3((long)i, d_len); |
523 | 485 | ||
524 | /* get the data reused from the init_buf */ | 486 | /* get the data reused from the init_buf */ |
525 | s->s3->tmp.reuse_message=1; | 487 | s->s3->tmp.reuse_message = 1; |
526 | s->s3->tmp.message_type=SSL3_MT_CLIENT_HELLO; | 488 | s->s3->tmp.message_type = SSL3_MT_CLIENT_HELLO; |
527 | s->s3->tmp.message_size=i; | 489 | s->s3->tmp.message_size = i; |
528 | } | 490 | } |
529 | 491 | ||
530 | /* imaginary new state (for program structure): */ | 492 | /* imaginary new state (for program structure): */ |
531 | /* s->state = SSL23_SR_CLNT_HELLO_C */ | 493 | /* s->state = SSL23_SR_CLNT_HELLO_C */ |
532 | 494 | ||
533 | if (type == 1) | 495 | if (type == 1) { |
534 | { | ||
535 | #ifdef OPENSSL_NO_SSL2 | 496 | #ifdef OPENSSL_NO_SSL2 |
536 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNSUPPORTED_PROTOCOL); | 497 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_UNSUPPORTED_PROTOCOL); |
537 | goto err; | 498 | goto err; |
538 | #else | 499 | #else |
539 | /* we are talking sslv2 */ | 500 | /* we are talking sslv2 */ |
540 | /* we need to clean up the SSLv3/TLSv1 setup and put in the | 501 | /* we need to clean up the SSLv3/TLSv1 setup and put in the |
541 | * sslv2 stuff. */ | 502 | * sslv2 stuff. */ |
542 | 503 | ||
543 | if (s->s2 == NULL) | 504 | if (s->s2 == NULL) { |
544 | { | ||
545 | if (!ssl2_new(s)) | 505 | if (!ssl2_new(s)) |
546 | goto err; | 506 | goto err; |
547 | } | 507 | } else |
548 | else | ||
549 | ssl2_clear(s); | 508 | ssl2_clear(s); |
550 | 509 | ||
551 | if (s->s3 != NULL) ssl3_free(s); | 510 | if (s->s3 != NULL) |
511 | ssl3_free(s); | ||
552 | 512 | ||
553 | if (!BUF_MEM_grow_clean(s->init_buf, | 513 | if (!BUF_MEM_grow_clean(s->init_buf, |
554 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) | 514 | SSL2_MAX_RECORD_LENGTH_3_BYTE_HEADER)) { |
555 | { | ||
556 | goto err; | 515 | goto err; |
557 | } | 516 | } |
558 | 517 | ||
559 | s->state=SSL2_ST_GET_CLIENT_HELLO_A; | 518 | s->state = SSL2_ST_GET_CLIENT_HELLO_A; |
560 | if (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3) | 519 | if (s->options & SSL_OP_NO_TLSv1 && s->options & SSL_OP_NO_SSLv3) |
561 | s->s2->ssl2_rollback=0; | 520 | s->s2->ssl2_rollback = 0; |
562 | else | 521 | else |
563 | /* reject SSL 2.0 session if client supports SSL 3.0 or TLS 1.0 | 522 | /* reject SSL 2.0 session if client supports SSL 3.0 or TLS 1.0 |
564 | * (SSL 3.0 draft/RFC 2246, App. E.2) */ | 523 | * (SSL 3.0 draft/RFC 2246, App. E.2) */ |
565 | s->s2->ssl2_rollback=1; | 524 | s->s2->ssl2_rollback = 1; |
566 | 525 | ||
567 | /* setup the n bytes we have read so we get them from | 526 | /* setup the n bytes we have read so we get them from |
568 | * the sslv2 buffer */ | 527 | * the sslv2 buffer */ |
569 | s->rstate=SSL_ST_READ_HEADER; | 528 | s->rstate = SSL_ST_READ_HEADER; |
570 | s->packet_length=n; | 529 | s->packet_length = n; |
571 | s->packet= &(s->s2->rbuf[0]); | 530 | s->packet = &(s->s2->rbuf[0]); |
572 | memcpy(s->packet,buf,n); | 531 | memcpy(s->packet, buf, n); |
573 | s->s2->rbuf_left=n; | 532 | s->s2->rbuf_left = n; |
574 | s->s2->rbuf_offs=0; | 533 | s->s2->rbuf_offs = 0; |
575 | 534 | ||
576 | s->method=SSLv2_server_method(); | 535 | s->method = SSLv2_server_method(); |
577 | s->handshake_func=s->method->ssl_accept; | 536 | s->handshake_func = s->method->ssl_accept; |
578 | #endif | 537 | #endif |
579 | } | 538 | } |
580 | 539 | ||
581 | if ((type == 2) || (type == 3)) | 540 | if ((type == 2) || (type == 3)) { |
582 | { | ||
583 | /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */ | 541 | /* we have SSLv3/TLSv1 (type 2: SSL2 style, type 3: SSL3/TLS style) */ |
584 | 542 | ||
585 | if (!ssl_init_wbio_buffer(s,1)) goto err; | 543 | if (!ssl_init_wbio_buffer(s, 1)) goto err; |
586 | 544 | ||
587 | /* we are in this state */ | 545 | /* we are in this state */ |
588 | s->state=SSL3_ST_SR_CLNT_HELLO_A; | 546 | s->state = SSL3_ST_SR_CLNT_HELLO_A; |
589 | 547 | ||
590 | if (type == 3) | 548 | if (type == 3) { |
591 | { | ||
592 | /* put the 'n' bytes we have read into the input buffer | 549 | /* put the 'n' bytes we have read into the input buffer |
593 | * for SSLv3 */ | 550 | * for SSLv3 */ |
594 | s->rstate=SSL_ST_READ_HEADER; | 551 | s->rstate = SSL_ST_READ_HEADER; |
595 | s->packet_length=n; | 552 | s->packet_length = n; |
596 | if (s->s3->rbuf.buf == NULL) | 553 | if (s->s3->rbuf.buf == NULL) |
597 | if (!ssl3_setup_read_buffer(s)) | 554 | if (!ssl3_setup_read_buffer(s)) |
598 | goto err; | 555 | goto err; |
599 | 556 | ||
600 | s->packet= &(s->s3->rbuf.buf[0]); | 557 | s->packet = &(s->s3->rbuf.buf[0]); |
601 | memcpy(s->packet,buf,n); | 558 | memcpy(s->packet, buf, n); |
602 | s->s3->rbuf.left=n; | 559 | s->s3->rbuf.left = n; |
603 | s->s3->rbuf.offset=0; | 560 | s->s3->rbuf.offset = 0; |
604 | } | 561 | } else { |
605 | else | 562 | s->packet_length = 0; |
606 | { | 563 | s->s3->rbuf.left = 0; |
607 | s->packet_length=0; | 564 | s->s3->rbuf.offset = 0; |
608 | s->s3->rbuf.left=0; | 565 | } |
609 | s->s3->rbuf.offset=0; | ||
610 | } | ||
611 | if (s->version == TLS1_2_VERSION) | 566 | if (s->version == TLS1_2_VERSION) |
612 | s->method = TLSv1_2_server_method(); | 567 | s->method = TLSv1_2_server_method(); |
613 | else if (s->version == TLS1_1_VERSION) | 568 | else if (s->version == TLS1_1_VERSION) |
@@ -617,22 +572,23 @@ int ssl23_get_client_hello(SSL *s) | |||
617 | else | 572 | else |
618 | s->method = SSLv3_server_method(); | 573 | s->method = SSLv3_server_method(); |
619 | #if 0 /* ssl3_get_client_hello does this */ | 574 | #if 0 /* ssl3_get_client_hello does this */ |
620 | s->client_version=(v[0]<<8)|v[1]; | 575 | s->client_version = (v[0]<<8)|v[1]; |
621 | #endif | 576 | #endif |
622 | s->handshake_func=s->method->ssl_accept; | 577 | s->handshake_func = s->method->ssl_accept; |
623 | } | 578 | } |
624 | 579 | ||
625 | if ((type < 1) || (type > 3)) | 580 | if ((type < 1) || (type > 3)) { |
626 | { | ||
627 | /* bad, very bad */ | 581 | /* bad, very bad */ |
628 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO,SSL_R_UNKNOWN_PROTOCOL); | 582 | SSLerr(SSL_F_SSL23_GET_CLIENT_HELLO, SSL_R_UNKNOWN_PROTOCOL); |
629 | goto err; | 583 | goto err; |
630 | } | 584 | } |
631 | s->init_num=0; | 585 | s->init_num = 0; |
632 | 586 | ||
633 | if (buf != buf_space) OPENSSL_free(buf); | 587 | if (buf != buf_space) |
634 | return(SSL_accept(s)); | 588 | OPENSSL_free(buf); |
589 | return (SSL_accept(s)); | ||
635 | err: | 590 | err: |
636 | if (buf != buf_space) OPENSSL_free(buf); | 591 | if (buf != buf_space) |
637 | return(-1); | 592 | OPENSSL_free(buf); |
638 | } | 593 | return (-1); |
594 | } | ||