Switch another low-level function to spans.

Get this out of the way for the various TLS 1.3 secrets to use spans.

Change-Id: Ia6c3fa4b35ecfad721af665f54bde5ab16baf7ca
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/37126
Commit-Queue: Steven Valdez <svaldez@google.com>
Reviewed-by: Steven Valdez <svaldez@google.com>
diff --git a/ssl/handshake.cc b/ssl/handshake.cc
index b8e0070..3df004c 100644
--- a/ssl/handshake.cc
+++ b/ssl/handshake.cc
@@ -479,8 +479,9 @@
   }
 
   // Log the master secret, if logging is enabled.
-  if (!ssl_log_secret(ssl, "CLIENT_RANDOM", session->master_key,
-                      session->master_key_length)) {
+  if (!ssl_log_secret(
+          ssl, "CLIENT_RANDOM",
+          MakeConstSpan(session->master_key, session->master_key_length))) {
     return 0;
   }
 
diff --git a/ssl/internal.h b/ssl/internal.h
index 621052f..e9b8201 100644
--- a/ssl/internal.h
+++ b/ssl/internal.h
@@ -1799,9 +1799,9 @@
 // SSLKEYLOGFILE functions.
 
 // ssl_log_secret logs |secret| with label |label|, if logging is enabled for
-// |ssl|. It returns one on success and zero on failure.
-int ssl_log_secret(const SSL *ssl, const char *label, const uint8_t *secret,
-                   size_t secret_len);
+// |ssl|. It returns true on success and false on failure.
+bool ssl_log_secret(const SSL *ssl, const char *label,
+                    Span<const uint8_t> secret);
 
 
 // ClientHello functions.
diff --git a/ssl/ssl_lib.cc b/ssl/ssl_lib.cc
index 00ee7da..80a33bc 100644
--- a/ssl/ssl_lib.cc
+++ b/ssl/ssl_lib.cc
@@ -323,46 +323,45 @@
   }
 }
 
