Skip to content

Commit 776b312

Browse files
authored
Merge pull request wolfSSL#9466 from SparkiDev/tls13_pt_alert_when_enc
TLS 1.3, plaintext alert: ignore when expecting encrypted
2 parents 86808b8 + b766f11 commit 776b312

File tree

5 files changed

+298
-51
lines changed

5 files changed

+298
-51
lines changed

.github/workflows/os-check.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ jobs:
6363
'--enable-coding=no',
6464
'--enable-dtls --enable-dtls13 --enable-ocspstapling --enable-ocspstapling2
6565
--enable-cert-setup-cb --enable-sessioncerts',
66+
'--enable-dtls --enable-dtls13 --enable-tls13
67+
CPPFLAGS=-DWOLFSSL_TLS13_IGNORE_PT_ALERT_ON_ENC',
6668
'--disable-sni --disable-ecc --disable-tls13 --disable-secure-renegotiation-info',
6769
'CPPFLAGS=-DWOLFSSL_BLIND_PRIVATE_KEY',
6870
'--enable-all --enable-certgencache',

.wolfssl_known_macro_extras

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,7 @@ WOLFSSL_TICKET_ENC_HMAC_SHA512
903903
WOLFSSL_TI_CURRTIME
904904
WOLFSSL_TLS13_DRAFT
905905
WOLFSSL_TLS13_IGNORE_AEAD_LIMITS
906+
WOLFSSL_TLS13_IGNORE_PT_ALERT_ON_ENC
906907
WOLFSSL_TLS13_SHA512
907908
WOLFSSL_TLS13_TICKET_BEFORE_FINISHED
908909
WOLFSSL_TLSX_PQC_MLKEM_STORE_PRIV_KEY

src/internal.c

Lines changed: 58 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -21697,20 +21697,20 @@ static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
2169721697
byte code;
2169821698
word32 dataSz = (word32)ssl->curSize;
2169921699

21700-
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
21701-
if (ssl->hsInfoOn)
21702-
AddPacketName(ssl, "Alert");
21703-
if (ssl->toInfoOn) {
21704-
/* add record header back on to info + alert bytes level/code */
21705-
int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx,
21706-
ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
21707-
if (ret != 0)
21708-
return ret;
21709-
#ifdef WOLFSSL_CALLBACKS
21710-
AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
21711-
#endif
21712-
}
21713-
#endif
21700+
#if defined(WOLFSSL_CALLBACKS) || defined(OPENSSL_EXTRA)
21701+
if (ssl->hsInfoOn)
21702+
AddPacketName(ssl, "Alert");
21703+
if (ssl->toInfoOn) {
21704+
/* add record header back on to info + alert bytes level/code */
21705+
int ret = AddPacketInfo(ssl, "Alert", alert, input + *inOutIdx,
21706+
ALERT_SIZE, READ_PROTO, RECORD_HEADER_SZ, ssl->heap);
21707+
if (ret != 0)
21708+
return ret;
21709+
#ifdef WOLFSSL_CALLBACKS
21710+
AddLateRecordHeader(&ssl->curRL, &ssl->timeoutInfo);
21711+
#endif
21712+
}
21713+
#endif
2171421714

2171521715
if (IsEncryptionOn(ssl, 0))
2171621716
dataSz -= ssl->keys.padSz;
@@ -21725,11 +21725,18 @@ static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
2172521725

