diff options
Diffstat (limited to 'src/lib/libssl/ssl_pkt.c')
-rw-r--r-- | src/lib/libssl/ssl_pkt.c | 166 |
1 files changed, 33 insertions, 133 deletions
diff --git a/src/lib/libssl/ssl_pkt.c b/src/lib/libssl/ssl_pkt.c index c9c86471d3..02a476ea82 100644 --- a/src/lib/libssl/ssl_pkt.c +++ b/src/lib/libssl/ssl_pkt.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_pkt.c,v 1.31 2020/08/30 15:40:20 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_pkt.c,v 1.32 2020/10/03 17:35:16 jsing Exp $ */ |
2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 | /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 | * All rights reserved. | 3 | * All rights reserved. |
4 | * | 4 | * |
@@ -149,15 +149,14 @@ ssl_force_want_read(SSL *s) | |||
149 | static int | 149 | static int |
150 | ssl3_read_n(SSL *s, int n, int max, int extend) | 150 | ssl3_read_n(SSL *s, int n, int max, int extend) |
151 | { | 151 | { |
152 | SSL3_BUFFER_INTERNAL *rb = &(S3I(s)->rbuf); | ||
152 | int i, len, left; | 153 | int i, len, left; |
153 | size_t align; | 154 | size_t align; |
154 | unsigned char *pkt; | 155 | unsigned char *pkt; |
155 | SSL3_BUFFER_INTERNAL *rb; | ||
156 | 156 | ||
157 | if (n <= 0) | 157 | if (n <= 0) |
158 | return n; | 158 | return n; |
159 | 159 | ||
160 | rb = &(S3I(s)->rbuf); | ||
161 | if (rb->buf == NULL) | 160 | if (rb->buf == NULL) |
162 | if (!ssl3_setup_read_buffer(s)) | 161 | if (!ssl3_setup_read_buffer(s)) |
163 | return -1; | 162 | return -1; |
@@ -327,15 +326,13 @@ ssl3_packet_extend(SSL *s, int plen) | |||
327 | static int | 326 | static int |
328 | ssl3_get_record(SSL *s) | 327 | ssl3_get_record(SSL *s) |
329 | { | 328 | { |
330 | int al; | 329 | SSL3_BUFFER_INTERNAL *rb = &(S3I(s)->rbuf); |
331 | int enc_err, n, i, ret = -1; | 330 | SSL3_RECORD_INTERNAL *rr = &(S3I(s)->rrec); |
332 | SSL3_RECORD_INTERNAL *rr; | 331 | uint8_t alert_desc; |
333 | SSL_SESSION *sess; | 332 | uint8_t *out; |
334 | unsigned char md[EVP_MAX_MD_SIZE]; | 333 | size_t out_len; |
335 | unsigned int mac_size, orig_len; | 334 | int al, n; |
336 | 335 | int ret = -1; | |
337 | rr = &(S3I(s)->rrec); | ||
338 | sess = s->session; | ||
339 | 336 | ||
340 | again: | 337 | again: |
341 | /* check if we have the header */ | 338 | /* check if we have the header */ |
@@ -387,17 +384,13 @@ ssl3_get_record(SSL *s) | |||
387 | goto err; | 384 | goto err; |
388 | } | 385 | } |
389 | 386 | ||
390 | if (rr->length > S3I(s)->rbuf.len - SSL3_RT_HEADER_LENGTH) { | 387 | if (rr->length > rb->len - SSL3_RT_HEADER_LENGTH) { |
391 | al = SSL_AD_RECORD_OVERFLOW; | 388 | al = SSL_AD_RECORD_OVERFLOW; |
392 | SSLerror(s, SSL_R_PACKET_LENGTH_TOO_LONG); | 389 | SSLerror(s, SSL_R_PACKET_LENGTH_TOO_LONG); |
393 | goto f_err; | 390 | goto f_err; |
394 | } | 391 | } |
395 | |||
396 | /* now s->internal->rstate == SSL_ST_READ_BODY */ | ||
397 | } | 392 | } |
398 | 393 | ||
399 | /* s->internal->rstate == SSL_ST_READ_BODY, get and decode the data */ | ||
400 | |||
401 | n = ssl3_packet_extend(s, SSL3_RT_HEADER_LENGTH + rr->length); | 394 | n = ssl3_packet_extend(s, SSL3_RT_HEADER_LENGTH + rr->length); |
402 | if (n <= 0) | 395 | if (n <= 0) |
403 | return (n); | 396 | return (n); |
@@ -406,133 +399,40 @@ ssl3_get_record(SSL *s) | |||
406 | 399 | ||
407 | s->internal->rstate = SSL_ST_READ_HEADER; /* set state for later operations */ | 400 | s->internal->rstate = SSL_ST_READ_HEADER; /* set state for later operations */ |
408 | 401 | ||
409 | /* At this point, s->internal->packet_length == SSL3_RT_HEADER_LNGTH + rr->length, | 402 | /* |
410 | * and we have that many bytes in s->internal->packet | 403 | * A full record has now been read from the wire, which now needs |
404 | * to be processed. | ||
411 | */ | 405 | */ |
412 | rr->input = &(s->internal->packet[SSL3_RT_HEADER_LENGTH]); | 406 | tls12_record_layer_set_version(s->internal->rl, s->version); |
413 | |||
414 | /* ok, we can now read from 's->internal->packet' data into 'rr' | ||
415 | * rr->input points at rr->length bytes, which | ||
416 | * need to be copied into rr->data by either | ||
417 | * the decryption or by the decompression | ||
418 | * When the data is 'copied' into the rr->data buffer, | ||
419 | * rr->input will be pointed at the new buffer */ | ||
420 | |||
421 | /* We now have - encrypted [ MAC [ compressed [ plain ] ] ] | ||
422 | * rr->length bytes of encrypted compressed stuff. */ | ||
423 | |||
424 | /* check is not needed I believe */ | ||
425 | if (rr->length > SSL3_RT_MAX_ENCRYPTED_LENGTH) { | ||
426 | al = SSL_AD_RECORD_OVERFLOW; | ||
427 | SSLerror(s, SSL_R_ENCRYPTED_LENGTH_TOO_LONG); | ||
428 | goto f_err; | ||
429 | } | ||
430 | |||
431 | /* decrypt in place in 'rr->input' */ | ||
432 | rr->data = rr->input; | ||
433 | 407 | ||
434 | /* enc_err is: | 408 | if (!tls12_record_layer_open_record(s->internal->rl, s->internal->packet, |
435 | * 0: (in non-constant time) if the record is publically invalid. | 409 | s->internal->packet_length, &out, &out_len)) { |
436 | * 1: if the padding is valid | 410 | tls12_record_layer_alert(s->internal->rl, &alert_desc); |
437 | * -1: if the padding is invalid */ | ||
438 | if ((enc_err = tls1_enc(s, 0)) == 0) { | ||
439 | al = SSL_AD_BAD_RECORD_MAC; | ||
440 | SSLerror(s, SSL_R_BLOCK_CIPHER_PAD_IS_WRONG); | ||
441 | goto f_err; | ||
442 | } | ||
443 | |||
444 | /* r->length is now the compressed data plus mac */ | ||
445 | if ((sess != NULL) && (s->enc_read_ctx != NULL) && | ||
446 | (EVP_MD_CTX_md(s->read_hash) != NULL)) { | ||
447 | /* s->read_hash != NULL => mac_size != -1 */ | ||
448 | unsigned char *mac = NULL; | ||
449 | unsigned char mac_tmp[EVP_MAX_MD_SIZE]; | ||
450 | |||
451 | mac_size = EVP_MD_CTX_size(s->read_hash); | ||
452 | OPENSSL_assert(mac_size <= EVP_MAX_MD_SIZE); | ||
453 | |||
454 | orig_len = rr->length + rr->padding_length; | ||
455 | 411 | ||
456 | /* orig_len is the length of the record before any padding was | 412 | if (alert_desc == 0) |
457 | * removed. This is public information, as is the MAC in use, | 413 | goto err; |
458 | * therefore we can safely process the record in a different | ||
459 | * amount of time if it's too short to possibly contain a MAC. | ||
460 | */ | ||
461 | if (orig_len < mac_size || | ||
462 | /* CBC records must have a padding length byte too. */ | ||
463 | (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE && | ||
464 | orig_len < mac_size + 1)) { | ||
465 | al = SSL_AD_DECODE_ERROR; | ||
466 | SSLerror(s, SSL_R_LENGTH_TOO_SHORT); | ||
467 | goto f_err; | ||
468 | } | ||
469 | |||
470 | if (EVP_CIPHER_CTX_mode(s->enc_read_ctx) == EVP_CIPH_CBC_MODE) { | ||
471 | /* We update the length so that the TLS header bytes | ||
472 | * can be constructed correctly but we need to extract | ||
473 | * the MAC in constant time from within the record, | ||
474 | * without leaking the contents of the padding bytes. | ||
475 | * */ | ||
476 | mac = mac_tmp; | ||
477 | ssl3_cbc_copy_mac(mac_tmp, rr, mac_size, orig_len); | ||
478 | rr->length -= mac_size; | ||
479 | } else { | ||
480 | /* In this case there's no padding, so |orig_len| | ||
481 | * equals |rec->length| and we checked that there's | ||
482 | * enough bytes for |mac_size| above. */ | ||
483 | rr->length -= mac_size; | ||
484 | mac = &rr->data[rr->length]; | ||
485 | } | ||
486 | 414 | ||
487 | i = tls1_mac(s,md,0 /* not send */); | 415 | if (alert_desc == SSL_AD_RECORD_OVERFLOW) |
488 | if (i < 0 || mac == NULL || | 416 | SSLerror(s, SSL_R_ENCRYPTED_LENGTH_TOO_LONG); |
489 | timingsafe_memcmp(md, mac, (size_t)mac_size) != 0) | 417 | else if (alert_desc == SSL_AD_BAD_RECORD_MAC) |
490 | enc_err = -1; | 418 | SSLerror(s, SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC); |
491 | if (rr->length > | ||
492 | SSL3_RT_MAX_COMPRESSED_LENGTH + mac_size) | ||
493 | enc_err = -1; | ||
494 | } | ||
495 | 419 | ||
496 | if (enc_err < 0) { | 420 | al = alert_desc; |
497 | /* | ||
498 | * A separate 'decryption_failed' alert was introduced with | ||
499 | * TLS 1.0, SSL 3.0 only has 'bad_record_mac'. But unless a | ||
500 | * decryption failure is directly visible from the ciphertext | ||
501 | * anyway, we should not reveal which kind of error | ||
502 | * occurred -- this might become visible to an attacker | ||
503 | * (e.g. via a logfile) | ||
504 | */ | ||
505 | al = SSL_AD_BAD_RECORD_MAC; | ||
506 | SSLerror(s, SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC); | ||
507 | goto f_err; | ||
508 | } | ||
509 | |||
510 | if (rr->length > SSL3_RT_MAX_PLAIN_LENGTH) { | ||
511 | al = SSL_AD_RECORD_OVERFLOW; | ||
512 | SSLerror(s, SSL_R_DATA_LENGTH_TOO_LONG); | ||
513 | goto f_err; | 421 | goto f_err; |
514 | } | 422 | } |
515 | 423 | ||
424 | rr->data = out; | ||
425 | rr->length = out_len; | ||
516 | rr->off = 0; | 426 | rr->off = 0; |
517 | /* | ||
518 | * So at this point the following is true | ||
519 | * | ||
520 | * ssl->s3->internal->rrec.type is the type of record | ||
521 | * ssl->s3->internal->rrec.length == number of bytes in record | ||
522 | * ssl->s3->internal->rrec.off == offset to first valid byte | ||
523 | * ssl->s3->internal->rrec.data == where to take bytes from, increment | ||
524 | * after use :-). | ||
525 | */ | ||
526 | 427 | ||
527 | /* we have pulled in a full packet so zero things */ | 428 | /* we have pulled in a full packet so zero things */ |
528 | s->internal->packet_length = 0; | 429 | s->internal->packet_length = 0; |
529 | 430 | ||
530 | if (rr->length == 0) { | 431 | if (rr->length == 0) { |
531 | /* | 432 | /* |
532 | * CBC countermeasures for known IV weaknesses | 433 | * CBC countermeasures for known IV weaknesses can legitimately |
533 | * can legitimately insert a single empty record, | 434 | * insert a single empty record, so we allow ourselves to read |
534 | * so we allow ourselves to read once past a single | 435 | * once past a single empty record without forcing want_read. |
535 | * empty record without forcing want_read. | ||
536 | */ | 436 | */ |
537 | if (s->internal->empty_record_count++ > SSL_MAX_EMPTY_RECORDS) { | 437 | if (s->internal->empty_record_count++ > SSL_MAX_EMPTY_RECORDS) { |
538 | SSLerror(s, SSL_R_PEER_BEHAVING_BADLY); | 438 | SSLerror(s, SSL_R_PEER_BEHAVING_BADLY); |
@@ -543,15 +443,15 @@ ssl3_get_record(SSL *s) | |||
543 | return -1; | 443 | return -1; |
544 | } | 444 | } |
545 | goto again; | 445 | goto again; |
546 | } else { | ||
547 | s->internal->empty_record_count = 0; | ||
548 | } | 446 | } |
549 | 447 | ||
448 | s->internal->empty_record_count = 0; | ||
449 | |||
550 | return (1); | 450 | return (1); |
551 | 451 | ||
552 | f_err: | 452 | f_err: |
553 | ssl3_send_alert(s, SSL3_AL_FATAL, al); | 453 | ssl3_send_alert(s, SSL3_AL_FATAL, al); |
554 | err: | 454 | err: |
555 | return (ret); | 455 | return (ret); |
556 | } | 456 | } |
557 | 457 | ||