-static int cbb_add_hex(CBB *cbb, const uint8_t *in, size_t in_len) {
+static bool cbb_add_hex(CBB *cbb, Span<const uint8_t> in) {
   static const char hextable[] = "0123456789abcdef";
   uint8_t *out;
 
-  if (!CBB_add_space(cbb, &out, in_len * 2)) {
-    return 0;
+  if (!CBB_add_space(cbb, &out, in.size() * 2)) {
+    return false;
   }
 
-  for (size_t i = 0; i < in_len; i++) {
-    *(out++) = (uint8_t)hextable[in[i] >> 4];
-    *(out++) = (uint8_t)hextable[in[i] & 0xf];
+  for (uint8_t b : in) {
+    *(out++) = (uint8_t)hextable[b >> 4];
+    *(out++) = (uint8_t)hextable[b & 0xf];
   }
 
-  return 1;
+  return true;
 }
 
-int ssl_log_secret(const SSL *ssl, const char *label, const uint8_t *secret,
-                   size_t secret_len) {
+bool ssl_log_secret(const SSL *ssl, const char *label,
+                    Span<const uint8_t> secret) {
   if (ssl->ctx->keylog_callback == NULL) {
-    return 1;
+    return true;
   }
 
   ScopedCBB cbb;
-  uint8_t *out;
-  size_t out_len;
+  Array<uint8_t> line;
   if (!CBB_init(cbb.get(), strlen(label) + 1 + SSL3_RANDOM_SIZE * 2 + 1 +
-                          secret_len * 2 + 1) ||
-      !CBB_add_bytes(cbb.get(), (const uint8_t *)label, strlen(label)) ||
-      !CBB_add_bytes(cbb.get(), (const uint8_t *)" ", 1) ||
-      !cbb_add_hex(cbb.get(), ssl->s3->client_random, SSL3_RANDOM_SIZE) ||
-      !CBB_add_bytes(cbb.get(), (const uint8_t *)" ", 1) ||
-      !cbb_add_hex(cbb.get(), secret, secret_len) ||
+                               secret.size() * 2 + 1) ||
+      !CBB_add_bytes(cbb.get(), reinterpret_cast<const uint8_t *>(label),
+                     strlen(label)) ||
+      !CBB_add_u8(cbb.get(), ' ') ||
+      !cbb_add_hex(cbb.get(), ssl->s3->client_random) ||
+      !CBB_add_u8(cbb.get(), ' ') ||
+      !cbb_add_hex(cbb.get(), secret) ||
       !CBB_add_u8(cbb.get(), 0 /* NUL */) ||
-      !CBB_finish(cbb.get(), &out, &out_len)) {
-    return 0;
+      !CBBFinishArray(cbb.get(), &line)) {
+    return false;
   }
 
-  ssl->ctx->keylog_callback(ssl, (const char *)out);
-  OPENSSL_free(out);
-  return 1;
+  ssl->ctx->keylog_callback(ssl, reinterpret_cast<const char *>(line.data()));
+  return true;
 }
 
 void ssl_do_info_callback(const SSL *ssl, int type, int value) {
diff --git a/ssl/tls13_enc.cc b/ssl/tls13_enc.cc
index 19ae052..c07afd1 100644
--- a/ssl/tls13_enc.cc
+++ b/ssl/tls13_enc.cc
@@ -233,7 +233,7 @@
   if (!derive_secret(hs, MakeSpan(hs->early_traffic_secret, hs->hash_len),
                      label_to_span(kTLS13LabelClientEarlyTraffic)) ||
       !ssl_log_secret(ssl, "CLIENT_EARLY_TRAFFIC_SECRET",
-                      hs->early_traffic_secret, hs->hash_len)) {
+                      MakeConstSpan(hs->early_traffic_secret, hs->hash_len))) {
     return false;
   }
 
@@ -262,12 +262,14 @@
   SSL *const ssl = hs->ssl;
   if (!derive_secret(hs, MakeSpan(hs->client_handshake_secret, hs->hash_len),
                      label_to_span(kTLS13LabelClientHandshakeTraffic)) ||
-      !ssl_log_secret(ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
-                      hs->client_handshake_secret, hs->hash_len) ||
+      !ssl_log_secret(
+          ssl, "CLIENT_HANDSHAKE_TRAFFIC_SECRET",
+          MakeConstSpan(hs->client_handshake_secret, hs->hash_len)) ||
       !derive_secret(hs, MakeSpan(hs->server_handshake_secret, hs->hash_len),
                      label_to_span(kTLS13LabelServerHandshakeTraffic)) ||
-      !ssl_log_secret(ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
-                      hs->server_handshake_secret, hs->hash_len)) {
+      !ssl_log_secret(
+          ssl, "SERVER_HANDSHAKE_TRAFFIC_SECRET",
+          MakeConstSpan(hs->server_handshake_secret, hs->hash_len))) {
     return false;
   }
 
@@ -297,16 +299,20 @@
   ssl->s3->exporter_secret_len = hs->hash_len;
   if (!derive_secret(hs, MakeSpan(hs->client_traffic_secret_0, hs->hash_len),
                      label_to_span(kTLS13LabelClientApplicationTraffic)) ||
-      !ssl_log_secret(ssl, "CLIENT_TRAFFIC_SECRET_0",
-                      hs->client_traffic_secret_0, hs->hash_len) ||
+      !ssl_log_secret(
+          ssl, "CLIENT_TRAFFIC_SECRET_0",
+          MakeConstSpan(hs->client_traffic_secret_0, hs->hash_len)) ||
       !derive_secret(hs, MakeSpan(hs->server_traffic_secret_0, hs->hash_len),
                      label_to_span(kTLS13LabelServerApplicationTraffic)) ||
-      !ssl_log_secret(ssl, "SERVER_TRAFFIC_SECRET_0",
-                      hs->server_traffic_secret_0, hs->hash_len) ||
-      !derive_secret(hs, MakeSpan(ssl->s3->exporter_secret, hs->hash_len),
-                     label_to_span(kTLS13LabelExporter)) ||
-      !ssl_log_secret(ssl, "EXPORTER_SECRET", ssl->s3->exporter_secret,
-                      hs->hash_len)) {
+      !ssl_log_secret(
+          ssl, "SERVER_TRAFFIC_SECRET_0",
+          MakeConstSpan(hs->server_traffic_secret_0, hs->hash_len)) ||
+      !derive_secret(
+          hs, MakeSpan(ssl->s3->exporter_secret, ssl->s3->exporter_secret_len),
+          label_to_span(kTLS13LabelExporter)) ||
+      !ssl_log_secret(ssl, "EXPORTER_SECRET",
+                      MakeConstSpan(ssl->s3->exporter_secret,
+                                    ssl->s3->exporter_secret_len))) {
     return false;
   }