| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/core/crypto/quic_crypto_client_config.h" | 5 #include "net/quic/core/crypto/quic_crypto_client_config.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 : proof_verifier_(std::move(proof_verifier)) { | 59 : proof_verifier_(std::move(proof_verifier)) { |
| 60 DCHECK(proof_verifier_.get()); | 60 DCHECK(proof_verifier_.get()); |
| 61 SetDefaults(); | 61 SetDefaults(); |
| 62 } | 62 } |
| 63 | 63 |
| 64 QuicCryptoClientConfig::~QuicCryptoClientConfig() { | 64 QuicCryptoClientConfig::~QuicCryptoClientConfig() { |
| 65 base::STLDeleteValues(&cached_states_); | 65 base::STLDeleteValues(&cached_states_); |
| 66 } | 66 } |
| 67 | 67 |
| 68 QuicCryptoClientConfig::CachedState::CachedState() | 68 QuicCryptoClientConfig::CachedState::CachedState() |
| 69 : server_config_valid_(false), generation_counter_(0) {} | 69 : server_config_valid_(false), |
| 70 expiration_time_(QuicWallTime::Zero()), |
| 71 generation_counter_(0) {} |
| 70 | 72 |
| 71 QuicCryptoClientConfig::CachedState::~CachedState() {} | 73 QuicCryptoClientConfig::CachedState::~CachedState() {} |
| 72 | 74 |
| 73 bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const { | 75 bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const { |
| 74 if (server_config_.empty()) { | 76 if (server_config_.empty()) { |
| 75 RecordInchoateClientHelloReason(SERVER_CONFIG_EMPTY); | 77 RecordInchoateClientHelloReason(SERVER_CONFIG_EMPTY); |
| 76 return false; | 78 return false; |
| 77 } | 79 } |
| 78 | 80 |
| 79 if (!server_config_valid_) { | 81 if (!server_config_valid_) { |
| 80 RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID); | 82 RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID); |
| 81 return false; | 83 return false; |
| 82 } | 84 } |
| 83 | 85 |
| 84 const CryptoHandshakeMessage* scfg = GetServerConfig(); | 86 const CryptoHandshakeMessage* scfg = GetServerConfig(); |
| 85 if (!scfg) { | 87 if (!scfg) { |
| 86 // Should be impossible short of cache corruption. | 88 // Should be impossible short of cache corruption. |
| 87 DCHECK(false); | 89 DCHECK(false); |
| 88 RecordInchoateClientHelloReason(SERVER_CONFIG_CORRUPTED); | 90 RecordInchoateClientHelloReason(SERVER_CONFIG_CORRUPTED); |
| 89 return false; | 91 return false; |
| 90 } | 92 } |
| 91 | 93 |
| 92 uint64_t expiry_seconds; | 94 if (now.IsAfter(expiration_time_)) { |
| 93 if (scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) { | |
| 94 RecordInchoateClientHelloReason(SERVER_CONFIG_INVALID_EXPIRY); | |
| 95 return false; | |
| 96 } | |
| 97 if (now.ToUNIXSeconds() >= expiry_seconds) { | |
| 98 UMA_HISTOGRAM_CUSTOM_TIMES( | 95 UMA_HISTOGRAM_CUSTOM_TIMES( |
| 99 "Net.QuicClientHelloServerConfig.InvalidDuration", | 96 "Net.QuicClientHelloServerConfig.InvalidDuration", |
| 100 base::TimeDelta::FromSeconds(now.ToUNIXSeconds() - expiry_seconds), | 97 base::TimeDelta::FromSeconds(now.ToUNIXSeconds() - |
| 98 expiration_time_.ToUNIXSeconds()), |
| 101 base::TimeDelta::FromMinutes(1), base::TimeDelta::FromDays(20), 50); | 99 base::TimeDelta::FromMinutes(1), base::TimeDelta::FromDays(20), 50); |
| 102 RecordInchoateClientHelloReason(SERVER_CONFIG_EXPIRED); | 100 RecordInchoateClientHelloReason(SERVER_CONFIG_EXPIRED); |
| 103 return false; | 101 return false; |
| 104 } | 102 } |
| 105 | 103 |
| 106 return true; | 104 return true; |
| 107 } | 105 } |
| 108 | 106 |
| 109 bool QuicCryptoClientConfig::CachedState::IsEmpty() const { | 107 bool QuicCryptoClientConfig::CachedState::IsEmpty() const { |
| 110 return server_config_.empty(); | 108 return server_config_.empty(); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 if (!new_scfg) { | 161 if (!new_scfg) { |
| 164 *error_details = "SCFG invalid"; | 162 *error_details = "SCFG invalid"; |
| 165 return SERVER_CONFIG_INVALID; | 163 return SERVER_CONFIG_INVALID; |
| 166 } | 164 } |
| 167 | 165 |
| 168 uint64_t expiry_seconds; | 166 uint64_t expiry_seconds; |
| 169 if (new_scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) { | 167 if (new_scfg->GetUint64(kEXPY, &expiry_seconds) != QUIC_NO_ERROR) { |
| 170 *error_details = "SCFG missing EXPY"; | 168 *error_details = "SCFG missing EXPY"; |
| 171 return SERVER_CONFIG_INVALID_EXPIRY; | 169 return SERVER_CONFIG_INVALID_EXPIRY; |
| 172 } | 170 } |
| 171 expiration_time_ = QuicWallTime::FromUNIXSeconds(expiry_seconds); |
| 173 | 172 |
| 174 if (now.ToUNIXSeconds() >= expiry_seconds) { | 173 if (now.IsAfter(expiration_time_)) { |
| 175 *error_details = "SCFG has expired"; | 174 *error_details = "SCFG has expired"; |
| 176 return SERVER_CONFIG_EXPIRED; | 175 return SERVER_CONFIG_EXPIRED; |
| 177 } | 176 } |
| 178 | 177 |
| 179 if (!matches_existing) { | 178 if (!matches_existing) { |
| 180 server_config_ = server_config.as_string(); | 179 server_config_ = server_config.as_string(); |
| 181 SetProofInvalid(); | 180 SetProofInvalid(); |
| 182 scfg_.reset(new_scfg_storage.release()); | 181 scfg_.reset(new_scfg_storage.release()); |
| 183 } | 182 } |
| 184 return SERVER_CONFIG_VALID; | 183 return SERVER_CONFIG_VALID; |
| (...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 979 } | 978 } |
| 980 | 979 |
| 981 // Update canonical version to point at the "most recent" entry. | 980 // Update canonical version to point at the "most recent" entry. |
| 982 canonical_server_map_[suffix_server_id] = server_id; | 981 canonical_server_map_[suffix_server_id] = server_id; |
| 983 | 982 |
| 984 server_state->InitializeFrom(*canonical_state); | 983 server_state->InitializeFrom(*canonical_state); |
| 985 return true; | 984 return true; |
| 986 } | 985 } |
| 987 | 986 |
| 988 } // namespace net | 987 } // namespace net |
| OLD | NEW |