summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordjm <>2014-04-08 00:55:05 +0000
committerdjm <>2014-04-08 00:55:05 +0000
commit0c9b71e493dec9864976f17b42bf36b7dba29b8e (patch)
tree1ffd0cd7caca8fdbb6c0ea53a010f9218b2a286e
parent2b799dc44b041e21f8e5646502eef97621469bfd (diff)
downloadopenbsd-0c9b71e493dec9864976f17b42bf36b7dba29b8e.tar.gz
openbsd-0c9b71e493dec9864976f17b42bf36b7dba29b8e.tar.bz2
openbsd-0c9b71e493dec9864976f17b42bf36b7dba29b8e.zip
MFC:
cherrypick fix for CVE-2014-0160 "heartbleed" vulnerability from OpenSSL git; ok sthen@
-rw-r--r--src/lib/libssl/src/ssl/d1_both.c26
-rw-r--r--src/lib/libssl/src/ssl/t1_lib.c14
2 files changed, 27 insertions, 13 deletions
diff --git a/src/lib/libssl/src/ssl/d1_both.c b/src/lib/libssl/src/ssl/d1_both.c
index de8bab873f..436ab67b7a 100644
--- a/src/lib/libssl/src/ssl/d1_both.c
+++ b/src/lib/libssl/src/ssl/d1_both.c
@@ -1452,26 +1452,36 @@ dtls1_process_heartbeat(SSL *s)
1452 unsigned int payload; 1452 unsigned int payload;
1453 unsigned int padding = 16; /* Use minimum padding */ 1453 unsigned int padding = 16; /* Use minimum padding */
1454 1454
1455 /* Read type and payload length first */
1456 hbtype = *p++;
1457 n2s(p, payload);
1458 pl = p;
1459
1460 if (s->msg_callback) 1455 if (s->msg_callback)
1461 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, 1456 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
1462 &s->s3->rrec.data[0], s->s3->rrec.length, 1457 &s->s3->rrec.data[0], s->s3->rrec.length,
1463 s, s->msg_callback_arg); 1458 s, s->msg_callback_arg);
1464 1459
1460 /* Read type and payload length first */
1461 if (1 + 2 + 16 > s->s3->rrec.length)
1462 return 0; /* silently discard */
1463 hbtype = *p++;
1464 n2s(p, payload);
1465 if (1 + 2 + payload + 16 > s->s3->rrec.length)
1466 return 0; /* silently discard per RFC 6520 sec. 4 */
1467 pl = p;
1468
1465 if (hbtype == TLS1_HB_REQUEST) 1469 if (hbtype == TLS1_HB_REQUEST)
1466 { 1470 {
1467 unsigned char *buffer, *bp; 1471 unsigned char *buffer, *bp;
1472 unsigned int write_length = 1 /* heartbeat type */ +
1473 2 /* heartbeat length */ +
1474 payload + padding;
1468 int r; 1475 int r;
1469 1476
1477 if (write_length > SSL3_RT_MAX_PLAIN_LENGTH)
1478 return 0;
1479
1470 /* Allocate memory for the response, size is 1 byte 1480 /* Allocate memory for the response, size is 1 byte
1471 * message type, plus 2 bytes payload length, plus 1481 * message type, plus 2 bytes payload length, plus
1472 * payload, plus padding 1482 * payload, plus padding
1473 */ 1483 */
1474 buffer = OPENSSL_malloc(1 + 2 + payload + padding); 1484 buffer = OPENSSL_malloc(write_length);
1475 bp = buffer; 1485 bp = buffer;
1476 1486
1477 /* Enter response type, length and copy payload */ 1487 /* Enter response type, length and copy payload */
@@ -1482,11 +1492,11 @@ dtls1_process_heartbeat(SSL *s)
1482 /* Random padding */ 1492 /* Random padding */
1483 RAND_pseudo_bytes(bp, padding); 1493 RAND_pseudo_bytes(bp, padding);
1484 1494
1485 r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding); 1495 r = dtls1_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, write_length);
1486 1496
1487 if (r >= 0 && s->msg_callback) 1497 if (r >= 0 && s->msg_callback)
1488 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT, 1498 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
1489 buffer, 3 + payload + padding, 1499 buffer, write_length,
1490 s, s->msg_callback_arg); 1500 s, s->msg_callback_arg);
1491 1501
1492 OPENSSL_free(buffer); 1502 OPENSSL_free(buffer);
diff --git a/src/lib/libssl/src/ssl/t1_lib.c b/src/lib/libssl/src/ssl/t1_lib.c
index bfd4731365..a649dafba9 100644
--- a/src/lib/libssl/src/ssl/t1_lib.c
+++ b/src/lib/libssl/src/ssl/t1_lib.c
@@ -2441,16 +2441,20 @@ tls1_process_heartbeat(SSL *s)
2441 unsigned int payload; 2441 unsigned int payload;
2442 unsigned int padding = 16; /* Use minimum padding */ 2442 unsigned int padding = 16; /* Use minimum padding */
2443 2443
2444 /* Read type and payload length first */
2445 hbtype = *p++;
2446 n2s(p, payload);
2447 pl = p;
2448
2449 if (s->msg_callback) 2444 if (s->msg_callback)
2450 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT, 2445 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2451 &s->s3->rrec.data[0], s->s3->rrec.length, 2446 &s->s3->rrec.data[0], s->s3->rrec.length,
2452 s, s->msg_callback_arg); 2447 s, s->msg_callback_arg);
2453 2448
2449 /* Read type and payload length first */
2450 if (1 + 2 + 16 > s->s3->rrec.length)
2451 return 0; /* silently discard */
2452 hbtype = *p++;
2453 n2s(p, payload);
2454 if (1 + 2 + payload + 16 > s->s3->rrec.length)
2455 return 0; /* silently discard per RFC 6520 sec. 4 */
2456 pl = p;
2457
2454 if (hbtype == TLS1_HB_REQUEST) 2458 if (hbtype == TLS1_HB_REQUEST)
2455 { 2459 {
2456 unsigned char *buffer, *bp; 2460 unsigned char *buffer, *bp;