| Index: crypto/hmac.cc
|
| diff --git a/crypto/hmac.cc b/crypto/hmac.cc
|
| index 588cb9e77bbf280bbbc4ed1fdd1ab3dda9a727e1..74d1f916ffd4e8cc0447f33934905925bbcf4181 100644
|
| --- a/crypto/hmac.cc
|
| +++ b/crypto/hmac.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "crypto/hmac.h"
|
|
|
| +#include <algorithm>
|
| +
|
| #include "base/logging.h"
|
|
|
| namespace crypto {
|
| @@ -43,12 +45,21 @@ bool HMAC::Verify(const base::StringPiece& data,
|
| const base::StringPiece& digest) const {
|
| if (digest.size() != DigestLength())
|
| return false;
|
| + return VerifyTruncated(data, digest);
|
| +}
|
| +
|
| +bool HMAC::VerifyTruncated(const base::StringPiece& data,
|
| + const base::StringPiece& digest) const {
|
| + if (digest.empty())
|
| + return false;
|
| + size_t digest_length = DigestLength();
|
| scoped_array<unsigned char> computed_digest(
|
| - new unsigned char[digest.size()]);
|
| - if (!Sign(data, computed_digest.get(), static_cast<int>(digest.size())))
|
| + new unsigned char[digest_length]);
|
| + if (!Sign(data, computed_digest.get(), static_cast<int>(digest_length)))
|
| return false;
|
|
|
| - return SecureMemcmp(digest.data(), computed_digest.get(), digest.size());
|
| + return SecureMemcmp(digest.data(), computed_digest.get(),
|
| + std::min(digest.size(), digest_length));
|
| }
|
|
|
| } // namespace crypto
|
|
|