diff options
Diffstat (limited to 'src/lib/libssl/s3_both.c')
| -rw-r--r-- | src/lib/libssl/s3_both.c | 164 |
1 files changed, 142 insertions, 22 deletions
diff --git a/src/lib/libssl/s3_both.c b/src/lib/libssl/s3_both.c index f3f27715d5..03e0c38770 100644 --- a/src/lib/libssl/s3_both.c +++ b/src/lib/libssl/s3_both.c | |||
| @@ -55,7 +55,61 @@ | |||
| 55 | * copied and put under another distribution licence | 55 | * copied and put under another distribution licence |
| 56 | * [including the GNU Public Licence.] | 56 | * [including the GNU Public Licence.] |
| 57 | */ | 57 | */ |
| 58 | /* ==================================================================== | ||
| 59 | * Copyright (c) 1998-2000 The OpenSSL Project. All rights reserved. | ||
| 60 | * | ||
| 61 | * Redistribution and use in source and binary forms, with or without | ||
| 62 | * modification, are permitted provided that the following conditions | ||
| 63 | * are met: | ||
| 64 | * | ||
| 65 | * 1. Redistributions of source code must retain the above copyright | ||
| 66 | * notice, this list of conditions and the following disclaimer. | ||
| 67 | * | ||
| 68 | * 2. Redistributions in binary form must reproduce the above copyright | ||
| 69 | * notice, this list of conditions and the following disclaimer in | ||
| 70 | * the documentation and/or other materials provided with the | ||
| 71 | * distribution. | ||
| 72 | * | ||
| 73 | * 3. All advertising materials mentioning features or use of this | ||
| 74 | * software must display the following acknowledgment: | ||
| 75 | * "This product includes software developed by the OpenSSL Project | ||
| 76 | * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" | ||
| 77 | * | ||
| 78 | * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to | ||
| 79 | * endorse or promote products derived from this software without | ||
| 80 | * prior written permission. For written permission, please contact | ||
| 81 | * openssl-core@openssl.org. | ||
| 82 | * | ||
| 83 | * 5. Products derived from this software may not be called "OpenSSL" | ||
| 84 | * nor may "OpenSSL" appear in their names without prior written | ||
| 85 | * permission of the OpenSSL Project. | ||
| 86 | * | ||
| 87 | * 6. Redistributions of any form whatsoever must retain the following | ||
| 88 | * acknowledgment: | ||
| 89 | * "This product includes software developed by the OpenSSL Project | ||
| 90 | * for use in the OpenSSL Toolkit (http://www.openssl.org/)" | ||
| 91 | * | ||
| 92 | * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY | ||
| 93 | * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 94 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
| 95 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR | ||
| 96 | * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 97 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | ||
| 98 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
| 99 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||
| 100 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | ||
| 101 | * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
| 102 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED | ||
| 103 | * OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 104 | * ==================================================================== | ||
| 105 | * | ||
| 106 | * This product includes cryptographic software written by Eric Young | ||
| 107 | * (eay@cryptsoft.com). This product includes software written by Tim | ||
| 108 | * Hudson (tjh@cryptsoft.com). | ||
| 109 | * | ||
| 110 | */ | ||
| 58 | 111 | ||
| 112 | #include <string.h> | ||
| 59 | #include <stdio.h> | 113 | #include <stdio.h> |
| 60 | #include <openssl/buffer.h> | 114 | #include <openssl/buffer.h> |
| 61 | #include <openssl/rand.h> | 115 | #include <openssl/rand.h> |
| @@ -64,8 +118,27 @@ | |||
| 64 | #include <openssl/x509.h> | 118 | #include <openssl/x509.h> |
| 65 | #include "ssl_locl.h" | 119 | #include "ssl_locl.h" |
| 66 | 120 | ||
| 67 | int ssl3_send_finished(SSL *s, int a, int b, unsigned char *sender, | 121 | /* send s->init_buf in records of type 'type' */ |
| 68 | int slen) | 122 | int ssl3_do_write(SSL *s, int type) |
| 123 | { | ||
| 124 | int ret; | ||
| 125 | |||
| 126 | ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off], | ||
| 127 | s->init_num); | ||
| 128 | if (ret < 0) return(-1); | ||
| 129 | if (type == SSL3_RT_HANDSHAKE) | ||
| 130 | /* should not be done for 'Hello Request's, but in that case | ||
| 131 | * we'll ignore the result anyway */ | ||
| 132 | ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret); | ||
| 133 | |||
| 134 | if (ret == s->init_num) | ||
| 135 | return(1); | ||
| 136 | s->init_off+=ret; | ||
| 137 | s->init_num-=ret; | ||
| 138 | return(0); | ||
| 139 | } | ||
| 140 | |||
| 141 | int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen) | ||
| 69 | { | 142 | { |
| 70 | unsigned char *p,*d; | 143 | unsigned char *p,*d; |
| 71 | int i; | 144 | int i; |
| @@ -79,7 +152,9 @@ int ssl3_send_finished(SSL *s, int a, int b, unsigned char *sender, | |||
| 79 | i=s->method->ssl3_enc->final_finish_mac(s, | 152 | i=s->method->ssl3_enc->final_finish_mac(s, |
| 80 | &(s->s3->finish_dgst1), | 153 | &(s->s3->finish_dgst1), |
| 81 | &(s->s3->finish_dgst2), | 154 | &(s->s3->finish_dgst2), |
| 82 | sender,slen,p); | 155 | sender,slen,s->s3->tmp.finish_md); |
| 156 | s->s3->tmp.finish_md_len = i; | ||
| 157 | memcpy(p, s->s3->tmp.finish_md, i); | ||
| 83 | p+=i; | 158 | p+=i; |
| 84 | l=i; | 159 | l=i; |
| 85 | 160 | ||
| @@ -109,7 +184,7 @@ int ssl3_get_finished(SSL *s, int a, int b) | |||
| 109 | unsigned char *p; | 184 | unsigned char *p; |
| 110 | 185 | ||
| 111 | /* the mac has already been generated when we received the | 186 | /* the mac has already been generated when we received the |
| 112 | * change cipher spec message and is in s->s3->tmp.in_dgst[12] | 187 | * change cipher spec message and is in s->s3->tmp.peer_finish_md |
| 113 | */ | 188 | */ |
| 114 | 189 | ||
| 115 | n=ssl3_get_message(s, | 190 | n=ssl3_get_message(s, |
| @@ -121,7 +196,7 @@ int ssl3_get_finished(SSL *s, int a, int b) | |||
| 121 | 196 | ||
| 122 | if (!ok) return((int)n); | 197 | if (!ok) return((int)n); |
| 123 | 198 | ||
| 124 | /* If this occurs if we has missed a message */ | 199 | /* If this occurs, we have missed a message */ |
| 125 | if (!s->s3->change_cipher_spec) | 200 | if (!s->s3->change_cipher_spec) |
| 126 | { | 201 | { |
| 127 | al=SSL_AD_UNEXPECTED_MESSAGE; | 202 | al=SSL_AD_UNEXPECTED_MESSAGE; |
| @@ -130,9 +205,8 @@ int ssl3_get_finished(SSL *s, int a, int b) | |||
| 130 | } | 205 | } |
| 131 | s->s3->change_cipher_spec=0; | 206 | s->s3->change_cipher_spec=0; |
| 132 | 207 | ||
| 133 | p=(unsigned char *)s->init_buf->data; | 208 | p = (unsigned char *)s->init_buf->data; |
| 134 | 209 | i = s->s3->tmp.peer_finish_md_len; | |
| 135 | i=s->method->ssl3_enc->finish_mac_length; | ||
| 136 | 210 | ||
| 137 | if (i != n) | 211 | if (i != n) |
| 138 | { | 212 | { |
| @@ -141,7 +215,7 @@ int ssl3_get_finished(SSL *s, int a, int b) | |||
| 141 | goto f_err; | 215 | goto f_err; |
| 142 | } | 216 | } |
| 143 | 217 | ||
| 144 | if (memcmp( p, (char *)&(s->s3->tmp.finish_md[0]),i) != 0) | 218 | if (memcmp(p, s->s3->tmp.peer_finish_md, i) != 0) |
| 145 | { | 219 | { |
| 146 | al=SSL_AD_DECRYPT_ERROR; | 220 | al=SSL_AD_DECRYPT_ERROR; |
| 147 | SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED); | 221 | SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED); |
| @@ -255,6 +329,11 @@ unsigned long ssl3_output_cert_chain(SSL *s, X509 *x) | |||
| 255 | return(l); | 329 | return(l); |
| 256 | } | 330 | } |
| 257 | 331 | ||
| 332 | /* Obtain handshake message of message type 'mt' (any if mt == -1), | ||
| 333 | * maximum acceptable body length 'max'. | ||
| 334 | * The first four bytes (msg_type and length) are read in state 'st1', | ||
| 335 | * the body is read in state 'stn'. | ||
| 336 | */ | ||
| 258 | long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | 337 | long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) |
| 259 | { | 338 | { |
| 260 | unsigned char *p; | 339 | unsigned char *p; |
| @@ -277,15 +356,38 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | |||
| 277 | 356 | ||
| 278 | p=(unsigned char *)s->init_buf->data; | 357 | p=(unsigned char *)s->init_buf->data; |
| 279 | 358 | ||
| 280 | if (s->state == st1) | 359 | if (s->state == st1) /* s->init_num < 4 */ |
| 281 | { | 360 | { |
| 282 | i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num], | 361 | int skip_message; |
| 283 | 4-s->init_num); | 362 | |
| 284 | if (i < (4-s->init_num)) | 363 | do |
| 285 | { | 364 | { |
| 286 | *ok=0; | 365 | while (s->init_num < 4) |
| 287 | return(ssl3_part_read(s,i)); | 366 | { |
| 367 | i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num], | ||
| 368 | 4 - s->init_num); | ||
| 369 | if (i <= 0) | ||
| 370 | { | ||
| 371 | s->rwstate=SSL_READING; | ||
| 372 | *ok = 0; | ||
| 373 | return i; | ||
| 374 | } | ||
| 375 | s->init_num+=i; | ||
| 376 | } | ||
| 377 | |||
| 378 | skip_message = 0; | ||
| 379 | if (!s->server) | ||
| 380 | if (p[0] == SSL3_MT_HELLO_REQUEST) | ||
| 381 | /* The server may always send 'Hello Request' messages -- | ||
| 382 | * we are doing a handshake anyway now, so ignore them | ||
| 383 | * if their format is correct. Does not count for | ||
| 384 | * 'Finished' MAC. */ | ||
| 385 | if (p[1] == 0 && p[2] == 0 &&p[3] == 0) | ||
| 386 | skip_message = 1; | ||
| 288 | } | 387 | } |
| 388 | while (skip_message); | ||
| 389 | |||
| 390 | /* s->init_num == 4 */ | ||
| 289 | 391 | ||
| 290 | if ((mt >= 0) && (*p != mt)) | 392 | if ((mt >= 0) && (*p != mt)) |
| 291 | { | 393 | { |
| @@ -293,6 +395,20 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | |||
| 293 | SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE); | 395 | SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE); |
| 294 | goto f_err; | 396 | goto f_err; |
| 295 | } | 397 | } |
| 398 | if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) && | ||
| 399 | (st1 == SSL3_ST_SR_CERT_A) && | ||
| 400 | (stn == SSL3_ST_SR_CERT_B)) | ||
| 401 | { | ||
| 402 | /* At this point we have got an MS SGC second client | ||
| 403 | * hello (maybe we should always allow the client to | ||
| 404 | * start a new handshake?). We need to restart the mac. | ||
| 405 | * Don't increment {num,total}_renegotiations because | ||
| 406 | * we have not completed the handshake. */ | ||
| 407 | ssl3_init_finished_mac(s); | ||
| 408 | } | ||
| 409 | |||
| 410 | ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, 4); | ||
| 411 | |||
| 296 | s->s3->tmp.message_type= *(p++); | 412 | s->s3->tmp.message_type= *(p++); |
| 297 | 413 | ||
| 298 | n2l3(p,l); | 414 | n2l3(p,l); |
| @@ -316,17 +432,21 @@ long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok) | |||
| 316 | /* next state (stn) */ | 432 | /* next state (stn) */ |
| 317 | p=(unsigned char *)s->init_buf->data; | 433 | p=(unsigned char *)s->init_buf->data; |
| 318 | n=s->s3->tmp.message_size; | 434 | n=s->s3->tmp.message_size; |
| 319 | if (n > 0) | 435 | while (n > 0) |
| 320 | { | 436 | { |
| 321 | i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n); | 437 | i=ssl3_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n); |
| 322 | if (i != (int)n) | 438 | if (i <= 0) |
| 323 | { | 439 | { |
| 324 | *ok=0; | 440 | s->rwstate=SSL_READING; |
| 325 | return(ssl3_part_read(s,i)); | 441 | *ok = 0; |
| 442 | return i; | ||
| 326 | } | 443 | } |
| 444 | s->init_num += i; | ||
| 445 | n -= i; | ||
| 327 | } | 446 | } |
| 447 | ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num); | ||
| 328 | *ok=1; | 448 | *ok=1; |
| 329 | return(n); | 449 | return s->init_num; |
| 330 | f_err: | 450 | f_err: |
| 331 | ssl3_send_alert(s,SSL3_AL_FATAL,al); | 451 | ssl3_send_alert(s,SSL3_AL_FATAL,al); |
| 332 | err: | 452 | err: |
| @@ -447,7 +567,7 @@ int ssl3_setup_buffers(SSL *s) | |||
| 447 | extra=SSL3_RT_MAX_EXTRA; | 567 | extra=SSL3_RT_MAX_EXTRA; |
| 448 | else | 568 | else |
| 449 | extra=0; | 569 | extra=0; |
| 450 | if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE+extra)) | 570 | if ((p=Malloc(SSL3_RT_MAX_PACKET_SIZE+extra)) |
| 451 | == NULL) | 571 | == NULL) |
| 452 | goto err; | 572 | goto err; |
| 453 | s->s3->rbuf.buf=p; | 573 | s->s3->rbuf.buf=p; |
| @@ -455,7 +575,7 @@ int ssl3_setup_buffers(SSL *s) | |||
| 455 | 575 | ||
| 456 | if (s->s3->wbuf.buf == NULL) | 576 | if (s->s3->wbuf.buf == NULL) |
| 457 | { | 577 | { |
| 458 | if ((p=(unsigned char *)Malloc(SSL3_RT_MAX_PACKET_SIZE)) | 578 | if ((p=Malloc(SSL3_RT_MAX_PACKET_SIZE)) |
| 459 | == NULL) | 579 | == NULL) |
| 460 | goto err; | 580 | goto err; |
| 461 | s->s3->wbuf.buf=p; | 581 | s->s3->wbuf.buf=p; |
