diff options
Diffstat (limited to '')
| -rw-r--r-- | src/lib/libssl/ssl_clnt.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/src/lib/libssl/ssl_clnt.c b/src/lib/libssl/ssl_clnt.c index 65939141a2..f46b66c372 100644 --- a/src/lib/libssl/ssl_clnt.c +++ b/src/lib/libssl/ssl_clnt.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ssl_clnt.c,v 1.8 2017/03/04 16:15:02 jsing Exp $ */ | 1 | /* $OpenBSD: ssl_clnt.c,v 1.9 2017/03/05 14:24:12 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 | * |
| @@ -2619,27 +2619,40 @@ err: | |||
| 2619 | int | 2619 | int |
| 2620 | ssl3_send_next_proto(SSL *s) | 2620 | ssl3_send_next_proto(SSL *s) |
| 2621 | { | 2621 | { |
| 2622 | unsigned int len, padding_len; | 2622 | CBB cbb, nextproto, npn, padding; |
| 2623 | unsigned char *d, *p; | 2623 | size_t pad_len; |
| 2624 | uint8_t *pad; | ||
| 2624 | 2625 | ||
| 2625 | if (s->internal->state == SSL3_ST_CW_NEXT_PROTO_A) { | 2626 | memset(&cbb, 0, sizeof(cbb)); |
| 2626 | d = p = ssl3_handshake_msg_start(s, SSL3_MT_NEXT_PROTO); | ||
| 2627 | 2627 | ||
| 2628 | len = s->internal->next_proto_negotiated_len; | 2628 | if (s->internal->state == SSL3_ST_CW_NEXT_PROTO_A) { |
| 2629 | padding_len = 32 - ((len + 2) % 32); | 2629 | pad_len = 32 - ((s->internal->next_proto_negotiated_len + 2) % 32); |
| 2630 | *(p++) = len; | ||
| 2631 | memcpy(p, s->internal->next_proto_negotiated, len); | ||
| 2632 | p += len; | ||
| 2633 | *(p++) = padding_len; | ||
| 2634 | memset(p, 0, padding_len); | ||
| 2635 | p += padding_len; | ||
| 2636 | 2630 | ||
| 2637 | ssl3_handshake_msg_finish(s, p - d); | 2631 | if (!ssl3_handshake_msg_start_cbb(s, &cbb, &nextproto, |
| 2632 | SSL3_MT_NEXT_PROTO)) | ||
| 2633 | goto err; | ||
| 2634 | if (!CBB_add_u8_length_prefixed(&nextproto, &npn)) | ||
| 2635 | goto err; | ||
| 2636 | if (!CBB_add_bytes(&npn, s->internal->next_proto_negotiated, | ||
| 2637 | s->internal->next_proto_negotiated_len)) | ||
| 2638 | goto err; | ||
| 2639 | if (!CBB_add_u8_length_prefixed(&nextproto, &padding)) | ||
| 2640 | goto err; | ||
| 2641 | if (!CBB_add_space(&padding, &pad, pad_len)) | ||
| 2642 | goto err; | ||
| 2643 | memset(pad, 0, pad_len); | ||
| 2644 | if (!ssl3_handshake_msg_finish_cbb(s, &cbb)) | ||
| 2645 | goto err; | ||
| 2638 | 2646 | ||
| 2639 | s->internal->state = SSL3_ST_CW_NEXT_PROTO_B; | 2647 | s->internal->state = SSL3_ST_CW_NEXT_PROTO_B; |
| 2640 | } | 2648 | } |
| 2641 | 2649 | ||
| 2642 | return (ssl3_handshake_write(s)); | 2650 | return (ssl3_handshake_write(s)); |
| 2651 | |||
| 2652 | err: | ||
| 2653 | CBB_cleanup(&cbb); | ||
| 2654 | |||
| 2655 | return (-1); | ||
| 2643 | } | 2656 | } |
| 2644 | 2657 | ||
| 2645 | /* | 2658 | /* |
