| Index: crypto/hkdf.cc
|
| diff --git a/crypto/hkdf.cc b/crypto/hkdf.cc
|
| index 2483e6029bc0454fcf6fe3aead6e3aaa83bb13b4..41e2d09bae2e8ff9822555c8604b4796fc19624d 100644
|
| --- a/crypto/hkdf.cc
|
| +++ b/crypto/hkdf.cc
|
| @@ -21,6 +21,23 @@ HKDF::HKDF(const base::StringPiece& secret,
|
| const base::StringPiece& info,
|
| size_t key_bytes_to_generate,
|
| size_t iv_bytes_to_generate,
|
| + size_t subkey_secret_bytes_to_generate)
|
| + : HKDF(secret,
|
| + salt,
|
| + info,
|
| + key_bytes_to_generate,
|
| + key_bytes_to_generate,
|
| + iv_bytes_to_generate,
|
| + iv_bytes_to_generate,
|
| + subkey_secret_bytes_to_generate) {}
|
| +
|
| +HKDF::HKDF(const base::StringPiece& secret,
|
| + const base::StringPiece& salt,
|
| + const base::StringPiece& info,
|
| + size_t client_key_bytes_to_generate,
|
| + size_t server_key_bytes_to_generate,
|
| + size_t client_iv_bytes_to_generate,
|
| + size_t server_iv_bytes_to_generate,
|
| size_t subkey_secret_bytes_to_generate) {
|
| // https://tools.ietf.org/html/rfc5869#section-2.2
|
| base::StringPiece actual_salt = salt;
|
| @@ -46,11 +63,12 @@ HKDF::HKDF(const base::StringPiece& secret,
|
| // https://tools.ietf.org/html/rfc5869#section-2.3
|
| // Perform the Expand phase to turn the pseudorandom key
|
| // and info into the output keying material.
|
| - const size_t material_length = 2 * key_bytes_to_generate +
|
| - 2 * iv_bytes_to_generate +
|
| - subkey_secret_bytes_to_generate;
|
| - const size_t n = (material_length + kSHA256HashLength-1) /
|
| - kSHA256HashLength;
|
| + const size_t material_length =
|
| + client_key_bytes_to_generate + client_iv_bytes_to_generate +
|
| + server_key_bytes_to_generate + server_iv_bytes_to_generate +
|
| + subkey_secret_bytes_to_generate;
|
| + const size_t n =
|
| + (material_length + kSHA256HashLength - 1) / kSHA256HashLength;
|
| DCHECK_LT(n, 256u);
|
|
|
| output_.resize(n * kSHA256HashLength);
|
| @@ -82,23 +100,30 @@ HKDF::HKDF(const base::StringPiece& secret,
|
| // On Windows, when the size of output_ is zero, dereference of 0'th element
|
| // results in a crash. C++11 solves this problem by adding a data() getter
|
| // method to std::vector.
|
| - if (key_bytes_to_generate) {
|
| + if (client_key_bytes_to_generate) {
|
| client_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - key_bytes_to_generate);
|
| - j += key_bytes_to_generate;
|
| + client_key_bytes_to_generate);
|
| + j += client_key_bytes_to_generate;
|
| + }
|
| +
|
| + if (server_key_bytes_to_generate) {
|
| server_write_key_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - key_bytes_to_generate);
|
| - j += key_bytes_to_generate;
|
| + server_key_bytes_to_generate);
|
| + j += server_key_bytes_to_generate;
|
| }
|
|
|
| - if (iv_bytes_to_generate) {
|
| + if (client_iv_bytes_to_generate) {
|
| client_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - iv_bytes_to_generate);
|
| - j += iv_bytes_to_generate;
|
| + client_iv_bytes_to_generate);
|
| + j += client_iv_bytes_to_generate;
|
| + }
|
| +
|
| + if (server_iv_bytes_to_generate) {
|
| server_write_iv_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| - iv_bytes_to_generate);
|
| - j += iv_bytes_to_generate;
|
| + server_iv_bytes_to_generate);
|
| + j += server_iv_bytes_to_generate;
|
| }
|
| +
|
| if (subkey_secret_bytes_to_generate) {
|
| subkey_secret_ = base::StringPiece(reinterpret_cast<char*>(&output_[j]),
|
| subkey_secret_bytes_to_generate);
|
|
|