OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "net/quic/crypto/quic_server_info.h" | 5 #include "net/quic/crypto/quic_server_info.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include <limits> |
| 8 |
8 #include "base/pickle.h" | 9 #include "base/pickle.h" |
9 #include "base/strings/string_piece.h" | 10 |
| 11 using std::string; |
| 12 |
| 13 namespace { |
| 14 |
| 15 const int kQuicCryptoConfigVersion = 1; |
| 16 |
| 17 } // namespace |
10 | 18 |
11 namespace net { | 19 namespace net { |
12 | 20 |
13 QuicServerInfo::State::State() {} | 21 QuicServerInfo::State::State() {} |
14 | 22 |
15 QuicServerInfo::State::~State() {} | 23 QuicServerInfo::State::~State() {} |
16 | 24 |
17 void QuicServerInfo::State::Clear() { | 25 void QuicServerInfo::State::Clear() { |
18 data.clear(); | 26 server_config.clear(); |
| 27 source_address_token.clear(); |
| 28 server_config_sig.clear(); |
| 29 certs.clear(); |
19 } | 30 } |
20 | 31 |
21 // TODO(rtenneti): Flesh out the details. | 32 QuicServerInfo::QuicServerInfo(const string& hostname) : hostname_(hostname) { |
22 QuicServerInfo::QuicServerInfo( | |
23 const std::string& hostname) | |
24 : hostname_(hostname), | |
25 weak_factory_(this) { | |
26 } | 33 } |
27 | 34 |
28 QuicServerInfo::~QuicServerInfo() { | 35 QuicServerInfo::~QuicServerInfo() { |
29 } | 36 } |
30 | 37 |
31 const QuicServerInfo::State& QuicServerInfo::state() const { | 38 const QuicServerInfo::State& QuicServerInfo::state() const { |
32 return state_; | 39 return state_; |
33 } | 40 } |
34 | 41 |
35 QuicServerInfo::State* QuicServerInfo::mutable_state() { | 42 QuicServerInfo::State* QuicServerInfo::mutable_state() { |
36 return &state_; | 43 return &state_; |
37 } | 44 } |
38 | 45 |
39 bool QuicServerInfo::Parse(const std::string& data) { | 46 bool QuicServerInfo::Parse(const string& data) { |
40 State* state = mutable_state(); | 47 State* state = mutable_state(); |
41 | 48 |
42 state->Clear(); | 49 state->Clear(); |
43 | 50 |
44 bool r = ParseInner(data); | 51 bool r = ParseInner(data); |
45 if (!r) | 52 if (!r) |
46 state->Clear(); | 53 state->Clear(); |
47 return r; | 54 return r; |
48 } | 55 } |
49 | 56 |
50 bool QuicServerInfo::ParseInner(const std::string& data) { | 57 bool QuicServerInfo::ParseInner(const string& data) { |
51 // TODO(rtenneti): restore QuicCryptoClientConfig::CachedState. | 58 State* state = mutable_state(); |
52 // State* state = mutable_state(); | |
53 | 59 |
54 // Pickle p(data.data(), data.size()); | 60 // No data was read from the disk cache. |
55 // PickleIterator iter(p); | 61 if (data.empty()) { |
| 62 return false; |
| 63 } |
| 64 |
| 65 Pickle p(data.data(), data.size()); |
| 66 PickleIterator iter(p); |
| 67 |
| 68 int version = -1; |
| 69 if (!p.ReadInt(&iter, &version)) { |
| 70 DVLOG(1) << "Missing version"; |
| 71 return false; |
| 72 } |
| 73 |
| 74 if (version != kQuicCryptoConfigVersion) { |
| 75 DVLOG(1) << "Unsupported version"; |
| 76 return false; |
| 77 } |
| 78 |
| 79 if (!p.ReadString(&iter, &state->server_config)) { |
| 80 DVLOG(1) << "Malformed server_config"; |
| 81 return false; |
| 82 } |
| 83 if (!p.ReadString(&iter, &state->source_address_token)) { |
| 84 DVLOG(1) << "Malformed source_address_token"; |
| 85 return false; |
| 86 } |
| 87 if (!p.ReadString(&iter, &state->server_config_sig)) { |
| 88 DVLOG(1) << "Malformed server_config_sig"; |
| 89 return false; |
| 90 } |
| 91 |
| 92 // Read certs. |
| 93 uint32 num_certs; |
| 94 if (!p.ReadUInt32(&iter, &num_certs)) { |
| 95 DVLOG(1) << "Malformed num_certs"; |
| 96 return false; |
| 97 } |
| 98 |
| 99 for (uint32 i = 0; i < num_certs; i++) { |
| 100 string cert; |
| 101 if (!p.ReadString(&iter, &cert)) { |
| 102 DVLOG(1) << "Malformed cert"; |
| 103 return false; |
| 104 } |
| 105 state->certs.push_back(cert); |
| 106 } |
56 | 107 |
57 return true; | 108 return true; |
58 } | 109 } |
59 | 110 |
60 std::string QuicServerInfo::Serialize() const { | 111 string QuicServerInfo::Serialize() const { |
61 Pickle p(sizeof(Pickle::Header)); | 112 Pickle p(sizeof(Pickle::Header)); |
62 | 113 |
63 // TODO(rtenneti): serialize QuicCryptoClientConfig::CachedState. | 114 if (!p.WriteInt(kQuicCryptoConfigVersion) || |
64 return std::string(reinterpret_cast<const char *>(p.data()), p.size()); | 115 !p.WriteString(state_.server_config) || |
| 116 !p.WriteString(state_.source_address_token) || |
| 117 !p.WriteString(state_.server_config_sig) || |
| 118 state_.certs.size() > std::numeric_limits<uint32>::max() || |
| 119 !p.WriteUInt32(state_.certs.size())) { |
| 120 return string(); |
| 121 } |
| 122 |
| 123 for (size_t i = 0; i < state_.certs.size(); i++) { |
| 124 if (!p.WriteString(state_.certs[i])) { |
| 125 return string(); |
| 126 } |
| 127 } |
| 128 |
| 129 return string(reinterpret_cast<const char *>(p.data()), p.size()); |
65 } | 130 } |
66 | 131 |
67 QuicServerInfoFactory::~QuicServerInfoFactory() {} | 132 QuicServerInfoFactory::~QuicServerInfoFactory() {} |
68 | 133 |
69 } // namespace net | 134 } // namespace net |
OLD | NEW |