19085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Copyright 2014 The Chromium Authors. All rights reserved. 29085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// Use of this source code is governed by a BSD-style license that can be 39085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// found in the LICENSE file. 45ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 55ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#ifndef NET_QUIC_CRYPTO_QUIC_SERVER_INFO_H_ 65ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org#define NET_QUIC_CRYPTO_QUIC_SERVER_INFO_H_ 75ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 89085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <string> 99085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include <vector> 109085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 119085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/memory/ref_counted.h" 129085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/memory/weak_ptr.h" 139085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "base/time/time.h" 149085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "net/base/completion_callback.h" 159085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "net/base/net_export.h" 169085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org#include "net/quic/quic_server_id.h" 179085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 189085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgnamespace net { 199085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 209085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass X509Certificate; 219085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 229085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// QuicServerInfo is an interface for fetching information about a QUIC server. 239085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// This information may be stored on disk so does not include keys or other 249085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// sensitive information. Primarily it's intended for caching the QUIC server's 259085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org// crypto config. 269085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.orgclass NET_EXPORT_PRIVATE QuicServerInfo { 279085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org public: 289085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org QuicServerInfo(const QuicServerId& server_id); 299085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org virtual ~QuicServerInfo(); 309085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 319085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Start will commence the lookup. This must be called before any other 329085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // methods. By opportunistically calling this early, it may be possible to 3356454717593e7552d6846198b8e0f661fa36a3cayangguo@chromium.org // overlap this object's lookup and reduce latency. 349085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org virtual void Start() = 0; 359085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 369085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // WaitForDataReady returns OK if the fetch of the requested data has 379085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // completed. Otherwise it returns ERR_IO_PENDING and will call |callback| on 389085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // the current thread when ready. 399085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // 40c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // Only a single callback can be outstanding at a given time and, in the 41c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // event that WaitForDataReady returns OK, it's the caller's responsibility 4271affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // to delete |callback|. 4371affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.org // 449085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // |callback| may be NULL, in which case ERR_IO_PENDING may still be returned 45e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // but, obviously, a callback will never be made. 46e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org virtual int WaitForDataReady(const CompletionCallback& callback) = 0; 47e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 481b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // Returns true if data is loaded from disk cache and ready (WaitForDataReady 4940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org // doesn't have a pending callback). 5040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org virtual bool IsDataReady() = 0; 51e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 52e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org // Returns true if the object is ready to persist data, in other words, if 531b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // data is loaded from disk cache and ready and there are no pending writes. 5440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org virtual bool IsReadyToPersist() = 0; 5540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org 56b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org // Persist allows for the server information to be updated for future users. 57b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org // This is a fire and forget operation: the caller may drop its reference 581b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org // from this object and the store operation will still complete. This can 5940b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org // only be called once WaitForDataReady has returned OK or called its 6040b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org // callback. 61b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org virtual void Persist() = 0; 62b9d7da12d4486aa0a9d6660de46d977198076e77sgjesse@chromium.org 631b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org struct State { 6440b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org State(); 6540b9da37a45dabf86bd82a39e885f2921f47fc08fschneider@chromium.org ~State(); 66e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org 67e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org void Clear(); 689085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 699085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // This class matches QuicClientCryptoConfig::CachedState. 709085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::string server_config; // A serialized handshake message. 719085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::string source_address_token; // An opaque proof of IP ownership. 729085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::vector<std::string> certs; // A list of certificates in leaf-first 739085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // order. 749085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::string server_config_sig; // A signature of |server_config_|. 759085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 769085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org private: 779085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org DISALLOW_COPY_AND_ASSIGN(State); 789085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org }; 799085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 809085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Once the data is ready, it can be read using the following members. These 819085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // members can then be updated before calling |Persist|. 829085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org const State& state() const; 839085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org State* mutable_state(); 849085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org 859085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org protected: 869085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // Parse parses pickled data and fills out the public member fields of this 879085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // object. It returns true iff the parse was successful. The public member 889085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org // fields will be set to something sane in any case. 899085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org bool Parse(const std::string& data); 909085a016223a6b72bf580d5781c93ec7b9e54422ager@chromium.org std::string Serialize(); 91a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org State state_; 92a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 93a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org private: 94a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // ParseInner is a helper function for Parse. 95a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org bool ParseInner(const std::string& data); 96b08986cb66c3f6687247cb6da186c1e73057e399whesse@chromium.org 97a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org // SerializeInner is a helper function for Serialize. 98a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org std::string SerializeInner() const; 99a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 100a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // This is the QUIC server (hostname, port, is_https, privacy_mode) tuple for 101a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org // which we restore the crypto_config. 102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org const QuicServerId server_id_; 103a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 104c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org DISALLOW_COPY_AND_ASSIGN(QuicServerInfo); 1053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}; 106c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org 107c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.orgclass QuicServerInfoFactory { 108c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org public: 109a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org virtual ~QuicServerInfoFactory(); 1103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org 111c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // GetForServer returns a fresh, allocated QuicServerInfo for the given 112c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org // |server_id| or NULL on failure. 113c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org virtual QuicServerInfo* GetForServer(const QuicServerId& server_id) = 0; 114a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}; 115a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org 116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} // namespace net 117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org 118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif // NET_QUIC_CRYPTO_QUIC_SERVER_INFO_H_ 119c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org