blob: 6c6fff906b2e051f40a48575128d22e7cff2f6bc [file] [log] [blame]
[email protected]662626642014-01-25 00:54:411// 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]f9ca77a2014-02-20 18:02:307#include <limits>
8
[email protected]662626642014-01-25 00:54:419#include "base/pickle.h"
[email protected]f9ca77a2014-02-20 18:02:3010
11using std::string;
12
13namespace {
14
15const int kQuicCryptoConfigVersion = 1;
16
17} // namespace
[email protected]662626642014-01-25 00:54:4118
19namespace net {
20
21QuicServerInfo::State::State() {}
22
23QuicServerInfo::State::~State() {}
24
25void QuicServerInfo::State::Clear() {
[email protected]f9ca77a2014-02-20 18:02:3026 server_config.clear();
27 source_address_token.clear();
28 server_config_sig.clear();
29 certs.clear();
[email protected]662626642014-01-25 00:54:4130}
31
[email protected]257f24f2014-04-01 09:15:3732QuicServerInfo::QuicServerInfo(const QuicServerId& server_id)
rjshaded5ced072015-12-18 19:26:0233 : server_id_(server_id) {}
[email protected]662626642014-01-25 00:54:4134
rjshaded5ced072015-12-18 19:26:0235QuicServerInfo::~QuicServerInfo() {}
[email protected]662626642014-01-25 00:54:4136
37const QuicServerInfo::State& QuicServerInfo::state() const {
38 return state_;
39}
40
41QuicServerInfo::State* QuicServerInfo::mutable_state() {
42 return &state_;
43}
44
[email protected]f9ca77a2014-02-20 18:02:3045bool QuicServerInfo::Parse(const string& data) {
[email protected]662626642014-01-25 00:54:4146 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]f9ca77a2014-02-20 18:02:3056bool QuicServerInfo::ParseInner(const string& data) {
57 State* state = mutable_state();
[email protected]662626642014-01-25 00:54:4158
[email protected]f9ca77a2014-02-20 18:02:3059 // No data was read from the disk cache.
60 if (data.empty()) {
61 return false;
62 }
63
brettwbd4d7112015-06-03 04:29:2564 base::Pickle p(data.data(), data.size());
65 base::PickleIterator iter(p);
[email protected]f9ca77a2014-02-20 18:02:3066
67 int version = -1;
avi48fc13b2014-12-28 23:31:4868 if (!iter.ReadInt(&version)) {
[email protected]f9ca77a2014-02-20 18:02:3069 DVLOG(1) << "Missing version";
70 return false;
71 }
72
73 if (version != kQuicCryptoConfigVersion) {
74 DVLOG(1) << "Unsupported version";
75 return false;
76 }
77
avi48fc13b2014-12-28 23:31:4878 if (!iter.ReadString(&state->server_config)) {
[email protected]f9ca77a2014-02-20 18:02:3079 DVLOG(1) << "Malformed server_config";
80 return false;
81 }
avi48fc13b2014-12-28 23:31:4882 if (!iter.ReadString(&state->source_address_token)) {
[email protected]f9ca77a2014-02-20 18:02:3083 DVLOG(1) << "Malformed source_address_token";
84 return false;
85 }
avi48fc13b2014-12-28 23:31:4886 if (!iter.ReadString(&state->server_config_sig)) {
[email protected]f9ca77a2014-02-20 18:02:3087 DVLOG(1) << "Malformed server_config_sig";
88 return false;
89 }
90
91 // Read certs.
92 uint32 num_certs;
avi48fc13b2014-12-28 23:31:4893 if (!iter.ReadUInt32(&num_certs)) {
[email protected]f9ca77a2014-02-20 18:02:3094 DVLOG(1) << "Malformed num_certs";
95 return false;
96 }
97
98 for (uint32 i = 0; i < num_certs; i++) {
99 string cert;
avi48fc13b2014-12-28 23:31:48100 if (!iter.ReadString(&cert)) {
[email protected]f9ca77a2014-02-20 18:02:30101 DVLOG(1) << "Malformed cert";
102 return false;
103 }
104 state->certs.push_back(cert);
105 }
[email protected]662626642014-01-25 00:54:41106
107 return true;
108}
109
[email protected]db1505e2014-02-26 15:23:17110string QuicServerInfo::Serialize() {
111 string pickled_data = SerializeInner();
112 state_.Clear();
113 return pickled_data;
114}
115
116string QuicServerInfo::SerializeInner() const {
brettwbd4d7112015-06-03 04:29:25117 base::Pickle p(sizeof(base::Pickle::Header));
[email protected]662626642014-01-25 00:54:41118
[email protected]f9ca77a2014-02-20 18:02:30119 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
rjshaded5ced072015-12-18 19:26:02134 return string(reinterpret_cast<const char*>(p.data()), p.size());
[email protected]662626642014-01-25 00:54:41135}
136
137QuicServerInfoFactory::~QuicServerInfoFactory() {}
138
139} // namespace net