[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 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 | ||||
3 | // found in the LICENSE file. | ||||
4 | |||||
5 | #include "net/quic/crypto/quic_server_info.h" | ||||
6 | |||||
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 7 | #include <limits> |
8 | |||||
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 9 | #include "base/pickle.h" |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 10 | |
11 | using std::string; | ||||
12 | |||||
13 | namespace { | ||||
14 | |||||
15 | const int kQuicCryptoConfigVersion = 1; | ||||
16 | |||||
17 | } // namespace | ||||
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 18 | |
19 | namespace net { | ||||
20 | |||||
21 | QuicServerInfo::State::State() {} | ||||
22 | |||||
23 | QuicServerInfo::State::~State() {} | ||||
24 | |||||
25 | void QuicServerInfo::State::Clear() { | ||||
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 26 | server_config.clear(); |
27 | source_address_token.clear(); | ||||
28 | server_config_sig.clear(); | ||||
29 | certs.clear(); | ||||
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 30 | } |
31 | |||||
[email protected] | 257f24f | 2014-04-01 09:15:37 | [diff] [blame] | 32 | QuicServerInfo::QuicServerInfo(const QuicServerId& server_id) |
rjshade | d5ced07 | 2015-12-18 19:26:02 | [diff] [blame^] | 33 | : server_id_(server_id) {} |
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 34 | |
rjshade | d5ced07 | 2015-12-18 19:26:02 | [diff] [blame^] | 35 | QuicServerInfo::~QuicServerInfo() {} |
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 36 | |
37 | const QuicServerInfo::State& QuicServerInfo::state() const { | ||||
38 | return state_; | ||||
39 | } | ||||
40 | |||||
41 | QuicServerInfo::State* QuicServerInfo::mutable_state() { | ||||
42 | return &state_; | ||||
43 | } | ||||
44 | |||||
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 45 | bool QuicServerInfo::Parse(const string& data) { |
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 46 | State* state = mutable_state(); |
47 | |||||
48 | state->Clear(); | ||||
49 | |||||
50 | bool r = ParseInner(data); | ||||
51 | if (!r) | ||||
52 | state->Clear(); | ||||
53 | return r; | ||||
54 | } | ||||
55 | |||||
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 56 | bool QuicServerInfo::ParseInner(const string& data) { |
57 | State* state = mutable_state(); | ||||
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 58 | |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 59 | // No data was read from the disk cache. |
60 | if (data.empty()) { | ||||
61 | return false; | ||||
62 | } | ||||
63 | |||||
brettw | bd4d711 | 2015-06-03 04:29:25 | [diff] [blame] | 64 | base::Pickle p(data.data(), data.size()); |
65 | base::PickleIterator iter(p); | ||||
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 66 | |
67 | int version = -1; | ||||
avi | 48fc13b | 2014-12-28 23:31:48 | [diff] [blame] | 68 | if (!iter.ReadInt(&version)) { |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 69 | DVLOG(1) << "Missing version"; |
70 | return false; | ||||
71 | } | ||||
72 | |||||
73 | if (version != kQuicCryptoConfigVersion) { | ||||
74 | DVLOG(1) << "Unsupported version"; | ||||
75 | return false; | ||||
76 | } | ||||
77 | |||||
avi | 48fc13b | 2014-12-28 23:31:48 | [diff] [blame] | 78 | if (!iter.ReadString(&state->server_config)) { |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 79 | DVLOG(1) << "Malformed server_config"; |
80 | return false; | ||||
81 | } | ||||
avi | 48fc13b | 2014-12-28 23:31:48 | [diff] [blame] | 82 | if (!iter.ReadString(&state->source_address_token)) { |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 83 | DVLOG(1) << "Malformed source_address_token"; |
84 | return false; | ||||
85 | } | ||||
avi | 48fc13b | 2014-12-28 23:31:48 | [diff] [blame] | 86 | if (!iter.ReadString(&state->server_config_sig)) { |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 87 | DVLOG(1) << "Malformed server_config_sig"; |
88 | return false; | ||||
89 | } | ||||
90 | |||||
91 | // Read certs. | ||||
92 | uint32 num_certs; | ||||
avi | 48fc13b | 2014-12-28 23:31:48 | [diff] [blame] | 93 | if (!iter.ReadUInt32(&num_certs)) { |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 94 | DVLOG(1) << "Malformed num_certs"; |
95 | return false; | ||||
96 | } | ||||
97 | |||||
98 | for (uint32 i = 0; i < num_certs; i++) { | ||||
99 | string cert; | ||||
avi | 48fc13b | 2014-12-28 23:31:48 | [diff] [blame] | 100 | if (!iter.ReadString(&cert)) { |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 101 | DVLOG(1) << "Malformed cert"; |
102 | return false; | ||||
103 | } | ||||
104 | state->certs.push_back(cert); | ||||
105 | } | ||||
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 106 | |
107 | return true; | ||||
108 | } | ||||
109 | |||||
[email protected] | db1505e | 2014-02-26 15:23:17 | [diff] [blame] | 110 | string QuicServerInfo::Serialize() { |
111 | string pickled_data = SerializeInner(); | ||||
112 | state_.Clear(); | ||||
113 | return pickled_data; | ||||
114 | } | ||||
115 | |||||
116 | string QuicServerInfo::SerializeInner() const { | ||||
brettw | bd4d711 | 2015-06-03 04:29:25 | [diff] [blame] | 117 | base::Pickle p(sizeof(base::Pickle::Header)); |
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 118 | |
[email protected] | f9ca77a | 2014-02-20 18:02:30 | [diff] [blame] | 119 | if (!p.WriteInt(kQuicCryptoConfigVersion) || |
120 | !p.WriteString(state_.server_config) || | ||||
121 | !p.WriteString(state_.source_address_token) || | ||||
122 | !p.WriteString(state_.server_config_sig) || | ||||
123 | state_.certs.size() > std::numeric_limits<uint32>::max() || | ||||
124 | !p.WriteUInt32(state_.certs.size())) { | ||||
125 | return string(); | ||||
126 | } | ||||
127 | |||||
128 | for (size_t i = 0; i < state_.certs.size(); i++) { | ||||
129 | if (!p.WriteString(state_.certs[i])) { | ||||
130 | return string(); | ||||
131 | } | ||||
132 | } | ||||
133 | |||||
rjshade | d5ced07 | 2015-12-18 19:26:02 | [diff] [blame^] | 134 | return string(reinterpret_cast<const char*>(p.data()), p.size()); |
[email protected] | 66262664 | 2014-01-25 00:54:41 | [diff] [blame] | 135 | } |
136 | |||||
137 | QuicServerInfoFactory::~QuicServerInfoFactory() {} | ||||
138 | |||||
139 | } // namespace net |