Fix for TLS v1.2 secret callback, incorrectly detecting bad master secret. API test cleanups (no sleep needed).

This commit is contained in:
David Garske
2024-07-30 11:51:20 -07:00
parent 50d60bf0e7
commit 1d9b86e2b0
3 changed files with 33 additions and 34 deletions

View File

@ -344,7 +344,7 @@ void wolfssl_priv_der_unblind(DerBuffer* key, DerBuffer* mask)
{ {
wolfSSL_CTX_keylog_cb_func logCb = NULL; wolfSSL_CTX_keylog_cb_func logCb = NULL;
int msSz; int msSz;
int hasVal; int invalidCount;
int i; int i;
const char* label = SSC_CR; const char* label = SSC_CR;
int labelSz = sizeof(SSC_CR); int labelSz = sizeof(SSC_CR);
@ -355,32 +355,34 @@ void wolfssl_priv_der_unblind(DerBuffer* key, DerBuffer* mask)
int ret; int ret;
(void)ctx; (void)ctx;
if (ssl == NULL || secret == NULL || *secretSz == 0) if (ssl == NULL || secret == NULL || secretSz == NULL || *secretSz == 0)
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
if (ssl->arrays == NULL) if (ssl->arrays == NULL)
return BAD_FUNC_ARG; return BAD_FUNC_ARG;
/* get the user-callback func from CTX*/ /* get the user-callback func from CTX */
logCb = ssl->ctx->keyLogCb; logCb = ssl->ctx->keyLogCb;
if (logCb == NULL) if (logCb == NULL) {
return 0; return 0; /* no logging callback */
}
/* need to make sure the given master-secret has a meaningful value */ /* make sure the given master-secret has a meaningful value */
msSz = *secretSz; msSz = *secretSz;
hasVal = 0; invalidCount = 0;
for (i = 0; i < msSz; i++) { for (i = 0; i < msSz; i++) {
if (*((byte*)secret) != 0) { if (((byte*)secret)[i] == 0) {
hasVal = 1; invalidCount++;
break;
} }
} }
if (hasVal == 0) if (invalidCount == *secretSz) {
return 0; /* master-secret looks invalid */ WOLFSSL_MSG("master-secret is not valid");
return 0; /* ignore error */
}
/* build up a hex-decoded keylog string /* build up a hex-decoded keylog string
"CLIENT_RANDOM <hex-encoded client random> <hex-encoded master-secret>" * "CLIENT_RANDOM <hex-encoded client rand> <hex-encoded master-secret>"
note that each keylog string does not have CR/LF. * note that each keylog string does not have CR/LF.
*/ */
buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1; buffSz = labelSz + (RAN_LEN * 2) + 1 + ((*secretSz) * 2) + 1;
log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET); log = XMALLOC(buffSz, ssl->heap, DYNAMIC_TYPE_SECRET);
if (log == NULL) if (log == NULL)
@ -410,8 +412,9 @@ void wolfssl_priv_der_unblind(DerBuffer* key, DerBuffer* mask)
ret = 0; ret = 0;
} }
} }
else else {
ret = MEMORY_E; ret = BUFFER_E;
}
} }
/* Zero out Base16 encoded secret and other data. */ /* Zero out Base16 encoded secret and other data. */
ForceZero(log, buffSz); ForceZero(log, buffSz);

View File

