OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chromeos/attestation/attestation_flow.h" | 5 #include "chromeos/attestation/attestation_flow.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "chromeos/cryptohome/async_method_caller.h" | 8 #include "chromeos/cryptohome/async_method_caller.h" |
9 #include "chromeos/dbus/cryptohome_client.h" | 9 #include "chromeos/dbus/cryptohome_client.h" |
10 | 10 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 if (!callback.is_null()) | 52 if (!callback.is_null()) |
53 callback.Run(result, data); | 53 callback.Run(result, data); |
54 } | 54 } |
55 | 55 |
56 AttestationKeyType GetKeyTypeForProfile( | 56 AttestationKeyType GetKeyTypeForProfile( |
57 AttestationCertificateProfile profile) { | 57 AttestationCertificateProfile profile) { |
58 switch (profile) { | 58 switch (profile) { |
59 case PROFILE_ENTERPRISE_MACHINE_CERTIFICATE: | 59 case PROFILE_ENTERPRISE_MACHINE_CERTIFICATE: |
60 return KEY_DEVICE; | 60 return KEY_DEVICE; |
61 case PROFILE_ENTERPRISE_USER_CERTIFICATE: | 61 case PROFILE_ENTERPRISE_USER_CERTIFICATE: |
| 62 case PROFILE_CONTENT_PROTECTION_CERTIFICATE: |
62 return KEY_USER; | 63 return KEY_USER; |
63 } | 64 } |
64 NOTREACHED(); | 65 NOTREACHED(); |
65 return KEY_USER; | 66 return KEY_USER; |
66 } | 67 } |
67 | 68 |
68 std::string GetKeyNameForProfile( | 69 std::string GetKeyNameForProfile(AttestationCertificateProfile profile, |
69 AttestationCertificateProfile profile) { | 70 const std::string& origin) { |
70 switch (profile) { | 71 switch (profile) { |
71 case PROFILE_ENTERPRISE_MACHINE_CERTIFICATE: | 72 case PROFILE_ENTERPRISE_MACHINE_CERTIFICATE: |
72 return kEnterpriseMachineKey; | 73 return kEnterpriseMachineKey; |
73 case PROFILE_ENTERPRISE_USER_CERTIFICATE: | 74 case PROFILE_ENTERPRISE_USER_CERTIFICATE: |
74 return kEnterpriseUserKey; | 75 return kEnterpriseUserKey; |
| 76 case PROFILE_CONTENT_PROTECTION_CERTIFICATE: |
| 77 return std::string(kContentProtectionKeyPrefix) + origin; |
75 } | 78 } |
76 NOTREACHED(); | 79 NOTREACHED(); |
77 return ""; | 80 return ""; |
78 } | 81 } |
79 | 82 |
80 int GetCertificateOptionsForProfile( | |
81 AttestationCertificateProfile profile) { | |
82 switch (profile) { | |
83 case PROFILE_ENTERPRISE_MACHINE_CERTIFICATE: | |
84 return CERTIFICATE_INCLUDE_STABLE_ID | CERTIFICATE_INCLUDE_DEVICE_STATE; | |
85 case PROFILE_ENTERPRISE_USER_CERTIFICATE: | |
86 return CERTIFICATE_INCLUDE_DEVICE_STATE; | |
87 } | |
88 NOTREACHED(); | |
89 return CERTIFICATE_OPTION_NONE; | |
90 } | |
91 | |
92 } // namespace | 83 } // namespace |
93 | 84 |
94 AttestationFlow::AttestationFlow(cryptohome::AsyncMethodCaller* async_caller, | 85 AttestationFlow::AttestationFlow(cryptohome::AsyncMethodCaller* async_caller, |
95 CryptohomeClient* cryptohome_client, | 86 CryptohomeClient* cryptohome_client, |
96 scoped_ptr<ServerProxy> server_proxy) | 87 scoped_ptr<ServerProxy> server_proxy) |
97 : async_caller_(async_caller), | 88 : async_caller_(async_caller), |
98 cryptohome_client_(cryptohome_client), | 89 cryptohome_client_(cryptohome_client), |
99 server_proxy_(server_proxy.Pass()), | 90 server_proxy_(server_proxy.Pass()), |
100 weak_factory_(this) { | 91 weak_factory_(this) { |
101 } | 92 } |
102 | 93 |
103 AttestationFlow::~AttestationFlow() { | 94 AttestationFlow::~AttestationFlow() { |
104 } | 95 } |
105 | 96 |
106 void AttestationFlow::GetCertificate( | 97 void AttestationFlow::GetCertificate( |
107 AttestationCertificateProfile certificate_profile, | 98 AttestationCertificateProfile certificate_profile, |
| 99 const std::string& user_email, |
| 100 const std::string& request_origin, |
108 bool force_new_key, | 101 bool force_new_key, |
109 const CertificateCallback& callback) { | 102 const CertificateCallback& callback) { |
110 // If this device has not enrolled with the Privacy CA, we need to do that | 103 // If this device has not enrolled with the Privacy CA, we need to do that |
111 // first. Once enrolled we can proceed with the certificate request. | 104 // first. Once enrolled we can proceed with the certificate request. |
112 base::Closure do_cert_request = base::Bind( | 105 base::Closure do_cert_request = base::Bind( |
113 &AttestationFlow::StartCertificateRequest, | 106 &AttestationFlow::StartCertificateRequest, |
114 weak_factory_.GetWeakPtr(), | 107 weak_factory_.GetWeakPtr(), |
115 certificate_profile, | 108 certificate_profile, |
| 109 user_email, |
| 110 request_origin, |
116 force_new_key, | 111 force_new_key, |
117 callback); | 112 callback); |
118 base::Closure on_enroll_failure = base::Bind(callback, false, ""); | 113 base::Closure on_enroll_failure = base::Bind(callback, false, ""); |
119 base::Closure do_enroll = base::Bind(&AttestationFlow::StartEnroll, | 114 base::Closure do_enroll = base::Bind(&AttestationFlow::StartEnroll, |
120 weak_factory_.GetWeakPtr(), | 115 weak_factory_.GetWeakPtr(), |
121 on_enroll_failure, | 116 on_enroll_failure, |
122 do_cert_request); | 117 do_cert_request); |
123 cryptohome_client_->TpmAttestationIsEnrolled(base::Bind( | 118 cryptohome_client_->TpmAttestationIsEnrolled(base::Bind( |
124 &DBusBoolRedirectCallback, | 119 &DBusBoolRedirectCallback, |
125 do_cert_request, // If enrolled, proceed with cert request. | 120 do_cert_request, // If enrolled, proceed with cert request. |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 return; | 184 return; |
190 } | 185 } |
191 | 186 |
192 // Enrollment has successfully completed, we can move on to whatever is next. | 187 // Enrollment has successfully completed, we can move on to whatever is next. |
193 if (!next_task.is_null()) | 188 if (!next_task.is_null()) |
194 next_task.Run(); | 189 next_task.Run(); |
195 } | 190 } |
196 | 191 |
197 void AttestationFlow::StartCertificateRequest( | 192 void AttestationFlow::StartCertificateRequest( |
198 AttestationCertificateProfile certificate_profile, | 193 AttestationCertificateProfile certificate_profile, |
| 194 const std::string& user_email, |
| 195 const std::string& request_origin, |
199 bool generate_new_key, | 196 bool generate_new_key, |
200 const CertificateCallback& callback) { | 197 const CertificateCallback& callback) { |
201 AttestationKeyType key_type = GetKeyTypeForProfile(certificate_profile); | 198 AttestationKeyType key_type = GetKeyTypeForProfile(certificate_profile); |
202 std::string key_name = GetKeyNameForProfile(certificate_profile); | 199 std::string key_name = GetKeyNameForProfile(certificate_profile, |
| 200 request_origin); |
203 if (generate_new_key) { | 201 if (generate_new_key) { |
204 // Get the attestation service to create a Privacy CA certificate request. | 202 // Get the attestation service to create a Privacy CA certificate request. |
205 async_caller_->AsyncTpmAttestationCreateCertRequest( | 203 async_caller_->AsyncTpmAttestationCreateCertRequest( |
206 GetCertificateOptionsForProfile(certificate_profile), | 204 certificate_profile, |
| 205 user_email, |
| 206 request_origin, |
207 base::Bind(&AttestationFlow::SendCertificateRequestToPCA, | 207 base::Bind(&AttestationFlow::SendCertificateRequestToPCA, |
208 weak_factory_.GetWeakPtr(), | 208 weak_factory_.GetWeakPtr(), |
209 key_type, | 209 key_type, |
210 key_name, | 210 key_name, |
211 callback)); | 211 callback)); |
212 } else { | 212 } else { |
213 // If the key already exists, query the existing certificate. | 213 // If the key already exists, query the existing certificate. |
214 base::Closure on_key_exists = base::Bind( | 214 base::Closure on_key_exists = base::Bind( |
215 &AttestationFlow::GetExistingCertificate, | 215 &AttestationFlow::GetExistingCertificate, |
216 weak_factory_.GetWeakPtr(), | 216 weak_factory_.GetWeakPtr(), |
217 key_type, | 217 key_type, |
218 key_name, | 218 key_name, |
219 callback); | 219 callback); |
220 // If the key does not exist, call this method back with |generate_new_key| | 220 // If the key does not exist, call this method back with |generate_new_key| |
221 // set to true. | 221 // set to true. |
222 base::Closure on_key_not_exists = base::Bind( | 222 base::Closure on_key_not_exists = base::Bind( |
223 &AttestationFlow::StartCertificateRequest, | 223 &AttestationFlow::StartCertificateRequest, |
224 weak_factory_.GetWeakPtr(), | 224 weak_factory_.GetWeakPtr(), |
225 certificate_profile, | 225 certificate_profile, |
| 226 user_email, |
| 227 request_origin, |
226 true, | 228 true, |
227 callback); | 229 callback); |
228 cryptohome_client_->TpmAttestationDoesKeyExist( | 230 cryptohome_client_->TpmAttestationDoesKeyExist( |
229 key_type, | 231 key_type, |
230 key_name, | 232 key_name, |
231 base::Bind(&DBusBoolRedirectCallback, | 233 base::Bind(&DBusBoolRedirectCallback, |
232 on_key_exists, | 234 on_key_exists, |
233 on_key_not_exists, | 235 on_key_not_exists, |
234 base::Bind(callback, false, ""))); | 236 base::Bind(callback, false, ""))); |
235 } | 237 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 const std::string& key_name, | 285 const std::string& key_name, |
284 const CertificateCallback& callback) { | 286 const CertificateCallback& callback) { |
285 cryptohome_client_->TpmAttestationGetCertificate( | 287 cryptohome_client_->TpmAttestationGetCertificate( |
286 key_type, | 288 key_type, |
287 key_name, | 289 key_name, |
288 base::Bind(&DBusDataMethodCallback, callback)); | 290 base::Bind(&DBusDataMethodCallback, callback)); |
289 } | 291 } |
290 | 292 |
291 } // namespace attestation | 293 } // namespace attestation |
292 } // namespace chromeos | 294 } // namespace chromeos |
OLD | NEW |