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/crypto/quic_crypto_client_config.h" | 5 #include "net/quic/crypto/quic_crypto_client_config.h" |
6 | 6 |
7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
8 #include "net/quic/crypto/cert_compressor.h" | 8 #include "net/quic/crypto/cert_compressor.h" |
9 #include "net/quic/crypto/channel_id.h" | 9 #include "net/quic/crypto/channel_id.h" |
10 #include "net/quic/crypto/common_cert_set.h" | 10 #include "net/quic/crypto/common_cert_set.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
22 #include "base/win/windows_version.h" | 22 #include "base/win/windows_version.h" |
23 #endif | 23 #endif |
24 | 24 |
25 using base::StringPiece; | 25 using base::StringPiece; |
26 using std::map; | 26 using std::map; |
27 using std::string; | 27 using std::string; |
28 using std::vector; | 28 using std::vector; |
29 | 29 |
30 namespace net { | 30 namespace net { |
31 | 31 |
32 QuicCryptoClientConfig::QuicCryptoClientConfig() | 32 QuicCryptoClientConfig::QuicCryptoClientConfig() { |
33 : quic_server_info_factory_(NULL) { | |
34 } | |
35 | |
36 QuicCryptoClientConfig::QuicCryptoClientConfig( | |
37 QuicServerInfoFactory* quic_server_info_factory) | |
38 : quic_server_info_factory_(quic_server_info_factory) { | |
39 } | 33 } |
40 | 34 |
41 QuicCryptoClientConfig::~QuicCryptoClientConfig() { | 35 QuicCryptoClientConfig::~QuicCryptoClientConfig() { |
42 STLDeleteValues(&cached_states_); | 36 STLDeleteValues(&cached_states_); |
43 } | 37 } |
44 | 38 |
45 QuicCryptoClientConfig::CachedState::CachedState() | 39 QuicCryptoClientConfig::CachedState::CachedState() |
46 : server_config_valid_(false), | 40 : server_config_valid_(false), |
47 generation_counter_(0) {} | 41 generation_counter_(0) {} |
48 | 42 |
43 QuicCryptoClientConfig::CachedState::CachedState( | |
44 scoped_ptr<QuicServerInfo> quic_server_info) | |
45 : server_config_valid_(false), | |
46 generation_counter_(0), | |
47 quic_server_info_(quic_server_info.Pass()) {} | |
48 | |
49 QuicCryptoClientConfig::CachedState::~CachedState() {} | 49 QuicCryptoClientConfig::CachedState::~CachedState() {} |
50 | 50 |
51 void QuicCryptoClientConfig::CachedState::LoadFromDiskCache( | |
52 QuicServerInfoFactory* quic_server_info_factory, | |
53 const string& server_hostname) { | |
54 DCHECK(quic_server_info_factory); | |
55 quic_server_info_.reset( | |
56 quic_server_info_factory->GetForHost(server_hostname)); | |
57 | |
58 // TODO(rtenneti): Need to flesh out reading data from disk cache. | |
59 } | |
60 | |
61 bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const { | 51 bool QuicCryptoClientConfig::CachedState::IsComplete(QuicWallTime now) const { |
62 if (server_config_.empty() || !server_config_valid_) { | 52 if (server_config_.empty() || !server_config_valid_) { |
63 return false; | 53 return false; |
64 } | 54 } |
65 | 55 |
66 const CryptoHandshakeMessage* scfg = GetServerConfig(); | 56 const CryptoHandshakeMessage* scfg = GetServerConfig(); |
67 if (!scfg) { | 57 if (!scfg) { |
68 // Should be impossible short of cache corruption. | 58 // Should be impossible short of cache corruption. |
69 DCHECK(false); | 59 DCHECK(false); |
70 return false; | 60 return false; |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
232 // Key exchange methods. | 222 // Key exchange methods. |
233 kexs.resize(2); | 223 kexs.resize(2); |
234 kexs[0] = kC255; | 224 kexs[0] = kC255; |
235 kexs[1] = kP256; | 225 kexs[1] = kP256; |
236 | 226 |
237 // Authenticated encryption algorithms. | 227 // Authenticated encryption algorithms. |
238 aead.resize(1); | 228 aead.resize(1); |
239 aead[0] = kAESG; | 229 aead[0] = kAESG; |
240 } | 230 } |
241 | 231 |
232 QuicCryptoClientConfig::CachedState* QuicCryptoClientConfig::Create( | |
233 const string& server_hostname, | |
234 QuicServerInfoFactory* quic_server_info_factory) { | |
235 scoped_ptr<QuicServerInfo> quic_server_info; | |
236 if (quic_server_info_factory) { | |
237 DCHECK(cached_states_.find(server_hostname) == cached_states_.end()); | |
wtc
2014/02/05 00:03:25
This DCHECK should be moved outside the "if" state
ramant (doing other things)
2014/02/05 00:40:39
Done.
| |
238 | |
239 quic_server_info.reset( | |
240 quic_server_info_factory->GetForHost(server_hostname)); | |
241 quic_server_info->Start(); | |
242 } | |
243 | |
244 CachedState* cached = new CachedState(quic_server_info.Pass()); | |
245 cached_states_.insert(make_pair(server_hostname, cached)); | |
246 return cached; | |
247 } | |
248 | |
242 QuicCryptoClientConfig::CachedState* QuicCryptoClientConfig::LookupOrCreate( | 249 QuicCryptoClientConfig::CachedState* QuicCryptoClientConfig::LookupOrCreate( |
243 const string& server_hostname) { | 250 const string& server_hostname) { |
244 map<string, CachedState*>::const_iterator it = | 251 map<string, CachedState*>::const_iterator it = |
245 cached_states_.find(server_hostname); | 252 cached_states_.find(server_hostname); |
246 if (it != cached_states_.end()) { | 253 if (it != cached_states_.end()) { |
247 return it->second; | 254 return it->second; |
248 } | 255 } |
249 | 256 return Create(server_hostname, NULL); |
250 CachedState* cached = new CachedState; | |
251 if (quic_server_info_factory_) { | |
252 cached->LoadFromDiskCache(quic_server_info_factory_, server_hostname); | |
253 } | |
254 cached_states_.insert(make_pair(server_hostname, cached)); | |
255 return cached; | |
256 } | 257 } |
257 | 258 |
258 void QuicCryptoClientConfig::FillInchoateClientHello( | 259 void QuicCryptoClientConfig::FillInchoateClientHello( |
259 const string& server_hostname, | 260 const string& server_hostname, |
260 const QuicVersion preferred_version, | 261 const QuicVersion preferred_version, |
261 const CachedState* cached, | 262 const CachedState* cached, |
262 QuicCryptoNegotiatedParameters* out_params, | 263 QuicCryptoNegotiatedParameters* out_params, |
263 CryptoHandshakeMessage* out) const { | 264 CryptoHandshakeMessage* out) const { |
264 out->set_tag(kCHLO); | 265 out->set_tag(kCHLO); |
265 out->set_minimum_size(kClientHelloMinimumSize); | 266 out->set_minimum_size(kClientHelloMinimumSize); |
(...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
667 CachedState* canonical_cached = | 668 CachedState* canonical_cached = |
668 canonical_crypto_config->LookupOrCreate(canonical_server_hostname); | 669 canonical_crypto_config->LookupOrCreate(canonical_server_hostname); |
669 if (!canonical_cached->proof_valid()) { | 670 if (!canonical_cached->proof_valid()) { |
670 return; | 671 return; |
671 } | 672 } |
672 CachedState* cached = LookupOrCreate(server_hostname); | 673 CachedState* cached = LookupOrCreate(server_hostname); |
673 cached->InitializeFrom(*canonical_cached); | 674 cached->InitializeFrom(*canonical_cached); |
674 } | 675 } |
675 | 676 |
676 } // namespace net | 677 } // namespace net |
OLD | NEW |