Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4648)

Unified Diff: chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc

Issue 212653004: Update server-backed state key generation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix re-enrollment test. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
index 5656ee7c15c412be3607e4d82c3d29658491ed89..ec89b27cea3adc30bdff332fac20ac206b87b54d 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.cc
@@ -7,8 +7,11 @@
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/command_line.h"
+#include "base/port.h"
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/pref_service.h"
+#include "base/strings/string_number_conversions.h"
+#include "base/time/time.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chromeos/attestation/attestation_policy_observer.h"
#include "chrome/browser/chromeos/login/startup_utils.h"
@@ -44,13 +47,10 @@ const char kNoRequisition[] = "none";
// Overridden no requisition value.
const char kRemoraRequisition[] = "remora";
-// MachineInfo key names.
-const char kMachineInfoSystemHwqual[] = "hardware_class";
-
// These are the machine serial number keys that we check in order until we
// find a non-empty serial number. The VPD spec says the serial number should be
// in the "serial_number" key for v2+ VPDs. However, legacy devices used a
-// different keys to report their serial number, which we fall back to if
+// different key to report their serial number, which we fall back to if
// "serial_number" is not present.
//
// Product_S/N is still special-cased due to inconsistencies with serial
@@ -96,6 +96,12 @@ bool GetMachineFlag(const std::string& key, bool default_value) {
} // namespace
+const int
+DeviceCloudPolicyManagerChromeOS::kDeviceStateKeyTimeQuantumPower;
+
+const int
+DeviceCloudPolicyManagerChromeOS::kDeviceStateKeyFutureQuanta;
+
DeviceCloudPolicyManagerChromeOS::DeviceCloudPolicyManagerChromeOS(
scoped_ptr<DeviceCloudPolicyStoreChromeOS> store,
const scoped_refptr<base::SequencedTaskRunner>& task_runner,
@@ -145,7 +151,8 @@ void DeviceCloudPolicyManagerChromeOS::StartEnrollment(
device_store_.get(), install_attributes_, CreateClient(),
background_task_runner_, auth_token,
install_attributes_->GetDeviceId(), is_auto_enrollment,
- GetDeviceRequisition(), GetDeviceStateKey(), allowed_device_modes,
+ GetDeviceRequisition(), GetCurrentDeviceStateKey(),
+ allowed_device_modes,
base::Bind(&DeviceCloudPolicyManagerChromeOS::EnrollmentCompleted,
base::Unretained(this), callback)));
enrollment_handler_->StartEnrollment();
@@ -268,16 +275,19 @@ std::string DeviceCloudPolicyManagerChromeOS::GetMachineID() {
// static
std::string DeviceCloudPolicyManagerChromeOS::GetMachineModel() {
- return GetMachineStatistic(kMachineInfoSystemHwqual);
+ return GetMachineStatistic(chromeos::system::kHardwareClassKey);
}
// static
-std::string DeviceCloudPolicyManagerChromeOS::GetDeviceStateKey() {
- // TODO(mnissler): Figure out which stable device identifiers should be used
- // here and update the code. See http://crbug.com/352599.
- std::string group_code_key =
- GetMachineStatistic(chromeos::system::kOffersGroupCodeKey);
- return crypto::SHA256HashString(group_code_key + GetMachineID());
+std::string DeviceCloudPolicyManagerChromeOS::GetCurrentDeviceStateKey() {
+ std::vector<std::string> state_keys;
+ if (GetDeviceStateKeys(base::Time::Now(), &state_keys) &&
+ !state_keys.empty()) {
+ // The key for the current time is always the first one.
+ return state_keys[0];
+ }
+
+ return std::string();
}
scoped_ptr<CloudPolicyClient> DeviceCloudPolicyManagerChromeOS::CreateClient() {
@@ -298,8 +308,8 @@ scoped_ptr<CloudPolicyClient> DeviceCloudPolicyManagerChromeOS::CreateClient() {
if (CommandLine::ForCurrentProcess()->HasSwitch(
chromeos::switches::kEnterpriseEnableForcedReEnrollment)) {
std::vector<std::string> state_keys;
- state_keys.push_back(GetDeviceStateKey());
- client->SetStateKeysToUpload(state_keys);
+ if (GetDeviceStateKeys(base::Time::Now(), &state_keys))
+ client->SetStateKeysToUpload(state_keys);
}
return client.Pass();
@@ -377,4 +387,41 @@ std::string DeviceCloudPolicyManagerChromeOS::GetRestoreMode() const {
return restore_mode;
}
+// static
+bool DeviceCloudPolicyManagerChromeOS::GetDeviceStateKeys(
+ const base::Time& timestamp,
+ std::vector<std::string>* state_keys) {
+ state_keys->clear();
+
+ std::string disk_serial_number =
+ GetMachineStatistic(chromeos::system::kDiskSerialNumber);
+ if (disk_serial_number.empty()) {
+ LOG(ERROR) << "Missing disk serial number";
+ return false;
+ }
+
+ std::string machine_id = GetMachineID();
+ if (machine_id.empty())
+ return false;
+
+ // Tolerate missing group code keys, some old devices may not have it.
+ std::string group_code_key =
+ GetMachineStatistic(chromeos::system::kOffersGroupCodeKey);
+
+ // Get the current time in quantized form.
+ int64 quantum_size = GG_INT64_C(1) << kDeviceStateKeyTimeQuantumPower;
+ int64 quantized_time =
+ (timestamp - base::Time::UnixEpoch()).InSeconds() & ~(quantum_size - 1);
+ for (int i = 0; i < kDeviceStateKeyFutureQuanta; ++i) {
+ state_keys->push_back(crypto::SHA256HashString(
+ crypto::SHA256HashString(group_code_key) +
+ crypto::SHA256HashString(disk_serial_number) +
+ crypto::SHA256HashString(machine_id) +
+ crypto::SHA256HashString(base::Int64ToString(quantized_time))));
+ quantized_time += quantum_size;
+ }
+
+ return true;
+}
+
} // namespace policy

Powered by Google App Engine
This is Rietveld 408576698