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

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

Powered by Google App Engine
This is Rietveld 408576698