Index: content/child/webcrypto/nss/hmac_nss.cc |
diff --git a/content/child/webcrypto/nss/hmac_nss.cc b/content/child/webcrypto/nss/hmac_nss.cc |
index f02be408d7f8064b09bafd3b843e9ea02226245d..40dadbe8a399e6dcbdbc4d5ec20dcd7b68e08aad 100644 |
--- a/content/child/webcrypto/nss/hmac_nss.cc |
+++ b/content/child/webcrypto/nss/hmac_nss.cc |
@@ -8,6 +8,7 @@ |
#include <sechash.h> |
#include "base/logging.h" |
+#include "base/numerics/safe_math.h" |
#include "base/stl_util.h" |
#include "content/child/webcrypto/algorithm_implementation.h" |
#include "content/child/webcrypto/crypto_data.h" |
@@ -109,16 +110,20 @@ class HmacImplementation : public AlgorithmImplementation { |
if (!WebCryptoHashToHMACMechanism(hash, &mechanism)) |
return Status::ErrorUnsupported(); |
- // TODO(eroman): check for overflow. |
- unsigned int keylen_bits = key_data.byte_length() * 8; |
- return ImportKeyRawNss( |
- key_data, |
- blink::WebCryptoKeyAlgorithm::createHmac(hash.id(), keylen_bits), |
- extractable, |
- usage_mask, |
- mechanism, |
- CKF_SIGN | CKF_VERIFY, |
- key); |
+ base::CheckedNumeric<unsigned int> keylen_bits(key_data.byte_length()); |
+ keylen_bits *= 8; |
+ |
+ if (!keylen_bits.IsValid()) |
+ return Status::ErrorDataTooLarge(); |
+ |
+ return ImportKeyRawNss(key_data, |
+ blink::WebCryptoKeyAlgorithm::createHmac( |
+ hash.id(), keylen_bits.ValueOrDie()), |
+ extractable, |
+ usage_mask, |
+ mechanism, |
+ CKF_SIGN | CKF_VERIFY, |
+ key); |
} |
virtual Status ImportKeyJwk(const CryptoData& key_data, |