Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "content/child/webcrypto/shared_crypto.h" | 5 #include "content/child/webcrypto/shared_crypto.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "content/child/webcrypto/crypto_data.h" | 8 #include "content/child/webcrypto/crypto_data.h" |
| 9 #include "content/child/webcrypto/jwk.h" | 9 #include "content/child/webcrypto/jwk.h" |
| 10 #include "content/child/webcrypto/platform_crypto.h" | 10 #include "content/child/webcrypto/platform_crypto.h" |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 594 if (!ContainsKeyUsages(all_public_key_usages | all_private_key_usages, | 594 if (!ContainsKeyUsages(all_public_key_usages | all_private_key_usages, |
| 595 combined_usage_mask)) | 595 combined_usage_mask)) |
| 596 return Status::ErrorCreateKeyBadUsages(); | 596 return Status::ErrorCreateKeyBadUsages(); |
| 597 | 597 |
| 598 *public_key_usages = combined_usage_mask & all_public_key_usages; | 598 *public_key_usages = combined_usage_mask & all_public_key_usages; |
| 599 *private_key_usages = combined_usage_mask & all_private_key_usages; | 599 *private_key_usages = combined_usage_mask & all_private_key_usages; |
| 600 | 600 |
| 601 return Status::Success(); | 601 return Status::Success(); |
| 602 } | 602 } |
| 603 | 603 |
| 604 // Converts a (big-endian) WebCrypto BigInteger, with or without leading zeros, | |
| 605 // to unsigned long. | |
| 606 bool BigIntegerToLong(const uint8* data, | |
| 607 unsigned int data_size, | |
| 608 unsigned long* result) { | |
| 609 // TODO(padolph): Is it correct to say that empty data is an error, or does it | |
| 610 // mean value 0? See https://www.w3.org/Bugs/Public/show_bug.cgi?id=23655 | |
|
Ryan Sleevi
2014/06/10 23:46:44
This was answered upstream. Can you please fix thi
eroman
2014/06/11 01:13:09
Yup I am aware of that (http://crbug.com/373552).
| |
| 611 if (data_size == 0) | |
| 612 return false; | |
| 613 | |
| 614 *result = 0; | |
| 615 for (size_t i = 0; i < data_size; ++i) { | |
| 616 size_t reverse_i = data_size - i - 1; | |
| 617 | |
| 618 if (reverse_i >= sizeof(unsigned long) && data[i]) | |
| 619 return false; // Too large for a long. | |
| 620 | |
| 621 *result |= data[i] << 8 * reverse_i; | |
| 622 } | |
| 623 return true; | |
| 624 } | |
| 625 | |
| 626 | |
| 604 } // namespace | 627 } // namespace |
| 605 | 628 |
| 606 void Init() { platform::Init(); } | 629 void Init() { platform::Init(); } |
| 607 | 630 |
| 608 Status Encrypt(const blink::WebCryptoAlgorithm& algorithm, | 631 Status Encrypt(const blink::WebCryptoAlgorithm& algorithm, |
| 609 const blink::WebCryptoKey& key, | 632 const blink::WebCryptoKey& key, |
| 610 const CryptoData& data, | 633 const CryptoData& data, |
| 611 std::vector<uint8>* buffer) { | 634 std::vector<uint8>* buffer) { |
| 612 if (!KeyUsageAllows(key, blink::WebCryptoKeyUsageEncrypt)) | 635 if (!KeyUsageAllows(key, blink::WebCryptoKeyUsageEncrypt)) |
| 613 return Status::ErrorUnexpected(); | 636 return Status::ErrorUnexpected(); |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 710 | 733 |
| 711 // TODO(padolph): Handle other asymmetric algorithm key generation. | 734 // TODO(padolph): Handle other asymmetric algorithm key generation. |
| 712 switch (algorithm.paramsType()) { | 735 switch (algorithm.paramsType()) { |
| 713 case blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams: { | 736 case blink::WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams: { |
| 714 const blink::WebCryptoRsaHashedKeyGenParams* params = | 737 const blink::WebCryptoRsaHashedKeyGenParams* params = |
| 715 algorithm.rsaHashedKeyGenParams(); | 738 algorithm.rsaHashedKeyGenParams(); |
| 716 | 739 |
| 717 if (!params->modulusLengthBits()) | 740 if (!params->modulusLengthBits()) |
| 718 return Status::ErrorGenerateRsaZeroModulus(); | 741 return Status::ErrorGenerateRsaZeroModulus(); |
| 719 | 742 |
| 720 CryptoData publicExponent(params->publicExponent()); | 743 unsigned long public_exponent = 0; |
| 721 if (!publicExponent.byte_length()) | 744 if (!BigIntegerToLong(params->publicExponent().data(), |
| 745 params->publicExponent().size(), | |
| 746 &public_exponent) || | |
| 747 (public_exponent != 3 && public_exponent != 65537)) { | |
| 722 return Status::ErrorGenerateKeyPublicExponent(); | 748 return Status::ErrorGenerateKeyPublicExponent(); |
| 749 } | |
| 723 | 750 |
| 724 return platform::GenerateRsaKeyPair(algorithm, | 751 return platform::GenerateRsaKeyPair(algorithm, |
| 725 extractable, | 752 extractable, |
| 726 public_key_usage_mask, | 753 public_key_usage_mask, |
| 727 private_key_usage_mask, | 754 private_key_usage_mask, |
| 728 params->modulusLengthBits(), | 755 params->modulusLengthBits(), |
| 729 publicExponent, | 756 public_exponent, |
| 730 public_key, | 757 public_key, |
| 731 private_key); | 758 private_key); |
| 732 } | 759 } |
| 733 default: | 760 default: |
| 734 return Status::ErrorUnsupported(); | 761 return Status::ErrorUnsupported(); |
| 735 } | 762 } |
| 736 } | 763 } |
| 737 | 764 |
| 738 // Note that this function may be called from the target Blink thread. | 765 // Note that this function may be called from the target Blink thread. |
| 739 Status ImportKey(blink::WebCryptoKeyFormat format, | 766 Status ImportKey(blink::WebCryptoKeyFormat format, |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 985 if (!ContainsKeyUsages(GetValidKeyUsagesForKeyType(algorithm, key_type), | 1012 if (!ContainsKeyUsages(GetValidKeyUsagesForKeyType(algorithm, key_type), |
| 986 usages)) | 1013 usages)) |
| 987 return Status::ErrorCreateKeyBadUsages(); | 1014 return Status::ErrorCreateKeyBadUsages(); |
| 988 | 1015 |
| 989 return Status::Success(); | 1016 return Status::Success(); |
| 990 } | 1017 } |
| 991 | 1018 |
| 992 } // namespace webcrypto | 1019 } // namespace webcrypto |
| 993 | 1020 |
| 994 } // namespace content | 1021 } // namespace content |
| OLD | NEW |