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 |