| 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 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 case blink::WebCryptoAlgorithmIdSha384: | 73 case blink::WebCryptoAlgorithmIdSha384: |
| 74 return HASH_AlgSHA384; | 74 return HASH_AlgSHA384; |
| 75 case blink::WebCryptoAlgorithmIdSha512: | 75 case blink::WebCryptoAlgorithmIdSha512: |
| 76 return HASH_AlgSHA512; | 76 return HASH_AlgSHA512; |
| 77 default: | 77 default: |
| 78 // Not a digest algorithm. | 78 // Not a digest algorithm. |
| 79 return HASH_AlgNULL; | 79 return HASH_AlgNULL; |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 CK_MECHANISM_TYPE WebCryptoAlgorithmToHMACMechanism( | 83 CK_MECHANISM_TYPE WebCryptoHashToHMACMechanism( |
| 84 const blink::WebCryptoAlgorithm& algorithm) { | 84 const blink::WebCryptoAlgorithm& algorithm) { |
| 85 switch (algorithm.id()) { | 85 switch (algorithm.id()) { |
| 86 case blink::WebCryptoAlgorithmIdSha1: | 86 case blink::WebCryptoAlgorithmIdSha1: |
| 87 return CKM_SHA_1_HMAC; | 87 return CKM_SHA_1_HMAC; |
| 88 case blink::WebCryptoAlgorithmIdSha224: |
| 89 return CKM_SHA224_HMAC; |
| 88 case blink::WebCryptoAlgorithmIdSha256: | 90 case blink::WebCryptoAlgorithmIdSha256: |
| 89 return CKM_SHA256_HMAC; | 91 return CKM_SHA256_HMAC; |
| 92 case blink::WebCryptoAlgorithmIdSha384: |
| 93 return CKM_SHA384_HMAC; |
| 94 case blink::WebCryptoAlgorithmIdSha512: |
| 95 return CKM_SHA512_HMAC; |
| 90 default: | 96 default: |
| 91 // Not a supported algorithm. | 97 // Not a supported algorithm. |
| 92 return CKM_INVALID_MECHANISM; | 98 return CKM_INVALID_MECHANISM; |
| 93 } | 99 } |
| 94 } | 100 } |
| 95 | 101 |
| 96 bool AesCbcEncryptDecrypt( | 102 bool AesCbcEncryptDecrypt( |
| 97 CK_ATTRIBUTE_TYPE operation, | 103 CK_ATTRIBUTE_TYPE operation, |
| 98 const blink::WebCryptoAlgorithm& algorithm, | 104 const blink::WebCryptoAlgorithm& algorithm, |
| 99 const blink::WebCryptoKey& key, | 105 const blink::WebCryptoKey& key, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 buffer_data + output_len, | 174 buffer_data + output_len, |
| 169 &final_output_chunk_len, | 175 &final_output_chunk_len, |
| 170 output_max_len - output_len)) { | 176 output_max_len - output_len)) { |
| 171 return false; | 177 return false; |
| 172 } | 178 } |
| 173 | 179 |
| 174 webcrypto::ShrinkBuffer(buffer, final_output_chunk_len + output_len); | 180 webcrypto::ShrinkBuffer(buffer, final_output_chunk_len + output_len); |
| 175 return true; | 181 return true; |
| 176 } | 182 } |
| 177 | 183 |
| 178 CK_MECHANISM_TYPE HmacAlgorithmToGenMechanism( | |
| 179 const blink::WebCryptoAlgorithm& algorithm) { | |
| 180 DCHECK_EQ(algorithm.id(), blink::WebCryptoAlgorithmIdHmac); | |
| 181 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); | |
| 182 DCHECK(params); | |
| 183 switch (params->hash().id()) { | |
| 184 case blink::WebCryptoAlgorithmIdSha1: | |
| 185 return CKM_SHA_1_HMAC; | |
| 186 case blink::WebCryptoAlgorithmIdSha256: | |
| 187 return CKM_SHA256_HMAC; | |
| 188 default: | |
| 189 return CKM_INVALID_MECHANISM; | |
| 190 } | |
| 191 } | |
| 192 | |
| 193 CK_MECHANISM_TYPE WebCryptoAlgorithmToGenMechanism( | 184 CK_MECHANISM_TYPE WebCryptoAlgorithmToGenMechanism( |
| 194 const blink::WebCryptoAlgorithm& algorithm) { | 185 const blink::WebCryptoAlgorithm& algorithm) { |
| 195 switch (algorithm.id()) { | 186 switch (algorithm.id()) { |
| 196 case blink::WebCryptoAlgorithmIdAesCbc: | 187 case blink::WebCryptoAlgorithmIdAesCbc: |
| 197 return CKM_AES_KEY_GEN; | 188 return CKM_AES_KEY_GEN; |
| 198 case blink::WebCryptoAlgorithmIdHmac: | 189 case blink::WebCryptoAlgorithmIdHmac: |
| 199 return HmacAlgorithmToGenMechanism(algorithm); | 190 return WebCryptoHashToHMACMechanism(algorithm.hmacKeyParams()->hash()); |
| 200 default: | 191 default: |
| 201 return CKM_INVALID_MECHANISM; | 192 return CKM_INVALID_MECHANISM; |
| 202 } | 193 } |
| 203 } | 194 } |
| 204 | 195 |
| 205 // TODO(eroman): This is duplicated in OpenSSL version. | |
| 206 unsigned int WebCryptoHmacAlgorithmToBlockSizeBits( | |
| 207 const blink::WebCryptoAlgorithm& algorithm) { | |
| 208 DCHECK_EQ(algorithm.id(), blink::WebCryptoAlgorithmIdHmac); | |
| 209 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); | |
| 210 DCHECK(params); | |
| 211 switch (params->hash().id()) { | |
| 212 case blink::WebCryptoAlgorithmIdSha1: | |
| 213 return 512; | |
| 214 case blink::WebCryptoAlgorithmIdSha256: | |
| 215 return 512; | |
| 216 default: | |
| 217 return 0; | |
| 218 } | |
| 219 } | |
| 220 | |
| 221 // Converts a (big-endian) WebCrypto BigInteger, with or without leading zeros, | 196 // Converts a (big-endian) WebCrypto BigInteger, with or without leading zeros, |
| 222 // to unsigned long. | 197 // to unsigned long. |
| 223 bool BigIntegerToLong(const uint8* data, | 198 bool BigIntegerToLong(const uint8* data, |
| 224 unsigned data_size, | 199 unsigned data_size, |
| 225 unsigned long* result) { | 200 unsigned long* result) { |
| 226 // TODO(padolph): Is it correct to say that empty data is an error, or does it | 201 // TODO(padolph): Is it correct to say that empty data is an error, or does it |
| 227 // mean value 0? See https://www.w3.org/Bugs/Public/show_bug.cgi?id=23655 | 202 // mean value 0? See https://www.w3.org/Bugs/Public/show_bug.cgi?id=23655 |
| 228 if (data_size == 0) | 203 if (data_size == 0) |
| 229 return false; | 204 return false; |
| 230 | 205 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 // possible operations for this key type. | 249 // possible operations for this key type. |
| 275 CK_FLAGS flags = 0; | 250 CK_FLAGS flags = 0; |
| 276 | 251 |
| 277 switch (algorithm.id()) { | 252 switch (algorithm.id()) { |
| 278 case blink::WebCryptoAlgorithmIdHmac: { | 253 case blink::WebCryptoAlgorithmIdHmac: { |
| 279 const blink::WebCryptoHmacParams* params = algorithm.hmacParams(); | 254 const blink::WebCryptoHmacParams* params = algorithm.hmacParams(); |
| 280 if (!params) { | 255 if (!params) { |
| 281 return false; | 256 return false; |
| 282 } | 257 } |
| 283 | 258 |
| 284 mechanism = WebCryptoAlgorithmToHMACMechanism(params->hash()); | 259 mechanism = WebCryptoHashToHMACMechanism(params->hash()); |
| 285 if (mechanism == CKM_INVALID_MECHANISM) { | 260 if (mechanism == CKM_INVALID_MECHANISM) { |
| 286 return false; | 261 return false; |
| 287 } | 262 } |
| 288 | 263 |
| 289 flags |= CKF_SIGN | CKF_VERIFY; | 264 flags |= CKF_SIGN | CKF_VERIFY; |
| 290 | 265 |
| 291 break; | 266 break; |
| 292 } | 267 } |
| 293 case blink::WebCryptoAlgorithmIdAesCbc: { | 268 case blink::WebCryptoAlgorithmIdAesCbc: { |
| 294 mechanism = CKM_AES_CBC; | 269 mechanism = CKM_AES_CBC; |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 keylen_bytes = params->lengthBits() / 8; | 649 keylen_bytes = params->lengthBits() / 8; |
| 675 key_type = blink::WebCryptoKeyTypeSecret; | 650 key_type = blink::WebCryptoKeyTypeSecret; |
| 676 break; | 651 break; |
| 677 } | 652 } |
| 678 case blink::WebCryptoAlgorithmIdHmac: { | 653 case blink::WebCryptoAlgorithmIdHmac: { |
| 679 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); | 654 const blink::WebCryptoHmacKeyParams* params = algorithm.hmacKeyParams(); |
| 680 DCHECK(params); | 655 DCHECK(params); |
| 681 if (params->hasLengthBytes()) { | 656 if (params->hasLengthBytes()) { |
| 682 keylen_bytes = params->optionalLengthBytes(); | 657 keylen_bytes = params->optionalLengthBytes(); |
| 683 } else { | 658 } else { |
| 684 keylen_bytes = WebCryptoHmacAlgorithmToBlockSizeBits(algorithm) / 8; | 659 keylen_bytes = webcrypto::ShaBlockSizeBytes(params->hash().id()); |
| 685 } | 660 } |
| 686 | 661 |
| 687 key_type = blink::WebCryptoKeyTypeSecret; | 662 key_type = blink::WebCryptoKeyTypeSecret; |
| 688 break; | 663 break; |
| 689 } | 664 } |
| 690 | 665 |
| 691 default: { | 666 default: { |
| 692 return false; | 667 return false; |
| 693 } | 668 } |
| 694 } | 669 } |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 switch (algorithm.id()) { | 844 switch (algorithm.id()) { |
| 870 case blink::WebCryptoAlgorithmIdHmac: { | 845 case blink::WebCryptoAlgorithmIdHmac: { |
| 871 const blink::WebCryptoHmacParams* params = algorithm.hmacParams(); | 846 const blink::WebCryptoHmacParams* params = algorithm.hmacParams(); |
| 872 if (!params) { | 847 if (!params) { |
| 873 return false; | 848 return false; |
| 874 } | 849 } |
| 875 | 850 |
| 876 SymKeyHandle* sym_key = reinterpret_cast<SymKeyHandle*>(key.handle()); | 851 SymKeyHandle* sym_key = reinterpret_cast<SymKeyHandle*>(key.handle()); |
| 877 | 852 |
| 878 DCHECK_EQ(PK11_GetMechanism(sym_key->key()), | 853 DCHECK_EQ(PK11_GetMechanism(sym_key->key()), |
| 879 WebCryptoAlgorithmToHMACMechanism(params->hash())); | 854 WebCryptoHashToHMACMechanism(params->hash())); |
| 880 DCHECK_NE(0, key.usages() & blink::WebCryptoKeyUsageSign); | 855 DCHECK_NE(0, key.usages() & blink::WebCryptoKeyUsageSign); |
| 881 | 856 |
| 882 SECItem param_item = { siBuffer, NULL, 0 }; | 857 SECItem param_item = { siBuffer, NULL, 0 }; |
| 883 SECItem data_item = { | 858 SECItem data_item = { |
| 884 siBuffer, | 859 siBuffer, |
| 885 const_cast<unsigned char*>(data), | 860 const_cast<unsigned char*>(data), |
| 886 data_size | 861 data_size |
| 887 }; | 862 }; |
| 888 // First call is to figure out the length. | 863 // First call is to figure out the length. |
| 889 SECItem signature_item = { siBuffer, NULL, 0 }; | 864 SECItem signature_item = { siBuffer, NULL, 0 }; |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1007 | 982 |
| 1008 *key = blink::WebCryptoKey::create(new PublicKeyHandle(pubkey.Pass()), | 983 *key = blink::WebCryptoKey::create(new PublicKeyHandle(pubkey.Pass()), |
| 1009 blink::WebCryptoKeyTypePublic, | 984 blink::WebCryptoKeyTypePublic, |
| 1010 extractable, | 985 extractable, |
| 1011 algorithm, | 986 algorithm, |
| 1012 usage_mask); | 987 usage_mask); |
| 1013 return true; | 988 return true; |
| 1014 } | 989 } |
| 1015 | 990 |
| 1016 } // namespace content | 991 } // namespace content |
| OLD | NEW |