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 3 // found in the LICENSE file. 4 5 #ifndef NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_PROTOBUF_H_ 6 #define NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_PROTOBUF_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/logging.h" 12 #include "base/stl_util.h" 13 #include "base/strings/string_piece.h" 14 #include "net/base/net_export.h" 15 #include "net/quic/crypto/crypto_protocol.h" 16 17 namespace net { 18 19 // QuicServerConfigProtobuf contains QUIC server config block and the private 20 // keys needed to prove ownership. 21 // TODO(rch): sync with server more rationally. 22 class NET_EXPORT_PRIVATE QuicServerConfigProtobuf { 23 public: 24 // PrivateKey contains a QUIC tag of a key exchange algorithm and a 25 // serialised private key for that algorithm. The format of the serialised 26 // private key is specific to the algorithm in question. 27 class NET_EXPORT_PRIVATE PrivateKey { 28 public: 29 QuicTag tag() const { 30 return tag_; 31 } 32 void set_tag(QuicTag tag) { 33 tag_ = tag; 34 } 35 std::string private_key() const { 36 return private_key_; 37 } 38 void set_private_key(std::string key) { 39 private_key_ = key; 40 } 41 42 private: 43 QuicTag tag_; 44 std::string private_key_; 45 }; 46 47 QuicServerConfigProtobuf(); 48 ~QuicServerConfigProtobuf(); 49 50 size_t key_size() const { 51 return keys_.size(); 52 } 53 54 const PrivateKey& key(size_t i) const { 55 DCHECK_GT(keys_.size(), i); 56 return *keys_[i]; 57 } 58 59 std::string config() const { 60 return config_; 61 } 62 63 void set_config(base::StringPiece config) { 64 config.CopyToString(&config_); 65 } 66 67 QuicServerConfigProtobuf::PrivateKey* add_key() { 68 keys_.push_back(new PrivateKey); 69 return keys_.back(); 70 } 71 72 void clear_key() { 73 STLDeleteElements(&keys_); 74 } 75 76 bool has_primary_time() const { 77 return primary_time_ > 0; 78 } 79 80 int64 primary_time() const { 81 return primary_time_; 82 } 83 84 void set_primary_time(int64 primary_time) { 85 primary_time_ = primary_time; 86 } 87 88 bool has_priority() const { 89 return priority_ > 0; 90 } 91 92 uint64 priority() const { 93 return priority_; 94 } 95 96 void set_priority(int64 priority) { 97 priority_ = priority; 98 } 99 100 bool has_source_address_token_secret_override() const { 101 return !source_address_token_secret_override_.empty(); 102 } 103 104 std::string source_address_token_secret_override() const { 105 return source_address_token_secret_override_; 106 } 107 108 void set_source_address_token_secret_override( 109 base::StringPiece source_address_token_secret_override) { 110 source_address_token_secret_override.CopyToString( 111 &source_address_token_secret_override_); 112 } 113 114 private: 115 std::vector<PrivateKey*> keys_; 116 117 // config_ is a serialised config in QUIC wire format. 118 std::string config_; 119 120 // primary_time_ contains a UNIX epoch seconds value that indicates when this 121 // config should become primary. 122 int64 primary_time_; 123 124 // Relative priority of this config vs other configs with the same 125 // primary time. For use as a secondary sort key when selecting the 126 // primary config. 127 uint64 priority_; 128 129 // Optional override to the secret used to box/unbox source address 130 // tokens when talking to clients that select this server config. 131 // It can be of any length as it is fed into a KDF before use. 132 std::string source_address_token_secret_override_; 133 134 DISALLOW_COPY_AND_ASSIGN(QuicServerConfigProtobuf); 135 }; 136 137 } // namespace net 138 139 #endif // NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_PROTOBUF_H_ 140