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 #ifndef NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 5 #ifndef NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
6 #define NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 6 #define NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
7 | 7 |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 25 matching lines...) Expand all Loading... |
36 class EphemeralKeySource; | 36 class EphemeralKeySource; |
37 class KeyExchange; | 37 class KeyExchange; |
38 class ProofSource; | 38 class ProofSource; |
39 class QuicClock; | 39 class QuicClock; |
40 class QuicDecrypter; | 40 class QuicDecrypter; |
41 class QuicEncrypter; | 41 class QuicEncrypter; |
42 class QuicRandom; | 42 class QuicRandom; |
43 class QuicServerConfigProtobuf; | 43 class QuicServerConfigProtobuf; |
44 class StrikeRegister; | 44 class StrikeRegister; |
45 class StrikeRegisterClient; | 45 class StrikeRegisterClient; |
46 struct QuicCryptoProof; | 46 struct QuicSignedServerConfig; |
47 | 47 |
48 // ClientHelloInfo contains information about a client hello message that is | 48 // ClientHelloInfo contains information about a client hello message that is |
49 // only kept for as long as it's being processed. | 49 // only kept for as long as it's being processed. |
50 struct ClientHelloInfo { | 50 struct ClientHelloInfo { |
51 ClientHelloInfo(const IPAddress& in_client_ip, QuicWallTime in_now); | 51 ClientHelloInfo(const IPAddress& in_client_ip, QuicWallTime in_now); |
52 ClientHelloInfo(const ClientHelloInfo& other); | 52 ClientHelloInfo(const ClientHelloInfo& other); |
53 ~ClientHelloInfo(); | 53 ~ClientHelloInfo(); |
54 | 54 |
55 // Inputs to EvaluateClientHello. | 55 // Inputs to EvaluateClientHello. |
56 const IPAddress client_ip; | 56 const IPAddress client_ip; |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
274 // ValidatedClientHelloMsg token that holds information about | 274 // ValidatedClientHelloMsg token that holds information about |
275 // the client hello. The callback will always be called exactly | 275 // the client hello. The callback will always be called exactly |
276 // once, either under the current call stack, or after the | 276 // once, either under the current call stack, or after the |
277 // completion of an asynchronous operation. | 277 // completion of an asynchronous operation. |
278 void ValidateClientHello( | 278 void ValidateClientHello( |
279 const CryptoHandshakeMessage& client_hello, | 279 const CryptoHandshakeMessage& client_hello, |
280 const IPAddress& client_ip, | 280 const IPAddress& client_ip, |
281 const IPAddress& server_ip, | 281 const IPAddress& server_ip, |
282 QuicVersion version, | 282 QuicVersion version, |
283 const QuicClock* clock, | 283 const QuicClock* clock, |
284 scoped_refptr<QuicCryptoProof> crypto_proof, | 284 scoped_refptr<QuicSignedServerConfig> crypto_proof, |
285 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; | 285 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; |
286 | 286 |
287 // ProcessClientHello processes |client_hello| and decides whether to accept | 287 // ProcessClientHello processes |client_hello| and decides whether to accept |
288 // or reject the connection. If the connection is to be accepted, |done_cb| is | 288 // or reject the connection. If the connection is to be accepted, |done_cb| is |
289 // invoked with the contents of the ServerHello and QUIC_NO_ERROR. Otherwise | 289 // invoked with the contents of the ServerHello and QUIC_NO_ERROR. Otherwise |
290 // |done_cb| is called with a REJ or SREJ message and QUIC_NO_ERROR. | 290 // |done_cb| is called with a REJ or SREJ message and QUIC_NO_ERROR. |
291 // | 291 // |
292 // validate_chlo_result: Output from the asynchronous call to | 292 // validate_chlo_result: Output from the asynchronous call to |
293 // ValidateClientHello. Contains the client hello message and | 293 // ValidateClientHello. Contains the client hello message and |
294 // information about it. | 294 // information about it. |
(...skipping 26 matching lines...) Expand all Loading... |
321 const IPAddress& server_ip, | 321 const IPAddress& server_ip, |
322 const IPEndPoint& client_address, | 322 const IPEndPoint& client_address, |
323 QuicVersion version, | 323 QuicVersion version, |
324 const QuicVersionVector& supported_versions, | 324 const QuicVersionVector& supported_versions, |
325 bool use_stateless_rejects, | 325 bool use_stateless_rejects, |
326 QuicConnectionId server_designated_connection_id, | 326 QuicConnectionId server_designated_connection_id, |
327 const QuicClock* clock, | 327 const QuicClock* clock, |
328 QuicRandom* rand, | 328 QuicRandom* rand, |
329 QuicCompressedCertsCache* compressed_certs_cache, | 329 QuicCompressedCertsCache* compressed_certs_cache, |
330 scoped_refptr<QuicCryptoNegotiatedParameters> params, | 330 scoped_refptr<QuicCryptoNegotiatedParameters> params, |
331 scoped_refptr<QuicCryptoProof> crypto_proof, | 331 scoped_refptr<QuicSignedServerConfig> crypto_proof, |
332 QuicByteCount total_framing_overhead, | 332 QuicByteCount total_framing_overhead, |
333 QuicByteCount chlo_packet_size, | 333 QuicByteCount chlo_packet_size, |
334 std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const; | 334 std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const; |
335 | 335 |
336 // BuildServerConfigUpdateMessage sets |out| to be a SCUP message containing | 336 // BuildServerConfigUpdateMessage sets |out| to be a SCUP message containing |
337 // the current primary config, an up to date source-address token, and cert | 337 // the current primary config, an up to date source-address token, and cert |
338 // chain and proof in the case of secure QUIC. Returns true if successfully | 338 // chain and proof in the case of secure QUIC. Returns true if successfully |
339 // filled |out|. | 339 // filled |out|. |
340 // | 340 // |
341 // |cached_network_params| is optional, and can be nullptr. | 341 // |cached_network_params| is optional, and can be nullptr. |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 int NumberOfConfigs() const; | 454 int NumberOfConfigs() const; |
455 | 455 |
456 // Callers retain the ownership of |rejection_observer| which must outlive the | 456 // Callers retain the ownership of |rejection_observer| which must outlive the |
457 // config. | 457 // config. |
458 void set_rejection_observer(RejectionObserver* rejection_observer) { | 458 void set_rejection_observer(RejectionObserver* rejection_observer) { |
459 rejection_observer_ = rejection_observer; | 459 rejection_observer_ = rejection_observer; |
460 } | 460 } |
461 | 461 |
462 private: | 462 private: |
463 friend class test::QuicCryptoServerConfigPeer; | 463 friend class test::QuicCryptoServerConfigPeer; |
464 friend struct QuicCryptoProof; | 464 friend struct QuicSignedServerConfig; |
465 | 465 |
466 // Config represents a server config: a collection of preferences and | 466 // Config represents a server config: a collection of preferences and |
467 // Diffie-Hellman public values. | 467 // Diffie-Hellman public values. |
468 class NET_EXPORT_PRIVATE Config : public QuicCryptoConfig, | 468 class NET_EXPORT_PRIVATE Config : public QuicCryptoConfig, |
469 public base::RefCounted<Config> { | 469 public base::RefCounted<Config> { |
470 public: | 470 public: |
471 Config(); | 471 Config(); |
472 | 472 |
473 // TODO(rtenneti): since this is a class, we should probably do | 473 // TODO(rtenneti): since this is a class, we should probably do |
474 // getters/setters here. | 474 // getters/setters here. |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 void SelectNewPrimaryConfig(QuicWallTime now) const; | 545 void SelectNewPrimaryConfig(QuicWallTime now) const; |
546 | 546 |
547 // EvaluateClientHello checks |client_hello| for gross errors and determines | 547 // EvaluateClientHello checks |client_hello| for gross errors and determines |
548 // whether it can be shown to be fresh (i.e. not a replay). The results are | 548 // whether it can be shown to be fresh (i.e. not a replay). The results are |
549 // written to |info|. | 549 // written to |info|. |
550 void EvaluateClientHello( | 550 void EvaluateClientHello( |
551 const IPAddress& server_ip, | 551 const IPAddress& server_ip, |
552 QuicVersion version, | 552 QuicVersion version, |
553 scoped_refptr<Config> requested_config, | 553 scoped_refptr<Config> requested_config, |
554 scoped_refptr<Config> primary_config, | 554 scoped_refptr<Config> primary_config, |
555 scoped_refptr<QuicCryptoProof> crypto_proof, | 555 scoped_refptr<QuicSignedServerConfig> crypto_proof, |
556 scoped_refptr<ValidateClientHelloResultCallback::Result> | 556 scoped_refptr<ValidateClientHelloResultCallback::Result> |
557 client_hello_state, | 557 client_hello_state, |
558 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; | 558 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; |
559 | 559 |
560 // Callback class for bridging between EvaluateClientHello and | 560 // Callback class for bridging between EvaluateClientHello and |
561 // EvaluateClientHelloAfterGetProof. | 561 // EvaluateClientHelloAfterGetProof. |
562 class EvaluateClientHelloCallback; | 562 class EvaluateClientHelloCallback; |
563 friend class EvaluateClientHelloCallback; | 563 friend class EvaluateClientHelloCallback; |
564 | 564 |
565 // Continuation of EvaluateClientHello after the call to | 565 // Continuation of EvaluateClientHello after the call to |
566 // ProofSource::GetProof. |found_error| indicates whether an error was | 566 // ProofSource::GetProof. |found_error| indicates whether an error was |
567 // detected in EvaluateClientHello, and |get_proof_failed| indicates whether | 567 // detected in EvaluateClientHello, and |get_proof_failed| indicates whether |
568 // GetProof failed. If GetProof was not run, then |get_proof_failed| will be | 568 // GetProof failed. If GetProof was not run, then |get_proof_failed| will be |
569 // set to false. | 569 // set to false. |
570 void EvaluateClientHelloAfterGetProof( | 570 void EvaluateClientHelloAfterGetProof( |
571 bool found_error, | 571 bool found_error, |
572 const IPAddress& server_ip, | 572 const IPAddress& server_ip, |
573 QuicVersion version, | 573 QuicVersion version, |
574 scoped_refptr<Config> requested_config, | 574 scoped_refptr<Config> requested_config, |
575 scoped_refptr<Config> primary_config, | 575 scoped_refptr<Config> primary_config, |
576 scoped_refptr<QuicCryptoProof> crypto_proof, | 576 scoped_refptr<QuicSignedServerConfig> crypto_proof, |
577 std::unique_ptr<ProofSource::Details> proof_source_details, | 577 std::unique_ptr<ProofSource::Details> proof_source_details, |
578 bool get_proof_failed, | 578 bool get_proof_failed, |
579 scoped_refptr<ValidateClientHelloResultCallback::Result> | 579 scoped_refptr<ValidateClientHelloResultCallback::Result> |
580 client_hello_state, | 580 client_hello_state, |
581 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; | 581 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const; |
582 | 582 |
583 // Callback class for bridging between ProcessClientHello and | 583 // Callback class for bridging between ProcessClientHello and |
584 // ProcessClientHelloAfterGetProof. | 584 // ProcessClientHelloAfterGetProof. |
585 class ProcessClientHelloCallback; | 585 class ProcessClientHelloCallback; |
586 friend class ProcessClientHelloCallback; | 586 friend class ProcessClientHelloCallback; |
587 | 587 |
588 // Portion of ProcessClientHello which executes after GetProof. | 588 // Portion of ProcessClientHello which executes after GetProof. |
589 void ProcessClientHelloAfterGetProof( | 589 void ProcessClientHelloAfterGetProof( |
590 bool found_error, | 590 bool found_error, |
591 std::unique_ptr<ProofSource::Details> proof_source_details, | 591 std::unique_ptr<ProofSource::Details> proof_source_details, |
592 const ValidateClientHelloResultCallback::Result& validate_chlo_result, | 592 const ValidateClientHelloResultCallback::Result& validate_chlo_result, |
593 bool reject_only, | 593 bool reject_only, |
594 QuicConnectionId connection_id, | 594 QuicConnectionId connection_id, |
595 const IPEndPoint& client_address, | 595 const IPEndPoint& client_address, |
596 QuicVersion version, | 596 QuicVersion version, |
597 const QuicVersionVector& supported_versions, | 597 const QuicVersionVector& supported_versions, |
598 bool use_stateless_rejects, | 598 bool use_stateless_rejects, |
599 QuicConnectionId server_designated_connection_id, | 599 QuicConnectionId server_designated_connection_id, |
600 const QuicClock* clock, | 600 const QuicClock* clock, |
601 QuicRandom* rand, | 601 QuicRandom* rand, |
602 QuicCompressedCertsCache* compressed_certs_cache, | 602 QuicCompressedCertsCache* compressed_certs_cache, |
603 scoped_refptr<QuicCryptoNegotiatedParameters> params, | 603 scoped_refptr<QuicCryptoNegotiatedParameters> params, |
604 scoped_refptr<QuicCryptoProof> crypto_proof, | 604 scoped_refptr<QuicSignedServerConfig> crypto_proof, |
605 QuicByteCount total_framing_overhead, | 605 QuicByteCount total_framing_overhead, |
606 QuicByteCount chlo_packet_size, | 606 QuicByteCount chlo_packet_size, |
607 const scoped_refptr<Config>& requested_config, | 607 const scoped_refptr<Config>& requested_config, |
608 const scoped_refptr<Config>& primary_config, | 608 const scoped_refptr<Config>& primary_config, |
609 std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const; | 609 std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const; |
610 | 610 |
611 // BuildRejection sets |out| to be a REJ message in reply to |client_hello|. | 611 // BuildRejection sets |out| to be a REJ message in reply to |client_hello|. |
612 void BuildRejection(QuicVersion version, | 612 void BuildRejection(QuicVersion version, |
613 QuicWallTime now, | 613 QuicWallTime now, |
614 const Config& config, | 614 const Config& config, |
615 const CryptoHandshakeMessage& client_hello, | 615 const CryptoHandshakeMessage& client_hello, |
616 const ClientHelloInfo& info, | 616 const ClientHelloInfo& info, |
617 const CachedNetworkParameters& cached_network_params, | 617 const CachedNetworkParameters& cached_network_params, |
618 bool use_stateless_rejects, | 618 bool use_stateless_rejects, |
619 QuicConnectionId server_designated_connection_id, | 619 QuicConnectionId server_designated_connection_id, |
620 QuicRandom* rand, | 620 QuicRandom* rand, |
621 QuicCompressedCertsCache* compressed_certs_cache, | 621 QuicCompressedCertsCache* compressed_certs_cache, |
622 scoped_refptr<QuicCryptoNegotiatedParameters> params, | 622 scoped_refptr<QuicCryptoNegotiatedParameters> params, |
623 const QuicCryptoProof& crypto_proof, | 623 const QuicSignedServerConfig& crypto_proof, |
624 QuicByteCount total_framing_overhead, | 624 QuicByteCount total_framing_overhead, |
625 QuicByteCount chlo_packet_size, | 625 QuicByteCount chlo_packet_size, |
626 CryptoHandshakeMessage* out) const; | 626 CryptoHandshakeMessage* out) const; |
627 | 627 |
628 // CompressChain compresses the certificates in |chain->certs| and returns a | 628 // CompressChain compresses the certificates in |chain->certs| and returns a |
629 // compressed representation. |common_sets| contains the common certificate | 629 // compressed representation. |common_sets| contains the common certificate |
630 // sets known locally and |client_common_set_hashes| contains the hashes of | 630 // sets known locally and |client_common_set_hashes| contains the hashes of |
631 // the common sets known to the peer. |client_cached_cert_hashes| contains | 631 // the common sets known to the peer. |client_cached_cert_hashes| contains |
632 // 64-bit, FNV-1a hashes of certificates that the peer already possesses. | 632 // 64-bit, FNV-1a hashes of certificates that the peer already possesses. |
633 static std::string CompressChain( | 633 static std::string CompressChain( |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
702 QuicWallTime now) const; | 702 QuicWallTime now) const; |
703 | 703 |
704 // ValidateExpectedLeafCertificate checks the |client_hello| to see if it has | 704 // ValidateExpectedLeafCertificate checks the |client_hello| to see if it has |
705 // an XLCT tag, and if so, verifies that its value matches the hash of the | 705 // an XLCT tag, and if so, verifies that its value matches the hash of the |
706 // server's leaf certificate. The certs field of |crypto_proof| is used to | 706 // server's leaf certificate. The certs field of |crypto_proof| is used to |
707 // compare against the XLCT value. This method returns true if the XLCT tag | 707 // compare against the XLCT value. This method returns true if the XLCT tag |
708 // is not present, or if the XLCT tag is present and valid. It returns false | 708 // is not present, or if the XLCT tag is present and valid. It returns false |
709 // otherwise. | 709 // otherwise. |
710 bool ValidateExpectedLeafCertificate( | 710 bool ValidateExpectedLeafCertificate( |
711 const CryptoHandshakeMessage& client_hello, | 711 const CryptoHandshakeMessage& client_hello, |
712 const QuicCryptoProof& crypto_proof) const; | 712 const QuicSignedServerConfig& crypto_proof) const; |
713 | 713 |
714 // Returns true if the PDMD field from the client hello demands an X509 | 714 // Returns true if the PDMD field from the client hello demands an X509 |
715 // certificate. | 715 // certificate. |
716 bool ClientDemandsX509Proof(const CryptoHandshakeMessage& client_hello) const; | 716 bool ClientDemandsX509Proof(const CryptoHandshakeMessage& client_hello) const; |
717 | 717 |
718 // Callback to receive the results of ProofSource::GetProof. Note: this | 718 // Callback to receive the results of ProofSource::GetProof. Note: this |
719 // callback has no cancellation support, since the lifetime of the ProofSource | 719 // callback has no cancellation support, since the lifetime of the ProofSource |
720 // is controlled by this object via unique ownership. If that ownership | 720 // is controlled by this object via unique ownership. If that ownership |
721 // stricture changes, this decision may need to be revisited. | 721 // stricture changes, this decision may need to be revisited. |
722 class BuildServerConfigUpdateMessageProofSourceCallback | 722 class BuildServerConfigUpdateMessageProofSourceCallback |
723 : public ProofSource::Callback { | 723 : public ProofSource::Callback { |
724 public: | 724 public: |
725 BuildServerConfigUpdateMessageProofSourceCallback( | 725 BuildServerConfigUpdateMessageProofSourceCallback( |
726 const BuildServerConfigUpdateMessageProofSourceCallback&) = delete; | 726 const BuildServerConfigUpdateMessageProofSourceCallback&) = delete; |
727 ~BuildServerConfigUpdateMessageProofSourceCallback() override; | 727 ~BuildServerConfigUpdateMessageProofSourceCallback() override; |
728 void operator=(const BuildServerConfigUpdateMessageProofSourceCallback&) = | 728 void operator=(const BuildServerConfigUpdateMessageProofSourceCallback&) = |
729 delete; | 729 delete; |
730 BuildServerConfigUpdateMessageProofSourceCallback( | 730 BuildServerConfigUpdateMessageProofSourceCallback( |
731 const QuicCryptoServerConfig* config, | 731 const QuicCryptoServerConfig* config, |
732 QuicVersion version, | 732 QuicVersion version, |
733 QuicCompressedCertsCache* compressed_certs_cache, | 733 QuicCompressedCertsCache* compressed_certs_cache, |
734 const CommonCertSets* common_cert_sets, | 734 const CommonCertSets* common_cert_sets, |
735 const QuicCryptoNegotiatedParameters& params, | 735 const QuicCryptoNegotiatedParameters& params, |
736 CryptoHandshakeMessage message, | 736 CryptoHandshakeMessage message, |
737 std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb); | 737 std::unique_ptr<BuildServerConfigUpdateMessageResultCallback> cb); |
738 | 738 |
739 void Run(bool ok, | 739 void Run(bool ok, |
740 const scoped_refptr<ProofSource::Chain>& chain, | 740 const scoped_refptr<ProofSource::Chain>& chain, |
741 const std::string& signature, | 741 const QuicCryptoProof& proof, |
742 const std::string& leaf_cert_sct, | |
743 std::unique_ptr<ProofSource::Details> details) override; | 742 std::unique_ptr<ProofSource::Details> details) override; |
744 | 743 |
745 private: | 744 private: |
746 const QuicCryptoServerConfig* config_; | 745 const QuicCryptoServerConfig* config_; |
747 const QuicVersion version_; | 746 const QuicVersion version_; |
748 QuicCompressedCertsCache* compressed_certs_cache_; | 747 QuicCompressedCertsCache* compressed_certs_cache_; |
749 const CommonCertSets* common_cert_sets_; | 748 const CommonCertSets* common_cert_sets_; |
750 const std::string client_common_set_hashes_; | 749 const std::string client_common_set_hashes_; |
751 const std::string client_cached_cert_hashes_; | 750 const std::string client_cached_cert_hashes_; |
752 const bool sct_supported_by_client_; | 751 const bool sct_supported_by_client_; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 | 841 |
843 // Enable serving SCT or not. | 842 // Enable serving SCT or not. |
844 bool enable_serving_sct_; | 843 bool enable_serving_sct_; |
845 | 844 |
846 // Does not own this observer. | 845 // Does not own this observer. |
847 RejectionObserver* rejection_observer_; | 846 RejectionObserver* rejection_observer_; |
848 | 847 |
849 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerConfig); | 848 DISALLOW_COPY_AND_ASSIGN(QuicCryptoServerConfig); |
850 }; | 849 }; |
851 | 850 |
852 struct NET_EXPORT_PRIVATE QuicCryptoProof | 851 struct NET_EXPORT_PRIVATE QuicSignedServerConfig |
853 : public base::RefCounted<QuicCryptoProof> { | 852 : public base::RefCounted<QuicSignedServerConfig> { |
854 QuicCryptoProof(); | 853 QuicSignedServerConfig(); |
855 | 854 |
| 855 // TODO(eranm): Have a QuicCryptoProof field instead of signature, cert_sct. |
856 std::string signature; | 856 std::string signature; |
857 scoped_refptr<ProofSource::Chain> chain; | 857 scoped_refptr<ProofSource::Chain> chain; |
858 std::string cert_sct; | 858 std::string cert_sct; |
859 // The server config that is used for this proof (and the rest of the | 859 // The server config that is used for this proof (and the rest of the |
860 // request). | 860 // request). |
861 scoped_refptr<QuicCryptoServerConfig::Config> config; | 861 scoped_refptr<QuicCryptoServerConfig::Config> config; |
862 std::string primary_scid; | 862 std::string primary_scid; |
863 | 863 |
864 private: | 864 private: |
865 friend class base::RefCounted<QuicCryptoProof>; | 865 friend class base::RefCounted<QuicSignedServerConfig>; |
866 virtual ~QuicCryptoProof(); | 866 virtual ~QuicSignedServerConfig(); |
867 }; | 867 }; |
868 | 868 |
869 } // namespace net | 869 } // namespace net |
870 | 870 |
871 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ | 871 #endif // NET_QUIC_CRYPTO_QUIC_CRYPTO_SERVER_CONFIG_H_ |
OLD | NEW |