Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(373)

Side by Side Diff: net/quic/crypto/crypto_handshake.h

Issue 13976007: Land Recent QUIC Changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Updated copyright notice Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/net.gyp ('k') | net/quic/crypto/crypto_handshake.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 #ifndef NET_QUIC_CRYPTO_CRYPTO_HANDSHAKE_H_ 5 #ifndef NET_QUIC_CRYPTO_CRYPTO_HANDSHAKE_H_
6 #define NET_QUIC_CRYPTO_CRYPTO_HANDSHAKE_H_ 6 #define NET_QUIC_CRYPTO_CRYPTO_HANDSHAKE_H_
7 7
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/strings/string_piece.h" 13 #include "base/strings/string_piece.h"
14 #include "base/synchronization/lock.h"
14 #include "net/base/ip_endpoint.h" 15 #include "net/base/ip_endpoint.h"
15 #include "net/base/net_export.h" 16 #include "net/base/net_export.h"
16 #include "net/quic/crypto/crypto_protocol.h" 17 #include "net/quic/crypto/crypto_protocol.h"
17 #include "net/quic/quic_time.h" 18 #include "net/quic/quic_time.h"
18 19
19 namespace net { 20 namespace net {
20 21
21 class KeyExchange; 22 class KeyExchange;
22 class QuicClock; 23 class QuicClock;
23 class QuicDecrypter; 24 class QuicDecrypter;
24 class QuicEncrypter; 25 class QuicEncrypter;
25 class QuicRandom; 26 class QuicRandom;
26 class QuicServerConfigProtobuf; 27 class QuicServerConfigProtobuf;
28 class StrikeRegister;
27 29
28 namespace test { 30 namespace test {
29 class QuicCryptoServerConfigPeer; 31 class QuicCryptoServerConfigPeer;
30 } // namespace test 32 } // namespace test
31 33
32 // An intermediate format of a handshake message that's convenient for a 34 // An intermediate format of a handshake message that's convenient for a
33 // CryptoFramer to serialize from or parse into. 35 // CryptoFramer to serialize from or parse into.
34 class NET_EXPORT_PRIVATE CryptoHandshakeMessage { 36 class NET_EXPORT_PRIVATE CryptoHandshakeMessage {
35 public: 37 public:
36 CryptoHandshakeMessage(); 38 CryptoHandshakeMessage();
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 QuicCryptoNegotiatedParameters(); 216 QuicCryptoNegotiatedParameters();
215 ~QuicCryptoNegotiatedParameters(); 217 ~QuicCryptoNegotiatedParameters();
216 218
217 uint16 version; 219 uint16 version;
218 CryptoTag key_exchange; 220 CryptoTag key_exchange;
219 CryptoTag aead; 221 CryptoTag aead;
220 std::string premaster_secret; 222 std::string premaster_secret;
221 scoped_ptr<QuicEncrypter> encrypter; 223 scoped_ptr<QuicEncrypter> encrypter;
222 scoped_ptr<QuicDecrypter> decrypter; 224 scoped_ptr<QuicDecrypter> decrypter;
223 std::string server_config_id; 225 std::string server_config_id;
226 std::string server_nonce;
224 }; 227 };
225 228
226 // QuicCryptoConfig contains common configuration between clients and servers. 229 // QuicCryptoConfig contains common configuration between clients and servers.
227 class NET_EXPORT_PRIVATE QuicCryptoConfig { 230 class NET_EXPORT_PRIVATE QuicCryptoConfig {
228 public: 231 public:
229 QuicCryptoConfig(); 232 QuicCryptoConfig();
230 ~QuicCryptoConfig(); 233 ~QuicCryptoConfig();
231 234
232 // Protocol version 235 // Protocol version
233 uint16 version; 236 uint16 version;
234 // Key exchange methods. The following two members' values correspond by 237 // Key exchange methods. The following two members' values correspond by
235 // index. 238 // index.
236 CryptoTagVector kexs; 239 CryptoTagVector kexs;
237 // Authenticated encryption with associated data (AEAD) algorithms. 240 // Authenticated encryption with associated data (AEAD) algorithms.
238 CryptoTagVector aead; 241 CryptoTagVector aead;
239 242
240 private: 243 private:
241 DISALLOW_COPY_AND_ASSIGN(QuicCryptoConfig); 244 DISALLOW_COPY_AND_ASSIGN(QuicCryptoConfig);
242 }; 245 };
243 246
244 // QuicCryptoClientConfig contains crypto-related configuration settings for a 247 // QuicCryptoClientConfig contains crypto-related configuration settings for a
245 // client. 248 // client. Note that this object isn't thread-safe. It's designed to be used on
249 // a single thread at a time.
246 class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig { 250 class NET_EXPORT_PRIVATE QuicCryptoClientConfig : public QuicCryptoConfig {
247 public: 251 public:
248 // A CachedState contains the information that the client needs in order to 252 // A CachedState contains the information that the client needs in order to
249 // perform a 0-RTT handshake with a server. This information can be reused 253 // perform a 0-RTT handshake with a server. This information can be reused
250 // over several connections to the same server. 254 // over several connections to the same server.
251 class CachedState { 255 class CachedState {
252 public: 256 public:
253 CachedState(); 257 CachedState();
254 ~CachedState(); 258 ~CachedState();
255 259
256 // is_complete returns true if this object contains enough information to 260 // is_complete returns true if this object contains enough information to
257 // perform a handshake with the server. 261 // perform a handshake with the server.
258 bool is_complete() const; 262 bool is_complete() const;
259 263
260 // GetServerConfig returns the parsed contents of |server_config|, or NULL 264 // GetServerConfig returns the parsed contents of |server_config|, or NULL
261 // if |server_config| is empty. The return value is owned by this object 265 // if |server_config| is empty. The return value is owned by this object
262 // and is destroyed when this object is. 266 // and is destroyed when this object is.
263 const CryptoHandshakeMessage* GetServerConfig() const; 267 const CryptoHandshakeMessage* GetServerConfig() const;
264 268
265 // SetServerConfig checks that |scfg| parses correctly and stores it in 269 // SetServerConfig checks that |scfg| parses correctly and stores it in
266 // |server_config|. It returns true if the parsing succeeds and false 270 // |server_config|. It returns true if the parsing succeeds and false
267 // otherwise. 271 // otherwise.
268 bool SetServerConfig(base::StringPiece scfg); 272 bool SetServerConfig(base::StringPiece scfg);
269 273
270 const std::string& server_config() const; 274 const std::string& server_config() const;
271 const std::string& source_address_token() const; 275 const std::string& source_address_token() const;
272 const std::string& orbit() const;
273 276
274 void set_source_address_token(base::StringPiece token); 277 void set_source_address_token(base::StringPiece token);
275 278
276 private: 279 private:
277 std::string server_config_id_; // An opaque id from the server. 280 std::string server_config_id_; // An opaque id from the server.
278 std::string server_config_; // A serialized handshake message. 281 std::string server_config_; // A serialized handshake message.
279 std::string source_address_token_; // An opaque proof of IP ownership. 282 std::string source_address_token_; // An opaque proof of IP ownership.
280 std::string orbit_; // An opaque server-id used in nonce generation.
281 283
282 // scfg contains the cached, parsed value of |server_config|. 284 // scfg contains the cached, parsed value of |server_config|.
283 mutable scoped_ptr<CryptoHandshakeMessage> scfg_; 285 mutable scoped_ptr<CryptoHandshakeMessage> scfg_;
284 }; 286 };
285 287
286 QuicCryptoClientConfig(); 288 QuicCryptoClientConfig();
287 ~QuicCryptoClientConfig(); 289 ~QuicCryptoClientConfig();
288 290
289 // Sets the members to reasonable, default values. 291 // Sets the members to reasonable, default values.
290 void SetDefaults(); 292 void SetDefaults();
291 293
292 // Lookup returns a CachedState for the given hostname, or NULL if no 294 // Lookup returns a CachedState for the given hostname, or NULL if no
293 // information is known. 295 // information is known.
294 const CachedState* Lookup(const std::string& server_hostname); 296 const CachedState* Lookup(const std::string& server_hostname) const;
295 297
296 // FillInchoateClientHello sets |out| to be a CHLO message that elicits a 298 // FillInchoateClientHello sets |out| to be a CHLO message that elicits a
297 // source-address token or SCFG from a server. If |cached| is non-NULL, the 299 // source-address token or SCFG from a server. If |cached| is non-NULL, the
298 // source-address token will be taken from it. 300 // source-address token will be taken from it.
299 void FillInchoateClientHello(const std::string& server_hostname, 301 void FillInchoateClientHello(const std::string& server_hostname,
300 const CachedState* cached, 302 const CachedState* cached,
301 CryptoHandshakeMessage* out); 303 CryptoHandshakeMessage* out) const;
302 304
303 // FillClientHello sets |out| to be a CHLO message based on the configuration 305 // FillClientHello sets |out| to be a CHLO message based on the configuration
304 // of this object. This object must have cached enough information about 306 // of this object. This object must have cached enough information about
305 // |server_hostname| in order to perform a handshake. This can be checked 307 // |server_hostname| in order to perform a handshake. This can be checked
306 // with the |is_complete| member of |CachedState|. 308 // with the |is_complete| member of |CachedState|.
307 // 309 //
308 // |clock| and |rand| are used to generate the nonce and |out_params| is 310 // |clock| and |rand| are used to generate the nonce and |out_params| is
309 // filled with the results of the handshake that the server is expected to 311 // filled with the results of the handshake that the server is expected to
310 // accept. 312 // accept.
311 QuicErrorCode FillClientHello(const std::string& server_hostname, 313 QuicErrorCode FillClientHello(const std::string& server_hostname,
312 QuicGuid guid, 314 QuicGuid guid,
313 const CachedState* cached, 315 const CachedState* cached,
314 const QuicClock* clock, 316 const QuicClock* clock,
315 QuicRandom* rand, 317 QuicRandom* rand,
316 QuicCryptoNegotiatedParameters* out_params, 318 QuicCryptoNegotiatedParameters* out_params,
317 CryptoHandshakeMessage* out, 319 CryptoHandshakeMessage* out,
318 std::string* error_details); 320 std::string* error_details) const;
319 321
320 // ProcessRejection processes a REJ message from a server and updates the 322 // ProcessRejection processes a REJ message from a server and updates the
321 // cached information about that server. After this, |is_complete| may return 323 // cached information about that server. After this, |is_complete| may return
322 // true for that server's CachedState. 324 // true for that server's CachedState. If the rejection message contains
325 // state about a future handshake (i.e. an nonce value from the server), then
326 // it will be saved in |out_params|.
323 QuicErrorCode ProcessRejection(const std::string& server_hostname, 327 QuicErrorCode ProcessRejection(const std::string& server_hostname,
324 const CryptoHandshakeMessage& rej, 328 const CryptoHandshakeMessage& rej,
329 QuicCryptoNegotiatedParameters* out_params,
325 std::string* error_details); 330 std::string* error_details);
326 331
327 // ProcessServerHello processes the message in |server_hello|, writes the 332 // ProcessServerHello processes the message in |server_hello|, writes the
328 // negotiated parameters to |out_params| and returns QUIC_NO_ERROR. If 333 // negotiated parameters to |out_params| and returns QUIC_NO_ERROR. If
329 // |server_hello| is unacceptable then it puts an error message in 334 // |server_hello| is unacceptable then it puts an error message in
330 // |error_details| and returns an error code. 335 // |error_details| and returns an error code.
331 QuicErrorCode ProcessServerHello(const CryptoHandshakeMessage& server_hello, 336 QuicErrorCode ProcessServerHello(const CryptoHandshakeMessage& server_hello,
332 const std::string& nonce, 337 const std::string& nonce,
333 QuicCryptoNegotiatedParameters* out_params, 338 QuicCryptoNegotiatedParameters* out_params,
334 std::string* error_details); 339 std::string* error_details);
335 340
336 private: 341 private:
337 // cached_states_ maps from the server hostname to the cached information 342 // cached_states_ maps from the server hostname to the cached information
338 // about that server. 343 // about that server.
339 std::map<std::string, CachedState*> cached_states_; 344 std::map<std::string, CachedState*> cached_states_;
340 }; 345 };
341 346
342 // QuicCryptoServerConfig contains the crypto configuration of a QUIC server. 347 // QuicCryptoServerConfig contains the crypto configuration of a QUIC server.
343 // Unlike a client, a QUIC server can have multiple configurations active in 348 // Unlike a client, a QUIC server can have multiple configurations active in
344 // order to support clients resuming with a previous configuration. 349 // order to support clients resuming with a previous configuration.
345 // TODO(agl): when adding configurations at runtime is added, this object will 350 // TODO(agl): when adding configurations at runtime is added, this object will
346 // need to consider locking. 351 // need to consider locking.
347 class NET_EXPORT_PRIVATE QuicCryptoServerConfig { 352 class NET_EXPORT_PRIVATE QuicCryptoServerConfig {
348 public: 353 public:
349 // |source_address_token_secret|: secret key material used for encrypting and 354 // |source_address_token_secret|: secret key material used for encrypting and
350 // decrypting source address tokens. It can be of any length as it is fed 355 // decrypting source address tokens. It can be of any length as it is fed
351 // into a KDF before use. 356 // into a KDF before use. In tests, use TESTING.
352 explicit QuicCryptoServerConfig( 357 explicit QuicCryptoServerConfig(
353 base::StringPiece source_address_token_secret); 358 base::StringPiece source_address_token_secret);
354 ~QuicCryptoServerConfig(); 359 ~QuicCryptoServerConfig();
355 360
356 // TESTING is a magic parameter for passing to the constructor in tests. 361 // TESTING is a magic parameter for passing to the constructor in tests.
357 static const char TESTING[]; 362 static const char TESTING[];
358 363
359 // ConfigForTesting generates a QuicServerConfigProtobuf protobuf suitable 364 // DefaultConfig generates a QuicServerConfigProtobuf protobuf suitable
360 // for using in tests. |extra_tags| contains additional key/value pairs that 365 // for using in tests. |extra_tags| contains additional key/value pairs that
361 // will be inserted into the config. 366 // will be inserted into the config.
362 static QuicServerConfigProtobuf* ConfigForTesting( 367 static QuicServerConfigProtobuf* DefaultConfig(
363 QuicRandom* rand, 368 QuicRandom* rand,
364 const QuicClock* clock, 369 const QuicClock* clock,
365 const CryptoHandshakeMessage& extra_tags); 370 const CryptoHandshakeMessage& extra_tags);
366 371
367 // AddConfig adds a QuicServerConfigProtobuf to the availible configurations. 372 // AddConfig adds a QuicServerConfigProtobuf to the availible configurations.
368 // It returns the SCFG message from the config if successful. The caller 373 // It returns the SCFG message from the config if successful. The caller
369 // takes ownership of the CryptoHandshakeMessage. 374 // takes ownership of the CryptoHandshakeMessage.
370 CryptoHandshakeMessage* AddConfig(QuicServerConfigProtobuf* protobuf); 375 CryptoHandshakeMessage* AddConfig(QuicServerConfigProtobuf* protobuf);
371 376
372 // AddTestingConfig creates a test config and then calls AddConfig to add it. 377 // AddDefaultConfig creates a config and then calls AddConfig to
373 // Any tags in |extra_tags| will be copied into the config. 378 // add it. Any tags in |extra_tags| will be copied into the config.
374 CryptoHandshakeMessage* AddTestingConfig( 379 CryptoHandshakeMessage* AddDefaultConfig(
375 QuicRandom* rand, 380 QuicRandom* rand,
376 const QuicClock* clock, 381 const QuicClock* clock,
377 const CryptoHandshakeMessage& extra_tags); 382 const CryptoHandshakeMessage& extra_tags);
378 383
379 // ProcessClientHello processes |client_hello| and decides whether to accept 384 // ProcessClientHello processes |client_hello| and decides whether to accept
380 // or reject the connection. If the connection is to be accepted, |out| is 385 // or reject the connection. If the connection is to be accepted, |out| is
381 // set to the contents of the ServerHello, |out_params| is completed and 386 // set to the contents of the ServerHello, |out_params| is completed and
382 // QUIC_NO_ERROR is returned. Otherwise |out| is set to be a REJ message and 387 // QUIC_NO_ERROR is returned. Otherwise |out| is set to be a REJ message and
383 // an error code is returned. 388 // an error code is returned.
384 // 389 //
385 // client_hello: the incoming client hello message. 390 // client_hello: the incoming client hello message.
386 // guid: the GUID for the connection, which is used in key derivation. 391 // guid: the GUID for the connection, which is used in key derivation.
387 // client_ip: the IP address of the client, which is used to generate and 392 // client_ip: the IP address of the client, which is used to generate and
388 // validate source-address tokens. 393 // validate source-address tokens.
389 // now_since_epoch: the current time, as a delta since the unix epoch, 394 // now_since_epoch: the current time, as a delta since the unix epoch,
390 // which is used to validate client nonces. 395 // which is used to validate client nonces.
391 // rand: an entropy source 396 // rand: an entropy source
397 // params: the state of the handshake. This may be updated with a server
398 // nonce when we send a rejection. After a successful handshake, this will
399 // contain the state of the connection.
392 // out: the resulting handshake message (either REJ or SHLO) 400 // out: the resulting handshake message (either REJ or SHLO)
393 // out_params: the state of the handshake
394 // error_details: used to store a string describing any error. 401 // error_details: used to store a string describing any error.
395 QuicErrorCode ProcessClientHello(const CryptoHandshakeMessage& client_hello, 402 QuicErrorCode ProcessClientHello(const CryptoHandshakeMessage& client_hello,
396 QuicGuid guid, 403 QuicGuid guid,
397 const IPEndPoint& client_ip, 404 const IPEndPoint& client_ip,
398 QuicTime::Delta now_since_epoch, 405 QuicTime::Delta now_since_epoch,
399 QuicRandom* rand, 406 QuicRandom* rand,
407 QuicCryptoNegotiatedParameters* params,
400 CryptoHandshakeMessage* out, 408 CryptoHandshakeMessage* out,
401 QuicCryptoNegotiatedParameters* out_params, 409 std::string* error_details) const;
402 std::string* error_details);
403 410
404 private: 411 private:
405 friend class test::QuicCryptoServerConfigPeer; 412 friend class test::QuicCryptoServerConfigPeer;
406 413
407 // Config represents a server config: a collection of preferences and 414 // Config represents a server config: a collection of preferences and
408 // Diffie-Hellman public values. 415 // Diffie-Hellman public values.
409 struct Config : public QuicCryptoConfig { 416 struct Config : public QuicCryptoConfig {
410 Config(); 417 Config();
411 ~Config(); 418 ~Config();
412 419
413 // serialized contains the bytes of this server config, suitable for sending 420 // serialized contains the bytes of this server config, suitable for sending
414 // on the wire. 421 // on the wire.
415 std::string serialized; 422 std::string serialized;
416 // id contains the SCID of this server config. 423 // id contains the SCID of this server config.
417 std::string id; 424 std::string id;
425 // orbit contains the orbit value for this config: an opaque identifier
426 // used to identify clusters of server frontends.
427 unsigned char orbit[kOrbitSize];
418 428
419 // key_exchanges contains key exchange objects with the private keys 429 // key_exchanges contains key exchange objects with the private keys
420 // already loaded. The values correspond, one-to-one, with the tags in 430 // already loaded. The values correspond, one-to-one, with the tags in
421 // |kexs| from the parent class. 431 // |kexs| from the parent class.
422 std::vector<KeyExchange*> key_exchanges; 432 std::vector<KeyExchange*> key_exchanges;
423 433
424 // tag_value_map contains the raw key/value pairs for the config. 434 // tag_value_map contains the raw key/value pairs for the config.
425 CryptoTagValueMap tag_value_map; 435 CryptoTagValueMap tag_value_map;
426 436
427 private: 437 private:
428 DISALLOW_COPY_AND_ASSIGN(Config); 438 DISALLOW_COPY_AND_ASSIGN(Config);
429 }; 439 };
430 440
431 // NewSourceAddressToken returns a fresh source address token for the given 441 // NewSourceAddressToken returns a fresh source address token for the given
432 // IP address. 442 // IP address.
433 std::string NewSourceAddressToken(const IPEndPoint& ip, 443 std::string NewSourceAddressToken(const IPEndPoint& ip,
434 QuicRandom* rand, 444 QuicRandom* rand,
435 QuicTime::Delta now_since_epoch); 445 QuicTime::Delta now_since_epoch) const;
436 446
437 // ValidateSourceAddressToken returns true if the source address token in 447 // ValidateSourceAddressToken returns true if the source address token in
438 // |token| is a valid and timely token for the IP address |ip| given that the 448 // |token| is a valid and timely token for the IP address |ip| given that the
439 // current time is |now|. 449 // current time is |now|.
440 bool ValidateSourceAddressToken(base::StringPiece token, 450 bool ValidateSourceAddressToken(base::StringPiece token,
441 const IPEndPoint& ip, 451 const IPEndPoint& ip,
442 QuicTime::Delta now_since_epoch); 452 QuicTime::Delta now_since_epoch) const;
443 453
444 std::map<ServerConfigID, Config*> configs_; 454 std::map<ServerConfigID, Config*> configs_;
445 455
446 ServerConfigID active_config_; 456 ServerConfigID active_config_;
447 457
458 mutable base::Lock strike_register_lock_;
459 // strike_register_ contains a data structure that keeps track of previously
460 // observed client nonces in order to prevent replay attacks.
461 mutable scoped_ptr<StrikeRegister> strike_register_;
462
448 // These members are used to encrypt and decrypt the source address tokens 463 // These members are used to encrypt and decrypt the source address tokens
449 // that we receive from and send to clients. 464 // that we receive from and send to clients.
450 scoped_ptr<QuicEncrypter> source_address_token_encrypter_; 465 scoped_ptr<QuicEncrypter> source_address_token_encrypter_;
451 scoped_ptr<QuicDecrypter> source_address_token_decrypter_; 466 scoped_ptr<QuicDecrypter> source_address_token_decrypter_;
452 }; 467 };
453 468
454 } // namespace net 469 } // namespace net
455 470
456 #endif // NET_QUIC_CRYPTO_CRYPTO_HANDSHAKE_H_ 471 #endif // NET_QUIC_CRYPTO_CRYPTO_HANDSHAKE_H_
OLDNEW
« no previous file with comments | « net/net.gyp ('k') | net/quic/crypto/crypto_handshake.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698