| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 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 "components/cryptauth/foreground_eid_generator.h" | 5 #include "components/cryptauth/foreground_eid_generator.h" |
| 6 | 6 |
| 7 #include <cstring> | 7 #include <cstring> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 const int64_t kMaxPositiveInt64TValue = 0x7FFFFFFF; | 23 const int64_t kMaxPositiveInt64TValue = 0x7FFFFFFF; |
| 24 } // namespace | 24 } // namespace |
| 25 | 25 |
| 26 const int64_t ForegroundEidGenerator::kNumMsInEidPeriod = | 26 const int64_t ForegroundEidGenerator::kNumMsInEidPeriod = |
| 27 base::TimeDelta::FromHours(8).InMilliseconds(); | 27 base::TimeDelta::FromHours(8).InMilliseconds(); |
| 28 const int64_t ForegroundEidGenerator::kNumMsInBeginningOfEidPeriod = | 28 const int64_t ForegroundEidGenerator::kNumMsInBeginningOfEidPeriod = |
| 29 base::TimeDelta::FromHours(2).InMilliseconds(); | 29 base::TimeDelta::FromHours(2).InMilliseconds(); |
| 30 const int8_t ForegroundEidGenerator::kBluetooth4Flag = 0x01; | 30 const int8_t ForegroundEidGenerator::kBluetooth4Flag = 0x01; |
| 31 | 31 |
| 32 ForegroundEidGenerator::EidData::EidData( | 32 ForegroundEidGenerator::EidData::EidData( |
| 33 const DataWithTimestamp current_data, | 33 const EidDataWithTimestamp current_data, |
| 34 std::unique_ptr<DataWithTimestamp> adjacent_data) | 34 std::unique_ptr<EidDataWithTimestamp> adjacent_data) |
| 35 : current_data(current_data), adjacent_data(std::move(adjacent_data)) {} | 35 : current_data(current_data), adjacent_data(std::move(adjacent_data)) {} |
| 36 | 36 |
| 37 ForegroundEidGenerator::EidData::~EidData() {} | 37 ForegroundEidGenerator::EidData::~EidData() {} |
| 38 | 38 |
| 39 ForegroundEidGenerator::EidData::AdjacentDataType | 39 ForegroundEidGenerator::EidData::AdjacentDataType |
| 40 ForegroundEidGenerator::EidData::GetAdjacentDataType() const { | 40 ForegroundEidGenerator::EidData::GetAdjacentDataType() const { |
| 41 if (!adjacent_data) { | 41 if (!adjacent_data) { |
| 42 return AdjacentDataType::NONE; | 42 return AdjacentDataType::NONE; |
| 43 } | 43 } |
| 44 | 44 |
| 45 if (adjacent_data->start_timestamp_ms < current_data.start_timestamp_ms) { | 45 if (adjacent_data->start_timestamp_ms < current_data.start_timestamp_ms) { |
| 46 return AdjacentDataType::PAST; | 46 return AdjacentDataType::PAST; |
| 47 } | 47 } |
| 48 | 48 |
| 49 return AdjacentDataType::FUTURE; | 49 return AdjacentDataType::FUTURE; |
| 50 } | 50 } |
| 51 | 51 |
| 52 std::string ForegroundEidGenerator::EidData::DataInHex() const { | 52 std::string ForegroundEidGenerator::EidData::DataInHex() const { |
| 53 std::string str = "[" + current_data.DataInHex(); | 53 std::string str = "[" + current_data.DataInHex(); |
| 54 | 54 |
| 55 if (adjacent_data) { | 55 if (adjacent_data) { |
| 56 return str + ", " + adjacent_data->DataInHex() + "]"; | 56 return str + ", " + adjacent_data->DataInHex() + "]"; |
| 57 } | 57 } |
| 58 | 58 |
| 59 return str + "]"; | 59 return str + "]"; |
| 60 } | 60 } |
| 61 | 61 |
| 62 ForegroundEidGenerator::DataWithTimestamp::DataWithTimestamp( | |
| 63 const std::string& data, | |
| 64 const int64_t start_timestamp_ms, | |
| 65 const int64_t end_timestamp_ms) | |
| 66 : data(data), | |
| 67 start_timestamp_ms(start_timestamp_ms), | |
| 68 end_timestamp_ms(end_timestamp_ms) { | |
| 69 DCHECK(start_timestamp_ms < end_timestamp_ms); | |
| 70 DCHECK(data.size()); | |
| 71 } | |
| 72 | |
| 73 ForegroundEidGenerator::DataWithTimestamp::DataWithTimestamp( | |
| 74 const DataWithTimestamp& other) | |
| 75 : data(other.data), | |
| 76 start_timestamp_ms(other.start_timestamp_ms), | |
| 77 end_timestamp_ms(other.end_timestamp_ms) { | |
| 78 DCHECK(start_timestamp_ms < end_timestamp_ms); | |
| 79 DCHECK(data.size()); | |
| 80 } | |
| 81 | |
| 82 bool ForegroundEidGenerator::DataWithTimestamp::ContainsTime( | |
| 83 const int64_t timestamp_ms) const { | |
| 84 return start_timestamp_ms <= timestamp_ms && timestamp_ms < end_timestamp_ms; | |
| 85 } | |
| 86 | |
| 87 std::string ForegroundEidGenerator::DataWithTimestamp::DataInHex() const { | |
| 88 std::stringstream ss; | |
| 89 ss << "0x" << std::hex; | |
| 90 | |
| 91 for (size_t i = 0; i < data.size(); i++) { | |
| 92 ss << static_cast<int>(data.data()[i]); | |
| 93 } | |
| 94 | |
| 95 return ss.str(); | |
| 96 } | |
| 97 | |
| 98 ForegroundEidGenerator::ForegroundEidGenerator() | 62 ForegroundEidGenerator::ForegroundEidGenerator() |
| 99 : ForegroundEidGenerator(base::MakeUnique<RawEidGeneratorImpl>(), | 63 : ForegroundEidGenerator(base::MakeUnique<RawEidGeneratorImpl>(), |
| 100 base::MakeUnique<base::DefaultClock>()) {} | 64 base::MakeUnique<base::DefaultClock>()) {} |
| 101 | 65 |
| 102 ForegroundEidGenerator::ForegroundEidGenerator( | 66 ForegroundEidGenerator::ForegroundEidGenerator( |
| 103 std::unique_ptr<RawEidGenerator> raw_eid_generator, | 67 std::unique_ptr<RawEidGenerator> raw_eid_generator, |
| 104 std::unique_ptr<base::Clock> clock) | 68 std::unique_ptr<base::Clock> clock) |
| 105 : clock_(std::move(clock)), | 69 : clock_(std::move(clock)), |
| 106 raw_eid_generator_(std::move(raw_eid_generator)) {} | 70 raw_eid_generator_(std::move(raw_eid_generator)) {} |
| 107 | 71 |
| 108 ForegroundEidGenerator::~ForegroundEidGenerator() {} | 72 ForegroundEidGenerator::~ForegroundEidGenerator() {} |
| 109 | 73 |
| 110 std::unique_ptr<ForegroundEidGenerator::EidData> | 74 std::unique_ptr<ForegroundEidGenerator::EidData> |
| 111 ForegroundEidGenerator::GenerateBackgroundScanFilter( | 75 ForegroundEidGenerator::GenerateBackgroundScanFilter( |
| 112 const std::vector<BeaconSeed>& scanning_device_beacon_seeds) const { | 76 const std::vector<BeaconSeed>& scanning_device_beacon_seeds) const { |
| 113 std::unique_ptr<EidPeriodTimestamps> timestamps = | 77 std::unique_ptr<EidPeriodTimestamps> timestamps = |
| 114 GetEidPeriodTimestamps(scanning_device_beacon_seeds); | 78 GetEidPeriodTimestamps(scanning_device_beacon_seeds); |
| 115 if (!timestamps) { | 79 if (!timestamps) { |
| 116 // If the device does not have seeds for the correct period, no EIDs can be | 80 // If the device does not have seeds for the correct period, no EIDs can be |
| 117 // generated. | 81 // generated. |
| 118 return nullptr; | 82 return nullptr; |
| 119 } | 83 } |
| 120 | 84 |
| 121 std::unique_ptr<DataWithTimestamp> current_eid = GenerateEidDataWithTimestamp( | 85 std::unique_ptr<EidDataWithTimestamp> current_eid = |
| 122 scanning_device_beacon_seeds, | 86 GenerateEidEidDataWithTimestamp( |
| 123 timestamps->current_period_start_timestamp_ms, | 87 scanning_device_beacon_seeds, |
| 124 timestamps->current_period_end_timestamp_ms); | 88 timestamps->current_period_start_timestamp_ms, |
| 89 timestamps->current_period_end_timestamp_ms); |
| 125 if (!current_eid) { | 90 if (!current_eid) { |
| 126 // The current EID could not be generated. | 91 // The current EID could not be generated. |
| 127 return nullptr; | 92 return nullptr; |
| 128 } | 93 } |
| 129 | 94 |
| 130 std::unique_ptr<DataWithTimestamp> adjacent_eid = | 95 std::unique_ptr<EidDataWithTimestamp> adjacent_eid = |
| 131 GenerateEidDataWithTimestamp( | 96 GenerateEidEidDataWithTimestamp( |
| 132 scanning_device_beacon_seeds, | 97 scanning_device_beacon_seeds, |
| 133 timestamps->adjacent_period_start_timestamp_ms, | 98 timestamps->adjacent_period_start_timestamp_ms, |
| 134 timestamps->adjacent_period_end_timestamp_ms); | 99 timestamps->adjacent_period_end_timestamp_ms); |
| 135 return base::WrapUnique(new EidData(*current_eid, std::move(adjacent_eid))); | 100 return base::WrapUnique(new EidData(*current_eid, std::move(adjacent_eid))); |
| 136 } | 101 } |
| 137 | 102 |
| 138 std::unique_ptr<ForegroundEidGenerator::DataWithTimestamp> | 103 std::unique_ptr<EidDataWithTimestamp> |
| 139 ForegroundEidGenerator::GenerateAdvertisement( | 104 ForegroundEidGenerator::GenerateAdvertisement( |
| 140 const std::string& advertising_device_public_key, | 105 const std::string& advertising_device_public_key, |
| 141 const std::vector<BeaconSeed>& scanning_device_beacon_seeds) const { | 106 const std::vector<BeaconSeed>& scanning_device_beacon_seeds) const { |
| 142 std::unique_ptr<EidPeriodTimestamps> timestamps = | 107 std::unique_ptr<EidPeriodTimestamps> timestamps = |
| 143 GetEidPeriodTimestamps(scanning_device_beacon_seeds); | 108 GetEidPeriodTimestamps(scanning_device_beacon_seeds); |
| 144 if (!timestamps) { | 109 if (!timestamps) { |
| 145 return nullptr; | 110 return nullptr; |
| 146 } | 111 } |
| 147 | 112 |
| 148 return GenerateAdvertisement(advertising_device_public_key, | 113 return GenerateAdvertisement(advertising_device_public_key, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 | 147 |
| 183 std::unique_ptr<EidPeriodTimestamps> timestamps = | 148 std::unique_ptr<EidPeriodTimestamps> timestamps = |
| 184 GetEidPeriodTimestamps(scanning_device_beacon_seeds, true); | 149 GetEidPeriodTimestamps(scanning_device_beacon_seeds, true); |
| 185 if (!timestamps) { | 150 if (!timestamps) { |
| 186 // If the devices do not have seeds for the correct period, no | 151 // If the devices do not have seeds for the correct period, no |
| 187 // advertisements can be generated. | 152 // advertisements can be generated. |
| 188 return possible_advertisements; | 153 return possible_advertisements; |
| 189 } | 154 } |
| 190 | 155 |
| 191 if (timestamps->current_period_start_timestamp_ms != kNoTimestamp) { | 156 if (timestamps->current_period_start_timestamp_ms != kNoTimestamp) { |
| 192 std::unique_ptr<DataWithTimestamp> current_advertisement = | 157 std::unique_ptr<EidDataWithTimestamp> current_advertisement = |
| 193 GenerateAdvertisement(advertising_device_public_key, | 158 GenerateAdvertisement(advertising_device_public_key, |
| 194 scanning_device_beacon_seeds, | 159 scanning_device_beacon_seeds, |
| 195 timestamps->current_period_start_timestamp_ms, | 160 timestamps->current_period_start_timestamp_ms, |
| 196 timestamps->current_period_end_timestamp_ms); | 161 timestamps->current_period_end_timestamp_ms); |
| 197 if (current_advertisement) { | 162 if (current_advertisement) { |
| 198 possible_advertisements.push_back(current_advertisement->data); | 163 possible_advertisements.push_back(current_advertisement->data); |
| 199 } | 164 } |
| 200 } | 165 } |
| 201 | 166 |
| 202 std::unique_ptr<DataWithTimestamp> adjacent_advertisement = | 167 std::unique_ptr<EidDataWithTimestamp> adjacent_advertisement = |
| 203 GenerateAdvertisement(advertising_device_public_key, | 168 GenerateAdvertisement(advertising_device_public_key, |
| 204 scanning_device_beacon_seeds, | 169 scanning_device_beacon_seeds, |
| 205 timestamps->adjacent_period_start_timestamp_ms, | 170 timestamps->adjacent_period_start_timestamp_ms, |
| 206 timestamps->adjacent_period_end_timestamp_ms); | 171 timestamps->adjacent_period_end_timestamp_ms); |
| 207 if (adjacent_advertisement) { | 172 if (adjacent_advertisement) { |
| 208 possible_advertisements.push_back(adjacent_advertisement->data); | 173 possible_advertisements.push_back(adjacent_advertisement->data); |
| 209 } | 174 } |
| 210 | 175 |
| 211 return possible_advertisements; | 176 return possible_advertisements; |
| 212 } | 177 } |
| 213 | 178 |
| 214 std::unique_ptr<ForegroundEidGenerator::DataWithTimestamp> | 179 std::unique_ptr<EidDataWithTimestamp> |
| 215 ForegroundEidGenerator::GenerateAdvertisement( | 180 ForegroundEidGenerator::GenerateAdvertisement( |
| 216 const std::string& advertising_device_public_key, | 181 const std::string& advertising_device_public_key, |
| 217 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, | 182 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, |
| 218 const int64_t start_of_period_timestamp_ms, | 183 const int64_t start_of_period_timestamp_ms, |
| 219 const int64_t end_of_period_timestamp_ms) const { | 184 const int64_t end_of_period_timestamp_ms) const { |
| 220 std::unique_ptr<DataWithTimestamp> advertising_device_identifying_data = | 185 std::unique_ptr<EidDataWithTimestamp> advertising_device_identifying_data = |
| 221 GenerateEidDataWithTimestamp( | 186 GenerateEidEidDataWithTimestamp( |
| 222 scanning_device_beacon_seeds, start_of_period_timestamp_ms, | 187 scanning_device_beacon_seeds, start_of_period_timestamp_ms, |
| 223 end_of_period_timestamp_ms, &advertising_device_public_key); | 188 end_of_period_timestamp_ms, &advertising_device_public_key); |
| 224 std::unique_ptr<DataWithTimestamp> scanning_device_identifying_data = | 189 std::unique_ptr<EidDataWithTimestamp> scanning_device_identifying_data = |
| 225 GenerateEidDataWithTimestamp(scanning_device_beacon_seeds, | 190 GenerateEidEidDataWithTimestamp(scanning_device_beacon_seeds, |
| 226 start_of_period_timestamp_ms, | 191 start_of_period_timestamp_ms, |
| 227 end_of_period_timestamp_ms); | 192 end_of_period_timestamp_ms); |
| 228 if (!advertising_device_identifying_data || | 193 if (!advertising_device_identifying_data || |
| 229 !scanning_device_identifying_data) { | 194 !scanning_device_identifying_data) { |
| 230 return nullptr; | 195 return nullptr; |
| 231 } | 196 } |
| 232 | 197 |
| 233 std::string full_advertisement = scanning_device_identifying_data->data + | 198 std::string full_advertisement = scanning_device_identifying_data->data + |
| 234 advertising_device_identifying_data->data; | 199 advertising_device_identifying_data->data; |
| 235 return base::WrapUnique(new DataWithTimestamp(full_advertisement, | 200 return base::WrapUnique(new EidDataWithTimestamp(full_advertisement, |
| 236 start_of_period_timestamp_ms, | 201 start_of_period_timestamp_ms, |
| 237 end_of_period_timestamp_ms)); | 202 end_of_period_timestamp_ms)); |
| 238 } | 203 } |
| 239 | 204 |
| 240 std::unique_ptr<ForegroundEidGenerator::DataWithTimestamp> | 205 std::unique_ptr<EidDataWithTimestamp> |
| 241 ForegroundEidGenerator::GenerateEidDataWithTimestamp( | 206 ForegroundEidGenerator::GenerateEidEidDataWithTimestamp( |
| 242 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, | 207 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, |
| 243 const int64_t start_of_period_timestamp_ms, | 208 const int64_t start_of_period_timestamp_ms, |
| 244 const int64_t end_of_period_timestamp_ms) const { | 209 const int64_t end_of_period_timestamp_ms) const { |
| 245 return GenerateEidDataWithTimestamp(scanning_device_beacon_seeds, | 210 return GenerateEidEidDataWithTimestamp(scanning_device_beacon_seeds, |
| 246 start_of_period_timestamp_ms, | 211 start_of_period_timestamp_ms, |
| 247 end_of_period_timestamp_ms, nullptr); | 212 end_of_period_timestamp_ms, nullptr); |
| 248 } | 213 } |
| 249 | 214 |
| 250 std::unique_ptr<ForegroundEidGenerator::DataWithTimestamp> | 215 std::unique_ptr<EidDataWithTimestamp> |
| 251 ForegroundEidGenerator::GenerateEidDataWithTimestamp( | 216 ForegroundEidGenerator::GenerateEidEidDataWithTimestamp( |
| 252 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, | 217 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, |
| 253 const int64_t start_of_period_timestamp_ms, | 218 const int64_t start_of_period_timestamp_ms, |
| 254 const int64_t end_of_period_timestamp_ms, | 219 const int64_t end_of_period_timestamp_ms, |
| 255 std::string const* extra_entropy) const { | 220 std::string const* extra_entropy) const { |
| 256 std::unique_ptr<std::string> eid_seed = GetEidSeedForPeriod( | 221 std::unique_ptr<std::string> eid_seed = GetEidSeedForPeriod( |
| 257 scanning_device_beacon_seeds, start_of_period_timestamp_ms); | 222 scanning_device_beacon_seeds, start_of_period_timestamp_ms); |
| 258 if (!eid_seed) { | 223 if (!eid_seed) { |
| 259 return nullptr; | 224 return nullptr; |
| 260 } | 225 } |
| 261 | 226 |
| 262 std::string eid_data = raw_eid_generator_->GenerateEid( | 227 std::string eid_data = raw_eid_generator_->GenerateEid( |
| 263 *eid_seed, start_of_period_timestamp_ms, extra_entropy); | 228 *eid_seed, start_of_period_timestamp_ms, extra_entropy); |
| 264 | 229 |
| 265 return base::WrapUnique(new DataWithTimestamp( | 230 return base::WrapUnique(new EidDataWithTimestamp( |
| 266 eid_data, start_of_period_timestamp_ms, end_of_period_timestamp_ms)); | 231 eid_data, start_of_period_timestamp_ms, end_of_period_timestamp_ms)); |
| 267 } | 232 } |
| 268 | 233 |
| 269 std::unique_ptr<std::string> ForegroundEidGenerator::GetEidSeedForPeriod( | 234 std::unique_ptr<std::string> ForegroundEidGenerator::GetEidSeedForPeriod( |
| 270 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, | 235 const std::vector<BeaconSeed>& scanning_device_beacon_seeds, |
| 271 const int64_t start_of_period_timestamp_ms) const { | 236 const int64_t start_of_period_timestamp_ms) const { |
| 272 for (auto seed : scanning_device_beacon_seeds) { | 237 for (auto seed : scanning_device_beacon_seeds) { |
| 273 if (seed.start_time_millis() <= start_of_period_timestamp_ms && | 238 if (seed.start_time_millis() <= start_of_period_timestamp_ms && |
| 274 start_of_period_timestamp_ms < seed.end_time_millis()) { | 239 start_of_period_timestamp_ms < seed.end_time_millis()) { |
| 275 return base::WrapUnique(new std::string(seed.data())); | 240 return base::WrapUnique(new std::string(seed.data())); |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 418 const int64_t end_of_period_timestamp_ms, | 383 const int64_t end_of_period_timestamp_ms, |
| 419 const int64_t current_timestamp_ms) { | 384 const int64_t current_timestamp_ms) { |
| 420 DCHECK(start_of_period_timestamp_ms <= current_timestamp_ms); | 385 DCHECK(start_of_period_timestamp_ms <= current_timestamp_ms); |
| 421 DCHECK(current_timestamp_ms < end_of_period_timestamp_ms); | 386 DCHECK(current_timestamp_ms < end_of_period_timestamp_ms); |
| 422 | 387 |
| 423 return current_timestamp_ms < | 388 return current_timestamp_ms < |
| 424 start_of_period_timestamp_ms + kNumMsInBeginningOfEidPeriod; | 389 start_of_period_timestamp_ms + kNumMsInBeginningOfEidPeriod; |
| 425 } | 390 } |
| 426 | 391 |
| 427 } // namespace cryptauth | 392 } // namespace cryptauth |
| OLD | NEW |