OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "content/renderer/webcrypto/webcrypto_impl.h" | 5 #include "content/renderer/webcrypto/webcrypto_impl.h" |
6 | 6 |
7 #include <cryptohi.h> | 7 #include <cryptohi.h> |
8 #include <pk11pub.h> | 8 #include <pk11pub.h> |
9 #include <sechash.h> | 9 #include <sechash.h> |
10 | 10 |
(...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
318 NULL)); | 318 NULL)); |
319 if (!pk11_sym_key.get()) { | 319 if (!pk11_sym_key.get()) { |
320 return false; | 320 return false; |
321 } | 321 } |
322 | 322 |
323 *key = blink::WebCryptoKey::create(new SymKeyHandle(pk11_sym_key.Pass()), | 323 *key = blink::WebCryptoKey::create(new SymKeyHandle(pk11_sym_key.Pass()), |
324 type, extractable, algorithm, usage_mask); | 324 type, extractable, algorithm, usage_mask); |
325 return true; | 325 return true; |
326 } | 326 } |
327 | 327 |
328 bool ExportKeyInternalRaw( | |
329 const blink::WebCryptoKey& key, | |
330 blink::WebArrayBuffer* buffer) { | |
331 | |
332 DCHECK(key.handle()); | |
333 DCHECK(buffer); | |
334 | |
335 if (key.type() != blink::WebCryptoKeyTypeSecret || !key.extractable()) | |
336 return false; | |
337 | |
338 SymKeyHandle* sym_key = reinterpret_cast<SymKeyHandle*>(key.handle()); | |
339 | |
340 if (PK11_ExtractKeyValue(sym_key->key()) != SECSuccess) | |
341 return false; | |
342 | |
343 const SECItem* key_data = PK11_GetKeyData(sym_key->key()); | |
344 if (!key_data) | |
345 return false; | |
346 DCHECK(key_data->data); | |
eroman
2013/12/05 02:53:58
If it is possible to have empty keys, then is this
padolph
2013/12/05 03:34:16
Removed.
| |
347 | |
348 *buffer = webcrypto::CreateArrayBuffer(key_data->data, key_data->len); | |
349 | |
350 return true; | |
351 } | |
352 | |
328 typedef scoped_ptr<CERTSubjectPublicKeyInfo, | 353 typedef scoped_ptr<CERTSubjectPublicKeyInfo, |
329 crypto::NSSDestroyer<CERTSubjectPublicKeyInfo, | 354 crypto::NSSDestroyer<CERTSubjectPublicKeyInfo, |
330 SECKEY_DestroySubjectPublicKeyInfo> > | 355 SECKEY_DestroySubjectPublicKeyInfo> > |
331 ScopedCERTSubjectPublicKeyInfo; | 356 ScopedCERTSubjectPublicKeyInfo; |
332 | 357 |
333 // Validates an NSS KeyType against a WebCrypto algorithm. Some NSS KeyTypes | 358 // Validates an NSS KeyType against a WebCrypto algorithm. Some NSS KeyTypes |
334 // contain enough information to fabricate a Web Crypto algorithm, which is | 359 // contain enough information to fabricate a Web Crypto algorithm, which is |
335 // returned if the input algorithm isNull(). This function indicates failure by | 360 // returned if the input algorithm isNull(). This function indicates failure by |
336 // returning a Null algorithm. | 361 // returning a Null algorithm. |
337 blink::WebCryptoAlgorithm ResolveNssKeyTypeWithInputAlgorithm( | 362 blink::WebCryptoAlgorithm ResolveNssKeyTypeWithInputAlgorithm( |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
417 reinterpret_cast<PublicKeyHandle*>(key.handle()); | 442 reinterpret_cast<PublicKeyHandle*>(key.handle()); |
418 | 443 |
419 const crypto::ScopedSECItem spki_der( | 444 const crypto::ScopedSECItem spki_der( |
420 SECKEY_EncodeDERSubjectPublicKeyInfo(pub_key->key())); | 445 SECKEY_EncodeDERSubjectPublicKeyInfo(pub_key->key())); |
421 if (!spki_der) | 446 if (!spki_der) |
422 return false; | 447 return false; |
423 | 448 |
424 DCHECK(spki_der->data); | 449 DCHECK(spki_der->data); |
425 DCHECK(spki_der->len); | 450 DCHECK(spki_der->len); |
426 | 451 |
427 *buffer = blink::WebArrayBuffer::create(spki_der->len, 1); | 452 *buffer = webcrypto::CreateArrayBuffer(spki_der->data, spki_der->len); |
428 memcpy(buffer->data(), spki_der->data, spki_der->len); | |
429 | 453 |
430 return true; | 454 return true; |
431 } | 455 } |
432 | 456 |
433 bool ImportKeyInternalPkcs8( | 457 bool ImportKeyInternalPkcs8( |
434 const unsigned char* key_data, | 458 const unsigned char* key_data, |
435 unsigned key_data_size, | 459 unsigned key_data_size, |
436 const blink::WebCryptoAlgorithm& algorithm_or_null, | 460 const blink::WebCryptoAlgorithm& algorithm_or_null, |
437 bool extractable, | 461 bool extractable, |
438 blink::WebCryptoKeyUsageMask usage_mask, | 462 blink::WebCryptoKeyUsageMask usage_mask, |
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
820 return false; | 844 return false; |
821 } | 845 } |
822 } | 846 } |
823 | 847 |
824 bool WebCryptoImpl::ExportKeyInternal( | 848 bool WebCryptoImpl::ExportKeyInternal( |
825 blink::WebCryptoKeyFormat format, | 849 blink::WebCryptoKeyFormat format, |
826 const blink::WebCryptoKey& key, | 850 const blink::WebCryptoKey& key, |
827 blink::WebArrayBuffer* buffer) { | 851 blink::WebArrayBuffer* buffer) { |
828 switch (format) { | 852 switch (format) { |
829 case blink::WebCryptoKeyFormatRaw: | 853 case blink::WebCryptoKeyFormatRaw: |
830 // TODO(padolph): Implement raw export | 854 return ExportKeyInternalRaw(key, buffer); |
831 return false; | |
832 case blink::WebCryptoKeyFormatSpki: | 855 case blink::WebCryptoKeyFormatSpki: |
833 return ExportKeyInternalSpki(key, buffer); | 856 return ExportKeyInternalSpki(key, buffer); |
834 case blink::WebCryptoKeyFormatPkcs8: | 857 case blink::WebCryptoKeyFormatPkcs8: |
835 // TODO(padolph): Implement pkcs8 export | 858 // TODO(padolph): Implement pkcs8 export |
836 return false; | 859 return false; |
837 default: | 860 default: |
838 return false; | 861 return false; |
839 } | 862 } |
840 } | 863 } |
841 | 864 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
988 | 1011 |
989 *key = blink::WebCryptoKey::create(new PublicKeyHandle(pubkey.Pass()), | 1012 *key = blink::WebCryptoKey::create(new PublicKeyHandle(pubkey.Pass()), |
990 blink::WebCryptoKeyTypePublic, | 1013 blink::WebCryptoKeyTypePublic, |
991 extractable, | 1014 extractable, |
992 algorithm, | 1015 algorithm, |
993 usage_mask); | 1016 usage_mask); |
994 return true; | 1017 return true; |
995 } | 1018 } |
996 | 1019 |
997 } // namespace content | 1020 } // namespace content |
OLD | NEW |