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