xref: /aosp_15_r20/external/cronet/net/http/transport_security_state_test_util.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2018 The Chromium Authors
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/http/transport_security_state_test_util.h"
6 
7 #include <iterator>
8 #include <string_view>
9 
10 #include "base/stl_util.h"
11 #include "base/strings/string_number_conversions.h"
12 #include "net/http/transport_security_state.h"
13 #include "url/gurl.h"
14 
15 namespace net {
16 
17 namespace test_default {
18 #include "net/http/transport_security_state_static_unittest_default.h"
19 }  // namespace test_default
20 
ScopedTransportSecurityStateSource()21 ScopedTransportSecurityStateSource::ScopedTransportSecurityStateSource() {
22   // TODO(mattm): allow using other source?
23   net::SetTransportSecurityStateSourceForTesting(
24       &net::test_default::kHSTSSource);
25 }
26 
ScopedTransportSecurityStateSource(uint16_t reporting_port)27 ScopedTransportSecurityStateSource::ScopedTransportSecurityStateSource(
28     uint16_t reporting_port) {
29   // TODO(mattm): allow using other source?
30   const TransportSecurityStateSource* base_source =
31       &net::test_default::kHSTSSource;
32   std::string reporting_port_string = base::NumberToString(reporting_port);
33   GURL::Replacements replace_port;
34   replace_port.SetPortStr(reporting_port_string);
35 
36   const char* last_report_uri = nullptr;
37   for (size_t i = 0; i < base_source->pinsets_count; ++i) {
38     const auto* pinset = &base_source->pinsets[i];
39     if (pinset->report_uri == kNoReportURI)
40       continue;
41     // Currently only one PKP report URI is supported.
42     if (last_report_uri)
43       DCHECK_EQ(std::string_view(last_report_uri), pinset->report_uri);
44     else
45       last_report_uri = pinset->report_uri;
46     pkp_report_uri_ =
47         GURL(pinset->report_uri).ReplaceComponents(replace_port).spec();
48   }
49   for (size_t i = 0; i < base_source->pinsets_count; ++i) {
50     const auto* pinset = &base_source->pinsets[i];
51     pinsets_.push_back({pinset->accepted_pins, pinset->rejected_pins,
52                         pinset->report_uri == kNoReportURI
53                             ? kNoReportURI
54                             : pkp_report_uri_.c_str()});
55   }
56 
57   const net::TransportSecurityStateSource new_source = {
58       base_source->huffman_tree,   base_source->huffman_tree_size,
59       base_source->preloaded_data, base_source->preloaded_bits,
60       base_source->root_position,  pinsets_.data(),
61       base_source->pinsets_count};
62 
63   source_ = std::make_unique<TransportSecurityStateSource>(new_source);
64 
65   net::SetTransportSecurityStateSourceForTesting(source_.get());
66 }
67 
~ScopedTransportSecurityStateSource()68 ScopedTransportSecurityStateSource::~ScopedTransportSecurityStateSource() {
69   net::SetTransportSecurityStateSourceForTesting(nullptr);
70 }
71 
72 }  // namespace net
73