keylog: add a random size argument to Curl_tls_keylog_write()

To allow the function to verify that the buffer is large enough. Avoids
possible future internal mishaps.

Closes #22560
This commit is contained in:
Daniel Stenberg 2026-08-12 14:04:48 +02:00
parent d064bc2adb
commit fbfb2499f0
No known key found for this signature in database
GPG key ID: 5CC908FDB71E12C2
6 changed files with 20 additions and 16 deletions

View file

@ -1043,7 +1043,8 @@ static int keylog_callback(gnutls_session_t session, const char *label,
return -1;
}
Curl_tls_keylog_write(label, crandom.data, secret->data, secret->size);
Curl_tls_keylog_write(label, crandom.data, crandom.size,
secret->data, secret->size);
return 0;
}

View file

@ -102,19 +102,20 @@ bool Curl_tls_keylog_write_line(const char *line)
return TRUE;
}
bool Curl_tls_keylog_write(
const char *label,
const unsigned char client_random[CLIENT_RANDOM_SIZE],
const unsigned char *secret, size_t secretlen)
bool Curl_tls_keylog_write(const char *label,
const unsigned char *client_random,
size_t random_size,
const unsigned char *secret, size_t secretlen)
{
size_t pos, i;
unsigned char line[KEYLOG_LABEL_MAXLEN + 1 +
(2 * CLIENT_RANDOM_SIZE) + 1 +
(2 * SECRET_MAXLEN) + 1 + 1];
if(!keylog_file_fp) {
DEBUGASSERT(random_size >= CLIENT_RANDOM_SIZE);
if(random_size < CLIENT_RANDOM_SIZE)
return FALSE;
if(!keylog_file_fp)
return FALSE;
}
pos = strlen(label);
if(pos > KEYLOG_LABEL_MAXLEN || !secretlen || secretlen > SECRET_MAXLEN) {

View file

@ -61,10 +61,10 @@ const char *Curl_tls_keylog_file_name(void);
* Appends a key log file entry.
* Returns true iff the key log file is open and a valid entry was provided.
*/
bool Curl_tls_keylog_write(
const char *label,
const unsigned char client_random[CLIENT_RANDOM_SIZE],
const unsigned char *secret, size_t secretlen);
bool Curl_tls_keylog_write(const char *label,
const unsigned char *client_random,
size_t random_size,
const unsigned char *secret, size_t secretlen);
/*
* Appends a line to the key log file, ensure it is terminated by an LF.

View file

@ -700,6 +700,7 @@ static void ossl_log_tls12_secret(const SSL *ssl, bool *keylog_done)
*keylog_done = TRUE;
Curl_tls_keylog_write("CLIENT_RANDOM", client_random,
sizeof(client_random),
master_key, master_key_length);
}
#endif /* !HAVE_KEYLOG_CALLBACK */

View file

@ -517,11 +517,11 @@ static void cr_keylog_log_cb(struct rustls_str label,
size_t secret_len)
{
char clabel[KEYLOG_LABEL_MAXLEN];
(void)client_random_len;
DEBUGASSERT(client_random_len == CLIENT_RANDOM_SIZE);
/* Turning a "rustls_str" into a null delimited "c" string */
curl_msnprintf(clabel, sizeof(clabel), "%.*s", (int)label.len, label.data);
Curl_tls_keylog_write(clabel, client_random, secret, secret_len);
Curl_tls_keylog_write(clabel, client_random, client_random_len,
secret, secret_len);
}
static CURLcode

View file

@ -162,7 +162,8 @@ static int wssl_tls13_secret_callback(SSL *ssl, int id,
return 0;
}
Curl_tls_keylog_write(label, client_random, secret, secretSz);
Curl_tls_keylog_write(label, client_random, sizeof(client_random),
secret, secretSz);
return 0;
}
#endif /* HAVE_SECRET_CALLBACK && WOLFSSL_TLS13 */
@ -203,7 +204,7 @@ static void wssl_log_tls12_secret(WOLFSSL *ssl)
return;
}
Curl_tls_keylog_write("CLIENT_RANDOM", cr, ms, msLen);
Curl_tls_keylog_write("CLIENT_RANDOM", cr, crLen, ms, msLen);
}
#endif /* OPENSSL_EXTRA */