Chromium Code Reviews| Index: crypto/hmac_openssl.cc |
| diff --git a/crypto/hmac_openssl.cc b/crypto/hmac_openssl.cc |
| index 92eea19d780270cde6fa593986ed2015e9687f85..ef20290e223200959674baf2d5f4db647b9d2cba 100644 |
| --- a/crypto/hmac_openssl.cc |
| +++ b/crypto/hmac_openssl.cc |
| @@ -20,45 +20,37 @@ struct HMACPlatformData { |
| std::vector<unsigned char> key; |
| }; |
| -HMAC::HMAC(HashAlgorithm hash_alg) |
| - : hash_alg_(hash_alg), plat_(new HMACPlatformData()) { |
| +HMAC::HMAC(HashAlgorithm hash_alg) : hash_alg_(hash_alg) { |
| // Only SHA-1 and SHA-256 hash algorithms are supported now. |
| DCHECK(hash_alg_ == SHA1 || hash_alg_ == SHA256); |
| } |
| bool HMAC::Init(const unsigned char* key, size_t key_length) { |
| // Init must not be called more than once on the same HMAC object. |
| - DCHECK(plat_->key.empty()); |
| - |
| + DCHECK(!plat_); |
| + plat_.reset(new HMACPlatformData()); |
| plat_->key.assign(key, key + key_length); |
| - if (key_length == 0) { |
| - // Special-case: if the key is empty, use a key with one zero |
| - // byte. OpenSSL's HMAC function breaks when passed a NULL key. (It calls |
| - // HMAC_Init_ex which treats a NULL key as having already been initialized |
| - // with a key previously.) HMAC pads keys with zeros, so this key is |
| - // equivalent. |
| - plat_->key.push_back(0); |
| - } |
| return true; |
| } |
| HMAC::~HMAC() { |
| - // Zero out key copy. |
| - plat_->key.assign(plat_->key.size(), 0); |
| - STLClearObject(&plat_->key); |
| + if (plat_) { |
| + // Zero out key copy. |
| + plat_->key.assign(plat_->key.size(), 0); |
| + STLClearObject(&plat_->key); |
|
davidben
2015/03/05 00:31:29
(While you're here, I'm not sure line 40 does anyt
eroman
2015/03/05 00:41:11
Yeah I agree doesn't seem useful. I will propose t
|
| + } |
| } |
| bool HMAC::Sign(const base::StringPiece& data, |
| unsigned char* digest, |
| size_t digest_length) const { |
| - DCHECK(!plat_->key.empty()); // Init must be called before Sign. |
| + DCHECK(plat_); // Init must be called before Sign. |
| ScopedOpenSSLSafeSizeBuffer<EVP_MAX_MD_SIZE> result(digest, digest_length); |
| return !!::HMAC(hash_alg_ == SHA1 ? EVP_sha1() : EVP_sha256(), |
| - &plat_->key[0], plat_->key.size(), |
| - reinterpret_cast<const unsigned char*>(data.data()), |
| - data.size(), |
| - result.safe_buffer(), NULL); |
| + vector_as_array(&plat_->key), plat_->key.size(), |
| + reinterpret_cast<const unsigned char*>(data.data()), |
| + data.size(), result.safe_buffer(), NULL); |
| } |
| } // namespace crypto |