diff options
Diffstat (limited to 'src/lib/libssl/t1_lib.c')
-rw-r--r-- | src/lib/libssl/t1_lib.c | 214 |
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 | ||
2459 | int | ||
2460 | tls1_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 | |||
2528 | int | ||
2529 | tls1_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 | ||