summaryrefslogtreecommitdiff
path: root/src/lib/libssl/ssl_pkt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/ssl_pkt.c')
-rw-r--r--src/lib/libssl/ssl_pkt.c166
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)
149static int 149static int
150ssl3_read_n(SSL *s, int n, int max, int extend) 150ssl3_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)
327static int 326static int
328ssl3_get_record(SSL *s) 327ssl3_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
552f_err: 452 f_err:
553 ssl3_send_alert(s, SSL3_AL_FATAL, al); 453 ssl3_send_alert(s, SSL3_AL_FATAL, al);
554err: 454 err:
555 return (ret); 455 return (ret);
556} 456}
557 457