diff options
Diffstat (limited to 'src/lib/libssl/s3_pkt.c')
-rw-r--r-- | src/lib/libssl/s3_pkt.c | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/src/lib/libssl/s3_pkt.c b/src/lib/libssl/s3_pkt.c index cb0b12b400..44c7c143fe 100644 --- a/src/lib/libssl/s3_pkt.c +++ b/src/lib/libssl/s3_pkt.c | |||
@@ -118,15 +118,9 @@ | |||
118 | 118 | ||
119 | static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, | 119 | static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, |
120 | unsigned int len, int create_empty_fragment); | 120 | unsigned int len, int create_empty_fragment); |
121 | static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, | ||
122 | unsigned int len); | ||
123 | static int ssl3_get_record(SSL *s); | 121 | static int ssl3_get_record(SSL *s); |
124 | static int do_compress(SSL *ssl); | ||
125 | static int do_uncompress(SSL *ssl); | ||
126 | static int do_change_cipher_spec(SSL *ssl); | ||
127 | 122 | ||
128 | /* used only by ssl3_get_record */ | 123 | int ssl3_read_n(SSL *s, int n, int max, int extend) |
129 | static int ssl3_read_n(SSL *s, int n, int max, int extend) | ||
130 | { | 124 | { |
131 | /* If extend == 0, obtain new n-byte packet; if extend == 1, increase | 125 | /* If extend == 0, obtain new n-byte packet; if extend == 1, increase |
132 | * packet by another n bytes. | 126 | * packet by another n bytes. |
@@ -147,6 +141,14 @@ static int ssl3_read_n(SSL *s, int n, int max, int extend) | |||
147 | /* ... now we can act as if 'extend' was set */ | 141 | /* ... now we can act as if 'extend' was set */ |
148 | } | 142 | } |
149 | 143 | ||
144 | /* extend reads should not span multiple packets for DTLS */ | ||
145 | if ( SSL_version(s) == DTLS1_VERSION && | ||
146 | extend) | ||
147 | { | ||
148 | if ( s->s3->rbuf.left > 0 && n > s->s3->rbuf.left) | ||
149 | n = s->s3->rbuf.left; | ||
150 | } | ||
151 | |||
150 | /* if there is enough in the buffer from a previous read, take some */ | 152 | /* if there is enough in the buffer from a previous read, take some */ |
151 | if (s->s3->rbuf.left >= (int)n) | 153 | if (s->s3->rbuf.left >= (int)n) |
152 | { | 154 | { |
@@ -275,11 +277,7 @@ again: | |||
275 | n2s(p,rr->length); | 277 | n2s(p,rr->length); |
276 | 278 | ||
277 | /* Lets check version */ | 279 | /* Lets check version */ |
278 | if (s->first_packet) | 280 | if (!s->first_packet) |
279 | { | ||
280 | s->first_packet=0; | ||
281 | } | ||
282 | else | ||
283 | { | 281 | { |
284 | if (version != s->version) | 282 | if (version != s->version) |
285 | { | 283 | { |
@@ -434,7 +432,7 @@ printf("\n"); | |||
434 | SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG); | 432 | SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_COMPRESSED_LENGTH_TOO_LONG); |
435 | goto f_err; | 433 | goto f_err; |
436 | } | 434 | } |
437 | if (!do_uncompress(s)) | 435 | if (!ssl3_do_uncompress(s)) |
438 | { | 436 | { |
439 | al=SSL_AD_DECOMPRESSION_FAILURE; | 437 | al=SSL_AD_DECOMPRESSION_FAILURE; |
440 | SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_DECOMPRESSION); | 438 | SSLerr(SSL_F_SSL3_GET_RECORD,SSL_R_BAD_DECOMPRESSION); |
@@ -472,8 +470,9 @@ err: | |||
472 | return(ret); | 470 | return(ret); |
473 | } | 471 | } |
474 | 472 | ||
475 | static int do_uncompress(SSL *ssl) | 473 | int ssl3_do_uncompress(SSL *ssl) |
476 | { | 474 | { |
475 | #ifndef OPENSSL_NO_COMP | ||
477 | int i; | 476 | int i; |
478 | SSL3_RECORD *rr; | 477 | SSL3_RECORD *rr; |
479 | 478 | ||
@@ -485,12 +484,13 @@ static int do_uncompress(SSL *ssl) | |||
485 | else | 484 | else |
486 | rr->length=i; | 485 | rr->length=i; |
487 | rr->data=rr->comp; | 486 | rr->data=rr->comp; |
488 | 487 | #endif | |
489 | return(1); | 488 | return(1); |
490 | } | 489 | } |
491 | 490 | ||
492 | static int do_compress(SSL *ssl) | 491 | int ssl3_do_compress(SSL *ssl) |
493 | { | 492 | { |
493 | #ifndef OPENSSL_NO_COMP | ||
494 | int i; | 494 | int i; |
495 | SSL3_RECORD *wr; | 495 | SSL3_RECORD *wr; |
496 | 496 | ||
@@ -504,6 +504,7 @@ static int do_compress(SSL *ssl) | |||
504 | wr->length=i; | 504 | wr->length=i; |
505 | 505 | ||
506 | wr->input=wr->data; | 506 | wr->input=wr->data; |
507 | #endif | ||
507 | return(1); | 508 | return(1); |
508 | } | 509 | } |
509 | 510 | ||
@@ -580,7 +581,7 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, | |||
580 | /* If we have an alert to send, lets send it */ | 581 | /* If we have an alert to send, lets send it */ |
581 | if (s->s3->alert_dispatch) | 582 | if (s->s3->alert_dispatch) |
582 | { | 583 | { |
583 | i=ssl3_dispatch_alert(s); | 584 | i=s->method->ssl_dispatch_alert(s); |
584 | if (i <= 0) | 585 | if (i <= 0) |
585 | return(i); | 586 | return(i); |
586 | /* if it went, fall through and send more stuff */ | 587 | /* if it went, fall through and send more stuff */ |
@@ -655,7 +656,7 @@ static int do_ssl3_write(SSL *s, int type, const unsigned char *buf, | |||
655 | /* first we compress */ | 656 | /* first we compress */ |
656 | if (s->compress != NULL) | 657 | if (s->compress != NULL) |
657 | { | 658 | { |
658 | if (!do_compress(s)) | 659 | if (!ssl3_do_compress(s)) |
659 | { | 660 | { |
660 | SSLerr(SSL_F_DO_SSL3_WRITE,SSL_R_COMPRESSION_FAILURE); | 661 | SSLerr(SSL_F_DO_SSL3_WRITE,SSL_R_COMPRESSION_FAILURE); |
661 | goto err; | 662 | goto err; |
@@ -716,8 +717,8 @@ err: | |||
716 | } | 717 | } |
717 | 718 | ||
718 | /* if s->s3->wbuf.left != 0, we need to call this */ | 719 | /* if s->s3->wbuf.left != 0, we need to call this */ |
719 | static int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, | 720 | int ssl3_write_pending(SSL *s, int type, const unsigned char *buf, |
720 | unsigned int len) | 721 | unsigned int len) |
721 | { | 722 | { |
722 | int i; | 723 | int i; |
723 | 724 | ||
@@ -1089,7 +1090,7 @@ start: | |||
1089 | if (s->s3->tmp.new_cipher == NULL) | 1090 | if (s->s3->tmp.new_cipher == NULL) |
1090 | { | 1091 | { |
1091 | al=SSL_AD_UNEXPECTED_MESSAGE; | 1092 | al=SSL_AD_UNEXPECTED_MESSAGE; |
1092 | SSLerr(SSL_F_SSL3_GET_CERT_VERIFY,SSL_R_CCS_RECEIVED_EARLY); | 1093 | SSLerr(SSL_F_SSL3_READ_BYTES,SSL_R_CCS_RECEIVED_EARLY); |
1093 | goto f_err; | 1094 | goto f_err; |
1094 | } | 1095 | } |
1095 | 1096 | ||
@@ -1099,7 +1100,7 @@ start: | |||
1099 | s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data, 1, s, s->msg_callback_arg); | 1100 | s->msg_callback(0, s->version, SSL3_RT_CHANGE_CIPHER_SPEC, rr->data, 1, s, s->msg_callback_arg); |
1100 | 1101 | ||
1101 | s->s3->change_cipher_spec=1; | 1102 | s->s3->change_cipher_spec=1; |
1102 | if (!do_change_cipher_spec(s)) | 1103 | if (!ssl3_do_change_cipher_spec(s)) |
1103 | goto err; | 1104 | goto err; |
1104 | else | 1105 | else |
1105 | goto start; | 1106 | goto start; |
@@ -1211,7 +1212,7 @@ err: | |||
1211 | return(-1); | 1212 | return(-1); |
1212 | } | 1213 | } |
1213 | 1214 | ||
1214 | static int do_change_cipher_spec(SSL *s) | 1215 | int ssl3_do_change_cipher_spec(SSL *s) |
1215 | { | 1216 | { |
1216 | int i; | 1217 | int i; |
1217 | const char *sender; | 1218 | const char *sender; |
@@ -1268,7 +1269,7 @@ void ssl3_send_alert(SSL *s, int level, int desc) | |||
1268 | s->s3->send_alert[0]=level; | 1269 | s->s3->send_alert[0]=level; |
1269 | s->s3->send_alert[1]=desc; | 1270 | s->s3->send_alert[1]=desc; |
1270 | if (s->s3->wbuf.left == 0) /* data still being written out? */ | 1271 | if (s->s3->wbuf.left == 0) /* data still being written out? */ |
1271 | ssl3_dispatch_alert(s); | 1272 | s->method->ssl_dispatch_alert(s); |
1272 | /* else data is still being written out, we will get written | 1273 | /* else data is still being written out, we will get written |
1273 | * some time in the future */ | 1274 | * some time in the future */ |
1274 | } | 1275 | } |