| OLD | NEW |
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/tools/domain_security_preload_generator/trie/trie_writer.h" | 5 #include "net/tools/transport_security_state_generator/trie/trie_writer.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/strings/string_piece.h" | 10 #include "base/strings/string_piece.h" |
| 11 #include "base/strings/string_split.h" | 11 #include "base/strings/string_split.h" |
| 12 #include "base/strings/string_util.h" | 12 #include "base/strings/string_util.h" |
| 13 #include "net/tools/domain_security_preload_generator/trie/trie_bit_buffer.h" | 13 #include "net/tools/transport_security_state_generator/trie/trie_bit_buffer.h" |
| 14 | 14 |
| 15 namespace net { | 15 namespace net { |
| 16 | 16 |
| 17 namespace transport_security_state { | 17 namespace transport_security_state { |
| 18 | 18 |
| 19 namespace { | 19 namespace { |
| 20 | 20 |
| 21 bool CompareReversedEntries(const std::unique_ptr<ReversedEntry>& lhs, | 21 bool CompareReversedEntries(const std::unique_ptr<ReversedEntry>& lhs, |
| 22 const std::unique_ptr<ReversedEntry>& rhs) { | 22 const std::unique_ptr<ReversedEntry>& rhs) { |
| 23 return lhs->reversed_name < rhs->reversed_name; | 23 return lhs->reversed_name < rhs->reversed_name; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 37 | 37 |
| 38 std::string domain = base::ToUpperASCII(parts[parts.size() - 2].as_string()); | 38 std::string domain = base::ToUpperASCII(parts[parts.size() - 2].as_string()); |
| 39 base::ReplaceChars(domain, "-", "_", &domain); | 39 base::ReplaceChars(domain, "-", "_", &domain); |
| 40 | 40 |
| 41 return base::ToUpperASCII(domain + "_" + gtld); | 41 return base::ToUpperASCII(domain + "_" + gtld); |
| 42 } | 42 } |
| 43 | 43 |
| 44 } // namespace | 44 } // namespace |
| 45 | 45 |
| 46 ReversedEntry::ReversedEntry(std::vector<uint8_t> reversed_name, | 46 ReversedEntry::ReversedEntry(std::vector<uint8_t> reversed_name, |
| 47 const DomainSecurityEntry* entry) | 47 const TransportSecurityStateEntry* entry) |
| 48 : reversed_name(reversed_name), entry(entry) {} | 48 : reversed_name(reversed_name), entry(entry) {} |
| 49 | 49 |
| 50 ReversedEntry::~ReversedEntry() {} | 50 ReversedEntry::~ReversedEntry() {} |
| 51 | 51 |
| 52 TrieWriter::TrieWriter(const HuffmanRepresentationTable& huffman_table, | 52 TrieWriter::TrieWriter(const HuffmanRepresentationTable& huffman_table, |
| 53 const NameIDMap& domain_ids_map, | 53 const NameIDMap& domain_ids_map, |
| 54 const NameIDMap& expect_ct_report_uri_map, | 54 const NameIDMap& expect_ct_report_uri_map, |
| 55 const NameIDMap& expect_staple_report_uri_map, | 55 const NameIDMap& expect_staple_report_uri_map, |
| 56 const NameIDMap& pinsets_map, | 56 const NameIDMap& pinsets_map, |
| 57 HuffmanFrequencyTracker* frequency_tracker) | 57 HuffmanBuilder* huffman_builder) |
| 58 : huffman_table_(huffman_table), | 58 : huffman_table_(huffman_table), |
| 59 domain_ids_map_(domain_ids_map), | 59 domain_ids_map_(domain_ids_map), |
| 60 expect_ct_report_uri_map_(expect_ct_report_uri_map), | 60 expect_ct_report_uri_map_(expect_ct_report_uri_map), |
| 61 expect_staple_report_uri_map_(expect_staple_report_uri_map), | 61 expect_staple_report_uri_map_(expect_staple_report_uri_map), |
| 62 pinsets_map_(pinsets_map), | 62 pinsets_map_(pinsets_map), |
| 63 frequency_tracker_(frequency_tracker) {} | 63 huffman_builder_(huffman_builder) {} |
| 64 | 64 |
| 65 TrieWriter::~TrieWriter() {} | 65 TrieWriter::~TrieWriter() {} |
| 66 | 66 |
| 67 uint32_t TrieWriter::WriteEntries(const DomainSecurityEntries& entries) { | 67 uint32_t TrieWriter::WriteEntries( |
| 68 const TransportSecurityStateEntries& entries) { |
| 68 ReversedEntries reversed_entries; | 69 ReversedEntries reversed_entries; |
| 69 | 70 |
| 70 for (auto const& entry : entries) { | 71 for (auto const& entry : entries) { |
| 71 std::unique_ptr<ReversedEntry> reversed_entry( | 72 std::unique_ptr<ReversedEntry> reversed_entry( |
| 72 new ReversedEntry(ReverseName(entry->hostname), entry.get())); | 73 new ReversedEntry(ReverseName(entry->hostname), entry.get())); |
| 73 reversed_entries.push_back(std::move(reversed_entry)); | 74 reversed_entries.push_back(std::move(reversed_entry)); |
| 74 } | 75 } |
| 75 | 76 |
| 76 std::stable_sort(reversed_entries.begin(), reversed_entries.end(), | 77 std::stable_sort(reversed_entries.begin(), reversed_entries.end(), |
| 77 CompareReversedEntries); | 78 CompareReversedEntries); |
| 78 | 79 |
| 79 return WriteDispatchTables(reversed_entries.begin(), reversed_entries.end()); | 80 return WriteDispatchTables(reversed_entries.begin(), reversed_entries.end()); |
| 80 } | 81 } |
| 81 | 82 |
| 82 uint32_t TrieWriter::WriteDispatchTables(ReversedEntries::iterator start, | 83 uint32_t TrieWriter::WriteDispatchTables(ReversedEntries::iterator start, |
| 83 ReversedEntries::iterator end) { | 84 ReversedEntries::iterator end) { |
| 84 DCHECK(start != end) << "No entries passed to WriteDispatchTables"; | 85 DCHECK(start != end) << "No entries passed to WriteDispatchTables"; |
| 85 | 86 |
| 86 TrieBitBuffer writer; | 87 TrieBitBuffer writer; |
| 87 | 88 |
| 88 std::vector<uint8_t> prefix = LongestCommonPrefix(start, end); | 89 std::vector<uint8_t> prefix = LongestCommonPrefix(start, end); |
| 89 for (size_t i = 0; i < prefix.size(); ++i) { | 90 for (size_t i = 0; i < prefix.size(); ++i) { |
| 90 writer.WriteBit(1); | 91 writer.WriteBit(1); |
| 91 } | 92 } |
| 92 writer.WriteBit(0); | 93 writer.WriteBit(0); |
| 93 | 94 |
| 94 if (prefix.size()) { | 95 if (prefix.size()) { |
| 95 for (size_t i = 0; i < prefix.size(); ++i) { | 96 for (size_t i = 0; i < prefix.size(); ++i) { |
| 96 writer.WriteChar(prefix.at(i), huffman_table_, frequency_tracker_); | 97 writer.WriteChar(prefix.at(i), huffman_table_, huffman_builder_); |
| 97 } | 98 } |
| 98 } | 99 } |
| 99 | 100 |
| 100 RemovePrefix(prefix.size(), start, end); | 101 RemovePrefix(prefix.size(), start, end); |
| 101 int32_t last_position = -1; | 102 int32_t last_position = -1; |
| 102 | 103 |
| 103 while (start != end) { | 104 while (start != end) { |
| 104 uint8_t candidate = (*start)->reversed_name.at(0); | 105 uint8_t candidate = (*start)->reversed_name.at(0); |
| 105 ReversedEntries::iterator sub_entries_end = start + 1; | 106 ReversedEntries::iterator sub_entries_end = start + 1; |
| 106 | 107 |
| 107 for (; sub_entries_end != end; sub_entries_end++) { | 108 for (; sub_entries_end != end; sub_entries_end++) { |
| 108 if ((*sub_entries_end)->reversed_name.at(0) != candidate) { | 109 if ((*sub_entries_end)->reversed_name.at(0) != candidate) { |
| 109 break; | 110 break; |
| 110 } | 111 } |
| 111 } | 112 } |
| 112 | 113 |
| 113 writer.WriteChar(candidate, huffman_table_, frequency_tracker_); | 114 writer.WriteChar(candidate, huffman_table_, huffman_builder_); |
| 114 | 115 |
| 115 if (candidate == kTerminalValue) { | 116 if (candidate == kTerminalValue) { |
| 116 DCHECK((sub_entries_end - start) == 1) | 117 DCHECK((sub_entries_end - start) == 1) |
| 117 << "Multiple values with the same name"; | 118 << "Multiple values with the same name"; |
| 118 WriteSecurityEntry((*start)->entry, &writer); | 119 WriteEntry((*start)->entry, &writer); |
| 119 } else { | 120 } else { |
| 120 RemovePrefix(1, start, sub_entries_end); | 121 RemovePrefix(1, start, sub_entries_end); |
| 121 uint32_t position = WriteDispatchTables(start, sub_entries_end); | 122 uint32_t position = WriteDispatchTables(start, sub_entries_end); |
| 122 writer.WritePosition(position, &last_position); | 123 writer.WritePosition(position, &last_position); |
| 123 } | 124 } |
| 124 | 125 |
| 125 start = sub_entries_end; | 126 start = sub_entries_end; |
| 126 } | 127 } |
| 127 | 128 |
| 128 writer.WriteChar(kEndOfTableValue, huffman_table_, frequency_tracker_); | 129 writer.WriteChar(kEndOfTableValue, huffman_table_, huffman_builder_); |
| 129 | 130 |
| 130 uint32_t position = buffer_.position(); | 131 uint32_t position = buffer_.position(); |
| 131 writer.Flush(); | 132 writer.Flush(); |
| 132 writer.WriteToBitWriter(&buffer_); | 133 writer.WriteToBitWriter(&buffer_); |
| 133 return position; | 134 return position; |
| 134 } | 135 } |
| 135 | 136 |
| 136 void TrieWriter::WriteSecurityEntry(const DomainSecurityEntry* entry, | 137 void TrieWriter::WriteEntry(const TransportSecurityStateEntry* entry, |
| 137 TrieBitBuffer* writer) { | 138 TrieBitBuffer* writer) { |
| 138 uint8_t include_subdomains = 0; | 139 uint8_t include_subdomains = 0; |
| 139 if (entry->include_subdomains) { | 140 if (entry->include_subdomains) { |
| 140 include_subdomains = 1; | 141 include_subdomains = 1; |
| 141 } | 142 } |
| 142 writer->WriteBit(include_subdomains); | 143 writer->WriteBit(include_subdomains); |
| 143 | 144 |
| 144 uint8_t force_https = 0; | 145 uint8_t force_https = 0; |
| 145 if (entry->force_https) { | 146 if (entry->force_https) { |
| 146 force_https = 1; | 147 force_https = 1; |
| 147 } | 148 } |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 return buffer_.position(); | 275 return buffer_.position(); |
| 275 } | 276 } |
| 276 | 277 |
| 277 void TrieWriter::Flush() { | 278 void TrieWriter::Flush() { |
| 278 buffer_.Flush(); | 279 buffer_.Flush(); |
| 279 } | 280 } |
| 280 | 281 |
| 281 } // namespace transport_security_state | 282 } // namespace transport_security_state |
| 282 | 283 |
| 283 } // namespace net | 284 } // namespace net |
| OLD | NEW |