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

Side by Side Diff: chrome/browser/chromeos/platform_keys/platform_keys_nss.cc

Issue 323093003: Add the Sign-At-Most-Once restriction the enterprise.platformKeys API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments. Created 6 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "chrome/browser/chromeos/platform_keys/platform_keys.h" 5 #include "chrome/browser/chromeos/platform_keys/platform_keys.h"
6 6
7 #include <cryptohi.h> 7 #include <cryptohi.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 19 matching lines...) Expand all
30 using content::BrowserThread; 30 using content::BrowserThread;
31 31
32 namespace { 32 namespace {
33 const char kErrorInternal[] = "Internal Error."; 33 const char kErrorInternal[] = "Internal Error.";
34 const char kErrorKeyNotFound[] = "Key not found."; 34 const char kErrorKeyNotFound[] = "Key not found.";
35 const char kErrorCertificateNotFound[] = "Certificate could not be found."; 35 const char kErrorCertificateNotFound[] = "Certificate could not be found.";
36 const char kErrorAlgorithmNotSupported[] = "Algorithm not supported."; 36 const char kErrorAlgorithmNotSupported[] = "Algorithm not supported.";
37 37
38 // The current maximal RSA modulus length that ChromeOS's TPM supports for key 38 // The current maximal RSA modulus length that ChromeOS's TPM supports for key
39 // generation. 39 // generation.
40 const unsigned int kMaxRSAModulusLength = 2048; 40 const unsigned int kMaxRSAModulusLengthBits = 2048;
41 } 41 }
42 42
43 namespace chromeos { 43 namespace chromeos {
44 44
45 namespace platform_keys { 45 namespace platform_keys {
46 46
47 namespace { 47 namespace {
48 48
49 // Base class to store state that is common to all NSS database operations and 49 // Base class to store state that is common to all NSS database operations and
50 // to provide convenience methods to call back. 50 // to provide convenience methods to call back.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 BrowserThread::PostTask(BrowserThread::IO, 118 BrowserThread::PostTask(BrowserThread::IO,
119 FROM_HERE, 119 FROM_HERE,
120 base::Bind(&GetCertDatabaseOnIOThread, 120 base::Bind(&GetCertDatabaseOnIOThread,
121 profile->GetResourceContext(), 121 profile->GetResourceContext(),
122 callback, 122 callback,
123 state)); 123 state));
124 } 124 }
125 125
126 class GenerateRSAKeyState : public NSSOperationState { 126 class GenerateRSAKeyState : public NSSOperationState {
127 public: 127 public:
128 GenerateRSAKeyState(unsigned int modulus_length, 128 GenerateRSAKeyState(unsigned int modulus_length_bits,
129 const GenerateKeyCallback& callback); 129 const subtle::GenerateKeyCallback& callback);
130 virtual ~GenerateRSAKeyState() {} 130 virtual ~GenerateRSAKeyState() {}
131 131
132 virtual void OnError(const tracked_objects::Location& from, 132 virtual void OnError(const tracked_objects::Location& from,
133 const std::string& error_message) OVERRIDE { 133 const std::string& error_message) OVERRIDE {
134 CallBack(from, std::string() /* no public key */, error_message); 134 CallBack(from, std::string() /* no public key */, error_message);
135 } 135 }
136 136
137 void CallBack(const tracked_objects::Location& from, 137 void CallBack(const tracked_objects::Location& from,
138 const std::string& public_key_spki_der, 138 const std::string& public_key_spki_der,
139 const std::string& error_message) { 139 const std::string& error_message) {
140 origin_task_runner_->PostTask( 140 origin_task_runner_->PostTask(
141 from, base::Bind(callback_, public_key_spki_der, error_message)); 141 from, base::Bind(callback_, public_key_spki_der, error_message));
142 } 142 }
143 143
144 unsigned int modulus_length_; 144 unsigned int modulus_length_bits_;
145 145
146 private: 146 private:
147 // Must be called on origin thread, use CallBack() therefore. 147 // Must be called on origin thread, use CallBack() therefore.
148 GenerateKeyCallback callback_; 148 subtle::GenerateKeyCallback callback_;
149 }; 149 };
150 150
151 class SignState : public NSSOperationState { 151 class SignState : public NSSOperationState {
152 public: 152 public:
153 SignState(const std::string& public_key, 153 SignState(const std::string& public_key,
154 const std::string& data, 154 const std::string& data,
155 const SignCallback& callback); 155 const subtle::SignCallback& callback);
156 virtual ~SignState() {} 156 virtual ~SignState() {}
157 157
158 virtual void OnError(const tracked_objects::Location& from, 158 virtual void OnError(const tracked_objects::Location& from,
159 const std::string& error_message) OVERRIDE { 159 const std::string& error_message) OVERRIDE {
160 CallBack(from, std::string() /* no signature */, error_message); 160 CallBack(from, std::string() /* no signature */, error_message);
161 } 161 }
162 162
163 void CallBack(const tracked_objects::Location& from, 163 void CallBack(const tracked_objects::Location& from,
164 const std::string& signature, 164 const std::string& signature,
165 const std::string& error_message) { 165 const std::string& error_message) {
166 origin_task_runner_->PostTask( 166 origin_task_runner_->PostTask(
167 from, base::Bind(callback_, signature, error_message)); 167 from, base::Bind(callback_, signature, error_message));
168 } 168 }
169 169
170 std::string public_key_; 170 std::string public_key_;
171 std::string data_; 171 std::string data_;
172 172
173 private: 173 private:
174 // Must be called on origin thread, use CallBack() therefore. 174 // Must be called on origin thread, use CallBack() therefore.
175 SignCallback callback_; 175 subtle::SignCallback callback_;
176 }; 176 };
177 177
178 class GetCertificatesState : public NSSOperationState { 178 class GetCertificatesState : public NSSOperationState {
179 public: 179 public:
180 explicit GetCertificatesState(const GetCertificatesCallback& callback); 180 explicit GetCertificatesState(const GetCertificatesCallback& callback);
181 virtual ~GetCertificatesState() {} 181 virtual ~GetCertificatesState() {}
182 182
183 virtual void OnError(const tracked_objects::Location& from, 183 virtual void OnError(const tracked_objects::Location& from,
184 const std::string& error_message) OVERRIDE { 184 const std::string& error_message) OVERRIDE {
185 CallBack(from, 185 CallBack(from,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
244 244
245 private: 245 private:
246 // Must be called on origin thread, use CallBack() therefore. 246 // Must be called on origin thread, use CallBack() therefore.
247 RemoveCertificateCallback callback_; 247 RemoveCertificateCallback callback_;
248 }; 248 };
249 249
250 NSSOperationState::NSSOperationState() 250 NSSOperationState::NSSOperationState()
251 : origin_task_runner_(base::ThreadTaskRunnerHandle::Get()) { 251 : origin_task_runner_(base::ThreadTaskRunnerHandle::Get()) {
252 } 252 }
253 253
254 GenerateRSAKeyState::GenerateRSAKeyState(unsigned int modulus_length, 254 GenerateRSAKeyState::GenerateRSAKeyState(
255 const GenerateKeyCallback& callback) 255 unsigned int modulus_length_bits,
256 : modulus_length_(modulus_length), callback_(callback) { 256 const subtle::GenerateKeyCallback& callback)
257 : modulus_length_bits_(modulus_length_bits), callback_(callback) {
257 } 258 }
258 259
259 SignState::SignState(const std::string& public_key, 260 SignState::SignState(const std::string& public_key,
260 const std::string& data, 261 const std::string& data,
261 const SignCallback& callback) 262 const subtle::SignCallback& callback)
262 : public_key_(public_key), data_(data), callback_(callback) { 263 : public_key_(public_key), data_(data), callback_(callback) {
263 } 264 }
264 265
265 GetCertificatesState::GetCertificatesState( 266 GetCertificatesState::GetCertificatesState(
266 const GetCertificatesCallback& callback) 267 const GetCertificatesCallback& callback)
267 : callback_(callback) { 268 : callback_(callback) {
268 } 269 }
269 270
270 ImportCertificateState::ImportCertificateState( 271 ImportCertificateState::ImportCertificateState(
271 scoped_refptr<net::X509Certificate> certificate, 272 scoped_refptr<net::X509Certificate> certificate,
272 const ImportCertificateCallback& callback) 273 const ImportCertificateCallback& callback)
273 : certificate_(certificate), callback_(callback) { 274 : certificate_(certificate), callback_(callback) {
274 } 275 }
275 276
276 RemoveCertificateState::RemoveCertificateState( 277 RemoveCertificateState::RemoveCertificateState(
277 scoped_refptr<net::X509Certificate> certificate, 278 scoped_refptr<net::X509Certificate> certificate,
278 const RemoveCertificateCallback& callback) 279 const RemoveCertificateCallback& callback)
279 : certificate_(certificate), callback_(callback) { 280 : certificate_(certificate), callback_(callback) {
280 } 281 }
281 282
282 // Does the actual key generation on a worker thread. Used by 283 // Does the actual key generation on a worker thread. Used by
283 // GenerateRSAKeyWithDB(). 284 // GenerateRSAKeyWithDB().
284 void GenerateRSAKeyOnWorkerThread(scoped_ptr<GenerateRSAKeyState> state) { 285 void GenerateRSAKeyOnWorkerThread(scoped_ptr<GenerateRSAKeyState> state) {
285 scoped_ptr<crypto::RSAPrivateKey> rsa_key( 286 scoped_ptr<crypto::RSAPrivateKey> rsa_key(
286 crypto::RSAPrivateKey::CreateSensitive(state->slot_.get(), 287 crypto::RSAPrivateKey::CreateSensitive(state->slot_.get(),
287 state->modulus_length_)); 288 state->modulus_length_bits_));
288 if (!rsa_key) { 289 if (!rsa_key) {
289 LOG(ERROR) << "Couldn't create key."; 290 LOG(ERROR) << "Couldn't create key.";
290 state->OnError(FROM_HERE, kErrorInternal); 291 state->OnError(FROM_HERE, kErrorInternal);
291 return; 292 return;
292 } 293 }
293 294
294 std::vector<uint8> public_key_spki_der; 295 std::vector<uint8> public_key_spki_der;
295 if (!rsa_key->ExportPublicKey(&public_key_spki_der)) { 296 if (!rsa_key->ExportPublicKey(&public_key_spki_der)) {
296 // TODO(pneubeck): Remove rsa_key from storage. 297 // TODO(pneubeck): Remove rsa_key from storage.
297 LOG(ERROR) << "Couldn't export public key."; 298 LOG(ERROR) << "Couldn't export public key.";
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 scoped_refptr<net::X509Certificate> certificate = state->certificate_; 462 scoped_refptr<net::X509Certificate> certificate = state->certificate_;
462 bool certificate_found = certificate->os_cert_handle()->isperm; 463 bool certificate_found = certificate->os_cert_handle()->isperm;
463 cert_db->DeleteCertAndKeyAsync( 464 cert_db->DeleteCertAndKeyAsync(
464 certificate, 465 certificate,
465 base::Bind( 466 base::Bind(
466 &DidRemoveCertificate, base::Passed(&state), certificate_found)); 467 &DidRemoveCertificate, base::Passed(&state), certificate_found));
467 } 468 }
468 469
469 } // namespace 470 } // namespace
470 471
472 namespace subtle {
473
471 void GenerateRSAKey(const std::string& token_id, 474 void GenerateRSAKey(const std::string& token_id,
472 unsigned int modulus_length, 475 unsigned int modulus_length_bits,
473 const GenerateKeyCallback& callback, 476 const GenerateKeyCallback& callback,
474 Profile* profile) { 477 Profile* profile) {
475 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 478 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
476 scoped_ptr<GenerateRSAKeyState> state( 479 scoped_ptr<GenerateRSAKeyState> state(
477 new GenerateRSAKeyState(modulus_length, callback)); 480 new GenerateRSAKeyState(modulus_length_bits, callback));
478 481
479 if (modulus_length > kMaxRSAModulusLength) { 482 if (modulus_length_bits > kMaxRSAModulusLengthBits) {
480 state->OnError(FROM_HERE, kErrorAlgorithmNotSupported); 483 state->OnError(FROM_HERE, kErrorAlgorithmNotSupported);
481 return; 484 return;
482 } 485 }
483 486
484 // Get the pointer to |state| before base::Passed releases |state|. 487 // Get the pointer to |state| before base::Passed releases |state|.
485 NSSOperationState* state_ptr = state.get(); 488 NSSOperationState* state_ptr = state.get();
486 GetCertDatabase(token_id, 489 GetCertDatabase(token_id,
487 base::Bind(&GenerateRSAKeyWithDB, base::Passed(&state)), 490 base::Bind(&GenerateRSAKeyWithDB, base::Passed(&state)),
488 profile, 491 profile,
489 state_ptr); 492 state_ptr);
(...skipping 11 matching lines...) Expand all
501 504
502 // The NSSCertDatabase object is not required. But in case it's not available 505 // The NSSCertDatabase object is not required. But in case it's not available
503 // we would get more informative error messages and we can double check that 506 // we would get more informative error messages and we can double check that
504 // we use a key of the correct token. 507 // we use a key of the correct token.
505 GetCertDatabase(token_id, 508 GetCertDatabase(token_id,
506 base::Bind(&RSASignWithDB, base::Passed(&state)), 509 base::Bind(&RSASignWithDB, base::Passed(&state)),
507 profile, 510 profile,
508 state_ptr); 511 state_ptr);
509 } 512 }
510 513
514 } // namespace subtle
515
511 void GetCertificates(const std::string& token_id, 516 void GetCertificates(const std::string& token_id,
512 const GetCertificatesCallback& callback, 517 const GetCertificatesCallback& callback,
513 Profile* profile) { 518 Profile* profile) {
514 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 519 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
515 scoped_ptr<GetCertificatesState> state(new GetCertificatesState(callback)); 520 scoped_ptr<GetCertificatesState> state(new GetCertificatesState(callback));
516 // Get the pointer to |state| before base::Passed releases |state|. 521 // Get the pointer to |state| before base::Passed releases |state|.
517 NSSOperationState* state_ptr = state.get(); 522 NSSOperationState* state_ptr = state.get();
518 GetCertDatabase(token_id, 523 GetCertDatabase(token_id,
519 base::Bind(&GetCertificatesWithDB, base::Passed(&state)), 524 base::Bind(&GetCertificatesWithDB, base::Passed(&state)),
520 profile, 525 profile,
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 // we would get more informative error messages. 559 // we would get more informative error messages.
555 GetCertDatabase(token_id, 560 GetCertDatabase(token_id,
556 base::Bind(&RemoveCertificateWithDB, base::Passed(&state)), 561 base::Bind(&RemoveCertificateWithDB, base::Passed(&state)),
557 profile, 562 profile,
558 state_ptr); 563 state_ptr);
559 } 564 }
560 565
561 } // namespace platform_keys 566 } // namespace platform_keys
562 567
563 } // namespace chromeos 568 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698