forked from wolfSSL/wolfssl
Store ssl->options.dtlsStateful when exporting DTLS session
This commit is contained in:
@ -1305,6 +1305,14 @@ static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ver > WOLFSSL_EXPORT_VERSION_4) {
|
||||||
|
#ifdef WOLFSSL_DTLS
|
||||||
|
exp[idx++] = options->dtlsStateful;
|
||||||
|
#else
|
||||||
|
exp[idx++] = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* version of connection */
|
/* version of connection */
|
||||||
exp[idx++] = ssl->version.major;
|
exp[idx++] = ssl->version.major;
|
||||||
exp[idx++] = ssl->version.minor;
|
exp[idx++] = ssl->version.minor;
|
||||||
@ -1320,6 +1328,13 @@ static int ExportOptions(WOLFSSL* ssl, byte* exp, word32 len, byte ver,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WOLFSSL_EXPORT_VERSION_4:
|
||||||
|
if (idx != DTLS_EXPORT_OPT_SZ_4 && type == WOLFSSL_EXPORT_DTLS) {
|
||||||
|
WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
|
||||||
|
return DTLS_EXPORT_VER_E;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WOLFSSL_EXPORT_VERSION:
|
case WOLFSSL_EXPORT_VERSION:
|
||||||
if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
|
if (idx != DTLS_EXPORT_OPT_SZ && type == WOLFSSL_EXPORT_DTLS) {
|
||||||
WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
|
WOLFSSL_MSG("Update DTLS_EXPORT_OPT_SZ and version of export");
|
||||||
@ -1355,6 +1370,13 @@ static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WOLFSSL_EXPORT_VERSION_4:
|
||||||
|
if (len < DTLS_EXPORT_OPT_SZ_4) {
|
||||||
|
WOLFSSL_MSG("Sanity check on buffer size failed");
|
||||||
|
return BAD_FUNC_ARG;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WOLFSSL_EXPORT_VERSION_3:
|
case WOLFSSL_EXPORT_VERSION_3:
|
||||||
if (len < DTLS_EXPORT_OPT_SZ_3) {
|
if (len < DTLS_EXPORT_OPT_SZ_3) {
|
||||||
WOLFSSL_MSG("Sanity check on buffer size failed");
|
WOLFSSL_MSG("Sanity check on buffer size failed");
|
||||||
@ -1488,6 +1510,17 @@ static int ImportOptions(WOLFSSL* ssl, const byte* exp, word32 len, byte ver,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we had a connection established, let's assume that we can act
|
||||||
|
* statefully */
|
||||||
|
options->dtlsStateful = 1;
|
||||||
|
if (ver > WOLFSSL_EXPORT_VERSION_4) {
|
||||||
|
#ifdef WOLFSSL_DTLS
|
||||||
|
options->dtlsStateful = exp[idx++];
|
||||||
|
#else
|
||||||
|
idx++;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* version of connection */
|
/* version of connection */
|
||||||
if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
|
if (ssl->version.major != exp[idx++] || ssl->version.minor != exp[idx++]) {
|
||||||
WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
|
WOLFSSL_MSG("Version mismatch ie DTLS v1 vs v1.2");
|
||||||
@ -1556,7 +1589,8 @@ static int ImportPeerInfo(WOLFSSL* ssl, const byte* buf, word32 len, byte ver)
|
|||||||
word16 port;
|
word16 port;
|
||||||
char ip[MAX_EXPORT_IP];
|
char ip[MAX_EXPORT_IP];
|
||||||
|
|
||||||
if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_3) {
|
if (ver != WOLFSSL_EXPORT_VERSION && ver != WOLFSSL_EXPORT_VERSION_4 &&
|
||||||
|
ver != WOLFSSL_EXPORT_VERSION_3) {
|
||||||
WOLFSSL_MSG("Export version not supported");
|
WOLFSSL_MSG("Export version not supported");
|
||||||
return BAD_FUNC_ARG;
|
return BAD_FUNC_ARG;
|
||||||
}
|
}
|
||||||
@ -1814,6 +1848,15 @@ int wolfSSL_session_import_internal(WOLFSSL* ssl, const unsigned char* buf,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WOLFSSL_EXPORT_VERSION_4:
|
||||||
|
if (type == WOLFSSL_EXPORT_DTLS) {
|
||||||
|
optSz = DTLS_EXPORT_OPT_SZ_4;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
optSz = TLS_EXPORT_OPT_SZ;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case WOLFSSL_EXPORT_VERSION_3:
|
case WOLFSSL_EXPORT_VERSION_3:
|
||||||
WOLFSSL_MSG("Importing older version 3");
|
WOLFSSL_MSG("Importing older version 3");
|
||||||
optSz = DTLS_EXPORT_OPT_SZ_3;
|
optSz = DTLS_EXPORT_OPT_SZ_3;
|
||||||
|
120
tests/api.c
120
tests/api.c
@ -438,6 +438,7 @@ typedef struct testVector {
|
|||||||
typedef int (*ctx_cb)(WOLFSSL_CTX* ctx);
|
typedef int (*ctx_cb)(WOLFSSL_CTX* ctx);
|
||||||
typedef int (*ssl_cb)(WOLFSSL* ssl);
|
typedef int (*ssl_cb)(WOLFSSL* ssl);
|
||||||
typedef int (*test_cbType)(WOLFSSL_CTX *ctx, WOLFSSL *ssl);
|
typedef int (*test_cbType)(WOLFSSL_CTX *ctx, WOLFSSL *ssl);
|
||||||
|
typedef int (*hs_cb)(WOLFSSL_CTX **ctx, WOLFSSL **ssl);
|
||||||
|
|
||||||
typedef struct test_ssl_cbf {
|
typedef struct test_ssl_cbf {
|
||||||
method_provider method;
|
method_provider method;
|
||||||
@ -445,6 +446,7 @@ typedef struct test_ssl_cbf {
|
|||||||
ssl_cb ssl_ready;
|
ssl_cb ssl_ready;
|
||||||
ssl_cb on_result;
|
ssl_cb on_result;
|
||||||
ssl_cb on_cleanup;
|
ssl_cb on_cleanup;
|
||||||
|
hs_cb on_handshake;
|
||||||
WOLFSSL_CTX* ctx;
|
WOLFSSL_CTX* ctx;
|
||||||
const char* caPemFile;
|
const char* caPemFile;
|
||||||
const char* certPemFile;
|
const char* certPemFile;
|
||||||
@ -6156,6 +6158,14 @@ int test_wolfSSL_client_server_nofail_memio(test_ssl_cbf* client_cb,
|
|||||||
ExpectIntEQ(client_on_handshake(test_ctx.c_ctx, test_ctx.c_ssl),
|
ExpectIntEQ(client_on_handshake(test_ctx.c_ctx, test_ctx.c_ssl),
|
||||||
TEST_SUCCESS);
|
TEST_SUCCESS);
|
||||||
}
|
}
|
||||||
|
if (client_cb->on_handshake != NULL) {
|
||||||
|
ExpectIntEQ(client_cb->on_handshake(&test_ctx.c_ctx, &test_ctx.c_ssl),
|
||||||
|
TEST_SUCCESS);
|
||||||
|
}
|
||||||
|
if (server_cb->on_handshake != NULL) {
|
||||||
|
ExpectIntEQ(server_cb->on_handshake(&test_ctx.s_ctx, &test_ctx.s_ssl),
|
||||||
|
TEST_SUCCESS);
|
||||||
|
}
|
||||||
#ifdef WOLFSSL_HAVE_TLS_UNIQUE
|
#ifdef WOLFSSL_HAVE_TLS_UNIQUE
|
||||||
XMEMSET(server_side_msg2, 0, MD_MAX_SIZE);
|
XMEMSET(server_side_msg2, 0, MD_MAX_SIZE);
|
||||||
msg_len = wolfSSL_get_peer_finished(test_ctx.s_ssl, server_side_msg2,
|
msg_len = wolfSSL_get_peer_finished(test_ctx.s_ssl, server_side_msg2,
|
||||||
@ -9330,7 +9340,6 @@ static int test_wolfSSL_dtls_export(void)
|
|||||||
return EXPECT_RESULT();
|
return EXPECT_RESULT();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(WOLFSSL_SESSION_EXPORT) && !defined(WOLFSSL_NO_TLS12)
|
#if defined(WOLFSSL_SESSION_EXPORT) && !defined(WOLFSSL_NO_TLS12)
|
||||||
#ifdef WOLFSSL_TLS13
|
#ifdef WOLFSSL_TLS13
|
||||||
static const byte canned_client_tls13_session[] = {
|
static const byte canned_client_tls13_session[] = {
|
||||||
@ -10214,6 +10223,114 @@ static int test_wolfSSL_SNI_GetFromBuffer(void)
|
|||||||
|
|
||||||
#endif /* HAVE_IO_TESTS_DEPENDENCIES */
|
#endif /* HAVE_IO_TESTS_DEPENDENCIES */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SESSION_EXPORT) && \
|
||||||
|
defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES)
|
||||||
|
/* Dummy peer functions to satisfy the exporter/importer */
|
||||||
|
static int test_wolfSSL_dtls_export_peers_get_peer(WOLFSSL* ssl, char* ip,
|
||||||
|
int* ipSz, unsigned short* port, int* fam)
|
||||||
|
{
|
||||||
|
(void)ssl;
|
||||||
|
ip[0] = -1;
|
||||||
|
*ipSz = 1;
|
||||||
|
*port = 1;
|
||||||
|
*fam = 2;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_wolfSSL_dtls_export_peers_set_peer(WOLFSSL* ssl, char* ip,
|
||||||
|
int ipSz, unsigned short port, int fam)
|
||||||
|
{
|
||||||
|
(void)ssl;
|
||||||
|
if (ip[0] != -1 || ipSz != 1 || port != 1 || fam != 2)
|
||||||
|
return 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int test_wolfSSL_dtls_export_peers_on_handshake(WOLFSSL_CTX **ctx,
|
||||||
|
WOLFSSL **ssl)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
unsigned char* sessionBuf = NULL;
|
||||||
|
unsigned int sessionSz = 0;
|
||||||
|
void* ioWriteCtx = wolfSSL_GetIOWriteCtx(*ssl);
|
||||||
|
void* ioReadCtx = wolfSSL_GetIOReadCtx(*ssl);
|
||||||
|
|
||||||
|
wolfSSL_CTX_SetIOGetPeer(*ctx, test_wolfSSL_dtls_export_peers_get_peer);
|
||||||
|
wolfSSL_CTX_SetIOSetPeer(*ctx, test_wolfSSL_dtls_export_peers_set_peer);
|
||||||
|
ExpectIntGE(wolfSSL_dtls_export(*ssl, NULL, &sessionSz), 0);
|
||||||
|
ExpectNotNull(sessionBuf =
|
||||||
|
(unsigned char*)XMALLOC(sessionSz, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER));
|
||||||
|
ExpectIntGE(wolfSSL_dtls_export(*ssl, sessionBuf, &sessionSz), 0);
|
||||||
|
wolfSSL_free(*ssl);
|
||||||
|
*ssl = NULL;
|
||||||
|
ExpectNotNull(*ssl = wolfSSL_new(*ctx));
|
||||||
|
ExpectIntGE(wolfSSL_dtls_import(*ssl, sessionBuf, sessionSz), 0);
|
||||||
|
wolfSSL_SetIOWriteCtx(*ssl, ioWriteCtx);
|
||||||
|
wolfSSL_SetIOReadCtx(*ssl, ioReadCtx);
|
||||||
|
|
||||||
|
XFREE(sessionBuf, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int test_wolfSSL_dtls_export_peers(void)
|
||||||
|
{
|
||||||
|
EXPECT_DECLS;
|
||||||
|
#if defined(WOLFSSL_DTLS) && defined(WOLFSSL_SESSION_EXPORT) && \
|
||||||
|
defined(HAVE_SSL_MEMIO_TESTS_DEPENDENCIES)
|
||||||
|
test_ssl_cbf client_cbf;
|
||||||
|
test_ssl_cbf server_cbf;
|
||||||
|
size_t i, j;
|
||||||
|
struct test_params {
|
||||||
|
method_provider client_meth;
|
||||||
|
method_provider server_meth;
|
||||||
|
const char* dtls_version;
|
||||||
|
} params[] = {
|
||||||
|
#ifndef NO_OLD_TLS
|
||||||
|
{wolfDTLSv1_client_method, wolfDTLSv1_server_method, "1.0"},
|
||||||
|
#endif
|
||||||
|
{wolfDTLSv1_2_client_method, wolfDTLSv1_2_server_method, "1.2"},
|
||||||
|
/* TODO DTLS 1.3 exporting not supported
|
||||||
|
#ifdef WOLFSSL_DTLS13
|
||||||
|
{wolfDTLSv1_3_client_method, wolfDTLSv1_3_server_method, "1.3"},
|
||||||
|
#endif
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i < sizeof(params)/sizeof(*params); i++) {
|
||||||
|
for (j = 0; j <= 0b11; j++) {
|
||||||
|
XMEMSET(&client_cbf, 0, sizeof(client_cbf));
|
||||||
|
XMEMSET(&server_cbf, 0, sizeof(server_cbf));
|
||||||
|
|
||||||
|
printf("\n\tTesting DTLS %s connection;", params[i].dtls_version);
|
||||||
|
|
||||||
|
client_cbf.method = params[i].client_meth;
|
||||||
|
server_cbf.method = params[i].server_meth;
|
||||||
|
|
||||||
|
if (j & 0b01) {
|
||||||
|
client_cbf.on_handshake =
|
||||||
|
test_wolfSSL_dtls_export_peers_on_handshake;
|
||||||
|
printf(" With client export;");
|
||||||
|
}
|
||||||
|
if (j & 0b10) {
|
||||||
|
server_cbf.on_handshake =
|
||||||
|
test_wolfSSL_dtls_export_peers_on_handshake;
|
||||||
|
printf(" With server export;");
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
ExpectIntEQ(test_wolfSSL_client_server_nofail_memio(&client_cbf,
|
||||||
|
&server_cbf, NULL), TEST_SUCCESS);
|
||||||
|
if (!EXPECT_SUCCESS())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return EXPECT_RESULT();
|
||||||
|
}
|
||||||
|
|
||||||
static int test_wolfSSL_UseTrustedCA(void)
|
static int test_wolfSSL_UseTrustedCA(void)
|
||||||
{
|
{
|
||||||
EXPECT_DECLS;
|
EXPECT_DECLS;
|
||||||
@ -69634,6 +69751,7 @@ TEST_CASE testCases[] = {
|
|||||||
/* Uses Assert in handshake callback. */
|
/* Uses Assert in handshake callback. */
|
||||||
TEST_DECL(test_wolfSSL_tls_export),
|
TEST_DECL(test_wolfSSL_tls_export),
|
||||||
#endif
|
#endif
|
||||||
|
TEST_DECL(test_wolfSSL_dtls_export_peers),
|
||||||
TEST_DECL(test_wolfSSL_SetMinVersion),
|
TEST_DECL(test_wolfSSL_SetMinVersion),
|
||||||
TEST_DECL(test_wolfSSL_CTX_SetMinVersion),
|
TEST_DECL(test_wolfSSL_CTX_SetMinVersion),
|
||||||
|
|
||||||
|
@ -1652,7 +1652,8 @@ enum Misc {
|
|||||||
DTLS_EXPORT_PRO = 165,/* wolfSSL protocol for serialized session */
|
DTLS_EXPORT_PRO = 165,/* wolfSSL protocol for serialized session */
|
||||||
DTLS_EXPORT_STATE_PRO = 166,/* wolfSSL protocol for serialized state */
|
DTLS_EXPORT_STATE_PRO = 166,/* wolfSSL protocol for serialized state */
|
||||||
TLS_EXPORT_PRO = 167,/* wolfSSL protocol for serialized TLS */
|
TLS_EXPORT_PRO = 167,/* wolfSSL protocol for serialized TLS */
|
||||||
DTLS_EXPORT_OPT_SZ = 61, /* amount of bytes used from Options */
|
DTLS_EXPORT_OPT_SZ = 62, /* amount of bytes used from Options */
|
||||||
|
DTLS_EXPORT_OPT_SZ_4 = 61, /* amount of bytes used from Options */
|
||||||
TLS_EXPORT_OPT_SZ = 65, /* amount of bytes used from Options */
|
TLS_EXPORT_OPT_SZ = 65, /* amount of bytes used from Options */
|
||||||
DTLS_EXPORT_OPT_SZ_3 = 60, /* amount of bytes used from Options */
|
DTLS_EXPORT_OPT_SZ_3 = 60, /* amount of bytes used from Options */
|
||||||
DTLS_EXPORT_KEY_SZ = 325 + (DTLS_SEQ_SZ * 2),
|
DTLS_EXPORT_KEY_SZ = 325 + (DTLS_SEQ_SZ * 2),
|
||||||
@ -1665,8 +1666,9 @@ enum Misc {
|
|||||||
WOLFSSL_EXPORT_SPC_SZ = 16, /* amount of bytes used from CipherSpecs */
|
WOLFSSL_EXPORT_SPC_SZ = 16, /* amount of bytes used from CipherSpecs */
|
||||||
#endif
|
#endif
|
||||||
WOLFSSL_EXPORT_LEN = 2, /* 2 bytes for length and protocol */
|
WOLFSSL_EXPORT_LEN = 2, /* 2 bytes for length and protocol */
|
||||||
WOLFSSL_EXPORT_VERSION = 4, /* wolfSSL version for serialized session */
|
WOLFSSL_EXPORT_VERSION = 5, /* wolfSSL version for serialized session */
|
||||||
|
|
||||||
|
WOLFSSL_EXPORT_VERSION_4 = 4, /* 5.6.4 release and before */
|
||||||
/* older export versions supported */
|
/* older export versions supported */
|
||||||
WOLFSSL_EXPORT_VERSION_3 = 3, /* wolfSSL version before TLS 1.3 addition */
|
WOLFSSL_EXPORT_VERSION_3 = 3, /* wolfSSL version before TLS 1.3 addition */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user