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_ = config.as_string(); 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 private: 89 std::vector<PrivateKey*> keys_; 90 91 // config_ is a serialised config in QUIC wire format. 92 std::string config_; 93 94 // primary_time_ contains a UNIX epoch seconds value that indicates when this 95 // config should become primary. 96 int64 primary_time_; 97 }; 98 99 } // namespace net 100 101 #endif // NET_QUIC_CRYPTO_CRYPTO_SERVER_CONFIG_PROTOBUF_H_ 102