Use std::string_view for label strings
No need to deal with converting between string literals and Span<const
char> is kind of annoying, and now we just have std::string_view.
Bug: 42290600
Change-Id: Ic6a4de786f77c512a19fcf10ed7a5f8ec7cfbcdb
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/75207
Auto-Submit: David Benjamin <davidben@google.com>
Commit-Queue: Adam Langley <agl@google.com>
Reviewed-by: Adam Langley <agl@google.com>
diff --git a/ssl/internal.h b/ssl/internal.h
index 92e4388..4d24178 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -21,6 +21,7 @@
#include <initializer_list>
#include <limits>
#include <new>
+#include <string_view>
#include <type_traits>
#include <utility>
@@ -932,7 +933,7 @@
// as the secret and |label| as the label. |seed1| and |seed2| are concatenated
// to form the seed parameter. It returns true on success and false on failure.
bool tls1_prf(const EVP_MD *digest, Span<uint8_t> out,
- Span<const uint8_t> secret, Span<const char> label,
+ Span<const uint8_t> secret, std::string_view label,
Span<const uint8_t> seed1, Span<const uint8_t> seed2);
@@ -1655,7 +1656,7 @@
// |exporter_secret|.
bool tls13_export_keying_material(SSL *ssl, Span<uint8_t> out,
Span<const uint8_t> secret,
- Span<const char> label,
+ std::string_view label,
Span<const uint8_t> context);
// tls13_finished_mac calculates the MAC of the handshake transcript to verify
diff --git a/ssl/ssl_transcript.cc b/ssl/ssl_transcript.cc
index 7367554..c8bee47 100644
--- a/ssl/ssl_transcript.cc
+++ b/ssl/ssl_transcript.cc
@@ -10,6 +10,8 @@
#include <openssl/ssl.h>
+#include <string_view>
+
#include <openssl/buf.h>
#include <openssl/digest.h>
#include <openssl/err.h>
@@ -197,18 +199,13 @@
bool SSLTranscript::GetFinishedMAC(uint8_t *out, size_t *out_len,
const SSL_SESSION *session,
bool from_server) const {
- static const char kClientLabel[] = "client finished";
- static const char kServerLabel[] = "server finished";
- auto label = from_server
- ? MakeConstSpan(kServerLabel, sizeof(kServerLabel) - 1)
- : MakeConstSpan(kClientLabel, sizeof(kClientLabel) - 1);
-
uint8_t digest[EVP_MAX_MD_SIZE];
size_t digest_len;
if (!GetHash(digest, &digest_len)) {
return false;
}
+ std::string_view label = from_server ? "server finished" : "client finished";
static const size_t kFinishedLen = 12;
if (!tls1_prf(Digest(), MakeSpan(out, kFinishedLen), session->secret, label,
MakeConstSpan(digest, digest_len), {})) {
diff --git a/ssl/t1_enc.cc b/ssl/t1_enc.cc
index ef4550d..31a2423 100644
--- a/ssl/t1_enc.cc
+++ b/ssl/t1_enc.cc
@@ -13,6 +13,7 @@
#include <assert.h>
#include <string.h>
+#include <string_view>
#include <utility>
#include <openssl/err.h>
@@ -31,7 +32,7 @@
BSSL_NAMESPACE_BEGIN
bool tls1_prf(const EVP_MD *digest, Span<uint8_t> out,
- Span<const uint8_t> secret, Span<const char> label,
+ Span<const uint8_t> secret, std::string_view label,
Span<const uint8_t> seed1, Span<const uint8_t> seed2) {
return 1 == CRYPTO_tls1_prf(digest, out.data(), out.size(), secret.data(),
secret.size(), label.data(), label.size(),
@@ -66,14 +67,11 @@
static bool generate_key_block(const SSL *ssl, Span<uint8_t> out,
const SSL_SESSION *session) {
- static const char kLabel[] = "key expansion";
- auto label = MakeConstSpan(kLabel, sizeof(kLabel) - 1);
-
const EVP_MD *digest = ssl_session_get_digest(session);
// Note this function assumes that |session|'s key material corresponds to
// |ssl->s3->client_random| and |ssl->s3->server_random|.
- return tls1_prf(digest, out, session->secret, label, ssl->s3->server_random,
- ssl->s3->client_random);
+ return tls1_prf(digest, out, session->secret, "key expansion",
+ ssl->s3->server_random, ssl->s3->client_random);
}
bool tls1_configure_aead(SSL *ssl, evp_aead_direction_t direction,
@@ -142,25 +140,20 @@
bool tls1_generate_master_secret(SSL_HANDSHAKE *hs, Span<uint8_t> out,
Span<const uint8_t> premaster) {
- static const char kMasterSecretLabel[] = "master secret";
- static const char kExtendedMasterSecretLabel[] = "extended master secret";
BSSL_CHECK(out.size() == SSL3_MASTER_SECRET_SIZE);
const SSL *ssl = hs->ssl;
if (hs->extended_master_secret) {
- auto label = MakeConstSpan(kExtendedMasterSecretLabel,
- sizeof(kExtendedMasterSecretLabel) - 1);
uint8_t digests[EVP_MAX_MD_SIZE];
size_t digests_len;
if (!hs->transcript.GetHash(digests, &digests_len) ||
- !tls1_prf(hs->transcript.Digest(), out, premaster, label,
- MakeConstSpan(digests, digests_len), {})) {
+ !tls1_prf(hs->transcript.Digest(), out, premaster,
+ "extended master secret", MakeConstSpan(digests, digests_len),
+ {})) {
return false;
}
} else {
- auto label =
- MakeConstSpan(kMasterSecretLabel, sizeof(kMasterSecretLabel) - 1);
- if (!tls1_prf(hs->transcript.Digest(), out, premaster, label,
+ if (!tls1_prf(hs->transcript.Digest(), out, premaster, "master secret",
ssl->s3->client_random, ssl->s3->server_random)) {
return false;
}
@@ -206,6 +199,8 @@
const char *label, size_t label_len,
const uint8_t *context, size_t context_len,
int use_context) {
+ auto out_span = Span(out, out_len);
+ std::string_view label_sv(label, label_len);
// In TLS 1.3, the exporter may be used whenever the secret has been derived.
if (ssl->s3->version != 0 && ssl_protocol_version(ssl) >= TLS1_3_VERSION) {
if (ssl->s3->exporter_secret.empty()) {
@@ -216,9 +211,9 @@
context = nullptr;
context_len = 0;
}
- return tls13_export_keying_material(
- ssl, MakeSpan(out, out_len), ssl->s3->exporter_secret,
- MakeConstSpan(label, label_len), MakeConstSpan(context, context_len));
+ return tls13_export_keying_material(ssl, out_span, ssl->s3->exporter_secret,
+ label_sv,
+ MakeConstSpan(context, context_len));
}
// Exporters may be used in False Start, where the handshake has progressed
@@ -253,6 +248,5 @@
const SSL_SESSION *session = SSL_get_session(ssl);
const EVP_MD *digest = ssl_session_get_digest(session);
- return tls1_prf(digest, MakeSpan(out, out_len), session->secret,
- MakeConstSpan(label, label_len), seed, {});
+ return tls1_prf(digest, out_span, session->secret, label_sv, seed, {});
}
diff --git a/ssl/tls13_enc.cc b/ssl/tls13_enc.cc
index a08cb5f..7f1ba57 100644
--- a/ssl/tls13_enc.cc
+++ b/ssl/tls13_enc.cc
@@ -18,6 +18,7 @@
#include <string.h>
#include <algorithm>
+#include <string_view>
#include <utility>
#include <openssl/aead.h>
@@ -87,15 +88,11 @@
hkdf_extract_to_secret(hs, *transcript, session->secret);
}
-static Span<const char> label_to_span(const char *label) {
- return MakeConstSpan(label, strlen(label));
-}
-
static bool hkdf_expand_label_with_prefix(Span<uint8_t> out,
const EVP_MD *digest,
Span<const uint8_t> secret,
- Span<const uint8_t> label_prefix,
- Span<const char> label,
+ std::string_view label_prefix,
+ std::string_view label,
Span<const uint8_t> hash) {
// This is a copy of CRYPTO_tls13_hkdf_expand_label, but modified to take an
// arbitrary prefix for the label instead of using the hardcoded "tls13 "
@@ -108,7 +105,9 @@
2 + 1 + label_prefix.size() + label.size() + 1 + hash.size()) ||
!CBB_add_u16(&cbb, out.size()) ||
!CBB_add_u8_length_prefixed(&cbb, &child) ||
- !CBB_add_bytes(&child, label_prefix.data(), label_prefix.size()) ||
+ !CBB_add_bytes(&child,
+ reinterpret_cast<const uint8_t *>(label_prefix.data()),
+ label_prefix.size()) ||
!CBB_add_bytes(&child, reinterpret_cast<const uint8_t *>(label.data()),
label.size()) ||
!CBB_add_u8_length_prefixed(&cbb, &child) ||
@@ -126,14 +125,11 @@
static bool hkdf_expand_label(Span<uint8_t> out, const EVP_MD *digest,
Span<const uint8_t> secret,
- Span<const char> label, Span<const uint8_t> hash,
+ std::string_view label, Span<const uint8_t> hash,
bool is_dtls) {
if (is_dtls) {
- static const uint8_t kDTLS13LabelPrefix[] = "dtls13";
- return hkdf_expand_label_with_prefix(
- out, digest, secret,
- MakeConstSpan(kDTLS13LabelPrefix, sizeof(kDTLS13LabelPrefix) - 1),
- label, hash);
+ return hkdf_expand_label_with_prefix(out, digest, secret, "dtls13", label,
+ hash);
}
return CRYPTO_tls13_hkdf_expand_label(
out.data(), out.size(), digest, secret.data(), secret.size(),
@@ -149,7 +145,7 @@
return EVP_Digest(nullptr, 0, derive_context, &derive_context_len,
hs->transcript.Digest(), nullptr) &&
hkdf_expand_label(MakeSpan(hs->secret), hs->transcript.Digest(),
- hs->secret, label_to_span(kTLS13LabelDerived),
+ hs->secret, kTLS13LabelDerived,
MakeConstSpan(derive_context, derive_context_len),
SSL_is_dtls(hs->ssl)) &&
hkdf_extract_to_secret(hs, hs->transcript, in);
@@ -161,7 +157,7 @@
// success and false on error.
static bool derive_secret_with_transcript(
const SSL_HANDSHAKE *hs, InplaceVector<uint8_t, SSL_MAX_MD_SIZE> *out,
- const SSLTranscript &transcript, Span<const char> label) {
+ const SSLTranscript &transcript, std::string_view label) {
uint8_t context_hash[EVP_MAX_MD_SIZE];
size_t context_hash_len;
if (!transcript.GetHash(context_hash, &context_hash_len)) {
@@ -176,7 +172,7 @@
static bool derive_secret(SSL_HANDSHAKE *hs,
InplaceVector<uint8_t, SSL_MAX_MD_SIZE> *out,
- Span<const char> label) {
+ std::string_view label) {
return derive_secret_with_transcript(hs, out, hs->transcript, label);
}
@@ -205,10 +201,8 @@
uint8_t key_buf[EVP_AEAD_MAX_KEY_LENGTH], iv_buf[EVP_AEAD_MAX_NONCE_LENGTH];
auto key = MakeSpan(key_buf).first(EVP_AEAD_key_length(aead));
auto iv = MakeSpan(iv_buf).first(EVP_AEAD_nonce_length(aead));
- if (!hkdf_expand_label(key, digest, traffic_secret, label_to_span("key"),
- {}, is_dtls) ||
- !hkdf_expand_label(iv, digest, traffic_secret, label_to_span("iv"), {},
- is_dtls)) {
+ if (!hkdf_expand_label(key, digest, traffic_secret, "key", {}, is_dtls) ||
+ !hkdf_expand_label(iv, digest, traffic_secret, "iv", {}, is_dtls)) {
return false;
}
@@ -339,8 +333,8 @@
uint8_t rne_key_buf[RecordNumberEncrypter::kMaxKeySize];
auto rne_key = MakeSpan(rne_key_buf).first(ret->KeySize());
- if (!hkdf_expand_label(rne_key, digest, traffic_secret, label_to_span("sn"),
- {}, /*is_dtls=*/true) ||
+ if (!hkdf_expand_label(rne_key, digest, traffic_secret, "sn", {},
+ /*is_dtls=*/true) ||
!ret->SetKey(rne_key)) {
return nullptr;
}
@@ -362,9 +356,8 @@
const SSLTranscript &transcript = (!ssl->server && hs->selected_ech_config)
? hs->inner_transcript
: hs->transcript;
- if (!derive_secret_with_transcript(
- hs, &hs->early_traffic_secret, transcript,
- label_to_span(kTLS13LabelClientEarlyTraffic)) ||
+ if (!derive_secret_with_transcript(hs, &hs->early_traffic_secret, transcript,
+ kTLS13LabelClientEarlyTraffic) ||
!ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET",
hs->early_traffic_secret)) {
return false;
@@ -375,11 +368,11 @@
bool tls13_derive_handshake_secrets(SSL_HANDSHAKE *hs) {
SSL *const ssl = hs->ssl;
if (!derive_secret(hs, &hs->client_handshake_secret,
- label_to_span(kTLS13LabelClientHandshakeTraffic)) ||
+ kTLS13LabelClientHandshakeTraffic) ||
!ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
hs->client_handshake_secret) ||
!derive_secret(hs, &hs->server_handshake_secret,
- label_to_span(kTLS13LabelServerHandshakeTraffic)) ||
+ kTLS13LabelServerHandshakeTraffic) ||
!ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
hs->server_handshake_secret)) {
return false;
@@ -391,15 +384,14 @@
bool tls13_derive_application_secrets(SSL_HANDSHAKE *hs) {
SSL *const ssl = hs->ssl;
if (!derive_secret(hs, &hs->client_traffic_secret_0,
- label_to_span(kTLS13LabelClientApplicationTraffic)) ||
+ kTLS13LabelClientApplicationTraffic) ||
!ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0",
hs->client_traffic_secret_0) ||
!derive_secret(hs, &hs->server_traffic_secret_0,
- label_to_span(kTLS13LabelServerApplicationTraffic)) ||
+ kTLS13LabelServerApplicationTraffic) ||
!ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0",
hs->server_traffic_secret_0) ||
- !derive_secret(hs, &ssl->s3->exporter_secret,
- label_to_span(kTLS13LabelExporter)) ||
+ !derive_secret(hs, &ssl->s3->exporter_secret, kTLS13LabelExporter) ||
!ssl_log_secret(ssl, "EXPORTER_SECRET", ssl->s3->exporter_secret)) {
return false;
}
@@ -417,7 +409,7 @@
const SSL_SESSION *session = SSL_get_session(ssl);
const EVP_MD *digest = ssl_session_get_digest(session);
return hkdf_expand_label(secret, digest, secret,
- label_to_span(kTLS13LabelApplicationTraffic), {},
+ kTLS13LabelApplicationTraffic, {},
SSL_is_dtls(ssl)) &&
tls13_set_traffic_key(ssl, ssl_encryption_application, direction,
session, secret);
@@ -426,8 +418,7 @@
static const char kTLS13LabelResumption[] = "res master";
bool tls13_derive_resumption_secret(SSL_HANDSHAKE *hs) {
- return derive_secret(hs, &hs->new_session->secret,
- label_to_span(kTLS13LabelResumption));
+ return derive_secret(hs, &hs->new_session->secret, kTLS13LabelResumption);
}
static const char kTLS13LabelFinished[] = "finished";
@@ -442,8 +433,8 @@
uint8_t key_buf[EVP_MAX_MD_SIZE];
auto key = MakeSpan(key_buf, EVP_MD_size(digest));
unsigned len;
- if (!hkdf_expand_label(key, digest, secret,
- label_to_span(kTLS13LabelFinished), {}, is_dtls) ||
+ if (!hkdf_expand_label(key, digest, secret, kTLS13LabelFinished, {},
+ is_dtls) ||
HMAC(digest, key.data(), key.size(), context.data(), context.size(), out,
&len) == nullptr) {
return false;
@@ -478,15 +469,14 @@
// override with the PSK.
assert(session->secret.size() == EVP_MD_size(digest));
return hkdf_expand_label(MakeSpan(session->secret), digest, session->secret,
- label_to_span(kTLS13LabelResumptionPSK), nonce,
- is_dtls);
+ kTLS13LabelResumptionPSK, nonce, is_dtls);
}
static const char kTLS13LabelExportKeying[] = "exporter";
bool tls13_export_keying_material(SSL *ssl, Span<uint8_t> out,
Span<const uint8_t> secret,
- Span<const char> label,
+ std::string_view label,
Span<const uint8_t> context) {
if (secret.empty()) {
assert(0);
@@ -513,9 +503,8 @@
auto derived_secret = MakeSpan(derived_secret_buf, EVP_MD_size(digest));
return hkdf_expand_label(derived_secret, digest, secret, label,
export_context, SSL_is_dtls(ssl)) &&
- hkdf_expand_label(out, digest, derived_secret,
- label_to_span(kTLS13LabelExportKeying), hash,
- SSL_is_dtls(ssl));
+ hkdf_expand_label(out, digest, derived_secret, kTLS13LabelExportKeying,
+ hash, SSL_is_dtls(ssl));
}
static const char kTLS13LabelPSKBinder[] = "res binder";
@@ -544,7 +533,7 @@
0) ||
!hkdf_expand_label(
binder_key, digest, MakeConstSpan(early_secret, early_secret_len),
- label_to_span(kTLS13LabelPSKBinder),
+ kTLS13LabelPSKBinder,
MakeConstSpan(binder_context, binder_context_len), is_dtls)) {
return false;
}
@@ -703,8 +692,7 @@
assert(out.size() == ECH_CONFIRMATION_SIGNAL_LEN);
return hkdf_expand_label(
out, transcript.Digest(), MakeConstSpan(secret, secret_len),
- is_hrr ? label_to_span("hrr ech accept confirmation")
- : label_to_span("ech accept confirmation"),
+ is_hrr ? "hrr ech accept confirmation" : "ech accept confirmation",
MakeConstSpan(context, context_len), SSL_is_dtls(hs->ssl));
}