From 91d81ea691a00f4ecce7a21e7f274c2646225474 Mon Sep 17 00:00:00 2001 From: John Safranek Date: Mon, 10 Dec 2018 16:51:43 -0800 Subject: [PATCH] Add some more debug logging for DTLS retransmission support. --- src/internal.c | 50 +++++++++++++++++++++++++++++++++++++++++--------- src/ssl.c | 5 +++++ 2 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/internal.c b/src/internal.c index ca7c0c78d..3082e3bf5 100644 --- a/src/internal.c +++ b/src/internal.c @@ -6003,8 +6003,12 @@ int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz) DtlsMsg* item; int ret = 0; - if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) + WOLFSSL_ENTER("DtlsMsgPoolSave()"); + + if (ssl->dtls_tx_msg_list_sz > DTLS_POOL_SZ) { + WOLFSSL_ERROR(DTLS_POOL_SZ_E); return DTLS_POOL_SZ_E; + } item = DtlsMsgNew(dataSz, ssl->heap); @@ -6027,6 +6031,7 @@ int DtlsMsgPoolSave(WOLFSSL* ssl, const byte* data, word32 dataSz) else ret = MEMORY_E; + WOLFSSL_LEAVE("DtlsMsgPoolSave()", ret); return ret; } @@ -6039,6 +6044,7 @@ int DtlsMsgPoolTimeout(WOLFSSL* ssl) ssl->dtls_timeout *= DTLS_TIMEOUT_MULTIPLIER; result = 0; } + WOLFSSL_LEAVE("DtlsMsgPoolTimeout()", result); return result; } @@ -6047,6 +6053,7 @@ int DtlsMsgPoolTimeout(WOLFSSL* ssl) * value. */ void DtlsMsgPoolReset(WOLFSSL* ssl) { + WOLFSSL_ENTER("DtlsMsgPoolReset()"); if (ssl->dtls_tx_msg_list) { DtlsMsgListDelete(ssl->dtls_tx_msg_list, ssl->heap); ssl->dtls_tx_msg_list = NULL; @@ -6080,6 +6087,8 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) int ret = 0; DtlsMsg* pool = ssl->dtls_tx_msg_list; + WOLFSSL_ENTER("DtlsMsgPoolSend()"); + if (pool != NULL) { while (pool != NULL) { @@ -6098,8 +6107,10 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) WriteSEQ(ssl, epochOrder, dtls->sequence_number); DtlsSEQIncrement(ssl, epochOrder); - if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) + if ((ret = CheckAvailableSize(ssl, pool->sz)) != 0) { + WOLFSSL_ERROR(ret); return ret; + } XMEMCPY(ssl->buffers.outputBuffer.buffer, pool->buf, pool->sz); @@ -6115,21 +6126,26 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) inputSz = pool->sz; sendSz = inputSz + MAX_MSG_EXTRA; - if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) + if ((ret = CheckAvailableSize(ssl, sendSz)) != 0) { + WOLFSSL_ERROR(ret); return ret; + } output = ssl->buffers.outputBuffer.buffer + ssl->buffers.outputBuffer.length; sendSz = BuildMessage(ssl, output, sendSz, input, inputSz, handshake, 0, 0, 0); - if (sendSz < 0) + if (sendSz < 0) { + WOLFSSL_ERROR(BUILD_MSG_ERROR); return BUILD_MSG_ERROR; + } ssl->buffers.outputBuffer.length += sendSz; } ret = SendBuffered(ssl); if (ret < 0) { + WOLFSSL_ERROR(ret); return ret; } @@ -6151,6 +6167,7 @@ int DtlsMsgPoolSend(WOLFSSL* ssl, int sendOnlyFirstPacket) } } + WOLFSSL_LEAVE("DtlsMsgPoolSend()", ret); return ret; } @@ -7094,6 +7111,7 @@ static int GetRecordHeader(WOLFSSL* ssl, const byte* input, word32* inOutIdx, if (IsDtlsNotSctpMode(ssl) && (!DtlsCheckWindow(ssl) || (ssl->options.handShakeDone && ssl->keys.curEpoch == 0))) { + WOLFSSL_LEAVE("GetRecordHeader()", SEQUENCE_ERROR); return SEQUENCE_ERROR; } #endif @@ -7186,8 +7204,10 @@ static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input, word32 idx = *inOutIdx; *inOutIdx += HANDSHAKE_HEADER_SZ + DTLS_HANDSHAKE_EXTRA; - if (*inOutIdx > totalSz) + if (*inOutIdx > totalSz) { + WOLFSSL_ERROR(BUFFER_E); return BUFFER_E; + } *type = input[idx++]; c24to32(input + idx, size); @@ -7203,8 +7223,10 @@ static int GetDtlsHandShakeHeader(WOLFSSL* ssl, const byte* input, if (ssl->curRL.pvMajor != ssl->version.major || ssl->curRL.pvMinor != ssl->version.minor) { - if (*type != client_hello && *type != hello_verify_request) + if (*type != client_hello && *type != hello_verify_request) { + WOLFSSL_ERROR(VERSION_ERROR); return VERSION_ERROR; + } else { WOLFSSL_MSG("DTLS Handshake ignoring hello or verify version"); } @@ -11247,6 +11269,8 @@ static int DtlsMsgDrain(WOLFSSL* ssl) DtlsMsg* item = ssl->dtls_rx_msg_list; int ret = 0; + WOLFSSL_ENTER("DtlsMsgDrain()"); + /* While there is an item in the store list, and it is the expected * message, and it is complete, and there hasn't been an error in the * last message... */ @@ -11270,6 +11294,7 @@ static int DtlsMsgDrain(WOLFSSL* ssl) ssl->dtls_rx_msg_list_sz--; } + WOLFSSL_LEAVE("DtlsMsgDrain()", ret); return ret; } @@ -11297,12 +11322,16 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, /* parse header */ if (GetDtlsHandShakeHeader(ssl, input, inOutIdx, &type, - &size, &fragOffset, &fragSz, totalSz) != 0) + &size, &fragOffset, &fragSz, totalSz) != 0) { + WOLFSSL_ERROR(PARSE_ERROR); return PARSE_ERROR; + } /* check that we have complete fragment */ - if (*inOutIdx + fragSz > totalSz) + if (*inOutIdx + fragSz > totalSz) { + WOLFSSL_ERROR(INCOMPLETE_DATA); return INCOMPLETE_DATA; + } /* Check the handshake sequence number first. If out of order, * add the current message to the list. If the message is in order, @@ -11347,6 +11376,7 @@ static int DoDtlsHandShakeMsg(WOLFSSL* ssl, byte* input, word32* inOutIdx, *inOutIdx += fragSz; if(type == finished ) { if (*inOutIdx + ssl->keys.padSz > totalSz) { + WOLFSSL_ERROR(BUFFER_E); return BUFFER_E; } *inOutIdx += ssl->keys.padSz; @@ -13177,8 +13207,10 @@ int ProcessReply(WOLFSSL* ssl) ret = BUFFER_ERROR; #endif } - if (ret != 0) + if (ret != 0) { + WOLFSSL_ERROR(ret); return ret; + } break; case change_cipher_spec: diff --git a/src/ssl.c b/src/ssl.c index 011161367..1757b3fa5 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -8768,6 +8768,8 @@ int wolfSSL_dtls_get_current_timeout(WOLFSSL* ssl) int timeout = 0; if (ssl) timeout = ssl->dtls_timeout; + + WOLFSSL_LEAVE("wolfSSL_dtls_get_current_timeout()", timeout); return timeout; } @@ -8810,6 +8812,7 @@ int wolfSSL_dtls_set_timeout_max(WOLFSSL* ssl, int timeout) int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) { int result = WOLFSSL_SUCCESS; + WOLFSSL_ENTER("wolfSSL_dtls_got_timeout()"); if (ssl == NULL) return WOLFSSL_FATAL_ERROR; @@ -8819,6 +8822,8 @@ int wolfSSL_dtls_got_timeout(WOLFSSL* ssl) result = WOLFSSL_FATAL_ERROR; } + + WOLFSSL_LEAVE("wolfSSL_dtls_got_timeout()", result); return result; }