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 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
195 switch (algorithm.id()) { | 195 switch (algorithm.id()) { |
196 case blink::WebCryptoAlgorithmIdAesCbc: | 196 case blink::WebCryptoAlgorithmIdAesCbc: |
197 return CKM_AES_KEY_GEN; | 197 return CKM_AES_KEY_GEN; |
198 case blink::WebCryptoAlgorithmIdHmac: | 198 case blink::WebCryptoAlgorithmIdHmac: |
199 return HmacAlgorithmToGenMechanism(algorithm); | 199 return HmacAlgorithmToGenMechanism(algorithm); |
200 default: | 200 default: |
201 return CKM_INVALID_MECHANISM; | 201 return CKM_INVALID_MECHANISM; |
202 } | 202 } |
203 } | 203 } |
204 | 204 |
205 unsigned int WebCryptoHmacAlgorithmToBlockSize( | 205 // TODO(eroman): This is duplicated in OpenSSL version. |
| 206 unsigned int WebCryptoHmacAlgorithmToBlockSizeBits( |
206 const blink::WebCryptoAlgorithm& algorithm) { | 207 const blink::WebCryptoAlgorithm& algorithm) { |
207 DCHECK_EQ(algorithm.id(), blink::WebCryptoAlgorithmIdHmac); | 208 DCHECK_EQ(algorithm.id(), blink::WebCryptoAlgorithmIdHmac); |
208 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); | 209 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); |
209 DCHECK(params); | 210 DCHECK(params); |
210 switch (params->hash().id()) { | 211 switch (params->hash().id()) { |
211 case blink::WebCryptoAlgorithmIdSha1: | 212 case blink::WebCryptoAlgorithmIdSha1: |
212 return 512; | 213 return 512; |
213 case blink::WebCryptoAlgorithmIdSha256: | 214 case blink::WebCryptoAlgorithmIdSha256: |
214 return 512; | 215 return 512; |
215 default: | 216 default: |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
661 | 662 |
662 if (mech == CKM_INVALID_MECHANISM) { | 663 if (mech == CKM_INVALID_MECHANISM) { |
663 return false; | 664 return false; |
664 } | 665 } |
665 | 666 |
666 switch (algorithm.id()) { | 667 switch (algorithm.id()) { |
667 case blink::WebCryptoAlgorithmIdAesCbc: { | 668 case blink::WebCryptoAlgorithmIdAesCbc: { |
668 const blink::WebCryptoAesKeyGenParams* params = | 669 const blink::WebCryptoAesKeyGenParams* params = |
669 algorithm.aesKeyGenParams(); | 670 algorithm.aesKeyGenParams(); |
670 DCHECK(params); | 671 DCHECK(params); |
671 keylen_bytes = params->length() / 8; | 672 if (params->lengthBits() % 8) |
672 if (params->length() % 8) | |
673 return false; | 673 return false; |
| 674 keylen_bytes = params->lengthBits() / 8; |
674 key_type = blink::WebCryptoKeyTypeSecret; | 675 key_type = blink::WebCryptoKeyTypeSecret; |
675 break; | 676 break; |
676 } | 677 } |
677 case blink::WebCryptoAlgorithmIdHmac: { | 678 case blink::WebCryptoAlgorithmIdHmac: { |
678 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); | 679 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); |
679 DCHECK(params); | 680 DCHECK(params); |
680 if (!params->getLength(keylen_bytes)) { | 681 if (params->hasLengthBytes()) { |
681 keylen_bytes = WebCryptoHmacAlgorithmToBlockSize(algorithm) / 8; | 682 keylen_bytes = params->optionalLengthBytes(); |
| 683 } else { |
| 684 keylen_bytes = WebCryptoHmacAlgorithmToBlockSizeBits(algorithm) / 8; |
682 } | 685 } |
683 | 686 |
684 key_type = blink::WebCryptoKeyTypeSecret; | 687 key_type = blink::WebCryptoKeyTypeSecret; |
685 break; | 688 break; |
686 } | 689 } |
687 | 690 |
688 default: { | 691 default: { |
689 return false; | 692 return false; |
690 } | 693 } |
691 } | 694 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 switch (algorithm.id()) { | 726 switch (algorithm.id()) { |
724 case blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5: | 727 case blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5: |
725 case blink::WebCryptoAlgorithmIdRsaOaep: | 728 case blink::WebCryptoAlgorithmIdRsaOaep: |
726 case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: { | 729 case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: { |
727 const blink::WebCryptoRsaKeyGenParams* const params = | 730 const blink::WebCryptoRsaKeyGenParams* const params = |
728 algorithm.rsaKeyGenParams(); | 731 algorithm.rsaKeyGenParams(); |
729 DCHECK(params); | 732 DCHECK(params); |
730 | 733 |
731 crypto::ScopedPK11Slot slot(PK11_GetInternalKeySlot()); | 734 crypto::ScopedPK11Slot slot(PK11_GetInternalKeySlot()); |
732 unsigned long public_exponent; | 735 unsigned long public_exponent; |
733 if (!slot || !params->modulusLength() || | 736 if (!slot || !params->modulusLengthBits() || |
734 !BigIntegerToLong(params->publicExponent().data(), | 737 !BigIntegerToLong(params->publicExponent().data(), |
735 params->publicExponent().size(), | 738 params->publicExponent().size(), |
736 &public_exponent) || | 739 &public_exponent) || |
737 !public_exponent) { | 740 !public_exponent) { |
738 return false; | 741 return false; |
739 } | 742 } |
740 | 743 |
741 PK11RSAGenParams rsa_gen_params; | 744 PK11RSAGenParams rsa_gen_params; |
742 rsa_gen_params.keySizeInBits = params->modulusLength(); | 745 rsa_gen_params.keySizeInBits = params->modulusLengthBits(); |
743 rsa_gen_params.pe = public_exponent; | 746 rsa_gen_params.pe = public_exponent; |
744 | 747 |
745 // Flags are verified at the Blink layer; here the flags are set to all | 748 // Flags are verified at the Blink layer; here the flags are set to all |
746 // possible operations for the given key type. | 749 // possible operations for the given key type. |
747 CK_FLAGS operation_flags; | 750 CK_FLAGS operation_flags; |
748 switch (algorithm.id()) { | 751 switch (algorithm.id()) { |
749 case blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5: | 752 case blink::WebCryptoAlgorithmIdRsaEsPkcs1v1_5: |
750 case blink::WebCryptoAlgorithmIdRsaOaep: | 753 case blink::WebCryptoAlgorithmIdRsaOaep: |
751 operation_flags = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP; | 754 operation_flags = CKF_ENCRYPT | CKF_DECRYPT | CKF_WRAP | CKF_UNWRAP; |
752 break; | 755 break; |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1004 | 1007 |
1005 *key = blink::WebCryptoKey::create(new PublicKeyHandle(pubkey.Pass()), | 1008 *key = blink::WebCryptoKey::create(new PublicKeyHandle(pubkey.Pass()), |
1006 blink::WebCryptoKeyTypePublic, | 1009 blink::WebCryptoKeyTypePublic, |
1007 extractable, | 1010 extractable, |
1008 algorithm, | 1011 algorithm, |
1009 usage_mask); | 1012 usage_mask); |
1010 return true; | 1013 return true; |
1011 } | 1014 } |
1012 | 1015 |
1013 } // namespace content | 1016 } // namespace content |
OLD | NEW |