1 // Copyright 2016 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 "quiche/quic/test_tools/quic_crypto_server_config_peer.h"
6
7 #include "absl/strings/string_view.h"
8 #include "quiche/quic/test_tools/mock_clock.h"
9 #include "quiche/quic/test_tools/mock_random.h"
10 #include "quiche/quic/test_tools/quic_test_utils.h"
11
12 namespace quic {
13 namespace test {
14
15 quiche::QuicheReferenceCountedPointer<QuicCryptoServerConfig::Config>
GetPrimaryConfig()16 QuicCryptoServerConfigPeer::GetPrimaryConfig() {
17 QuicReaderMutexLock locked(&server_config_->configs_lock_);
18 return quiche::QuicheReferenceCountedPointer<QuicCryptoServerConfig::Config>(
19 server_config_->primary_config_);
20 }
21
22 quiche::QuicheReferenceCountedPointer<QuicCryptoServerConfig::Config>
GetConfig(std::string config_id)23 QuicCryptoServerConfigPeer::GetConfig(std::string config_id) {
24 QuicReaderMutexLock locked(&server_config_->configs_lock_);
25 if (config_id == "<primary>") {
26 return quiche::QuicheReferenceCountedPointer<
27 QuicCryptoServerConfig::Config>(server_config_->primary_config_);
28 } else {
29 return server_config_->GetConfigWithScid(config_id);
30 }
31 }
32
GetProofSource() const33 ProofSource* QuicCryptoServerConfigPeer::GetProofSource() const {
34 return server_config_->proof_source_.get();
35 }
36
ResetProofSource(std::unique_ptr<ProofSource> proof_source)37 void QuicCryptoServerConfigPeer::ResetProofSource(
38 std::unique_ptr<ProofSource> proof_source) {
39 server_config_->proof_source_ = std::move(proof_source);
40 }
41
NewSourceAddressToken(std::string config_id,SourceAddressTokens previous_tokens,const QuicIpAddress & ip,QuicRandom * rand,QuicWallTime now,CachedNetworkParameters * cached_network_params)42 std::string QuicCryptoServerConfigPeer::NewSourceAddressToken(
43 std::string config_id, SourceAddressTokens previous_tokens,
44 const QuicIpAddress& ip, QuicRandom* rand, QuicWallTime now,
45 CachedNetworkParameters* cached_network_params) {
46 return server_config_->NewSourceAddressToken(
47 *GetConfig(config_id)->source_address_token_boxer, previous_tokens, ip,
48 rand, now, cached_network_params);
49 }
50
ValidateSourceAddressTokens(std::string config_id,absl::string_view srct,const QuicIpAddress & ip,QuicWallTime now,CachedNetworkParameters * cached_network_params)51 HandshakeFailureReason QuicCryptoServerConfigPeer::ValidateSourceAddressTokens(
52 std::string config_id, absl::string_view srct, const QuicIpAddress& ip,
53 QuicWallTime now, CachedNetworkParameters* cached_network_params) {
54 SourceAddressTokens tokens;
55 HandshakeFailureReason reason = server_config_->ParseSourceAddressToken(
56 *GetConfig(config_id)->source_address_token_boxer, srct, tokens);
57 if (reason != HANDSHAKE_OK) {
58 return reason;
59 }
60
61 return server_config_->ValidateSourceAddressTokens(tokens, ip, now,
62 cached_network_params);
63 }
64
65 HandshakeFailureReason
ValidateSingleSourceAddressToken(absl::string_view token,const QuicIpAddress & ip,QuicWallTime now)66 QuicCryptoServerConfigPeer::ValidateSingleSourceAddressToken(
67 absl::string_view token, const QuicIpAddress& ip, QuicWallTime now) {
68 SourceAddressTokens tokens;
69 HandshakeFailureReason parse_status = server_config_->ParseSourceAddressToken(
70 *GetPrimaryConfig()->source_address_token_boxer, token, tokens);
71 if (HANDSHAKE_OK != parse_status) {
72 return parse_status;
73 }
74 EXPECT_EQ(1, tokens.tokens_size());
75 return server_config_->ValidateSingleSourceAddressToken(tokens.tokens(0), ip,
76 now);
77 }
78
CheckConfigs(std::vector<std::pair<std::string,bool>> expected_ids_and_status)79 void QuicCryptoServerConfigPeer::CheckConfigs(
80 std::vector<std::pair<std::string, bool>> expected_ids_and_status) {
81 QuicReaderMutexLock locked(&server_config_->configs_lock_);
82
83 ASSERT_EQ(expected_ids_and_status.size(), server_config_->configs_.size())
84 << ConfigsDebug();
85
86 for (const std::pair<const ServerConfigID,
87 quiche::QuicheReferenceCountedPointer<
88 QuicCryptoServerConfig::Config>>& i :
89 server_config_->configs_) {
90 bool found = false;
91 for (std::pair<ServerConfigID, bool>& j : expected_ids_and_status) {
92 if (i.first == j.first && i.second->is_primary == j.second) {
93 found = true;
94 j.first.clear();
95 break;
96 }
97 }
98
99 ASSERT_TRUE(found) << "Failed to find match for " << i.first
100 << " in configs:\n"
101 << ConfigsDebug();
102 }
103 }
104
105 // ConfigsDebug returns a std::string that contains debugging information about
106 // the set of Configs loaded in |server_config_| and their status.
ConfigsDebug()107 std::string QuicCryptoServerConfigPeer::ConfigsDebug() {
108 if (server_config_->configs_.empty()) {
109 return "No Configs in QuicCryptoServerConfig";
110 }
111
112 std::string s;
113
114 for (const auto& i : server_config_->configs_) {
115 const quiche::QuicheReferenceCountedPointer<QuicCryptoServerConfig::Config>
116 config = i.second;
117 if (config->is_primary) {
118 s += "(primary) ";
119 } else {
120 s += " ";
121 }
122 s += config->id;
123 s += "\n";
124 }
125
126 return s;
127 }
128
SelectNewPrimaryConfig(int seconds)129 void QuicCryptoServerConfigPeer::SelectNewPrimaryConfig(int seconds) {
130 QuicWriterMutexLock locked(&server_config_->configs_lock_);
131 server_config_->SelectNewPrimaryConfig(
132 QuicWallTime::FromUNIXSeconds(seconds));
133 }
134
CompressChain(QuicCompressedCertsCache * compressed_certs_cache,const quiche::QuicheReferenceCountedPointer<ProofSource::Chain> & chain,const std::string & client_cached_cert_hashes)135 std::string QuicCryptoServerConfigPeer::CompressChain(
136 QuicCompressedCertsCache* compressed_certs_cache,
137 const quiche::QuicheReferenceCountedPointer<ProofSource::Chain>& chain,
138 const std::string& client_cached_cert_hashes) {
139 return QuicCryptoServerConfig::CompressChain(compressed_certs_cache, chain,
140 client_cached_cert_hashes);
141 }
142
source_address_token_future_secs()143 uint32_t QuicCryptoServerConfigPeer::source_address_token_future_secs() {
144 return server_config_->source_address_token_future_secs_;
145 }
146
source_address_token_lifetime_secs()147 uint32_t QuicCryptoServerConfigPeer::source_address_token_lifetime_secs() {
148 return server_config_->source_address_token_lifetime_secs_;
149 }
150
151 } // namespace test
152 } // namespace quic
153