diff options
Diffstat (limited to 'src/lib/libssl/ssl_srvr.c')
-rw-r--r-- | src/lib/libssl/ssl_srvr.c | 104 |
1 files changed, 6 insertions, 98 deletions
diff --git a/src/lib/libssl/ssl_srvr.c b/src/lib/libssl/ssl_srvr.c index a21039e727..50ce91ddd8 100644 --- a/src/lib/libssl/ssl_srvr.c +++ b/src/lib/libssl/ssl_srvr.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: ssl_srvr.c,v 1.20 2017/08/12 02:55:22 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_srvr.c,v 1.21 2017/08/12 21:03:08 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 | * |
@@ -468,10 +468,7 @@ ssl3_accept(SSL *s) | |||
468 | * the client uses its key from the certificate | 468 | * the client uses its key from the certificate |
469 | * for key exchange. | 469 | * for key exchange. |
470 | */ | 470 | */ |
471 | if (S3I(s)->next_proto_neg_seen) | 471 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; |
472 | S3I(s)->hs.state = SSL3_ST_SR_NEXT_PROTO_A; | ||
473 | else | ||
474 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; | ||
475 | s->internal->init_num = 0; | 472 | s->internal->init_num = 0; |
476 | } else if (SSL_USE_SIGALGS(s) || (alg_k & SSL_kGOST)) { | 473 | } else if (SSL_USE_SIGALGS(s) || (alg_k & SSL_kGOST)) { |
477 | S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; | 474 | S3I(s)->hs.state = SSL3_ST_SR_CERT_VRFY_A; |
@@ -525,20 +522,8 @@ ssl3_accept(SSL *s) | |||
525 | if (ret <= 0) | 522 | if (ret <= 0) |
526 | goto end; | 523 | goto end; |
527 | 524 | ||
528 | if (S3I(s)->next_proto_neg_seen) | ||
529 | S3I(s)->hs.state = SSL3_ST_SR_NEXT_PROTO_A; | ||
530 | else | ||
531 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; | ||
532 | s->internal->init_num = 0; | ||
533 | break; | ||
534 | |||
535 | case SSL3_ST_SR_NEXT_PROTO_A: | ||
536 | case SSL3_ST_SR_NEXT_PROTO_B: | ||
537 | ret = ssl3_get_next_proto(s); | ||
538 | if (ret <= 0) | ||
539 | goto end; | ||
540 | s->internal->init_num = 0; | ||
541 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; | 525 | S3I(s)->hs.state = SSL3_ST_SR_FINISHED_A; |
526 | s->internal->init_num = 0; | ||
542 | break; | 527 | break; |
543 | 528 | ||
544 | case SSL3_ST_SR_FINISHED_A: | 529 | case SSL3_ST_SR_FINISHED_A: |
@@ -610,15 +595,9 @@ ssl3_accept(SSL *s) | |||
610 | if (ret <= 0) | 595 | if (ret <= 0) |
611 | goto end; | 596 | goto end; |
612 | S3I(s)->hs.state = SSL3_ST_SW_FLUSH; | 597 | S3I(s)->hs.state = SSL3_ST_SW_FLUSH; |
613 | if (s->internal->hit) { | 598 | if (s->internal->hit) |
614 | if (S3I(s)->next_proto_neg_seen) { | 599 | S3I(s)->hs.next_state = SSL3_ST_SR_FINISHED_A; |
615 | s->s3->flags |= SSL3_FLAGS_CCS_OK; | 600 | else |
616 | S3I(s)->hs.next_state = | ||
617 | SSL3_ST_SR_NEXT_PROTO_A; | ||
618 | } else | ||
619 | S3I(s)->hs.next_state = | ||
620 | SSL3_ST_SR_FINISHED_A; | ||
621 | } else | ||
622 | S3I(s)->hs.next_state = SSL_ST_OK; | 601 | S3I(s)->hs.next_state = SSL_ST_OK; |
623 | s->internal->init_num = 0; | 602 | s->internal->init_num = 0; |
624 | break; | 603 | break; |
@@ -2708,74 +2687,3 @@ ssl3_send_cert_status(SSL *s) | |||
2708 | 2687 | ||
2709 | return (-1); | 2688 | return (-1); |
2710 | } | 2689 | } |
2711 | |||
2712 | /* | ||
2713 | * ssl3_get_next_proto reads a Next Protocol Negotiation handshake message. | ||
2714 | * It sets the next_proto member in s if found | ||
2715 | */ | ||
2716 | int | ||
2717 | ssl3_get_next_proto(SSL *s) | ||
2718 | { | ||
2719 | CBS cbs, proto, padding; | ||
2720 | int ok; | ||
2721 | long n; | ||
2722 | size_t len; | ||
2723 | |||
2724 | /* | ||
2725 | * Clients cannot send a NextProtocol message if we didn't see the | ||
2726 | * extension in their ClientHello | ||
2727 | */ | ||
2728 | if (!S3I(s)->next_proto_neg_seen) { | ||
2729 | SSLerror(s, SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION); | ||
2730 | return (-1); | ||
2731 | } | ||
2732 | |||
2733 | /* 514 maxlen is enough for the payload format below */ | ||
2734 | n = s->method->internal->ssl_get_message(s, SSL3_ST_SR_NEXT_PROTO_A, | ||
2735 | SSL3_ST_SR_NEXT_PROTO_B, SSL3_MT_NEXT_PROTO, 514, &ok); | ||
2736 | if (!ok) | ||
2737 | return ((int)n); | ||
2738 | |||
2739 | /* | ||
2740 | * S3I(s)->hs.state doesn't reflect whether ChangeCipherSpec has been received | ||
2741 | * in this handshake, but S3I(s)->change_cipher_spec does (will be reset | ||
2742 | * by ssl3_get_finished). | ||
2743 | */ | ||
2744 | if (!S3I(s)->change_cipher_spec) { | ||
2745 | SSLerror(s, SSL_R_GOT_NEXT_PROTO_BEFORE_A_CCS); | ||
2746 | return (-1); | ||
2747 | } | ||
2748 | |||
2749 | if (n < 2) | ||
2750 | return (0); | ||
2751 | /* The body must be > 1 bytes long */ | ||
2752 | |||
2753 | CBS_init(&cbs, s->internal->init_msg, s->internal->init_num); | ||
2754 | |||
2755 | /* | ||
2756 | * The payload looks like: | ||
2757 | * uint8 proto_len; | ||
2758 | * uint8 proto[proto_len]; | ||
2759 | * uint8 padding_len; | ||
2760 | * uint8 padding[padding_len]; | ||
2761 | */ | ||
2762 | if (!CBS_get_u8_length_prefixed(&cbs, &proto) || | ||
2763 | !CBS_get_u8_length_prefixed(&cbs, &padding) || | ||
2764 | CBS_len(&cbs) != 0) | ||
2765 | return 0; | ||
2766 | |||
2767 | /* | ||
2768 | * XXX We should not NULL it, but this matches old behavior of not | ||
2769 | * freeing before malloc. | ||
2770 | */ | ||
2771 | s->internal->next_proto_negotiated = NULL; | ||
2772 | s->internal->next_proto_negotiated_len = 0; | ||
2773 | |||
2774 | if (!CBS_stow(&proto, &s->internal->next_proto_negotiated, &len)) { | ||
2775 | SSLerror(s, ERR_R_MALLOC_FAILURE); | ||
2776 | return (0); | ||
2777 | } | ||
2778 | s->internal->next_proto_negotiated_len = (uint8_t)len; | ||
2779 | |||
2780 | return (1); | ||
2781 | } | ||