Index: net/http/http_network_transaction.cc |
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc |
index 5f7c4bd99743851434119aee7608fc88bfce0635..120436443e4128f972a61b6982c5d308275e4459 100644 |
--- a/net/http/http_network_transaction.cc |
+++ b/net/http/http_network_transaction.cc |
@@ -707,12 +707,19 @@ int HttpNetworkTransaction::DoLoop(int result) { |
case STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE: |
rv = DoGenerateServerAuthTokenComplete(rv); |
break; |
- case STATE_GET_TOKEN_BINDING_KEY: |
+ case STATE_GET_PROVIDED_TOKEN_BINDING_KEY: |
DCHECK_EQ(OK, rv); |
- rv = DoGetTokenBindingKey(); |
+ rv = DoGetProvidedTokenBindingKey(); |
break; |
- case STATE_GET_TOKEN_BINDING_KEY_COMPLETE: |
- rv = DoGetTokenBindingKeyComplete(rv); |
+ case STATE_GET_PROVIDED_TOKEN_BINDING_KEY_COMPLETE: |
+ rv = DoGetProvidedTokenBindingKeyComplete(rv); |
+ break; |
+ case STATE_GET_REFERRED_TOKEN_BINDING_KEY: |
+ DCHECK_EQ(OK, rv); |
+ rv = DoGetReferredTokenBindingKey(); |
+ break; |
+ case STATE_GET_REFERRED_TOKEN_BINDING_KEY_COMPLETE: |
+ rv = DoGetReferredTokenBindingKeyComplete(rv); |
break; |
case STATE_INIT_REQUEST_BODY: |
DCHECK_EQ(OK, rv); |
@@ -929,30 +936,54 @@ int HttpNetworkTransaction::DoGenerateServerAuthToken() { |
int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { |
DCHECK_NE(ERR_IO_PENDING, rv); |
if (rv == OK) |
- next_state_ = STATE_GET_TOKEN_BINDING_KEY; |
+ next_state_ = STATE_GET_PROVIDED_TOKEN_BINDING_KEY; |
return rv; |
} |
-int HttpNetworkTransaction::DoGetTokenBindingKey() { |
- next_state_ = STATE_GET_TOKEN_BINDING_KEY_COMPLETE; |
+int HttpNetworkTransaction::DoGetProvidedTokenBindingKey() { |
+ next_state_ = STATE_GET_PROVIDED_TOKEN_BINDING_KEY_COMPLETE; |
if (!IsTokenBindingEnabled()) |
return OK; |
net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY); |
ChannelIDService* channel_id_service = session_->params().channel_id_service; |
return channel_id_service->GetOrCreateChannelID( |
- request_->url.host(), &token_binding_key_, io_callback_, |
+ request_->url.host(), &provided_token_binding_key_, io_callback_, |
&token_binding_request_); |
} |
-int HttpNetworkTransaction::DoGetTokenBindingKeyComplete(int rv) { |
+int HttpNetworkTransaction::DoGetProvidedTokenBindingKeyComplete(int rv) { |
DCHECK_NE(ERR_IO_PENDING, rv); |
- next_state_ = STATE_INIT_REQUEST_BODY; |
- if (!IsTokenBindingEnabled()) |
+ if (IsTokenBindingEnabled()) { |
+ net_log_.EndEventWithNetErrorCode( |
+ NetLog::TYPE_HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY, rv); |
+ } |
+ |
+ if (rv == OK) |
+ next_state_ = STATE_GET_REFERRED_TOKEN_BINDING_KEY; |
+ return rv; |
+} |
+ |
+int HttpNetworkTransaction::DoGetReferredTokenBindingKey() { |
+ next_state_ = STATE_GET_REFERRED_TOKEN_BINDING_KEY_COMPLETE; |
+ if (!IsTokenBindingEnabled() || request_->token_binding_referrer.empty()) |
return OK; |
- net_log_.EndEventWithNetErrorCode( |
- NetLog::TYPE_HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY, rv); |
+ net_log_.BeginEvent(NetLog::TYPE_HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY); |
+ ChannelIDService* channel_id_service = session_->params().channel_id_service; |
+ return channel_id_service->GetOrCreateChannelID( |
+ request_->token_binding_referrer, &referred_token_binding_key_, |
+ io_callback_, &token_binding_request_); |
+} |
+ |
+int HttpNetworkTransaction::DoGetReferredTokenBindingKeyComplete(int rv) { |
+ DCHECK_NE(ERR_IO_PENDING, rv); |
+ if (IsTokenBindingEnabled() && !request_->token_binding_referrer.empty()) { |
+ net_log_.EndEventWithNetErrorCode( |
+ NetLog::TYPE_HTTP_TRANSACTION_GET_TOKEN_BINDING_KEY, rv); |
+ } |
+ if (rv == OK) |
+ next_state_ = STATE_INIT_REQUEST_BODY; |
return rv; |
} |
@@ -990,7 +1021,7 @@ int HttpNetworkTransaction::BuildRequestHeaders( |
} |
RecordTokenBindingSupport(); |
- if (token_binding_key_) { |
+ if (provided_token_binding_key_) { |
std::string token_binding_header; |
int rv = BuildTokenBindingHeader(&token_binding_header); |
if (rv != OK) |
@@ -1029,17 +1060,34 @@ int HttpNetworkTransaction::BuildRequestHeaders( |
int HttpNetworkTransaction::BuildTokenBindingHeader(std::string* out) { |
base::TimeTicks start = base::TimeTicks::Now(); |
std::vector<uint8_t> signed_ekm; |
- int rv = stream_->GetSignedEKMForTokenBinding(token_binding_key_.get(), |
- &signed_ekm); |
+ int rv = stream_->GetSignedEKMForTokenBinding( |
+ provided_token_binding_key_.get(), &signed_ekm); |
if (rv != OK) |
return rv; |
std::string provided_token_binding; |
- rv = BuildProvidedTokenBinding(token_binding_key_.get(), signed_ekm, |
- &provided_token_binding); |
+ rv = BuildTokenBinding(TokenBindingType::PROVIDED, |
+ provided_token_binding_key_.get(), signed_ekm, |
+ &provided_token_binding); |
if (rv != OK) |
return rv; |
+ |
std::vector<base::StringPiece> token_bindings; |
token_bindings.push_back(provided_token_binding); |
+ |
+ std::string referred_token_binding; |
+ if (referred_token_binding_key_) { |
+ std::vector<uint8_t> referred_signed_ekm; |
+ int rv = stream_->GetSignedEKMForTokenBinding( |
+ referred_token_binding_key_.get(), &referred_signed_ekm); |
+ if (rv != OK) |
+ return rv; |
+ rv = BuildTokenBinding(TokenBindingType::REFERRED, |
+ referred_token_binding_key_.get(), |
+ referred_signed_ekm, &referred_token_binding); |
+ if (rv != OK) |
+ return rv; |
+ token_bindings.push_back(referred_token_binding); |
+ } |
std::string header; |
rv = BuildTokenBindingMessageFromTokenBindings(token_bindings, &header); |
if (rv != OK) |
@@ -1531,7 +1579,8 @@ void HttpNetworkTransaction::ResetStateForAuthRestart() { |
remote_endpoint_ = IPEndPoint(); |
net_error_details_.quic_broken = false; |
net_error_details_.quic_connection_error = QUIC_NO_ERROR; |
- token_binding_key_.reset(); |
+ provided_token_binding_key_.reset(); |
+ referred_token_binding_key_.reset(); |
} |
void HttpNetworkTransaction::CacheNetErrorDetailsAndResetStream() { |