Avi Drissman | 6459548 | 2022-09-14 20:52:29 | [diff] [blame] | 1 | // Copyright 2012 The Chromium Authors |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
[email protected] | ae4a77fa | 2013-11-13 00:09:46 | [diff] [blame] | 5 | #include "net/http/transport_security_persister.h" |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 6 | |
[email protected] | 83980c7 | 2012-05-09 17:57:23 | [diff] [blame] | 7 | #include <map> |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 8 | #include <memory> |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 9 | #include <string> |
[email protected] | ede0321 | 2012-09-07 12:52:26 | [diff] [blame] | 10 | #include <vector> |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 11 | |
[email protected] | 5799981 | 2013-02-24 05:40:52 | [diff] [blame] | 12 | #include "base/files/file_path.h" |
thestig | d8df033 | 2014-09-04 06:33:29 | [diff] [blame] | 13 | #include "base/files/file_util.h" |
[email protected] | ea1a3f6 | 2012-11-16 20:34:23 | [diff] [blame] | 14 | #include "base/files/scoped_temp_dir.h" |
Matt Menke | 6e2bf4e | 2021-03-05 14:45:45 | [diff] [blame] | 15 | #include "base/json/json_writer.h" |
fdoray | 6ef45cf | 2016-08-25 15:36:37 | [diff] [blame] | 16 | #include "base/run_loop.h" |
Matt Menke | 6e2bf4e | 2021-03-05 14:45:45 | [diff] [blame] | 17 | #include "base/strings/string_util.h" |
Carlos Caballero | b25fe847 | 2020-07-17 10:27:17 | [diff] [blame] | 18 | #include "base/task/current_thread.h" |
Sean Maher | e672a66 | 2023-01-09 21:42:28 | [diff] [blame] | 19 | #include "base/task/sequenced_task_runner.h" |
Gabriel Charette | 99f5df3 | 2021-03-19 19:55:55 | [diff] [blame] | 20 | #include "base/task/thread_pool.h" |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 21 | #include "base/test/scoped_feature_list.h" |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 22 | #include "net/base/features.h" |
Brianna Goldstein | d22b064 | 2022-10-11 16:30:50 | [diff] [blame] | 23 | #include "net/base/network_anonymization_key.h" |
Matt Menke | 4807a9a | 2020-11-21 00:14:41 | [diff] [blame] | 24 | #include "net/base/schemeful_site.h" |
[email protected] | 536fd0b | 2013-03-14 17:41:57 | [diff] [blame] | 25 | #include "net/http/transport_security_state.h" |
Gabriel Charette | c710874 | 2019-08-23 03:31:40 | [diff] [blame] | 26 | #include "net/test/test_with_task_environment.h" |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 27 | #include "testing/gtest/include/gtest/gtest.h" |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 28 | #include "url/gurl.h" |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 29 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 30 | namespace net { |
| 31 | |
| 32 | namespace { |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 33 | |
estark | 83487b6 | 2015-07-27 17:11:14 | [diff] [blame] | 34 | const char kReportUri[] = "http://www.example.test/report"; |
| 35 | |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 36 | class TransportSecurityPersisterTest : public ::testing::Test, |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 37 | public WithTaskEnvironment { |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 38 | public: |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 39 | TransportSecurityPersisterTest() |
| 40 | : WithTaskEnvironment( |
| 41 | base::test::TaskEnvironment::TimeSource::MOCK_TIME) { |
| 42 | // Mock out time so that entries with hard-coded json data can be |
| 43 | // successfully loaded. Use a large enough value that dynamically created |
| 44 | // entries have at least somewhat interesting expiration times. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 45 | FastForwardBy(base::Days(3660)); |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 46 | } |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 47 | |
dcheng | 67be2b1f | 2014-10-27 21:47:29 | [diff] [blame] | 48 | ~TransportSecurityPersisterTest() override { |
Carlos Caballero | b25fe847 | 2020-07-17 10:27:17 | [diff] [blame] | 49 | EXPECT_TRUE(base::CurrentIOThread::IsSet()); |
fdoray | 6ef45cf | 2016-08-25 15:36:37 | [diff] [blame] | 50 | base::RunLoop().RunUntilIdle(); |
[email protected] | 179dbf25 | 2012-05-15 19:59:25 | [diff] [blame] | 51 | } |
| 52 | |
dcheng | 67be2b1f | 2014-10-27 21:47:29 | [diff] [blame] | 53 | void SetUp() override { |
[email protected] | 83980c7 | 2012-05-09 17:57:23 | [diff] [blame] | 54 | ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
Will Harris | 62f94bd5 | 2021-08-11 16:48:40 | [diff] [blame] | 55 | transport_security_file_path_ = |
| 56 | temp_dir_.GetPath().AppendASCII("TransportSecurity"); |
Carlos Caballero | b25fe847 | 2020-07-17 10:27:17 | [diff] [blame] | 57 | ASSERT_TRUE(base::CurrentIOThread::IsSet()); |
Christian Dullweber | 836696e | 2020-05-12 18:21:55 | [diff] [blame] | 58 | scoped_refptr<base::SequencedTaskRunner> background_runner( |
| 59 | base::ThreadPool::CreateSequencedTaskRunner( |
| 60 | {base::MayBlock(), base::TaskPriority::BEST_EFFORT, |
| 61 | base::TaskShutdownBehavior::BLOCK_SHUTDOWN})); |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 62 | state_ = std::make_unique<TransportSecurityState>(); |
Matt Menke | ffa8fc2 | 2017-11-08 11:22:15 | [diff] [blame] | 63 | persister_ = std::make_unique<TransportSecurityPersister>( |
Will Harris | 62f94bd5 | 2021-08-11 16:48:40 | [diff] [blame] | 64 | state_.get(), std::move(background_runner), |
| 65 | transport_security_file_path_); |
[email protected] | 83980c7 | 2012-05-09 17:57:23 | [diff] [blame] | 66 | } |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 67 | |
[email protected] | 83980c7 | 2012-05-09 17:57:23 | [diff] [blame] | 68 | protected: |
Will Harris | 62f94bd5 | 2021-08-11 16:48:40 | [diff] [blame] | 69 | base::FilePath transport_security_file_path_; |
[email protected] | ea1a3f6 | 2012-11-16 20:34:23 | [diff] [blame] | 70 | base::ScopedTempDir temp_dir_; |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 71 | std::unique_ptr<TransportSecurityState> state_; |
danakj | 1fd259a0 | 2016-04-16 03:17:09 | [diff] [blame] | 72 | std::unique_ptr<TransportSecurityPersister> persister_; |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 73 | }; |
| 74 | |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 75 | // Tests that LoadEntries() clears existing non-static entries. |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 76 | TEST_F(TransportSecurityPersisterTest, LoadEntriesClearsExistingState) { |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 77 | TransportSecurityState::STSState sts_state; |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 78 | const base::Time current_time(base::Time::Now()); |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 79 | const base::Time expiry = current_time + base::Seconds(1000); |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 80 | static const char kYahooDomain[] = "yahoo.com"; |
| 81 | |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 82 | EXPECT_FALSE(state_->GetDynamicSTSState(kYahooDomain, &sts_state)); |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 83 | |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 84 | state_->AddHSTS(kYahooDomain, expiry, false /* include subdomains */); |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 85 | EXPECT_TRUE(state_->GetDynamicSTSState(kYahooDomain, &sts_state)); |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 86 | |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 87 | persister_->LoadEntries("{\"version\":2}"); |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 88 | |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 89 | EXPECT_FALSE(state_->GetDynamicSTSState(kYahooDomain, &sts_state)); |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 90 | } |
| 91 | |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 92 | // Tests that serializing -> deserializing -> reserializing results in the same |
| 93 | // output. |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 94 | TEST_F(TransportSecurityPersisterTest, SerializeData1) { |
Claudio DeSouza | f3385c73 | 2023-03-13 12:36:23 | [diff] [blame] | 95 | absl::optional<std::string> output = persister_->SerializeData(); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 96 | |
Claudio DeSouza | f3385c73 | 2023-03-13 12:36:23 | [diff] [blame] | 97 | ASSERT_TRUE(output); |
| 98 | persister_->LoadEntries(*output); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 99 | |
Claudio DeSouza | f3385c73 | 2023-03-13 12:36:23 | [diff] [blame] | 100 | absl::optional<std::string> output2 = persister_->SerializeData(); |
| 101 | ASSERT_TRUE(output2); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 102 | EXPECT_EQ(output, output2); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 103 | } |
| 104 | |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 105 | TEST_F(TransportSecurityPersisterTest, SerializeData2) { |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 106 | TransportSecurityState::STSState sts_state; |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 107 | const base::Time current_time(base::Time::Now()); |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 108 | const base::Time expiry = current_time + base::Seconds(1000); |
[email protected] | 83980c7 | 2012-05-09 17:57:23 | [diff] [blame] | 109 | static const char kYahooDomain[] = "yahoo.com"; |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 110 | |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 111 | EXPECT_FALSE(state_->GetDynamicSTSState(kYahooDomain, &sts_state)); |
[email protected] | 474f079e | 2013-03-02 19:11:20 | [diff] [blame] | 112 | |
| 113 | bool include_subdomains = true; |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 114 | state_->AddHSTS(kYahooDomain, expiry, include_subdomains); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 115 | |
Claudio DeSouza | f3385c73 | 2023-03-13 12:36:23 | [diff] [blame] | 116 | absl::optional<std::string> output = persister_->SerializeData(); |
| 117 | ASSERT_TRUE(output); |
| 118 | persister_->LoadEntries(*output); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 119 | |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 120 | EXPECT_TRUE(state_->GetDynamicSTSState(kYahooDomain, &sts_state)); |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 121 | EXPECT_EQ(sts_state.upgrade_mode, |
| 122 | TransportSecurityState::STSState::MODE_FORCE_HTTPS); |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 123 | EXPECT_TRUE(state_->GetDynamicSTSState("foo.yahoo.com", &sts_state)); |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 124 | EXPECT_EQ(sts_state.upgrade_mode, |
| 125 | TransportSecurityState::STSState::MODE_FORCE_HTTPS); |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 126 | EXPECT_TRUE(state_->GetDynamicSTSState("foo.bar.yahoo.com", &sts_state)); |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 127 | EXPECT_EQ(sts_state.upgrade_mode, |
| 128 | TransportSecurityState::STSState::MODE_FORCE_HTTPS); |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 129 | EXPECT_TRUE(state_->GetDynamicSTSState("foo.bar.baz.yahoo.com", &sts_state)); |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 130 | EXPECT_EQ(sts_state.upgrade_mode, |
| 131 | TransportSecurityState::STSState::MODE_FORCE_HTTPS); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 132 | } |
| 133 | |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 134 | TEST_F(TransportSecurityPersisterTest, SerializeData3) { |
estark | 83487b6 | 2015-07-27 17:11:14 | [diff] [blame] | 135 | const GURL report_uri(kReportUri); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 136 | // Add an entry. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 137 | base::Time expiry = base::Time::Now() + base::Seconds(1000); |
[email protected] | 474f079e | 2013-03-02 19:11:20 | [diff] [blame] | 138 | bool include_subdomains = false; |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 139 | state_->AddHSTS("www.example.com", expiry, include_subdomains); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 140 | |
| 141 | // Add another entry. |
Peter Kasting | e5a38ed | 2021-10-02 03:06:35 | [diff] [blame] | 142 | expiry = base::Time::Now() + base::Seconds(3000); |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 143 | state_->AddHSTS("www.example.net", expiry, include_subdomains); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 144 | |
| 145 | // Save a copy of everything. |
Eric Orth | 0eeeef18 | 2022-12-01 23:49:57 | [diff] [blame] | 146 | std::set<TransportSecurityState::HashedHost> sts_saved; |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 147 | TransportSecurityState::STSStateIterator sts_iter(*state_); |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 148 | while (sts_iter.HasNext()) { |
| 149 | sts_saved.insert(sts_iter.hostname()); |
| 150 | sts_iter.Advance(); |
| 151 | } |
| 152 | |
Claudio DeSouza | f3385c73 | 2023-03-13 12:36:23 | [diff] [blame] | 153 | absl::optional<std::string> serialized = persister_->SerializeData(); |
| 154 | ASSERT_TRUE(serialized); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 155 | |
Christian Dullweber | ee89d67 | 2018-11-29 15:12:28 | [diff] [blame] | 156 | // Persist the data to the file. |
| 157 | base::RunLoop run_loop; |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 158 | persister_->WriteNow(state_.get(), run_loop.QuitClosure()); |
Christian Dullweber | ee89d67 | 2018-11-29 15:12:28 | [diff] [blame] | 159 | run_loop.Run(); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 160 | |
| 161 | // Read the data back. |
| 162 | std::string persisted; |
Will Harris | 62f94bd5 | 2021-08-11 16:48:40 | [diff] [blame] | 163 | EXPECT_TRUE( |
| 164 | base::ReadFileToString(transport_security_file_path_, &persisted)); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 165 | EXPECT_EQ(persisted, serialized); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 166 | persister_->LoadEntries(persisted); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 167 | |
| 168 | // Check that states are the same as saved. |
| 169 | size_t count = 0; |
Matt Menke | ad7fa0b | 2020-06-06 08:50:01 | [diff] [blame] | 170 | TransportSecurityState::STSStateIterator sts_iter2(*state_); |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 171 | while (sts_iter2.HasNext()) { |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 172 | count++; |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 173 | sts_iter2.Advance(); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 174 | } |
martijn | c0d6b62 | 2015-06-30 19:14:40 | [diff] [blame] | 175 | EXPECT_EQ(count, sts_saved.size()); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 176 | } |
| 177 | |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 178 | // Tests that deserializing bad data shouldn't result in any STS entries being |
| 179 | // added to the transport security state. |
| 180 | TEST_F(TransportSecurityPersisterTest, DeserializeBadData) { |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 181 | persister_->LoadEntries(""); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 182 | EXPECT_EQ(0u, state_->num_sts_entries()); |
| 183 | |
| 184 | persister_->LoadEntries("Foopy"); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 185 | EXPECT_EQ(0u, state_->num_sts_entries()); |
| 186 | |
| 187 | persister_->LoadEntries("15"); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 188 | EXPECT_EQ(0u, state_->num_sts_entries()); |
| 189 | |
| 190 | persister_->LoadEntries("[15]"); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 191 | EXPECT_EQ(0u, state_->num_sts_entries()); |
| 192 | |
| 193 | persister_->LoadEntries("{\"version\":1}"); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 194 | EXPECT_EQ(0u, state_->num_sts_entries()); |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 195 | } |
| 196 | |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 197 | TEST_F(TransportSecurityPersisterTest, DeserializeDataOldWithoutCreationDate) { |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 198 | // This is an old-style piece of transport state JSON, which has no creation |
| 199 | // date. |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 200 | const std::string kInput = |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 201 | "{ " |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 202 | "\"G0EywIek2XnIhLrUjaK4TrHBT1+2TcixDVRXwM3/CCo=\": {" |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 203 | "\"expiry\": 1266815027.983453, " |
| 204 | "\"include_subdomains\": false, " |
| 205 | "\"mode\": \"strict\" " |
| 206 | "}" |
| 207 | "}"; |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 208 | persister_->LoadEntries(kInput); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 209 | EXPECT_EQ(0u, state_->num_sts_entries()); |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 210 | } |
| 211 | |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 212 | TEST_F(TransportSecurityPersisterTest, DeserializeDataOldMergedDictionary) { |
Matt Menke | 911e448d | 2020-05-29 00:03:38 | [diff] [blame] | 213 | // This is an old-style piece of transport state JSON, which uses a single |
| 214 | // unversioned host-keyed dictionary of merged ExpectCT and HSTS data. |
| 215 | const std::string kInput = |
| 216 | "{" |
| 217 | " \"CxLbri+JPdi5pZ8/a/2rjyzq+IYs07WJJ1yxjB4Lpw0=\": {" |
| 218 | " \"expect_ct\": {" |
| 219 | " \"expect_ct_enforce\": true," |
| 220 | " \"expect_ct_expiry\": 1590512843.283966," |
| 221 | " \"expect_ct_observed\": 1590511843.284064," |
| 222 | " \"expect_ct_report_uri\": \"https://expect_ct.test/report_uri\"" |
| 223 | " }," |
| 224 | " \"expiry\": 0.0," |
| 225 | " \"mode\": \"default\"," |
| 226 | " \"sts_include_subdomains\": false," |
| 227 | " \"sts_observed\": 0.0" |
| 228 | " }," |
| 229 | " \"DkgjGShIBmYtgJcJf5lfX3rTr2S6dqyF+O8IAgjuleE=\": {" |
| 230 | " \"expiry\": 1590512843.283966," |
| 231 | " \"mode\": \"force-https\"," |
| 232 | " \"sts_include_subdomains\": false," |
| 233 | " \"sts_observed\": 1590511843.284025" |
| 234 | " }," |
| 235 | " \"M5lkNV3JBeoPMlKrTOKRYT+mrUsZCS5eoQWsc9/r1MU=\": {" |
| 236 | " \"expect_ct\": {" |
| 237 | " \"expect_ct_enforce\": true," |
| 238 | " \"expect_ct_expiry\": 1590512843.283966," |
| 239 | " \"expect_ct_observed\": 1590511843.284098," |
| 240 | " \"expect_ct_report_uri\": \"\"" |
| 241 | " }," |
| 242 | " \"expiry\": 1590512843.283966," |
| 243 | " \"mode\": \"force-https\"," |
| 244 | " \"sts_include_subdomains\": true," |
| 245 | " \"sts_observed\": 1590511843.284091" |
| 246 | " }" |
| 247 | "}"; |
| 248 | |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 249 | persister_->LoadEntries(kInput); |
Chris Thompson | 2e85f54e | 2021-05-18 22:40:18 | [diff] [blame] | 250 | EXPECT_EQ(0u, state_->num_sts_entries()); |
[email protected] | f43b89f3 | 2012-05-01 19:39:48 | [diff] [blame] | 251 | } |
| 252 | |
Emily Stark | fcd1ed2e | 2022-12-07 18:37:46 | [diff] [blame] | 253 | TEST_F(TransportSecurityPersisterTest, DeserializeLegacyExpectCTData) { |
| 254 | const std::string kHost = "CxLbri+JPdi5pZ8/a/2rjyzq+IYs07WJJ1yxjB4Lpw0="; |
| 255 | const std::string kInput = |
| 256 | R"({"version":2, "sts": [{ "host": ")" + kHost + |
| 257 | R"(", "mode": "force-https", "sts_include_subdomains": false, )" |
| 258 | R"("sts_observed": 0.0, "expiry": 4825336765.0}], "expect_ct": [{"host":)" |
| 259 | R"("CxLbri+JPdi5pZ8/a/2rjyzq+IYs07WJJ1yxjB4Lpw0=", "nak": "test", )" |
| 260 | R"("expect_ct_observed": 0.0, "expect_ct_expiry": 4825336765.0, )" |
| 261 | R"("expect_ct_enforce": true, "expect_ct_report_uri": ""}]})"; |
| 262 | LOG(ERROR) << kInput; |
| 263 | constexpr auto kDefaultFileWriterCommitInterval = base::Seconds(10); |
| 264 | persister_->LoadEntries(kInput); |
| 265 | FastForwardBy(kDefaultFileWriterCommitInterval + base::Seconds(1)); |
| 266 | EXPECT_EQ(1u, state_->num_sts_entries()); |
| 267 | // Now read the data and check that there are no Expect-CT entries. |
| 268 | std::string persisted; |
| 269 | ASSERT_TRUE( |
| 270 | base::ReadFileToString(transport_security_file_path_, &persisted)); |
| 271 | // Smoke test that the file contains some data as expected... |
| 272 | ASSERT_NE(std::string::npos, persisted.find(kHost)); |
| 273 | // But it shouldn't contain any Expect-CT data. |
| 274 | EXPECT_EQ(std::string::npos, persisted.find("expect_ct")); |
estark | a368232 | 2017-04-19 00:33:56 | [diff] [blame] | 275 | } |
| 276 | |
ttuttle | 859dc7a | 2015-04-23 19:42:29 | [diff] [blame] | 277 | } // namespace |
| 278 | |
| 279 | } // namespace net |