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

Unified Diff: chromeos/attestation/attestation_flow.cc

Issue 14305009: Enhanced and refactored the AttestationFlow interface. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 8 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: chromeos/attestation/attestation_flow.cc
diff --git a/chromeos/attestation/attestation_flow.cc b/chromeos/attestation/attestation_flow.cc
index f36403a89b99bcec86958597ebb35eff11859c89..4bd2a0e7ecaf234fabef5b7eba6fb11bd91add15 100644
--- a/chromeos/attestation/attestation_flow.cc
+++ b/chromeos/attestation/attestation_flow.cc
@@ -38,30 +38,46 @@ void DBusBoolRedirectCallback(const base::Closure& on_true,
task.Run();
}
-} // namespace
+void DBusDataMethodCallback(
+ const chromeos::attestation::AttestationFlow::CertificateCallback& callback,
+ DBusMethodCallStatus status,
+ bool result,
+ const std::string& data) {
+ if (status != DBUS_METHOD_CALL_SUCCESS) {
+ LOG(ERROR) << "Attestation: DBus data operation failed.";
+ if (!callback.is_null())
+ callback.Run(false, "");
+ return;
+ }
+ if (!callback.is_null())
+ callback.Run(result, data);
+}
-const char AttestationFlow::kEnterpriseMachineKey[] = "attest-ent-machine";
+} // namespace
AttestationFlow::AttestationFlow(cryptohome::AsyncMethodCaller* async_caller,
CryptohomeClient* cryptohome_client,
scoped_ptr<ServerProxy> server_proxy)
- : ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)),
- async_caller_(async_caller),
+ : async_caller_(async_caller),
cryptohome_client_(cryptohome_client),
- server_proxy_(server_proxy.Pass()) {
+ server_proxy_(server_proxy.Pass()),
+ ALLOW_THIS_IN_INITIALIZER_LIST(weak_factory_(this)) {
}
AttestationFlow::~AttestationFlow() {
}
-void AttestationFlow::GetCertificate(const std::string& name,
- const CertificateCallback& callback) {
+void AttestationFlow::GetCertificate(
+ AttestationCertificateProfile certificate_profile,
+ bool force_new_key,
+ const CertificateCallback& callback) {
// If this device has not enrolled with the Privacy CA, we need to do that
// first. Once enrolled we can proceed with the certificate request.
base::Closure do_cert_request = base::Bind(
&AttestationFlow::StartCertificateRequest,
weak_factory_.GetWeakPtr(),
- name,
+ certificate_profile,
+ force_new_key,
callback);
base::Closure on_enroll_failure = base::Bind(callback, false, "");
base::Closure do_enroll = base::Bind(&AttestationFlow::StartEnroll,
@@ -143,22 +159,49 @@ void AttestationFlow::OnEnrollComplete(const base::Closure& on_failure,
}
void AttestationFlow::StartCertificateRequest(
- const std::string& name,
+ AttestationCertificateProfile certificate_profile,
+ bool generate_new_key,
const CertificateCallback& callback) {
- // Get the attestation service to create a Privacy CA certificate request.
- int options = CryptohomeClient::INCLUDE_DEVICE_STATE;
- if (name == kEnterpriseMachineKey)
- options |= CryptohomeClient::INCLUDE_STABLE_ID;
- async_caller_->AsyncTpmAttestationCreateCertRequest(
- options,
- base::Bind(&AttestationFlow::SendCertificateRequestToPCA,
- weak_factory_.GetWeakPtr(),
- name,
- callback));
+ AttestationKeyType key_type = GetKeyTypeForProfile(certificate_profile);
+ std::string key_name = GetKeyNameForProfile(certificate_profile);
+ if (generate_new_key) {
+ // Get the attestation service to create a Privacy CA certificate request.
+ async_caller_->AsyncTpmAttestationCreateCertRequest(
+ GetCertificateOptionsForProfile(certificate_profile),
+ base::Bind(&AttestationFlow::SendCertificateRequestToPCA,
+ weak_factory_.GetWeakPtr(),
+ key_type,
+ key_name,
+ callback));
+ } else {
+ // If the key already exists, query the existing certificate.
+ base::Closure on_key_exists = base::Bind(
+ &AttestationFlow::GetExistingCertificate,
+ weak_factory_.GetWeakPtr(),
+ key_type,
+ key_name,
+ callback);
+ // If the key does not exist, call this method back with |generate_new_key|
+ // set to true.
+ base::Closure on_key_not_exists = base::Bind(
+ &AttestationFlow::StartCertificateRequest,
+ weak_factory_.GetWeakPtr(),
+ certificate_profile,
+ true,
+ callback);
+ cryptohome_client_->TpmAttestationDoesKeyExist(
+ key_type,
+ key_name,
+ base::Bind(&DBusBoolRedirectCallback,
+ on_key_exists,
+ on_key_not_exists,
+ base::Bind(callback, false, "")));
+ }
}
void AttestationFlow::SendCertificateRequestToPCA(
- const std::string& name,
+ AttestationKeyType key_type,
+ const std::string& key_name,
const CertificateCallback& callback,
bool success,
const std::string& data) {
@@ -174,12 +217,14 @@ void AttestationFlow::SendCertificateRequestToPCA(
data,
base::Bind(&AttestationFlow::SendCertificateResponseToDaemon,
weak_factory_.GetWeakPtr(),
- name,
+ key_type,
+ key_name,
callback));
}
void AttestationFlow::SendCertificateResponseToDaemon(
- const std::string& name,
+ AttestationKeyType key_type,
+ const std::string& key_name,
const CertificateCallback& callback,
bool success,
const std::string& data) {
@@ -191,14 +236,60 @@ void AttestationFlow::SendCertificateResponseToDaemon(
}
// Forward the response to the attestation service to complete the operation.
- CryptohomeClient::AttestationKeyType key_type = CryptohomeClient::USER_KEY;
- if (name == kEnterpriseMachineKey)
- key_type = CryptohomeClient::DEVICE_KEY;
async_caller_->AsyncTpmAttestationFinishCertRequest(data,
key_type,
- name,
+ key_name,
base::Bind(callback));
}
+void AttestationFlow::GetExistingCertificate(
+ AttestationKeyType key_type,
+ const std::string& key_name,
+ const CertificateCallback& callback) {
+ cryptohome_client_->TpmAttestationGetCertificate(
+ key_type,
+ key_name,
+ base::Bind(&DBusDataMethodCallback, callback));
+}
+
+AttestationKeyType AttestationFlow::GetKeyTypeForProfile(
Mattias Nissler (ping if slow) 2013/04/24 12:57:53 nit (here and below): These functions could be mov
dkrahn 2013/04/25 01:06:52 Done.
+ AttestationCertificateProfile profile) {
+ switch (profile) {
+ case ENTERPRISE_MACHINE_CERTIFICATE:
+ return DEVICE_KEY;
+ case ENTERPRISE_USER_CERTIFICATE:
+ return USER_KEY;
+ default:
+ NOTREACHED();
Mattias Nissler (ping if slow) 2013/04/24 12:57:53 Here and below: It'd be better to not have a defau
dkrahn 2013/04/25 01:06:52 Done.
+ }
+ return USER_KEY;
+}
+
+std::string AttestationFlow::GetKeyNameForProfile(
+ AttestationCertificateProfile profile) {
+ switch (profile) {
+ case ENTERPRISE_MACHINE_CERTIFICATE:
+ return kEnterpriseMachineKey;
+ case ENTERPRISE_USER_CERTIFICATE:
+ return kEnterpriseUserKey;
+ default:
+ NOTREACHED();
+ }
+ return "";
+}
+
+int AttestationFlow::GetCertificateOptionsForProfile(
+ AttestationCertificateProfile profile) {
+ switch (profile) {
+ case ENTERPRISE_MACHINE_CERTIFICATE:
+ return INCLUDE_STABLE_ID | INCLUDE_DEVICE_STATE;
+ case ENTERPRISE_USER_CERTIFICATE:
+ return INCLUDE_DEVICE_STATE;
+ default:
+ NOTREACHED();
+ }
+ return CERTIFICATE_OPTION_NONE;
+}
+
} // namespace attestation
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698