Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Unified Diff: crypto/hkdf.cc

Issue 1904163003: Add new constructor to HKDF that allows the client and server key/IV (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: StringPiece Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « crypto/hkdf.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « crypto/hkdf.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698