Add default handlers for extension parsing. This allows us to specify client-only and unused callbacks without needing to include empty wrappers, and allows us to continue using the default ext_*_parse_clienthello function for early parsing. Change-Id: I4104e22a0a6dd6b02f9a5605e9866f6b3de6a097 Reviewed-on: https://boringssl-review.googlesource.com/8743 Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/ssl/t1_lib.c b/ssl/t1_lib.c index c05bc4f..2b9402d 100644 --- a/ssl/t1_lib.c +++ b/ssl/t1_lib.c
@@ -623,6 +623,25 @@ int (*add_serverhello)(SSL *ssl, CBB *out); }; +static int forbid_parse_serverhello(SSL *ssl, uint8_t *out_alert, CBS *contents) { + if (contents != NULL) { + /* Servers MUST NOT send this extension. */ + *out_alert = SSL_AD_UNSUPPORTED_EXTENSION; + OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION); + return 0; + } + + return 1; +} + +static int ignore_parse_clienthello(SSL *ssl, uint8_t *out_alert, CBS *contents) { + /* This extension from the client is handled elsewhere. */ + return 1; +} + +static int dont_add_serverhello(SSL *ssl, CBB *out) { + return 1; +} /* Server name indication (SNI). * @@ -1004,13 +1023,6 @@ return 1; } -static int ext_ticket_parse_clienthello(SSL *ssl, uint8_t *out_alert, - CBS *contents) { - /* This function isn't used because the ticket extension from the client is - * handled in ssl_session.c. */ - return 1; -} - static int ext_ticket_add_serverhello(SSL *ssl, CBB *out) { if (!ssl->tlsext_ticket_expected) { return 1; @@ -1062,18 +1074,6 @@ return 1; } -static int ext_sigalgs_parse_serverhello(SSL *ssl, uint8_t *out_alert, - CBS *contents) { - if (contents != NULL) { - /* Servers MUST NOT send this extension. */ - *out_alert = SSL_AD_UNSUPPORTED_EXTENSION; - OPENSSL_PUT_ERROR(SSL, SSL_R_SIGNATURE_ALGORITHMS_EXTENSION_SENT_BY_SERVER); - return 0; - } - - return 1; -} - static int ext_sigalgs_parse_clienthello(SSL *ssl, uint8_t *out_alert, CBS *contents) { OPENSSL_free(ssl->cert->peer_sigalgs); @@ -1095,11 +1095,6 @@ return 1; } -static int ext_sigalgs_add_serverhello(SSL *ssl, CBB *out) { - /* Servers MUST NOT send this extension. */ - return 1; -} - /* OCSP Stapling. * @@ -1938,16 +1933,17 @@ NULL, ext_ticket_add_clienthello, ext_ticket_parse_serverhello, - ext_ticket_parse_clienthello, + /* Ticket extension client parsing is handled in ssl_session.c */ + ignore_parse_clienthello, ext_ticket_add_serverhello, }, { TLSEXT_TYPE_signature_algorithms, NULL, ext_sigalgs_add_clienthello, - ext_sigalgs_parse_serverhello, + forbid_parse_serverhello, ext_sigalgs_parse_clienthello, - ext_sigalgs_add_serverhello, + dont_add_serverhello, }, { TLSEXT_TYPE_status_request,