Decide whether or not to request client certificates early.
This allows us to merge two of the ssl3_digest_cached_records calls which were almost, but not completely, redundant. Also catches a missing case: the buffer may be discarded if doing session resumption but otherwise enabling client authentication. BUG=492371 Change-Id: I78e9a4a9cca665e89899ef97b815454c6f5c7e02 Reviewed-on: https://boringssl-review.googlesource.com/4885 Reviewed-by: Adam Langley <agl@google.com>
This commit is contained in:
parent
4b30b28def
commit
5c1ce2925d
@ -273,25 +273,17 @@ int dtls1_accept(SSL *s) {
|
|||||||
|
|
||||||
case SSL3_ST_SW_CERT_REQ_A:
|
case SSL3_ST_SW_CERT_REQ_A:
|
||||||
case SSL3_ST_SW_CERT_REQ_B:
|
case SSL3_ST_SW_CERT_REQ_B:
|
||||||
if (/* don't request cert unless asked for it: */
|
if (s->s3->tmp.cert_request) {
|
||||||
!(s->verify_mode & SSL_VERIFY_PEER) ||
|
|
||||||
/* With normal PSK Certificates and
|
|
||||||
* Certificate Requests are omitted */
|
|
||||||
(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
|
|
||||||
/* no cert request */
|
|
||||||
skip = 1;
|
|
||||||
s->s3->tmp.cert_request = 0;
|
|
||||||
s->state = SSL3_ST_SW_SRVR_DONE_A;
|
|
||||||
} else {
|
|
||||||
s->s3->tmp.cert_request = 1;
|
|
||||||
dtls1_start_timer(s);
|
dtls1_start_timer(s);
|
||||||
ret = ssl3_send_certificate_request(s);
|
ret = ssl3_send_certificate_request(s);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
s->state = SSL3_ST_SW_SRVR_DONE_A;
|
} else {
|
||||||
s->init_num = 0;
|
skip = 1;
|
||||||
}
|
}
|
||||||
|
s->state = SSL3_ST_SW_SRVR_DONE_A;
|
||||||
|
s->init_num = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SSL3_ST_SW_SRVR_DONE_A:
|
case SSL3_ST_SW_SRVR_DONE_A:
|
||||||
|
@ -337,31 +337,16 @@ int ssl3_accept(SSL *s) {
|
|||||||
|
|
||||||
case SSL3_ST_SW_CERT_REQ_A:
|
case SSL3_ST_SW_CERT_REQ_A:
|
||||||
case SSL3_ST_SW_CERT_REQ_B:
|
case SSL3_ST_SW_CERT_REQ_B:
|
||||||
if (/* don't request cert unless asked for it: */
|
if (s->s3->tmp.cert_request) {
|
||||||
!(s->verify_mode & SSL_VERIFY_PEER) ||
|
|
||||||
/* Don't request a certificate if an obc was presented */
|
|
||||||
((s->verify_mode & SSL_VERIFY_PEER_IF_NO_OBC) &&
|
|
||||||
s->s3->tlsext_channel_id_valid) ||
|
|
||||||
/* With normal PSK Certificates and
|
|
||||||
* Certificate Requests are omitted */
|
|
||||||
(s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK)) {
|
|
||||||
/* no cert request */
|
|
||||||
skip = 1;
|
|
||||||
s->s3->tmp.cert_request = 0;
|
|
||||||
s->state = SSL3_ST_SW_SRVR_DONE_A;
|
|
||||||
if (s->s3->handshake_buffer &&
|
|
||||||
!ssl3_digest_cached_records(s, free_handshake_buffer)) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
s->s3->tmp.cert_request = 1;
|
|
||||||
ret = ssl3_send_certificate_request(s);
|
ret = ssl3_send_certificate_request(s);
|
||||||
if (ret <= 0) {
|
if (ret <= 0) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
s->state = SSL3_ST_SW_SRVR_DONE_A;
|
} else {
|
||||||
s->init_num = 0;
|
skip = 1;
|
||||||
}
|
}
|
||||||
|
s->state = SSL3_ST_SW_SRVR_DONE_A;
|
||||||
|
s->init_num = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SSL3_ST_SW_SRVR_DONE_A:
|
case SSL3_ST_SW_SRVR_DONE_A:
|
||||||
@ -1069,12 +1054,27 @@ int ssl3_get_client_hello(SSL *s) {
|
|||||||
goto f_err;
|
goto f_err;
|
||||||
}
|
}
|
||||||
s->s3->tmp.new_cipher = c;
|
s->s3->tmp.new_cipher = c;
|
||||||
|
|
||||||
|
/* Determine whether to request a client certificate. */
|
||||||
|
s->s3->tmp.cert_request = !!(s->verify_mode & SSL_VERIFY_PEER);
|
||||||
|
/* Only request a certificate if Channel ID isn't negotiated. */
|
||||||
|
if ((s->verify_mode & SSL_VERIFY_PEER_IF_NO_OBC) &&
|
||||||
|
s->s3->tlsext_channel_id_valid) {
|
||||||
|
s->s3->tmp.cert_request = 0;
|
||||||
|
}
|
||||||
|
/* Plain PSK forbids Certificate and CertificateRequest. */
|
||||||
|
if (s->s3->tmp.new_cipher->algorithm_mkey & SSL_kPSK) {
|
||||||
|
s->s3->tmp.cert_request = 0;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Session-id reuse */
|
/* Session-id reuse */
|
||||||
s->s3->tmp.new_cipher = s->session->cipher;
|
s->s3->tmp.new_cipher = s->session->cipher;
|
||||||
|
s->s3->tmp.cert_request = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((!SSL_USE_SIGALGS(s) || !(s->verify_mode & SSL_VERIFY_PEER)) &&
|
/* In TLS 1.2, client authentication requires hashing the handshake transcript
|
||||||
|
* under a different hash. Otherwise, release the handshake buffer. */
|
||||||
|
if ((!SSL_USE_SIGALGS(s) || !s->s3->tmp.cert_request) &&
|
||||||
!ssl3_digest_cached_records(s, free_handshake_buffer)) {
|
!ssl3_digest_cached_records(s, free_handshake_buffer)) {
|
||||||
goto f_err;
|
goto f_err;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user