Index: media/crypto/aes_decryptor.cc |
diff --git a/media/crypto/aes_decryptor.cc b/media/crypto/aes_decryptor.cc |
index e69f4062a8afb3f00ee9d609a19785da40269efe..730a9b80c70f03181f0e1eb21f52ceed5532447e 100644 |
--- a/media/crypto/aes_decryptor.cc |
+++ b/media/crypto/aes_decryptor.cc |
@@ -66,21 +66,22 @@ static bool CheckData(const DecoderBuffer& input, |
if (!hmac.Init(hmac_key)) |
return false; |
- // The HMAC covers the IV and the frame data. |
+ // The component that initializes |input.GetDecryptConfig()| is responsible |
+ // for checking that |input.GetDecryptConfig()->checksum_size()| matches |
+ // what is defined by the format. |
+ |
+ // Here, check that checksum size is not greater than the hash |
+ // algorithm's digest length. |
+ DCHECK_LE(input.GetDecryptConfig()->checksum_size(), |
+ static_cast<int>(hmac.DigestLength())); |
+ |
base::StringPiece data_to_check( |
reinterpret_cast<const char*>(input.GetData()), input.GetDataSize()); |
+ base::StringPiece digest( |
+ reinterpret_cast<const char*>(input.GetDecryptConfig()->checksum()), |
+ input.GetDecryptConfig()->checksum_size()); |
- scoped_array<uint8> calculated_hmac(new uint8[hmac.DigestLength()]); |
- if (!hmac.Sign(data_to_check, calculated_hmac.get(), hmac.DigestLength())) |
- return false; |
- |
- DCHECK(input.GetDecryptConfig()->checksum_size() <= |
- static_cast<int>(hmac.DigestLength())); |
- if (memcmp(input.GetDecryptConfig()->checksum(), |
- calculated_hmac.get(), |
- input.GetDecryptConfig()->checksum_size()) != 0) |
- return false; |
- return true; |
+ return hmac.VerifyTruncated(data_to_check, digest); |
} |
// Decrypts |input| using |key|. |encrypted_data_offset| is the number of bytes |