@ -23353,7 +23353,7 @@ void wolfSSL_CTX_set_keylog_callback(WOLFSSL_CTX* ctx,
wolfSSL_CTX_keylog_cb_func cb) wolfSSL_CTX_keylog_cb_func cb)
{ {
WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback"); WOLFSSL_ENTER("wolfSSL_CTX_set_keylog_callback");
/* stores the callback into WOLFSSL_CTX */ /* stores the callback into WOLFSSL_CTX */
if (ctx != NULL) { if (ctx != NULL) {
ctx->keyLogCb = cb; ctx->keyLogCb = cb;
} }
@ -23364,8 +23364,7 @@ wolfSSL_CTX_keylog_cb_func wolfSSL_CTX_get_keylog_callback(
WOLFSSL_ENTER("wolfSSL_CTX_get_keylog_callback"); WOLFSSL_ENTER("wolfSSL_CTX_get_keylog_callback");
if (ctx != NULL) if (ctx != NULL)
return ctx->keyLogCb; return ctx->keyLogCb;
else return NULL;
return NULL;
} }
#endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */ #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */

View File

@ -49570,20 +49570,19 @@ static THREAD_RETURN WOLFSSL_THREAD server_task_ech(void* args)
#endif /* HAVE_ECH && WOLFSSL_TLS13 */ #endif /* HAVE_ECH && WOLFSSL_TLS13 */
#if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK) #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
static void keyLog_callback(const WOLFSSL* ssl, const char* line ) static void keyLog_callback(const WOLFSSL* ssl, const char* line)
{ {
XFILE fp;
const byte lf = '\n';
AssertNotNull(ssl); AssertNotNull(ssl);
AssertNotNull(line); AssertNotNull(line);
XFILE fp;
const byte lf = '\n';
fp = XFOPEN("./MyKeyLog.txt", "a"); fp = XFOPEN("./MyKeyLog.txt", "a");
XFWRITE( line, 1, strlen(line),fp); XFWRITE(line, 1, XSTRLEN(line), fp);
XFWRITE( (void*)&lf,1,1,fp); XFWRITE((void*)&lf, 1, 1, fp);
XFFLUSH(fp); XFFLUSH(fp);
XFCLOSE(fp); XFCLOSE(fp);
} }
#endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */ #endif /* OPENSSL_EXTRA && HAVE_SECRET_CALLBACK */
static int test_wolfSSL_CTX_set_keylog_callback(void) static int test_wolfSSL_CTX_set_keylog_callback(void)
@ -49631,12 +49630,14 @@ static int test_wolfSSL_Tls12_Key_Logging_test(void)
{ {
EXPECT_DECLS; EXPECT_DECLS;
#if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK) #if defined(OPENSSL_EXTRA) && defined(HAVE_SECRET_CALLBACK)
/* This test is intended for checking whether keylog callback is called /* This test is intended for checking whether keylog callback is called
* in client during TLS handshake between the client and a server. * in client during TLS handshake between the client and a server.
*/ */
test_ssl_cbf server_cbf; test_ssl_cbf server_cbf;
test_ssl_cbf client_cbf; test_ssl_cbf client_cbf;
XFILE fp = XBADFILE; XFILE fp = XBADFILE;
char buff[500];
int found = 0;
XMEMSET(&server_cbf, 0, sizeof(test_ssl_cbf)); XMEMSET(&server_cbf, 0, sizeof(test_ssl_cbf));
XMEMSET(&client_cbf, 0, sizeof(test_ssl_cbf)); XMEMSET(&client_cbf, 0, sizeof(test_ssl_cbf));
@ -49653,16 +49654,12 @@ static int test_wolfSSL_Tls12_Key_Logging_test(void)
ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf, ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf,
&server_cbf, NULL), TEST_SUCCESS); &server_cbf, NULL), TEST_SUCCESS);
XSLEEP_MS(100);
/* check if the keylog file exists */ /* check if the keylog file exists */
char buff[300] = {0};
int found = 0;
ExpectTrue((fp = XFOPEN("./MyKeyLog.txt", "r")) != XBADFILE); ExpectTrue((fp = XFOPEN("./MyKeyLog.txt", "r")) != XBADFILE);
XFFLUSH(fp); /* Just to make sure any buffers get flushed */ XFFLUSH(fp); /* Just to make sure any buffers get flushed */
XMEMSET(buff, 0, sizeof(buff));
while (EXPECT_SUCCESS() && XFGETS(buff, (int)sizeof(buff), fp) != NULL) { while (EXPECT_SUCCESS() && XFGETS(buff, (int)sizeof(buff), fp) != NULL) {
if (0 == strncmp(buff,"CLIENT_RANDOM ", sizeof("CLIENT_RANDOM ")-1)) { if (0 == strncmp(buff,"CLIENT_RANDOM ", sizeof("CLIENT_RANDOM ")-1)) {
found = 1; found = 1;