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