summaryrefslogtreecommitdiff
path: root/src/lib/libssl/t1_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/t1_lib.c')
-rw-r--r--src/lib/libssl/t1_lib.c214
1 files changed, 0 insertions, 214 deletions
diff --git a/src/lib/libssl/t1_lib.c b/src/lib/libssl/t1_lib.c
index 08f7a444ad..8796651806 100644
--- a/src/lib/libssl/t1_lib.c
+++ b/src/lib/libssl/t1_lib.c
@@ -615,20 +615,6 @@ unsigned char
615 i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret); 615 i2d_X509_EXTENSIONS(s->tlsext_ocsp_exts, &ret);
616 } 616 }
617 617
618#ifndef OPENSSL_NO_HEARTBEATS
619 /* Add Heartbeat extension */
620 s2n(TLSEXT_TYPE_heartbeat, ret);
621 s2n(1, ret);
622 /* Set mode:
623 * 1: peer may send requests
624 * 2: peer not allowed to send requests
625 */
626 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
627 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
628 else
629 *(ret++) = SSL_TLSEXT_HB_ENABLED;
630#endif
631
632#ifndef OPENSSL_NO_NEXTPROTONEG 618#ifndef OPENSSL_NO_NEXTPROTONEG
633 if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len) { 619 if (s->ctx->next_proto_select_cb && !s->s3->tmp.finish_md_len) {
634 /* The client advertises an emtpy extension to indicate its 620 /* The client advertises an emtpy extension to indicate its
@@ -838,23 +824,6 @@ unsigned char
838 ret += 36; 824 ret += 36;
839 } 825 }
840 826
841#ifndef OPENSSL_NO_HEARTBEATS
842 /* Add Heartbeat extension if we've received one */
843 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) {
844 s2n(TLSEXT_TYPE_heartbeat, ret);
845 s2n(1, ret);
846 /* Set mode:
847 * 1: peer may send requests
848 * 2: peer not allowed to send requests
849 */
850 if (s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_RECV_REQUESTS)
851 *(ret++) = SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
852 else
853 *(ret++) = SSL_TLSEXT_HB_ENABLED;
854
855 }
856#endif
857
858#ifndef OPENSSL_NO_NEXTPROTONEG 827#ifndef OPENSSL_NO_NEXTPROTONEG
859 next_proto_neg_seen = s->s3->next_proto_neg_seen; 828 next_proto_neg_seen = s->s3->next_proto_neg_seen;
860 s->s3->next_proto_neg_seen = 0; 829 s->s3->next_proto_neg_seen = 0;
@@ -980,11 +949,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
980 s->s3->next_proto_neg_seen = 0; 949 s->s3->next_proto_neg_seen = 0;
981#endif 950#endif
982 951
983#ifndef OPENSSL_NO_HEARTBEATS
984 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
985 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
986#endif
987
988#ifndef OPENSSL_NO_EC 952#ifndef OPENSSL_NO_EC
989 if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG) 953 if (s->options & SSL_OP_SAFARI_ECDHE_ECDSA_BUG)
990 ssl_check_for_safari(s, data, d, n); 954 ssl_check_for_safari(s, data, d, n);
@@ -1342,22 +1306,6 @@ ssl_parse_clienthello_tlsext(SSL *s, unsigned char **p, unsigned char *d,
1342 else 1306 else
1343 s->tlsext_status_type = -1; 1307 s->tlsext_status_type = -1;
1344 } 1308 }
1345#ifndef OPENSSL_NO_HEARTBEATS
1346 else if (type == TLSEXT_TYPE_heartbeat) {
1347 switch (data[0]) {
1348 case 0x01: /* Client allows us to send HB requests */
1349 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1350 break;
1351 case 0x02: /* Client doesn't accept HB requests */
1352 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1353 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1354 break;
1355 default:
1356 *al = SSL_AD_ILLEGAL_PARAMETER;
1357 return 0;
1358 }
1359 }
1360#endif
1361#ifndef OPENSSL_NO_NEXTPROTONEG 1309#ifndef OPENSSL_NO_NEXTPROTONEG
1362 else if (type == TLSEXT_TYPE_next_proto_neg && 1310 else if (type == TLSEXT_TYPE_next_proto_neg &&
1363 s->s3->tmp.finish_md_len == 0) { 1311 s->s3->tmp.finish_md_len == 0) {
@@ -1443,11 +1391,6 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n,
1443 s->s3->next_proto_neg_seen = 0; 1391 s->s3->next_proto_neg_seen = 0;
1444#endif 1392#endif
1445 1393
1446#ifndef OPENSSL_NO_HEARTBEATS
1447 s->tlsext_heartbeat &= ~(SSL_TLSEXT_HB_ENABLED |
1448 SSL_TLSEXT_HB_DONT_SEND_REQUESTS);
1449#endif
1450
1451 if (data >= (d + n - 2)) 1394 if (data >= (d + n - 2))
1452 goto ri_check; 1395 goto ri_check;
1453 1396
@@ -1595,22 +1538,6 @@ ssl_parse_serverhello_tlsext(SSL *s, unsigned char **p, unsigned char *d, int n,
1595 return 0; 1538 return 0;
1596 renegotiate_seen = 1; 1539 renegotiate_seen = 1;
1597 } 1540 }
1598#ifndef OPENSSL_NO_HEARTBEATS
1599 else if (type == TLSEXT_TYPE_heartbeat) {
1600 switch (data[0]) {
1601 case 0x01: /* Server allows us to send HB requests */
1602 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1603 break;
1604 case 0x02: /* Server doesn't accept HB requests */
1605 s->tlsext_heartbeat |= SSL_TLSEXT_HB_ENABLED;
1606 s->tlsext_heartbeat |= SSL_TLSEXT_HB_DONT_SEND_REQUESTS;
1607 break;
1608 default:
1609 *al = SSL_AD_ILLEGAL_PARAMETER;
1610 return 0;
1611 }
1612 }
1613#endif
1614#ifndef OPENSSL_NO_SRTP 1541#ifndef OPENSSL_NO_SRTP
1615 else if (type == TLSEXT_TYPE_use_srtp) { 1542 else if (type == TLSEXT_TYPE_use_srtp) {
1616 if (ssl_parse_serverhello_use_srtp_ext(s, data, size, 1543 if (ssl_parse_serverhello_use_srtp_ext(s, data, size,
@@ -2454,144 +2381,3 @@ tls1_process_sigalgs(SSL *s, const unsigned char *data, int dsize)
2454} 2381}
2455 2382
2456#endif 2383#endif
2457
2458#ifndef OPENSSL_NO_HEARTBEATS
2459int
2460tls1_process_heartbeat(SSL *s)
2461{
2462 unsigned char *p = &s->s3->rrec.data[0], *pl;
2463 unsigned short hbtype;
2464 unsigned int payload;
2465 unsigned int padding = 16; /* Use minimum padding */
2466
2467 if (s->msg_callback)
2468 s->msg_callback(0, s->version, TLS1_RT_HEARTBEAT,
2469 &s->s3->rrec.data[0], s->s3->rrec.length,
2470 s, s->msg_callback_arg);
2471
2472 /* Read type and payload length first */
2473 if (1 + 2 + 16 > s->s3->rrec.length)
2474 return 0; /* silently discard */
2475 hbtype = *p++;
2476 n2s(p, payload);
2477 if (1 + 2 + payload + 16 > s->s3->rrec.length)
2478 return 0; /* silently discard per RFC 6520 sec. 4 */
2479 pl = p;
2480
2481 if (hbtype == TLS1_HB_REQUEST) {
2482 unsigned char *buffer, *bp;
2483 int r;
2484
2485 /* Allocate memory for the response, size is 1 bytes
2486 * message type, plus 2 bytes payload length, plus
2487 * payload, plus padding
2488 */
2489 buffer = OPENSSL_malloc(1 + 2 + payload + padding);
2490 bp = buffer;
2491
2492 /* Enter response type, length and copy payload */
2493 *bp++ = TLS1_HB_RESPONSE;
2494 s2n(payload, bp);
2495 memcpy(bp, pl, payload);
2496 bp += payload;
2497 /* Random padding */
2498 RAND_pseudo_bytes(bp, padding);
2499
2500 r = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buffer, 3 + payload + padding);
2501
2502 if (r >= 0 && s->msg_callback)
2503 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2504 buffer, 3 + payload + padding,
2505 s, s->msg_callback_arg);
2506
2507 OPENSSL_free(buffer);
2508
2509 if (r < 0)
2510 return r;
2511 } else if (hbtype == TLS1_HB_RESPONSE) {
2512 unsigned int seq;
2513
2514 /* We only send sequence numbers (2 bytes unsigned int),
2515 * and 16 random bytes, so we just try to read the
2516 * sequence number */
2517 n2s(pl, seq);
2518
2519 if (payload == 18 && seq == s->tlsext_hb_seq) {
2520 s->tlsext_hb_seq++;
2521 s->tlsext_hb_pending = 0;
2522 }
2523 }
2524
2525 return 0;
2526}
2527
2528int
2529tls1_heartbeat(SSL *s)
2530{
2531 unsigned char *buf, *p;
2532 int ret;
2533 unsigned int payload = 18; /* Sequence number + random bytes */
2534 unsigned int padding = 16; /* Use minimum padding */
2535
2536 /* Only send if peer supports and accepts HB requests... */
2537 if (!(s->tlsext_heartbeat & SSL_TLSEXT_HB_ENABLED) ||
2538 s->tlsext_heartbeat & SSL_TLSEXT_HB_DONT_SEND_REQUESTS) {
2539 SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PEER_DOESNT_ACCEPT);
2540 return -1;
2541 }
2542
2543 /* ...and there is none in flight yet... */
2544 if (s->tlsext_hb_pending) {
2545 SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_TLS_HEARTBEAT_PENDING);
2546 return -1;
2547 }
2548
2549 /* ...and no handshake in progress. */
2550 if (SSL_in_init(s) || s->in_handshake) {
2551 SSLerr(SSL_F_TLS1_HEARTBEAT, SSL_R_UNEXPECTED_MESSAGE);
2552 return -1;
2553 }
2554
2555 /* Check if padding is too long, payload and padding
2556 * must not exceed 2^14 - 3 = 16381 bytes in total.
2557 */
2558 OPENSSL_assert(payload + padding <= 16381);
2559
2560 /* Create HeartBeat message, we just use a sequence number
2561 * as payload to distuingish different messages and add
2562 * some random stuff.
2563 * - Message Type, 1 byte
2564 * - Payload Length, 2 bytes (unsigned int)
2565 * - Payload, the sequence number (2 bytes uint)
2566 * - Payload, random bytes (16 bytes uint)
2567 * - Padding
2568 */
2569 buf = OPENSSL_malloc(1 + 2 + payload + padding);
2570 p = buf;
2571 /* Message Type */
2572 *p++ = TLS1_HB_REQUEST;
2573 /* Payload length (18 bytes here) */
2574 s2n(payload, p);
2575 /* Sequence number */
2576 s2n(s->tlsext_hb_seq, p);
2577 /* 16 random bytes */
2578 RAND_pseudo_bytes(p, 16);
2579 p += 16;
2580 /* Random padding */
2581 RAND_pseudo_bytes(p, padding);
2582
2583 ret = ssl3_write_bytes(s, TLS1_RT_HEARTBEAT, buf, 3 + payload + padding);
2584 if (ret >= 0) {
2585 if (s->msg_callback)
2586 s->msg_callback(1, s->version, TLS1_RT_HEARTBEAT,
2587 buf, 3 + payload + padding,
2588 s, s->msg_callback_arg);
2589
2590 s->tlsext_hb_pending = 1;
2591 }
2592
2593 OPENSSL_free(buf);
2594
2595 return ret;
2596}
2597#endif