Chromium Code Reviews| 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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 232 size_t reverse_i = data_size - i - 1; | 232 size_t reverse_i = data_size - i - 1; |
| 233 | 233 |
| 234 if (reverse_i >= sizeof(unsigned long) && data[i]) | 234 if (reverse_i >= sizeof(unsigned long) && data[i]) |
| 235 return false; // Too large for a long. | 235 return false; // Too large for a long. |
| 236 | 236 |
| 237 *result |= data[i] << 8 * reverse_i; | 237 *result |= data[i] << 8 * reverse_i; |
| 238 } | 238 } |
| 239 return true; | 239 return true; |
| 240 } | 240 } |
| 241 | 241 |
| 242 typedef scoped_ptr_malloc< | |
|
Ryan Sleevi
2013/11/21 01:41:34
scoped_ptr_malloc is DEPRECATED, as scoped_ptr sup
padolph
2013/11/21 03:38:13
This typedef is no longer needed because of the ch
| |
| 243 PRArenaPool, crypto::NSSDestroyer1<PRArenaPool, | |
| 244 PORT_FreeArena, | |
| 245 PR_FALSE> > ScopedPRArenaPool; | |
| 246 | |
| 242 } // namespace | 247 } // namespace |
| 243 | 248 |
| 244 void WebCryptoImpl::Init() { | 249 void WebCryptoImpl::Init() { |
| 245 crypto::EnsureNSSInit(); | 250 crypto::EnsureNSSInit(); |
| 246 } | 251 } |
| 247 | 252 |
| 248 bool WebCryptoImpl::EncryptInternal( | 253 bool WebCryptoImpl::EncryptInternal( |
| 249 const blink::WebCryptoAlgorithm& algorithm, | 254 const blink::WebCryptoAlgorithm& algorithm, |
| 250 const blink::WebCryptoKey& key, | 255 const blink::WebCryptoKey& key, |
| 251 const unsigned char* data, | 256 const unsigned char* data, |
| (...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 642 | 647 |
| 643 break; | 648 break; |
| 644 } | 649 } |
| 645 default: | 650 default: |
| 646 return false; | 651 return false; |
| 647 } | 652 } |
| 648 | 653 |
| 649 return true; | 654 return true; |
| 650 } | 655 } |
| 651 | 656 |
| 657 bool WebCryptoImpl::ImportRsaPublicKeyInternal( | |
|
eroman
2013/11/20 23:37:12
@rsleevi, dark lord of NSS: Can you review this fu
| |
| 658 const unsigned char* modulus_data, | |
| 659 unsigned modulus_size, | |
| 660 const unsigned char* exponent_data, | |
| 661 unsigned exponent_size, | |
| 662 const blink::WebCryptoAlgorithm& algorithm, | |
| 663 bool extractable, | |
| 664 blink::WebCryptoKeyUsageMask usage_mask, | |
| 665 blink::WebCryptoKey* key) { | |
| 666 | |
| 667 DCHECK(modulus_data); | |
| 668 DCHECK(modulus_size); | |
| 669 DCHECK(exponent_data); | |
| 670 DCHECK(exponent_size); | |
|
Ryan Sleevi
2013/11/21 01:41:34
Is Blink going to require these four fields be val
eroman
2013/11/21 01:55:41
The caller here is the JWK parsing code, which val
padolph
2013/11/21 03:38:13
Done.
| |
| 671 | |
| 672 // NSS does not provide a way to create an RSA public key directly from the | |
| 673 // modulus and exponent values. But it can import an DER-encoded ASN.1 blob | |
|
Ryan Sleevi
2013/11/21 01:41:34
"values. But" -> "values, but"
padolph
2013/11/21 03:38:13
Done.
| |
| 674 // with the values and create the key from that. The code below follows the | |
| 675 // recommendation described in | |
| 676 // https://developer.mozilla.org/en-US/docs/NSS/NSS_Tech_Notes/nss_tech_note7 | |
| 677 | |
| 678 ScopedPRArenaPool arena(PORT_NewArena(DER_DEFAULT_CHUNKSIZE)); | |
| 679 if (!arena.get()) | |
| 680 return false; | |
| 681 | |
| 682 // Pack the input values into struct compatible with NSS ASN.1 encoding, and | |
| 683 // set up the ASN.1 encoder template for it. | |
| 684 struct RsaPublicKeyData { | |
| 685 SECItem modulus; | |
| 686 SECItem exponent; | |
| 687 }; | |
| 688 const RsaPublicKeyData pubkey_in = { | |
| 689 {siUnsignedInteger, const_cast<unsigned char*>(modulus_data), | |
| 690 modulus_size}, | |
| 691 {siUnsignedInteger, const_cast<unsigned char*>(exponent_data), | |
| 692 exponent_size}}; | |
| 693 const SEC_ASN1Template RsaPublicKeyTemplate[] = { | |
| 694 {SEC_ASN1_SEQUENCE, 0, NULL, sizeof(RsaPublicKeyData)}, | |
| 695 {SEC_ASN1_INTEGER, offsetof(RsaPublicKeyData, modulus), }, | |
| 696 {SEC_ASN1_INTEGER, offsetof(RsaPublicKeyData, exponent), }, | |
| 697 {0, }}; | |
|
Ryan Sleevi
2013/11/21 01:41:34
nit: I seem to recall that clang-format/the style
padolph
2013/11/21 03:38:13
The current format is what clang-format -style=Chr
| |
| 698 | |
| 699 // Do the ASN.1 encoding to produce the DER-formatted public key. In this | |
| 700 // usage, SEC_ASN1EncodeItem() returns a pointer to the provided output | |
| 701 // SECItem (pubkey_der) on success, or NULL on failure. | |
|
Ryan Sleevi
2013/11/21 01:41:34
A subtle element of this is the fact that the SECI
padolph
2013/11/21 03:38:13
Done.
| |
| 702 SECItem pubkey_der = {siBuffer, NULL, 0}; | |
| 703 SECItem* const check_der_ptr = SEC_ASN1EncodeItem( | |
| 704 arena.get(), &pubkey_der, &pubkey_in, RsaPublicKeyTemplate); | |
| 705 if (!check_der_ptr) | |
| 706 return false; | |
| 707 DCHECK_EQ(&pubkey_der, check_der_ptr); | |
| 708 | |
| 709 // Import the DER to create an RSA SECKEYPublicKey. | |
|
Ryan Sleevi
2013/11/21 01:41:34
nit: // Import the DER-encoded public key to...
padolph
2013/11/21 03:38:13
Done.
| |
| 710 crypto::ScopedSECKEYPublicKey pubkey( | |
| 711 SECKEY_ImportDERPublicKey(&pubkey_der, CKK_RSA)); | |
| 712 if (!pubkey.get()) | |
| 713 return false; | |
| 714 | |
| 715 *key = blink::WebCryptoKey::create(new PublicKeyHandle(pubkey.Pass()), | |
| 716 blink::WebCryptoKeyTypePublic, | |
| 717 extractable, | |
| 718 algorithm, | |
| 719 usage_mask); | |
| 720 return true; | |
| 721 } | |
| 722 | |
| 652 } // namespace content | 723 } // namespace content |
| OLD | NEW |