OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | |
6 #define NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | |
7 | |
8 #include <map> | |
9 #include <string> | |
10 #include <vector> | |
11 | |
12 #include "base/memory/ref_counted.h" | |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "base/strings/string_piece.h" | |
15 #include "base/synchronization/lock.h" | |
16 #include "net/base/ip_endpoint.h" | |
17 #include "net/base/net_export.h" | |
18 #include "net/quic/crypto/cached_network_parameters.h" | |
19 #include "net/quic/crypto/crypto_handshake.h" | |
20 #include "net/quic/crypto/crypto_handshake_message.h" | |
21 #include "net/quic/crypto/crypto_protocol.h" | |
22 #include "net/quic/crypto/crypto_secret_boxer.h" | |
23 #include "net/quic/crypto/source_address_token.h" | |
24 #include "net/quic/quic_time.h" | |
25 | |
26 namespace net { | |
27 | |
28 class CryptoHandshakeMessage; | |
29 class EphemeralKeySource; | |
30 class KeyExchange; | |
31 class ProofSource; | |
32 class QuicClock; | |
33 class QuicDecrypter; | |
34 class QuicEncrypter; | |
35 class QuicRandom; | |
36 class QuicServerConfigProtobuf; | |
37 class StrikeRegister; | |
38 class StrikeRegisterClient; | |
39 | |
40 // ClientHelloInfo contains information about a client hello message that is | |
41 // only kept for as long as it's being processed. | |
42 struct ClientHelloInfo { | |
43 ClientHelloInfo(const IPEndPoint& in_client_ip, QuicWallTime in_now); | |
44 ~ClientHelloInfo(); | |
45 | |
46 // Inputs to EvaluateClientHello. | |
47 const IPEndPoint client_ip; | |
48 const QuicWallTime now; | |
49 | |
50 // Outputs from EvaluateClientHello. | |
51 bool valid_source_address_token; | |
52 bool client_nonce_well_formed; | |
53 bool unique; | |
54 base::StringPiece sni; | |
55 base::StringPiece client_nonce; | |
56 base::StringPiece server_nonce; | |
57 base::StringPiece user_agent_id; | |
58 SourceAddressTokens source_address_tokens; | |
59 | |
60 // Errors from EvaluateClientHello. | |
61 std::vector<uint32> reject_reasons; | |
62 static_assert(sizeof(QuicTag) == sizeof(uint32), "header out of sync"); | |
63 }; | |
64 | |
65 namespace test { | |
66 class QuicCryptoServerConfigPeer; | |
67 } // namespace test | |
68 | |
69 // Hook that allows application code to subscribe to primary config changes. | |
70 class PrimaryConfigChangedCallback { | |
71 public: | |
72 PrimaryConfigChangedCallback(); | |
73 virtual ~PrimaryConfigChangedCallback(); | |
74 virtual void Run(const std::string& scid) = 0; | |
75 | |
76 private: | |
77 DISALLOW_COPY_AND_ASSIGN(PrimaryConfigChangedCallback); | |
78 }; | |
79 | |
80 // Callback used to accept the result of the |client_hello| validation step. | |
81 class NET_EXPORT_PRIVATE ValidateClientHelloResultCallback { | |
82 public: | |
83 // Opaque token that holds information about the client_hello and | |
84 // its validity. Can be interpreted by calling ProcessClientHello. | |
85 struct Result { | |
86 Result(const CryptoHandshakeMessage& in_client_hello, | |
87 IPEndPoint in_client_ip, | |
88 QuicWallTime in_now); | |
89 ~Result(); | |
90 | |
91 CryptoHandshakeMessage client_hello; | |
92 ClientHelloInfo info; | |
93 QuicErrorCode error_code; | |
94 std::string error_details; | |
95 | |
96 // Populated if the CHLO STK contained a CachedNetworkParameters proto. | |
97 CachedNetworkParameters cached_network_params; | |
98 }; | |
99 | |
100 ValidateClientHelloResultCallback(); | |
101 virtual ~ValidateClientHelloResultCallback(); | |
102 void Run(const Result* result); | |
103 | |
104 protected: | |
105 virtual void RunImpl(const CryptoHandshakeMessage& client_hello, | |
106 const Result& result) = 0; | |
107 | |
108 private: | |
109 DISALLOW_COPY_AND_ASSIGN(ValidateClientHelloResultCallback); | |
110 }; | |
111 | |
112 // QuicCryptoServerConfig contains the crypto configuration of a QUIC server. | |
113 // Unlike a client, a QUIC server can have multiple configurations active in | |
114 // order to support clients resuming with a previous configuration. | |
115 // TODO(agl): when adding configurations at runtime is added, this object will | |
116 // need to consider locking. | |
117 class NET_EXPORT_PRIVATE QuicCryptoServerConfig { | |
118 public: | |
119 // ConfigOptions contains options for generating server configs. | |
120 struct NET_EXPORT_PRIVATE ConfigOptions { | |
121 ConfigOptions(); | |
122 | |
123 // expiry_time is the time, in UNIX seconds, when the server config will | |
124 // expire. If unset, it defaults to the current time plus six months. | |
125 QuicWallTime expiry_time; | |
126 // channel_id_enabled controls whether the server config will indicate | |
127 // support for ChannelIDs. | |
128 bool channel_id_enabled; | |
129 // id contains the server config id for the resulting config. If empty, a | |
130 // random id is generated. | |
131 std::string id; | |
132 // orbit contains the kOrbitSize bytes of the orbit value for the server | |
133 // config. If |orbit| is empty then a random orbit is generated. | |
134 std::string orbit; | |
135 // p256 determines whether a P-256 public key will be included in the | |
136 // server config. Note that this breaks deterministic server-config | |
137 // generation since P-256 key generation doesn't use the QuicRandom given | |
138 // to DefaultConfig(). | |
139 bool p256; | |
140 }; | |
141 | |
142 // |source_address_token_secret|: secret key material used for encrypting and | |
143 // decrypting source address tokens. It can be of any length as it is fed | |
144 // into a KDF before use. In tests, use TESTING. | |
145 // |server_nonce_entropy|: an entropy source used to generate the orbit and | |
146 // key for server nonces, which are always local to a given instance of a | |
147 // server. | |
148 QuicCryptoServerConfig(base::StringPiece source_address_token_secret, | |
149 QuicRandom* server_nonce_entropy); | |
150 ~QuicCryptoServerConfig(); | |
151 | |
152 // TESTING is a magic parameter for passing to the constructor in tests. | |
153 static const char TESTING[]; | |
154 | |
155 // Generates a QuicServerConfigProtobuf protobuf suitable for | |
156 // AddConfig and SetConfigs. | |
157 static QuicServerConfigProtobuf* GenerateConfig( | |
158 QuicRandom* rand, | |
159 const QuicClock* clock, | |
160 const ConfigOptions& options); | |
161 | |
162 // AddConfig adds a QuicServerConfigProtobuf to the availible configurations. | |
163 // It returns the SCFG message from the config if successful. The caller | |
164 // takes ownership of the CryptoHandshakeMessage. |now| is used in | |
165 // conjunction with |protobuf->primary_time()| to determine whether the | |
166 // config should be made primary. | |
167 CryptoHandshakeMessage* AddConfig(QuicServerConfigProtobuf* protobuf, | |
168 QuicWallTime now); | |
169 | |
170 // AddDefaultConfig calls DefaultConfig to create a config and then calls | |
171 // AddConfig to add it. See the comment for |DefaultConfig| for details of | |
172 // the arguments. | |
173 CryptoHandshakeMessage* AddDefaultConfig( | |
174 QuicRandom* rand, | |
175 const QuicClock* clock, | |
176 const ConfigOptions& options); | |
177 | |
178 // SetConfigs takes a vector of config protobufs and the current time. | |
179 // Configs are assumed to be uniquely identified by their server config ID. | |
180 // Previously unknown configs are added and possibly made the primary config | |
181 // depending on their |primary_time| and the value of |now|. Configs that are | |
182 // known, but are missing from the protobufs are deleted, unless they are | |
183 // currently the primary config. SetConfigs returns false if any errors were | |
184 // encountered and no changes to the QuicCryptoServerConfig will occur. | |
185 bool SetConfigs(const std::vector<QuicServerConfigProtobuf*>& protobufs, | |
186 QuicWallTime now); | |
187 | |
188 // Get the server config ids for all known configs. | |
189 void GetConfigIds(std::vector<std::string>* scids) const; | |
190 | |
191 // Checks |client_hello| for gross errors and determines whether it | |
192 // can be shown to be fresh (i.e. not a replay). The result of the | |
193 // validation step must be interpreted by calling | |
194 // QuicCryptoServerConfig::ProcessClientHello from the done_cb. | |
195 // | |
196 // ValidateClientHello may invoke the done_cb before unrolling the | |
197 // stack if it is able to assess the validity of the client_nonce | |
198 // without asynchronous operations. | |
199 // | |
200 // client_hello: the incoming client hello message. | |
201 // client_ip: the IP address of the client, which is used to generate and | |
202 // validate source-address tokens. | |
203 // clock: used to validate client nonces and ephemeral keys. | |
204 // done_cb: single-use callback that accepts an opaque | |
205 // ValidatedClientHelloMsg token that holds information about | |
206 // the client hello. The callback will always be called exactly | |
207 // once, either under the current call stack, or after the | |
208 // completion of an asynchronous operation. | |
209 void ValidateClientHello( | |
210 const CryptoHandshakeMessage& client_hello, | |
211 IPEndPoint client_ip, | |
212 const QuicClock* clock, | |
213 ValidateClientHelloResultCallback* done_cb) const; | |
214 | |
215 // ProcessClientHello processes |client_hello| and decides whether to accept | |
216 // or reject the connection. If the connection is to be accepted, |out| is | |
217 // set to the contents of the ServerHello, |out_params| is completed and | |
218 // QUIC_NO_ERROR is returned. Otherwise |out| is set to be a REJ message and | |
219 // an error code is returned. | |
220 // | |
221 // validate_chlo_result: Output from the asynchronous call to | |
222 // ValidateClientHello. Contains the client hello message and | |
223 // information about it. | |
224 // connection_id: the ConnectionId for the connection, which is used in key | |
225 // derivation. | |
226 // server_ip: the IP address and port of the server. The IP address may be | |
227 // used for certificate selection. | |
228 // client_address: the IP address and port of the client. The IP address is | |
229 // used to generate and validate source-address tokens. | |
230 // version: version of the QUIC protocol in use for this connection | |
231 // supported_versions: versions of the QUIC protocol that this server | |
232 // supports. | |
233 // initial_flow_control_window: size of initial flow control window this | |
234 // server uses for new streams. | |
235 // clock: used to validate client nonces and ephemeral keys. | |
236 // rand: an entropy source | |
237 // params: the state of the handshake. This may be updated with a server | |
238 // nonce when we send a rejection. After a successful handshake, this will | |
239 // contain the state of the connection. | |
240 // out: the resulting handshake message (either REJ or SHLO) | |
241 // error_details: used to store a string describing any error. | |
242 QuicErrorCode ProcessClientHello( | |
243 const ValidateClientHelloResultCallback::Result& validate_chlo_result, | |
244 QuicConnectionId connection_id, | |
245 const IPEndPoint& server_ip, | |
246 const IPEndPoint& client_address, | |
247 QuicVersion version, | |
248 const QuicVersionVector& supported_versions, | |
249 const QuicClock* clock, | |
250 QuicRandom* rand, | |
251 QuicCryptoNegotiatedParameters* params, | |
252 CryptoHandshakeMessage* out, | |
253 std::string* error_details) const; | |
254 | |
255 // BuildServerConfigUpdateMessage sets |out| to be a SCUP message containing | |
256 // the current primary config, an up to date source-address token, and cert | |
257 // chain and proof in the case of secure QUIC. Returns true if successfully | |
258 // filled |out|. | |
259 // | |
260 // |cached_network_params| is optional, and can be nullptr. | |
261 bool BuildServerConfigUpdateMessage( | |
262 const SourceAddressTokens& previous_source_address_tokens, | |
263 const IPEndPoint& server_ip, | |
264 const IPEndPoint& client_ip, | |
265 const QuicClock* clock, | |
266 QuicRandom* rand, | |
267 const QuicCryptoNegotiatedParameters& params, | |
268 const CachedNetworkParameters* cached_network_params, | |
269 CryptoHandshakeMessage* out) const; | |
270 | |
271 // SetProofSource installs |proof_source| as the ProofSource for handshakes. | |
272 // This object takes ownership of |proof_source|. | |
273 void SetProofSource(ProofSource* proof_source); | |
274 | |
275 // SetEphemeralKeySource installs an object that can cache ephemeral keys for | |
276 // a short period of time. This object takes ownership of | |
277 // |ephemeral_key_source|. If not set then ephemeral keys will be generated | |
278 // per-connection. | |
279 void SetEphemeralKeySource(EphemeralKeySource* ephemeral_key_source); | |
280 | |
281 // Install an externall created StrikeRegisterClient for use to | |
282 // interact with the strike register. This object takes ownership | |
283 // of the |strike_register_client|. | |
284 void SetStrikeRegisterClient(StrikeRegisterClient* strike_register_client); | |
285 | |
286 // set_replay_protection controls whether replay protection is enabled. If | |
287 // replay protection is disabled then no strike registers are needed and | |
288 // frontends can share an orbit value without a shared strike-register. | |
289 // However, an attacker can duplicate a handshake and cause a client's | |
290 // request to be processed twice. | |
291 void set_replay_protection(bool on); | |
292 | |
293 // set_strike_register_no_startup_period configures the strike register to | |
294 // not have a startup period. | |
295 void set_strike_register_no_startup_period(); | |
296 | |
297 // set_strike_register_max_entries sets the maximum number of entries that | |
298 // the internal strike register will hold. If the strike register fills up | |
299 // then the oldest entries (by the client's clock) will be dropped. | |
300 void set_strike_register_max_entries(uint32 max_entries); | |
301 | |
302 // set_strike_register_window_secs sets the number of seconds around the | |
303 // current time that the strike register will attempt to be authoritative | |
304 // for. Setting a larger value allows for greater client clock-skew, but | |
305 // means that the quiescent startup period must be longer. | |
306 void set_strike_register_window_secs(uint32 window_secs); | |
307 | |
308 // set_source_address_token_future_secs sets the number of seconds into the | |
309 // future that source-address tokens will be accepted from. Since | |
310 // source-address tokens are authenticated, this should only happen if | |
311 // another, valid server has clock-skew. | |
312 void set_source_address_token_future_secs(uint32 future_secs); | |
313 | |
314 // set_source_address_token_lifetime_secs sets the number of seconds that a | |
315 // source-address token will be valid for. | |
316 void set_source_address_token_lifetime_secs(uint32 lifetime_secs); | |
317 | |
318 // set_server_nonce_strike_register_max_entries sets the number of entries in | |
319 // the server-nonce strike-register. This is used to record that server nonce | |
320 // values have been used. If the number of entries is too small then clients | |
321 // which are depending on server nonces may fail to handshake because their | |
322 // nonce has expired in the amount of time it took to go from the server to | |
323 // the client and back. | |
324 void set_server_nonce_strike_register_max_entries(uint32 max_entries); | |
325 | |
326 // set_server_nonce_strike_register_window_secs sets the number of seconds | |
327 // around the current time that the server-nonce strike-register will accept | |
328 // nonces from. Setting a larger value allows for clients to delay follow-up | |
329 // client hellos for longer and still use server nonces as proofs of | |
330 // uniqueness. | |
331 void set_server_nonce_strike_register_window_secs(uint32 window_secs); | |
332 | |
333 // Set and take ownership of the callback to invoke on primary config changes. | |
334 void AcquirePrimaryConfigChangedCb(PrimaryConfigChangedCallback* cb); | |
335 | |
336 // Returns true if this config has a |proof_source_|. | |
337 bool HasProofSource() const; | |
338 | |
339 private: | |
340 friend class test::QuicCryptoServerConfigPeer; | |
341 | |
342 // Config represents a server config: a collection of preferences and | |
343 // Diffie-Hellman public values. | |
344 class NET_EXPORT_PRIVATE Config : public QuicCryptoConfig, | |
345 public base::RefCounted<Config> { | |
346 public: | |
347 Config(); | |
348 | |
349 // TODO(rtenneti): since this is a class, we should probably do | |
350 // getters/setters here. | |
351 // |serialized| contains the bytes of this server config, suitable for | |
352 // sending on the wire. | |
353 std::string serialized; | |
354 // id contains the SCID of this server config. | |
355 std::string id; | |
356 // orbit contains the orbit value for this config: an opaque identifier | |
357 // used to identify clusters of server frontends. | |
358 unsigned char orbit[kOrbitSize]; | |
359 | |
360 // key_exchanges contains key exchange objects with the private keys | |
361 // already loaded. The values correspond, one-to-one, with the tags in | |
362 // |kexs| from the parent class. | |
363 std::vector<KeyExchange*> key_exchanges; | |
364 | |
365 // tag_value_map contains the raw key/value pairs for the config. | |
366 QuicTagValueMap tag_value_map; | |
367 | |
368 // channel_id_enabled is true if the config in |serialized| specifies that | |
369 // ChannelIDs are supported. | |
370 bool channel_id_enabled; | |
371 | |
372 // is_primary is true if this config is the one that we'll give out to | |
373 // clients as the current one. | |
374 bool is_primary; | |
375 | |
376 // primary_time contains the timestamp when this config should become the | |
377 // primary config. A value of QuicWallTime::Zero() means that this config | |
378 // will not be promoted at a specific time. | |
379 QuicWallTime primary_time; | |
380 | |
381 // Secondary sort key for use when selecting primary configs and | |
382 // there are multiple configs with the same primary time. | |
383 // Smaller numbers mean higher priority. | |
384 uint64 priority; | |
385 | |
386 // source_address_token_boxer_ is used to protect the | |
387 // source-address tokens that are given to clients. | |
388 // Points to either source_address_token_boxer_storage or the | |
389 // default boxer provided by QuicCryptoServerConfig. | |
390 const CryptoSecretBoxer* source_address_token_boxer; | |
391 | |
392 // Holds the override source_address_token_boxer instance if the | |
393 // Config is not using the default source address token boxer | |
394 // instance provided by QuicCryptoServerConfig. | |
395 scoped_ptr<CryptoSecretBoxer> source_address_token_boxer_storage; | |
396 | |
397 private: | |
398 friend class base::RefCounted<Config>; | |
399 | |
400 virtual ~Config(); | |
401 | |
402 DISALLOW_COPY_AND_ASSIGN(Config); | |
403 }; | |
404 | |
405 typedef std::map<ServerConfigID, scoped_refptr<Config> > ConfigMap; | |
406 | |
407 // Get a ref to the config with a given server config id. | |
408 scoped_refptr<Config> GetConfigWithScid( | |
409 base::StringPiece requested_scid) const; | |
410 | |
411 // ConfigPrimaryTimeLessThan returns true if a->primary_time < | |
412 // b->primary_time. | |
413 static bool ConfigPrimaryTimeLessThan(const scoped_refptr<Config>& a, | |
414 const scoped_refptr<Config>& b); | |
415 | |
416 // SelectNewPrimaryConfig reevaluates the primary config based on the | |
417 // "primary_time" deadlines contained in each. | |
418 void SelectNewPrimaryConfig(QuicWallTime now) const; | |
419 | |
420 // EvaluateClientHello checks |client_hello| for gross errors and determines | |
421 // whether it can be shown to be fresh (i.e. not a replay). The results are | |
422 // written to |info|. | |
423 void EvaluateClientHello( | |
424 const uint8* primary_orbit, | |
425 scoped_refptr<Config> requested_config, | |
426 ValidateClientHelloResultCallback::Result* client_hello_state, | |
427 ValidateClientHelloResultCallback* done_cb) const; | |
428 | |
429 // BuildRejection sets |out| to be a REJ message in reply to |client_hello|. | |
430 void BuildRejection(const IPEndPoint& server_ip, | |
431 const Config& config, | |
432 const CryptoHandshakeMessage& client_hello, | |
433 const ClientHelloInfo& info, | |
434 const CachedNetworkParameters& cached_network_params, | |
435 QuicRandom* rand, | |
436 QuicCryptoNegotiatedParameters* params, | |
437 CryptoHandshakeMessage* out) const; | |
438 | |
439 // ParseConfigProtobuf parses the given config protobuf and returns a | |
440 // scoped_refptr<Config> if successful. The caller adopts the reference to the | |
441 // Config. On error, ParseConfigProtobuf returns nullptr. | |
442 scoped_refptr<Config> ParseConfigProtobuf(QuicServerConfigProtobuf* protobuf); | |
443 | |
444 // NewSourceAddressToken returns a fresh source address token for the given | |
445 // IP address. |cached_network_params| is optional, and can be nullptr. | |
446 std::string NewSourceAddressToken( | |
447 const Config& config, | |
448 const SourceAddressTokens& previous_tokens, | |
449 const IPEndPoint& ip, | |
450 QuicRandom* rand, | |
451 QuicWallTime now, | |
452 const CachedNetworkParameters* cached_network_params) const; | |
453 | |
454 // ParseSourceAddressToken parses the source address tokens contained in | |
455 // the encrypted |token|, and populates |tokens| with the parsed tokens. | |
456 // Returns HANDSHAKE_OK if |token| could be parsed, or the reason for the | |
457 // failure. | |
458 HandshakeFailureReason ParseSourceAddressToken( | |
459 const Config& config, | |
460 base::StringPiece token, | |
461 SourceAddressTokens* tokens) const; | |
462 | |
463 // ValidateSourceAddressToken returns HANDSHAKE_OK if the source address | |
464 // tokens in |tokens| contain a valid and timely token for the IP address | |
465 // |ip| given that the current time is |now|. Otherwise it returns the | |
466 // reason for failure. |cached_network_params| is populated if the valid | |
467 // token contains a CachedNetworkParameters proto. | |
468 // TODO(rch): remove this method when we remove: | |
469 // FLAGS_quic_use_multiple_address_in_source_tokens. | |
470 HandshakeFailureReason ValidateSourceAddressToken( | |
471 const Config& config, | |
472 base::StringPiece token, | |
473 const IPEndPoint& ip, | |
474 QuicWallTime now, | |
475 CachedNetworkParameters* cached_network_params) const; | |
476 | |
477 // ValidateSourceAddressTokens returns HANDSHAKE_OK if the source address | |
478 // tokens in |tokens| contain a valid and timely token for the IP address | |
479 // |ip| given that the current time is |now|. Otherwise it returns the | |
480 // reason for failure. |cached_network_params| is populated if the valid | |
481 // token contains a CachedNetworkParameters proto. | |
482 HandshakeFailureReason ValidateSourceAddressTokens( | |
483 const SourceAddressTokens& tokens, | |
484 const IPEndPoint& ip, | |
485 QuicWallTime now, | |
486 CachedNetworkParameters* cached_network_params) const; | |
487 | |
488 // ValidateSingleSourceAddressToken returns HANDSHAKE_OK if the source | |
489 // address token in |token| is a timely token for the IP address |ip| | |
490 // given that the current time is |now|. Otherwise it returns the reason | |
491 // for failure. | |
492 HandshakeFailureReason ValidateSingleSourceAddressToken( | |
493 const SourceAddressToken& token, | |
494 const IPEndPoint& ip, | |
495 QuicWallTime now) const; | |
496 | |
497 // Returns HANDSHAKE_OK if the source address token in |token| is a timely | |
498 // token given that the current time is |now|. Otherwise it returns the | |
499 // reason for failure. | |
500 HandshakeFailureReason ValidateSourceAddressTokenTimestamp( | |
501 const SourceAddressToken& token, | |
502 QuicWallTime now) const; | |
503 | |
504 // NewServerNonce generates and encrypts a random nonce. | |
505 std::string NewServerNonce(QuicRandom* rand, QuicWallTime now) const; | |
506 | |
507 // ValidateServerNonce decrypts |token| and verifies that it hasn't been | |
508 // previously used and is recent enough that it is plausible that it was part | |
509 // of a very recently provided rejection ("recent" will be on the order of | |
510 // 10-30 seconds). If so, it records that it has been used and returns | |
511 // HANDSHAKE_OK. Otherwise it returns the reason for failure. | |
512 HandshakeFailureReason ValidateServerNonce( | |
513 base::StringPiece echoed_server_nonce, | |
514 QuicWallTime now) const; | |
515 | |
516 // replay_protection_ controls whether the server enforces that handshakes | |
517 // aren't replays. | |
518 bool replay_protection_; | |
519 | |
520 // configs_ satisfies the following invariants: | |
521 // 1) configs_.empty() <-> primary_config_ == nullptr | |
522 // 2) primary_config_ != nullptr -> primary_config_->is_primary | |
523 // 3) ∀ c∈configs_, c->is_primary <-> c == primary_config_ | |
524 mutable base::Lock configs_lock_; | |
525 // configs_ contains all active server configs. It's expected that there are | |
526 // about half-a-dozen configs active at any one time. | |
527 ConfigMap configs_; | |
528 // primary_config_ points to a Config (which is also in |configs_|) which is | |
529 // the primary config - i.e. the one that we'll give out to new clients. | |
530 mutable scoped_refptr<Config> primary_config_; | |
531 // next_config_promotion_time_ contains the nearest, future time when an | |
532 // active config will be promoted to primary. | |
533 mutable QuicWallTime next_config_promotion_time_; | |
534 // Callback to invoke when the primary config changes. | |
535 scoped_ptr<PrimaryConfigChangedCallback> primary_config_changed_cb_; | |
536 | |
537 // Protects access to the pointer held by strike_register_client_. | |
538 mutable base::Lock strike_register_client_lock_; | |
539 // strike_register_ contains a data structure that keeps track of previously | |
540 // observed client nonces in order to prevent replay attacks. | |
541 mutable scoped_ptr<StrikeRegisterClient> strike_register_client_; | |
542 | |
543 // Default source_address_token_boxer_ used to protect the | |
544 // source-address tokens that are given to clients. Individual | |
545 // configs may use boxers with alternate secrets. | |
546 CryptoSecretBoxer default_source_address_token_boxer_; | |
547 | |
548 // server_nonce_boxer_ is used to encrypt and validate suggested server | |
549 // nonces. | |
550 CryptoSecretBoxer server_nonce_boxer_; | |
551 | |
552 // server_nonce_orbit_ contains the random, per-server orbit values that this | |
553 // server will use to generate server nonces (the moral equivalent of a SYN | |
554 // cookies). | |
555 uint8 server_nonce_orbit_[8]; | |
556 | |
557 mutable base::Lock server_nonce_strike_register_lock_; | |
558 // server_nonce_strike_register_ contains a data structure that keeps track of | |
559 // previously observed server nonces from this server, in order to prevent | |
560 // replay attacks. | |
561 mutable scoped_ptr<StrikeRegister> server_nonce_strike_register_; | |
562 | |
563 // proof_source_ contains an object that can provide certificate chains and | |
564 // signatures. | |
565 scoped_ptr<ProofSource> proof_source_; | |
566 | |
567 // ephemeral_key_source_ contains an object that caches ephemeral keys for a | |
568 // short period of time. | |
569 scoped_ptr<EphemeralKeySource> ephemeral_key_source_; | |
570 | |
571 // These fields store configuration values. See the comments for their | |
572 // respective setter functions. | |
573 bool strike_register_no_startup_period_; | |
574 uint32 strike_register_max_entries_; | |
575 uint32 strike_register_window_secs_; | |
576 uint32 source_address_token_future_secs_; | |
577 uint32 source_address_token_lifetime_secs_; | |
578 uint32 server_nonce_strike_register_max_entries_; | |
579 uint32 server_nonce_strike_register_window_secs_; | |
580 | |
581 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerConfig); | |
582 }; | |
583 | |
584 } // namespace net | |
585 | |
586 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | |
OLD | NEW |