2172621726
level = input[(*inOutIdx)++];
2172721727
code = input[(*inOutIdx)++];
21728-
ssl->alert_history.last_rx.code = code;
21729-
ssl->alert_history.last_rx.level = level;
2173021728
*type = code;
21731-
if (level == alert_fatal) {
21732-
ssl->options.isClosed = 1; /* Don't send close_notify */
21729+
#ifdef WOLFSSL_TLS13_IGNORE_PT_ALERT_ON_ENC
21730+
/* Don't process alert when TLS 1.3 and encrypting but plaintext alert. */
21731+
if (!IsAtLeastTLSv1_3(ssl->version) || !IsEncryptionOn(ssl, 0) ||
21732+
ssl->keys.decryptedCur)
21733+
#endif
21734+
{
21735+
ssl->alert_history.last_rx.code = code;
21736+
ssl->alert_history.last_rx.level = level;
21737+
if (level == alert_fatal) {
21738+
ssl->options.isClosed = 1; /* Don't send close_notify */
21739+
}
2173321740
}
2173421741

2173521742
if (++ssl->options.alertCount >= WOLFSSL_ALERT_COUNT_MAX) {
@@ -21743,20 +21750,35 @@ static int DoAlert(WOLFSSL* ssl, byte* input, word32* inOutIdx, int* type)
2174321750
}
2174421751

2174521752
LogAlert(*type);
21746-
if (*type == close_notify) {
21747-
ssl->options.closeNotify = 1;
21753+
if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
21754+
!ssl->keys.decryptedCur)
21755+
{
21756+
#ifdef WOLFSSL_TLS13_IGNORE_PT_ALERT_ON_ENC
21757+
/* Ignore alert if TLS 1.3 and encrypting but was plaintext alert. */
21758+
*type = invalid_alert;
21759+
level = alert_none;
21760+
21761+
#else
21762+
/* Unexpected message when encryption is on and alert not encrypted. */
21763+
SendAlert(ssl, alert_fatal, unexpected_message);
21764+
WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
21765+
return PARSE_ERROR;
21766+
#endif
2174821767
}
2174921768
else {
21750-
/*
21751-
* A close_notify alert doesn't mean there's been an error, so we only
21752-
* add other types of alerts to the error queue
21753-
*/
21754-
WOLFSSL_ERROR(*type);
21769+
if (*type == close_notify) {
21770+
ssl->options.closeNotify = 1;
21771+
}
21772+
else {
21773+
/*
21774+
* A close_notify alert doesn't mean there's been an error, so we
21775+
* only add other types of alerts to the error queue
21776+
*/
21777+
WOLFSSL_ERROR(*type);
21778+
}
2175521779
}
21756-
21757-
if (IsEncryptionOn(ssl, 0)) {
21780+
if (IsEncryptionOn(ssl, 0))
2175821781
*inOutIdx += ssl->keys.padSz;
21759-
}
2176021782

2176121783
return level;
2176221784
}
@@ -22507,7 +22529,8 @@ static int DoProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
2250722529
#ifdef WOLFSSL_TLS13
2250822530
if (IsAtLeastTLSv1_3(ssl->version) && IsEncryptionOn(ssl, 0) &&
2250922531
ssl->curRL.type != application_data &&
22510-
ssl->curRL.type != change_cipher_spec) {
22532+
ssl->curRL.type != change_cipher_spec &&
22533+
ssl->curRL.type != alert) {
2251122534
SendAlert(ssl, alert_fatal, unexpected_message);
2251222535
WOLFSSL_ERROR_VERBOSE(PARSE_ERROR);
2251322536
return PARSE_ERROR;
@@ -22615,9 +22638,9 @@ static int DoProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
2261522638
case decryptMessage:
2261622639

2261722640
if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
22618-
(!IsAtLeastTLSv1_3(ssl->version) ||
22619-
ssl->curRL.type != change_cipher_spec))
22620-
{
22641+
(!IsAtLeastTLSv1_3(ssl->version) ||
22642+
(ssl->curRL.type != change_cipher_spec &&
22643+
ssl->curRL.type != alert))) {
2262122644
ret = DoDecrypt(ssl);
2262222645
#ifdef WOLFSSL_ASYNC_CRYPT
2262322646
if (ret == WC_NO_ERR_TRACE(WC_PENDING_E))
@@ -22694,9 +22717,9 @@ static int DoProcessReplyEx(WOLFSSL* ssl, int allowSocketErr)
2269422717
case verifyMessage:
2269522718

2269622719
if (IsEncryptionOn(ssl, 0) && ssl->keys.decryptedCur == 0 &&
22697-
(!IsAtLeastTLSv1_3(ssl->version) ||
22698-
ssl->curRL.type != change_cipher_spec))
22699-
{
22720+
(!IsAtLeastTLSv1_3(ssl->version) ||
22721+
(ssl->curRL.type != change_cipher_spec &&
22722+
ssl->curRL.type != alert))) {
2270022723
if (!atomicUser
2270122724
#if defined(HAVE_ENCRYPT_THEN_MAC) && !defined(WOLFSSL_AEAD_ONLY)
2270222725
&& !ssl->options.startedETMRead

tests/api/test_tls13.c

Lines changed: 221 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2339,7 +2339,6 @@ static int MERecv(WOLFSSL* ssl, char* buf, int sz, void* ctx)
23392339
int len = (int)msg->length;
23402340

23412341
(void)ssl;
2342-
(void)sz;
23432342

23442343
/* Pass back as much of message as will fit in buffer. */
23452344
if (len > sz)
@@ -2572,7 +2571,6 @@ int test_tls13_duplicate_extension(void)
25722571
}
25732572

25742573

2575-
25762574
int test_key_share_mismatch(void)
25772575
{
25782576
EXPECT_DECLS;
@@ -2652,3 +2650,224 @@ int test_key_share_mismatch(void)
26522650
#endif
26532651
return EXPECT_RESULT();
26542652
}
2653+
2654+
2655+
#if defined(WOLFSSL_TLS13) && !defined(NO_RSA) && defined(HAVE_ECC) && \
2656+
defined(HAVE_AESGCM) && !defined(NO_WOLFSSL_SERVER)
2657+
/* Called when writing. */
2658+
static int Tls13PTASend(WOLFSSL* ssl, char* buf, int sz, void* ctx)
2659+
{
2660+
(void)ssl;
2661+
(void)buf;
2662+
(void)ctx;
2663+
2664+
return sz;
2665+
}
2666+
static int Tls13PTARecv(WOLFSSL* ssl, char* buf, int sz, void* ctx)
2667+
{
2668+
WOLFSSL_BUFFER_INFO* msg = (WOLFSSL_BUFFER_INFO*)ctx;
2669+
int len;
2670+
2671+
(void)ssl;
2672+
2673+
if (msg->length == 0) {
2674+
/* Only do as many alerts as required to get to max alert count. */
2675+
msg->buffer[0]--;
2676+
if (msg->buffer[0] > 0) {
2677+
msg->buffer -= 7;
2678+
msg->length += 7;
2679+
}
2680+
else {
2681+
return -1;
2682+
}
2683+
}
2684+
2685+
len = (int)msg->length;
2686+
/* Pass back as much of message as will fit in buffer. */
2687+
if (len > sz)
2688+
len = sz;
2689+
XMEMCPY(buf, msg->buffer, len);
2690+
/* Move over returned data. */
2691+
msg->buffer += len;
2692+
msg->length -= len;
2693+
2694+
/* Amount actually copied. */
2695+
return len;
2696+
}
2697+
#endif
2698+
2699+
int test_tls13_plaintext_alert(void)
2700+
{
2701+
EXPECT_DECLS;
2702+
2703+
#if defined(WOLFSSL_TLS13) && !defined(NO_RSA) && defined(HAVE_ECC) && \
2704+
defined(HAVE_AESGCM) && !defined(NO_WOLFSSL_SERVER)
2705+
byte clientMsgs[] = {
2706+
/* Client Hello */
2707+
0x16, 0x03, 0x03, 0x01, 0x9b, 0x01, 0x00, 0x01,
2708+
0x97, 0x03, 0x03, 0xf4, 0x65, 0xbd, 0x22, 0xfe,
2709+
0x6e, 0xab, 0x66, 0xdd, 0xcf, 0xe9, 0x65, 0x55,
2710+
0xe8, 0xdf, 0xc3, 0x8e, 0x4b, 0x00, 0xbc, 0xf8,
2711+
0x23, 0x57, 0x1b, 0xa0, 0xc8, 0xa9, 0xe2, 0x8c,
2712+
0x91, 0x6e, 0xf9, 0x20, 0xf7, 0x5c, 0xc5, 0x5b,
2713+
0x75, 0x8c, 0x47, 0x0a, 0x0e, 0xc4, 0x1a, 0xda,
2714+
0xef, 0x75, 0xe5, 0x21, 0x00, 0x00, 0x00, 0x00,
2715+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2716+
0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x13, 0x01,
2717+
0x13, 0x02, 0x01, 0x00, 0x01, 0x4a, 0x00, 0x2d,
2718+
0x00, 0x03, 0x02, 0x00, 0x01, 0x00, 0x33, 0x00,
2719+
0x47, 0x00, 0x45, 0x00, 0x17, 0x00, 0x41, 0x04,
2720+
0x90, 0xfc, 0xe2, 0x97, 0x05, 0x7c, 0xb5, 0x23,
2721+
0x5d, 0x5f, 0x5b, 0xcd, 0x0c, 0x1e, 0xe0, 0xe9,
2722+
0xab, 0x38, 0x6b, 0x1e, 0x20, 0x5c, 0x1c, 0x90,
2723+
0x2a, 0x9e, 0x68, 0x8e, 0x70, 0x05, 0x10, 0xa8,
2724+
0x02, 0x1b, 0xf9, 0x5c, 0xef, 0xc9, 0xaf, 0xca,
2725+
0x1a, 0x3b, 0x16, 0x8b, 0xe4, 0x1b, 0x3c, 0x15,
2726+
0xb8, 0x0d, 0xbd, 0xaf, 0x62, 0x8d, 0xa7, 0x13,
2727+
0xa0, 0x7c, 0xe0, 0x59, 0x0c, 0x4f, 0x8a, 0x6d,
2728+
0x00, 0x2b, 0x00, 0x03, 0x02, 0x03, 0x04, 0x00,
2729+
0x0d, 0x00, 0x20, 0x00, 0x1e, 0x06, 0x03, 0x05,
2730+
0x03, 0x04, 0x03, 0x02, 0x03, 0x08, 0x06, 0x08,
2731+
0x0b, 0x08, 0x05, 0x08, 0x0a, 0x08, 0x04, 0x08,
2732+
0x09, 0x06, 0x01, 0x05, 0x01, 0x04, 0x01, 0x03,
2733+
0x01, 0x02, 0x01, 0x00, 0x0a, 0x00, 0x04, 0x00,
2734+
0x02, 0x00, 0x17, 0x00, 0x16, 0x00, 0x00, 0x00,
2735+
0x23, 0x00, 0x00, 0x00, 0x29, 0x00, 0xb9, 0x00,
2736+
0x94, 0x00, 0x8e, 0x0f, 0x12, 0xfa, 0x84, 0x1f,
2737+
0x76, 0x94, 0xd7, 0x09, 0x5e, 0xad, 0x08, 0x51,
2738+
0xb6, 0x80, 0x28, 0x31, 0x8b, 0xfd, 0xc6, 0xbd,
2739+
0x9e, 0xf5, 0x3b, 0x4d, 0x02, 0xbe, 0x1d, 0x73,
2740+
0xea, 0x13, 0x68, 0x00, 0x4c, 0xfd, 0x3d, 0x48,
2741+
0x51, 0xf9, 0x06, 0xbb, 0x92, 0xed, 0x42, 0x9f,
2742+
0x7f, 0x2c, 0x73, 0x9f, 0xd9, 0xb4, 0xef, 0x05,
2743+
0x26, 0x5b, 0x60, 0x5c, 0x0a, 0xfc, 0xa3, 0xbd,
2744+
0x2d, 0x2d, 0x8b, 0xf9, 0xaa, 0x5c, 0x96, 0x3a,
2745+
0xf2, 0xec, 0xfa, 0xe5, 0x57, 0x2e, 0x87, 0xbe,
2746+
0x27, 0xc5, 0x3d, 0x4f, 0x5d, 0xdd, 0xde, 0x1c,
2747+
0x1b, 0xb3, 0xcc, 0x27, 0x27, 0x57, 0x5a, 0xd9,
2748+
0xea, 0x99, 0x27, 0x23, 0xa6, 0x0e, 0xea, 0x9c,
2749+
0x0d, 0x85, 0xcb, 0x72, 0xeb, 0xd7, 0x93, 0xe3,
2750+
0xfe, 0xf7, 0x5c, 0xc5, 0x5b, 0x75, 0x8c, 0x47,
2751+
0x0a, 0x0e, 0xc4, 0x1a, 0xda, 0xef, 0x75, 0xe5,
2752+
0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2753+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2754+
0x00, 0xfb, 0x92, 0xce, 0xaa, 0x00, 0x21, 0x20,
2755+
0xcb, 0x73, 0x25, 0x80, 0x46, 0x78, 0x4f, 0xe5,
2756+
0x34, 0xf6, 0x91, 0x13, 0x7f, 0xc8, 0x8d, 0xdc,
2757+
0x81, 0x04, 0xb7, 0x0d, 0x49, 0x85, 0x2e, 0x12,
2758+
0x7a, 0x07, 0x23, 0xe9, 0x13, 0xa4, 0x6d, 0x8c,
2759+
0x15, 0x03, 0x03, 0x00, 0x02, 0x01, 0x00, 0x00
2760+
};
2761+
2762+
WOLFSSL_CTX* ctx = NULL;
2763+
WOLFSSL* ssl = NULL;
2764+
WOLFSSL_BUFFER_INFO msg;
2765+
2766+
#ifdef WOLFSSL_TLS13_IGNORE_PT_ALERT_ON_ENC
2767+
/* We fail on WOLFSSL_ALERT_COUNT_MAX alerts. */
2768+
2769+
/* Set up wolfSSL context. */
2770+
ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method()));
2771+
ExpectTrue(wolfSSL_CTX_use_certificate_file(ctx, svrCertFile,
2772+
CERT_FILETYPE));
2773+
ExpectTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile,
2774+
CERT_FILETYPE));
2775+
if (EXPECT_SUCCESS()) {
2776+
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL);
2777+
}
2778+
/* Read from 'msg'. */
2779+
wolfSSL_SetIORecv(ctx, Tls13PTARecv);
2780+
/* No where to send to - dummy sender. */
2781+
wolfSSL_SetIOSend(ctx, Tls13PTASend);
2782+
2783+
ExpectNotNull(ssl = wolfSSL_new(ctx));
2784+
msg.buffer = clientMsgs;
2785+
msg.length = (unsigned int)sizeof(clientMsgs) - 1;
2786+
clientMsgs[sizeof(clientMsgs) - 1] = WOLFSSL_ALERT_COUNT_MAX;
2787+
if (EXPECT_SUCCESS()) {
2788+
wolfSSL_SetIOReadCtx(ssl, &msg);
2789+
}
2790+
/* Alert will be ignored until too many. */
2791+
/* Read all message include CertificateVerify with invalid signature
2792+
* algorithm. */
2793+
ExpectIntEQ(wolfSSL_accept(ssl), WC_NO_ERR_TRACE(WOLFSSL_FATAL_ERROR));
2794+
/* Expect an invalid parameter error. */
2795+
ExpectIntEQ(wolfSSL_get_error(ssl, WOLFSSL_FATAL_ERROR),
2796+
WC_NO_ERR_TRACE(ALERT_COUNT_E));
2797+
2798+
wolfSSL_free(ssl);
2799+
ssl = NULL;
2800+
wolfSSL_CTX_free(ctx);
2801+
ctx = NULL;
2802+
2803+
/* Set up wolfSSL context. */
2804+
ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method()));
2805+
ExpectTrue(wolfSSL_CTX_use_certificate_file(ctx, svrCertFile,
2806+
CERT_FILETYPE));
2807+
ExpectTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile,
2808+
CERT_FILETYPE));
2809+
if (EXPECT_SUCCESS()) {
2810+
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL);
2811+
}
2812+
/* Read from 'msg'. */
2813+
wolfSSL_SetIORecv(ctx, Tls13PTARecv);
2814+
/* No where to send to - dummy sender. */
2815+
wolfSSL_SetIOSend(ctx, Tls13PTASend);
2816+
2817+
ExpectNotNull(ssl = wolfSSL_new(ctx));
2818+
msg.buffer = clientMsgs;
2819+
msg.length = (unsigned int)sizeof(clientMsgs) - 1;
2820+
clientMsgs[sizeof(clientMsgs) - 1] = WOLFSSL_ALERT_COUNT_MAX - 1;
2821+
if (EXPECT_SUCCESS()) {
2822+
wolfSSL_SetIOReadCtx(ssl, &msg);
2823+
}
2824+
/* Alert will be ignored until too many. */
2825+
/* Read all message include CertificateVerify with invalid signature
2826+
* algorithm. */
2827+
ExpectIntEQ(wolfSSL_accept(ssl), WC_NO_ERR_TRACE(WOLFSSL_FATAL_ERROR));
2828+
/* Expect an invalid parameter error. */
2829+
ExpectIntEQ(wolfSSL_get_error(ssl, WOLFSSL_FATAL_ERROR),
2830+
WC_NO_ERR_TRACE(SOCKET_ERROR_E));
2831+
2832+
wolfSSL_free(ssl);
2833+
wolfSSL_CTX_free(ctx);
2834+
#else
2835+
/* Fail on plaintext alert when encryption keys on. */
2836+
2837+
/* Set up wolfSSL context. */
2838+
ExpectNotNull(ctx = wolfSSL_CTX_new(wolfTLSv1_3_server_method()));
2839+
ExpectTrue(wolfSSL_CTX_use_certificate_file(ctx, svrCertFile,
2840+
CERT_FILETYPE));
2841+
ExpectTrue(wolfSSL_CTX_use_PrivateKey_file(ctx, svrKeyFile,
2842+
CERT_FILETYPE));
2843+
if (EXPECT_SUCCESS()) {
2844+
wolfSSL_CTX_set_verify(ctx, WOLFSSL_VERIFY_NONE, NULL);
2845+
}
2846+
/* Read from 'msg'. */
2847+
wolfSSL_SetIORecv(ctx, Tls13PTARecv);
2848+
/* No where to send to - dummy sender. */
2849+
wolfSSL_SetIOSend(ctx, Tls13PTASend);
2850+
2851+
ExpectNotNull(ssl = wolfSSL_new(ctx));
2852+
msg.buffer = clientMsgs;
2853+
msg.length = (unsigned int)sizeof(clientMsgs) - 1;
2854+
clientMsgs[sizeof(clientMsgs) - 1] = 1;
2855+
if (EXPECT_SUCCESS()) {
2856+
wolfSSL_SetIOReadCtx(ssl, &msg);
2857+
}
2858+
/* Alert will be ignored until too many. */
2859+
/* Read all message include CertificateVerify with invalid signature
2860+
* algorithm. */
2861+
ExpectIntEQ(wolfSSL_accept(ssl), WC_NO_ERR_TRACE(WOLFSSL_FATAL_ERROR));
2862+
/* Expect an invalid parameter error. */
2863+
ExpectIntEQ(wolfSSL_get_error(ssl, WOLFSSL_FATAL_ERROR),
2864+
WC_NO_ERR_TRACE(PARSE_ERROR));
2865+
2866+
wolfSSL_free(ssl);
2867+
wolfSSL_CTX_free(ctx);
2868+
#endif
2869+
#endif
2870+
2871+
return EXPECT_RESULT();
2872+
}
2873+

0 commit comments

Comments
 (0)