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