Pass TLS read/write secrets by absl::Span instead of a byte vector.
PiperOrigin-RevId: 445930737
diff --git a/quiche/quic/core/crypto/crypto_utils.cc b/quiche/quic/core/crypto/crypto_utils.cc
index c55689f..9b33b0b 100644
--- a/quiche/quic/core/crypto/crypto_utils.cc
+++ b/quiche/quic/core/crypto/crypto_utils.cc
@@ -55,7 +55,7 @@
// Secret, Label, and Length are passed in as |secret|, |label|, and
// |out_len|, respectively. The resulting expanded secret is returned.
std::vector<uint8_t> HkdfExpandLabel(const EVP_MD* prf,
- const std::vector<uint8_t>& secret,
+ absl::Span<const uint8_t> secret,
const std::string& label, size_t out_len) {
bssl::ScopedCBB quic_hkdf_label;
CBB inner_label;
@@ -115,7 +115,7 @@
}
void CryptoUtils::SetKeyAndIV(const EVP_MD* prf,
- const std::vector<uint8_t>& pp_secret,
+ absl::Span<const uint8_t> pp_secret,
const ParsedQuicVersion& version,
QuicCrypter* crypter) {
std::vector<uint8_t> key =
@@ -130,7 +130,7 @@
}
std::vector<uint8_t> CryptoUtils::GenerateHeaderProtectionKey(
- const EVP_MD* prf, const std::vector<uint8_t>& pp_secret,
+ const EVP_MD* prf, absl::Span<const uint8_t> pp_secret,
const ParsedQuicVersion& version, size_t out_len) {
return HkdfExpandLabel(prf, pp_secret, getLabelForVersion(version, "hp"),
out_len);
diff --git a/quiche/quic/core/crypto/crypto_utils.h b/quiche/quic/core/crypto/crypto_utils.h
index 718f48d..87bf309 100644
--- a/quiche/quic/core/crypto/crypto_utils.h
+++ b/quiche/quic/core/crypto/crypto_utils.h
@@ -91,13 +91,13 @@
// protection key. GenerateHeaderProtectionKey/SetHeaderProtectionKey must be
// called before using |crypter|.
static void SetKeyAndIV(const EVP_MD* prf,
- const std::vector<uint8_t>& pp_secret,
+ absl::Span<const uint8_t> pp_secret,
const ParsedQuicVersion& version,
QuicCrypter* crypter);
// Derives the header protection key from the packet protection secret.
static std::vector<uint8_t> GenerateHeaderProtectionKey(
- const EVP_MD* prf, const std::vector<uint8_t>& pp_secret,
+ const EVP_MD* prf, absl::Span<const uint8_t> pp_secret,
const ParsedQuicVersion& version, size_t out_len);
// Given a secret for key phase n, return the secret for phase n+1.
diff --git a/quiche/quic/core/crypto/tls_connection.cc b/quiche/quic/core/crypto/tls_connection.cc
index 61e4c23..1b54b14 100644
--- a/quiche/quic/core/crypto/tls_connection.cc
+++ b/quiche/quic/core/crypto/tls_connection.cc
@@ -158,12 +158,9 @@
const SSL_CIPHER* cipher,
const uint8_t* secret,
size_t secret_length) {
- // TODO(nharper): replace this vector with a span (which unfortunately doesn't
- // yet exist in quic/platform/api).
- std::vector<uint8_t> secret_vec(secret, secret + secret_length);
TlsConnection::Delegate* delegate = ConnectionFromSsl(ssl)->delegate_;
if (!delegate->SetReadSecret(QuicEncryptionLevel(level), cipher,
- secret_vec)) {
+ absl::MakeSpan(secret, secret_length))) {
return 0;
}
return 1;
@@ -175,11 +172,9 @@
const SSL_CIPHER* cipher,
const uint8_t* secret,
size_t secret_length) {
- // TODO(nharper): replace this vector with a span (which unfortunately doesn't
- // yet exist in quic/platform/api).
- std::vector<uint8_t> secret_vec(secret, secret + secret_length);
TlsConnection::Delegate* delegate = ConnectionFromSsl(ssl)->delegate_;
- delegate->SetWriteSecret(QuicEncryptionLevel(level), cipher, secret_vec);
+ delegate->SetWriteSecret(QuicEncryptionLevel(level), cipher,
+ absl::MakeSpan(secret, secret_length));
return 1;
}
diff --git a/quiche/quic/core/crypto/tls_connection.h b/quiche/quic/core/crypto/tls_connection.h
index a4887e8..5c4e8b8 100644
--- a/quiche/quic/core/crypto/tls_connection.h
+++ b/quiche/quic/core/crypto/tls_connection.h
@@ -47,7 +47,7 @@
// traffic secrets and application traffic secrets. The provided write
// secret must be used with the provided cipher suite |cipher|.
virtual void SetWriteSecret(EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& write_secret) = 0;
+ absl::Span<const uint8_t> write_secret) = 0;
// SetReadSecret is similar to SetWriteSecret, except that it is used for
// decrypting messages. SetReadSecret at a particular level is always called
@@ -55,7 +55,7 @@
// where the EncryptionLevel for SetWriteSecret is
// ENCRYPTION_FORWARD_SECURE.
virtual bool SetReadSecret(EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& read_secret) = 0;
+ absl::Span<const uint8_t> read_secret) = 0;
// WriteMessage is called when there is |data| from the TLS stack ready for
// the QUIC stack to write in a crypto frame. The data must be transmitted
diff --git a/quiche/quic/core/tls_client_handshaker.cc b/quiche/quic/core/tls_client_handshaker.cc
index dbe7234..7460263 100644
--- a/quiche/quic/core/tls_client_handshaker.cc
+++ b/quiche/quic/core/tls_client_handshaker.cc
@@ -429,7 +429,7 @@
void TlsClientHandshaker::SetWriteSecret(
EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& write_secret) {
+ absl::Span<const uint8_t> write_secret) {
if (is_connection_closed()) {
return;
}
diff --git a/quiche/quic/core/tls_client_handshaker.h b/quiche/quic/core/tls_client_handshaker.h
index d3c6312..21b6033 100644
--- a/quiche/quic/core/tls_client_handshaker.h
+++ b/quiche/quic/core/tls_client_handshaker.h
@@ -72,7 +72,7 @@
void OnHandshakeDoneReceived() override;
void OnNewTokenReceived(absl::string_view token) override;
void SetWriteSecret(EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& write_secret) override;
+ absl::Span<const uint8_t> write_secret) override;
// Override to drop initial keys if trying to write ENCRYPTION_HANDSHAKE data.
void WriteMessage(EncryptionLevel level, absl::string_view data) override;
diff --git a/quiche/quic/core/tls_handshaker.cc b/quiche/quic/core/tls_handshaker.cc
index 6f4f4ff..15b4d4f 100644
--- a/quiche/quic/core/tls_handshaker.cc
+++ b/quiche/quic/core/tls_handshaker.cc
@@ -235,7 +235,7 @@
void TlsHandshaker::SetWriteSecret(EncryptionLevel level,
const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& write_secret) {
+ absl::Span<const uint8_t> write_secret) {
QUIC_DVLOG(1) << ENDPOINT << "SetWriteSecret level=" << level;
std::unique_ptr<QuicEncrypter> encrypter =
QuicEncrypter::CreateFromCipherSuite(SSL_CIPHER_get_id(cipher));
@@ -252,7 +252,7 @@
header_protection_key.size()));
if (level == ENCRYPTION_FORWARD_SECURE) {
QUICHE_DCHECK(latest_write_secret_.empty());
- latest_write_secret_ = write_secret;
+ latest_write_secret_.assign(write_secret.begin(), write_secret.end());
one_rtt_write_header_protection_key_ = header_protection_key;
}
handshaker_delegate_->OnNewEncryptionKeyAvailable(level,
@@ -261,7 +261,7 @@
bool TlsHandshaker::SetReadSecret(EncryptionLevel level,
const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& read_secret) {
+ absl::Span<const uint8_t> read_secret) {
QUIC_DVLOG(1) << ENDPOINT << "SetReadSecret level=" << level;
std::unique_ptr<QuicDecrypter> decrypter =
QuicDecrypter::CreateFromCipherSuite(SSL_CIPHER_get_id(cipher));
@@ -278,7 +278,7 @@
header_protection_key.size()));
if (level == ENCRYPTION_FORWARD_SECURE) {
QUICHE_DCHECK(latest_read_secret_.empty());
- latest_read_secret_ = read_secret;
+ latest_read_secret_.assign(read_secret.begin(), read_secret.end());
one_rtt_read_header_protection_key_ = header_protection_key;
}
return handshaker_delegate_->OnNewDecryptionKeyAvailable(
diff --git a/quiche/quic/core/tls_handshaker.h b/quiche/quic/core/tls_handshaker.h
index ddd44c6..d2e0ee4 100644
--- a/quiche/quic/core/tls_handshaker.h
+++ b/quiche/quic/core/tls_handshaker.h
@@ -138,14 +138,14 @@
// traffic secrets and application traffic secrets. The provided write secret
// must be used with the provided cipher suite |cipher|.
void SetWriteSecret(EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& write_secret) override;
+ absl::Span<const uint8_t> write_secret) override;
// SetReadSecret is similar to SetWriteSecret, except that it is used for
// decrypting messages. SetReadSecret at a particular level is always called
// after SetWriteSecret for that level, except for ENCRYPTION_ZERO_RTT, where
// the EncryptionLevel for SetWriteSecret is ENCRYPTION_FORWARD_SECURE.
bool SetReadSecret(EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& read_secret) override;
+ absl::Span<const uint8_t> read_secret) override;
// WriteMessage is called when there is |data| from the TLS stack ready for
// the QUIC stack to write in a crypto frame. The data must be transmitted at
diff --git a/quiche/quic/core/tls_server_handshaker.cc b/quiche/quic/core/tls_server_handshaker.cc
index 3d9be2a..58ea409 100644
--- a/quiche/quic/core/tls_server_handshaker.cc
+++ b/quiche/quic/core/tls_server_handshaker.cc
@@ -556,7 +556,7 @@
void TlsServerHandshaker::SetWriteSecret(
EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& write_secret) {
+ absl::Span<const uint8_t> write_secret) {
if (is_connection_closed()) {
return;
}
diff --git a/quiche/quic/core/tls_server_handshaker.h b/quiche/quic/core/tls_server_handshaker.h
index fde73c6..fa5ca75 100644
--- a/quiche/quic/core/tls_server_handshaker.h
+++ b/quiche/quic/core/tls_server_handshaker.h
@@ -89,7 +89,7 @@
override;
std::unique_ptr<QuicEncrypter> CreateCurrentOneRttEncrypter() override;
void SetWriteSecret(EncryptionLevel level, const SSL_CIPHER* cipher,
- const std::vector<uint8_t>& write_secret) override;
+ absl::Span<const uint8_t> write_secret) override;
// Called with normalized SNI hostname as |hostname|. Return value will be
// sent in an ACCEPT_CH frame in the TLS ALPS extension, unless empty.