forked from wolfSSL/wolfssl
Merge pull request #2984 from julek-wolfssl/dtls-scr
Add secure renegotiation to DTLS 1.2
This commit is contained in:
@@ -3050,13 +3050,28 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
|
||||
} else {
|
||||
if (!resumeScr) {
|
||||
printf("Beginning secure rengotiation.\n");
|
||||
if (wolfSSL_Rehandshake(ssl) != WOLFSSL_SUCCESS) {
|
||||
if ((ret = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS) {
|
||||
err = wolfSSL_get_error(ssl, 0);
|
||||
printf("err = %d, %s\n", err,
|
||||
wolfSSL_ERR_error_string(err, buffer));
|
||||
wolfSSL_free(ssl); ssl = NULL;
|
||||
wolfSSL_CTX_free(ctx); ctx = NULL;
|
||||
err_sys("wolfSSL_Rehandshake failed");
|
||||
#ifdef WOLFSSL_ASYNC_CRYPT
|
||||
while (err == WC_PENDING_E) {
|
||||
err = 0;
|
||||
ret = wolfSSL_negotiate(ssl);
|
||||
if (ret != WOLFSSL_SUCCESS) {
|
||||
err = wolfSSL_get_error(ssl, 0);
|
||||
if (err == WC_PENDING_E) {
|
||||
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
|
||||
if (ret < 0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (ret != WOLFSSL_SUCCESS) {
|
||||
printf("err = %d, %s\n", err,
|
||||
wolfSSL_ERR_error_string(err, buffer));
|
||||
wolfSSL_free(ssl); ssl = NULL;
|
||||
wolfSSL_CTX_free(ctx); ctx = NULL;
|
||||
err_sys("wolfSSL_Rehandshake failed");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("RENEGOTIATION SUCCESSFUL\n");
|
||||
@@ -3064,13 +3079,28 @@ THREAD_RETURN WOLFSSL_THREAD client_test(void* args)
|
||||
}
|
||||
else {
|
||||
printf("Beginning secure resumption.\n");
|
||||
if (wolfSSL_SecureResume(ssl) != WOLFSSL_SUCCESS) {
|
||||
if ((ret = wolfSSL_SecureResume(ssl)) != WOLFSSL_SUCCESS) {
|
||||
err = wolfSSL_get_error(ssl, 0);
|
||||
printf("err = %d, %s\n", err,
|
||||
wolfSSL_ERR_error_string(err, buffer));
|
||||
wolfSSL_free(ssl); ssl = NULL;
|
||||
wolfSSL_CTX_free(ctx); ctx = NULL;
|
||||
err_sys("wolfSSL_SecureResume failed");
|
||||
#ifdef WOLFSSL_ASYNC_CRYPT
|
||||
while (err == WC_PENDING_E) {
|
||||
err = 0;
|
||||
ret = wolfSSL_negotiate(ssl);
|
||||
if (ret != WOLFSSL_SUCCESS) {
|
||||
err = wolfSSL_get_error(ssl, 0);
|
||||
if (err == WC_PENDING_E) {
|
||||
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
|
||||
if (ret < 0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (ret != WOLFSSL_SUCCESS) {
|
||||
printf("err = %d, %s\n", err,
|
||||
wolfSSL_ERR_error_string(err, buffer));
|
||||
wolfSSL_free(ssl); ssl = NULL;
|
||||
wolfSSL_CTX_free(ctx); ctx = NULL;
|
||||
err_sys("wolfSSL_SecureResume failed");
|
||||
}
|
||||
}
|
||||
else {
|
||||
printf("SECURE RESUMPTION SUCCESSFUL\n");
|
||||
|
@@ -2385,8 +2385,23 @@ THREAD_RETURN WOLFSSL_THREAD server_test(void* args)
|
||||
printf("not doing secure renegotiation on example with"
|
||||
" nonblocking yet\n");
|
||||
} else {
|
||||
if (wolfSSL_Rehandshake(ssl) != WOLFSSL_SUCCESS) {
|
||||
printf("not doing secure renegotiation\n");
|
||||
if ((ret = wolfSSL_Rehandshake(ssl)) != WOLFSSL_SUCCESS) {
|
||||
#ifdef WOLFSSL_ASYNC_CRYPT
|
||||
err = wolfSSL_get_error(ssl, 0);
|
||||
while (err == WC_PENDING_E) {
|
||||
err = 0;
|
||||
ret = wolfSSL_negotiate(ssl);
|
||||
if (ret != WOLFSSL_SUCCESS) {
|
||||
err = wolfSSL_get_error(ssl, 0);
|
||||
if (err == WC_PENDING_E) {
|
||||
ret = wolfSSL_AsyncPoll(ssl, WOLF_POLL_FLAG_CHECK_HW);
|
||||
if (ret < 0) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ret != WOLFSSL_SUCCESS)
|
||||
#endif
|
||||
printf("not doing secure renegotiation\n");
|
||||
}
|
||||
else {
|
||||
printf("RENEGOTIATION SUCCESSFUL\n");
|
||||
|
1241
src/internal.c
1241
src/internal.c
File diff suppressed because it is too large
Load Diff
103
src/keys.c
103
src/keys.c
@@ -3066,7 +3066,11 @@ int SetKeysSide(WOLFSSL* ssl, enum encrypt_side side)
|
||||
#ifdef HAVE_SECURE_RENEGOTIATION
|
||||
if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status) {
|
||||
keys = &ssl->secure_renegotiation->tmp_keys;
|
||||
copy = 1;
|
||||
#ifdef WOLFSSL_DTLS
|
||||
/* For DTLS, copy is done in StoreKeys */
|
||||
if (!ssl->options.dtls)
|
||||
#endif
|
||||
copy = 1;
|
||||
}
|
||||
#endif /* HAVE_SECURE_RENEGOTIATION */
|
||||
|
||||
@@ -3141,6 +3145,15 @@ int SetKeysSide(WOLFSSL* ssl, enum encrypt_side side)
|
||||
ssl->heap, ssl->devId, ssl->rng, ssl->options.tls1_3);
|
||||
|
||||
#ifdef HAVE_SECURE_RENEGOTIATION
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (ret == 0 && ssl->options.dtls) {
|
||||
if (wc_encrypt)
|
||||
wc_encrypt->src = keys == &ssl->keys ? KEYS : SCR;
|
||||
if (wc_decrypt)
|
||||
wc_decrypt->src = keys == &ssl->keys ? KEYS : SCR;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (copy) {
|
||||
int clientCopy = 0;
|
||||
|
||||
@@ -3217,11 +3230,26 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side)
|
||||
{
|
||||
int sz, i = 0;
|
||||
Keys* keys = &ssl->keys;
|
||||
#ifdef WOLFSSL_DTLS
|
||||
/* In case of DTLS, ssl->keys is updated here */
|
||||
int scr_copy = 0;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SECURE_RENEGOTIATION
|
||||
if (ssl->secure_renegotiation && ssl->secure_renegotiation->cache_status ==
|
||||
SCR_CACHE_NEEDED) {
|
||||
if (ssl->secure_renegotiation &&
|
||||
ssl->secure_renegotiation->cache_status == SCR_CACHE_NEEDED) {
|
||||
keys = &ssl->secure_renegotiation->tmp_keys;
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (ssl->options.dtls) {
|
||||
/* epoch is incremented after StoreKeys is called */
|
||||
ssl->secure_renegotiation->tmp_keys.dtls_epoch = ssl->keys.dtls_epoch + 1;
|
||||
/* we only need to copy keys on second and future renegotiations */
|
||||
if (ssl->keys.dtls_epoch > 1)
|
||||
scr_copy = 1;
|
||||
ssl->encrypt.src = KEYS_NOT_SET;
|
||||
ssl->decrypt.src = KEYS_NOT_SET;
|
||||
}
|
||||
#endif
|
||||
CacheStatusPP(ssl->secure_renegotiation);
|
||||
}
|
||||
#endif /* HAVE_SECURE_RENEGOTIATION */
|
||||
@@ -3232,23 +3260,54 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side)
|
||||
if (ssl->specs.cipher_type != aead) {
|
||||
sz = ssl->specs.hash_size;
|
||||
#ifndef WOLFSSL_AEAD_ONLY
|
||||
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy) {
|
||||
XMEMCPY(ssl->keys.client_write_MAC_secret,
|
||||
keys->client_write_MAC_secret, sz);
|
||||
XMEMCPY(ssl->keys.server_write_MAC_secret,
|
||||
keys->server_write_MAC_secret, sz);
|
||||
}
|
||||
#endif
|
||||
XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz);
|
||||
XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz);
|
||||
#endif
|
||||
i += sz;
|
||||
}
|
||||
sz = ssl->specs.key_size;
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy) {
|
||||
XMEMCPY(ssl->keys.client_write_key,
|
||||
keys->client_write_key, sz);
|
||||
XMEMCPY(ssl->keys.server_write_key,
|
||||
keys->server_write_key, sz);
|
||||
}
|
||||
#endif
|
||||
XMEMCPY(keys->client_write_key, &keyData[i], sz);
|
||||
XMEMCPY(keys->server_write_key, &keyData[i], sz);
|
||||
i += sz;
|
||||
|
||||
sz = ssl->specs.iv_size;
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy) {
|
||||
XMEMCPY(ssl->keys.client_write_IV,
|
||||
keys->client_write_IV, sz);
|
||||
XMEMCPY(ssl->keys.server_write_IV,
|
||||
keys->server_write_IV, sz);
|
||||
}
|
||||
#endif
|
||||
XMEMCPY(keys->client_write_IV, &keyData[i], sz);
|
||||
XMEMCPY(keys->server_write_IV, &keyData[i], sz);
|
||||
|
||||
#ifdef HAVE_AEAD
|
||||
if (ssl->specs.cipher_type == aead) {
|
||||
/* Initialize the AES-GCM/CCM explicit IV to a zero. */
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy) {
|
||||
XMEMCPY(ssl->keys.aead_exp_IV,
|
||||
keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
|
||||
}
|
||||
#endif
|
||||
XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ);
|
||||
}
|
||||
#endif /* HAVE_AEAD */
|
||||
@@ -3261,12 +3320,22 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side)
|
||||
sz = ssl->specs.hash_size;
|
||||
if (side & PROVISION_CLIENT) {
|
||||
#ifndef WOLFSSL_AEAD_ONLY
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy)
|
||||
XMEMCPY(ssl->keys.client_write_MAC_secret,
|
||||
keys->client_write_MAC_secret, sz);
|
||||
#endif
|
||||
XMEMCPY(keys->client_write_MAC_secret,&keyData[i], sz);
|
||||
#endif
|
||||
i += sz;
|
||||
}
|
||||
if (side & PROVISION_SERVER) {
|
||||
#ifndef WOLFSSL_AEAD_ONLY
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy)
|
||||
XMEMCPY(ssl->keys.server_write_MAC_secret,
|
||||
keys->server_write_MAC_secret, sz);
|
||||
#endif
|
||||
XMEMCPY(keys->server_write_MAC_secret,&keyData[i], sz);
|
||||
#endif
|
||||
i += sz;
|
||||
@@ -3274,25 +3343,51 @@ int StoreKeys(WOLFSSL* ssl, const byte* keyData, int side)
|
||||
}
|
||||
sz = ssl->specs.key_size;
|
||||
if (side & PROVISION_CLIENT) {
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy)
|
||||
XMEMCPY(ssl->keys.client_write_key,
|
||||
keys->client_write_key, sz);
|
||||
#endif
|
||||
XMEMCPY(keys->client_write_key, &keyData[i], sz);
|
||||
i += sz;
|
||||
}
|
||||
if (side & PROVISION_SERVER) {
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy)
|
||||
XMEMCPY(ssl->keys.server_write_key,
|
||||
keys->server_write_key, sz);
|
||||
#endif
|
||||
XMEMCPY(keys->server_write_key, &keyData[i], sz);
|
||||
i += sz;
|
||||
}
|
||||
|
||||
sz = ssl->specs.iv_size;
|
||||
if (side & PROVISION_CLIENT) {
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy)
|
||||
XMEMCPY(ssl->keys.client_write_IV,
|
||||
keys->client_write_IV, sz);
|
||||
#endif
|
||||
XMEMCPY(keys->client_write_IV, &keyData[i], sz);
|
||||
i += sz;
|
||||
}
|
||||
if (side & PROVISION_SERVER)
|
||||
if (side & PROVISION_SERVER) {
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy)
|
||||
XMEMCPY(ssl->keys.server_write_IV,
|
||||
keys->server_write_IV, sz);
|
||||
#endif
|
||||
XMEMCPY(keys->server_write_IV, &keyData[i], sz);
|
||||
}
|
||||
|
||||
#ifdef HAVE_AEAD
|
||||
if (ssl->specs.cipher_type == aead) {
|
||||
/* Initialize the AES-GCM/CCM explicit IV to a zero. */
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (scr_copy)
|
||||
XMEMCPY(ssl->keys.aead_exp_IV,
|
||||
keys->aead_exp_IV, AEAD_MAX_EXP_SZ);
|
||||
#endif
|
||||
XMEMSET(keys->aead_exp_IV, 0, AEAD_MAX_EXP_SZ);
|
||||
}
|
||||
#endif
|
||||
|
72
src/ssl.c
72
src/ssl.c
@@ -1647,7 +1647,7 @@ int wolfSSL_GetOutputSize(WOLFSSL* ssl, int inSz)
|
||||
if (inSz > maxSize)
|
||||
return INPUT_SIZE_E;
|
||||
|
||||
return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0);
|
||||
return BuildMessage(ssl, NULL, 0, NULL, inSz, application_data, 0, 1, 0, CUR_ORDER);
|
||||
}
|
||||
|
||||
|
||||
@@ -2706,7 +2706,8 @@ static int _Rehandshake(WOLFSSL* ssl)
|
||||
}
|
||||
}
|
||||
ret = wolfSSL_negotiate(ssl);
|
||||
ssl->secure_rene_count++;
|
||||
if (ret == WOLFSSL_SUCCESS)
|
||||
ssl->secure_rene_count++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -3228,6 +3229,57 @@ int wolfSSL_UseClientSuites(WOLFSSL* ssl)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef WOLFSSL_DTLS
|
||||
const byte* wolfSSL_GetDtlsMacSecret(WOLFSSL* ssl, int verify, int epochOrder)
|
||||
{
|
||||
#ifndef WOLFSSL_AEAD_ONLY
|
||||
Keys* keys = NULL;
|
||||
|
||||
(void)epochOrder;
|
||||
|
||||
if (ssl == NULL)
|
||||
return NULL;
|
||||
|
||||
#ifdef HAVE_SECURE_RENEGOTIATION
|
||||
switch (epochOrder) {
|
||||
case PEER_ORDER:
|
||||
if (IsDtlsMsgSCRKeys(ssl))
|
||||
keys = &ssl->secure_renegotiation->tmp_keys;
|
||||
else
|
||||
keys = &ssl->keys;
|
||||
break;
|
||||
case PREV_ORDER:
|
||||
keys = &ssl->keys;
|
||||
break;
|
||||
case CUR_ORDER:
|
||||
if (DtlsUseSCRKeys(ssl))
|
||||
keys = &ssl->secure_renegotiation->tmp_keys;
|
||||
else
|
||||
keys = &ssl->keys;
|
||||
break;
|
||||
default:
|
||||
WOLFSSL_MSG("Unknown epoch order");
|
||||
return NULL;
|
||||
}
|
||||
#else
|
||||
keys = &ssl->keys;
|
||||
#endif
|
||||
|
||||
if ( (ssl->options.side == WOLFSSL_CLIENT_END && !verify) ||
|
||||
(ssl->options.side == WOLFSSL_SERVER_END && verify) )
|
||||
return keys->client_write_MAC_secret;
|
||||
else
|
||||
return keys->server_write_MAC_secret;
|
||||
#else
|
||||
(void)ssl;
|
||||
(void)verify;
|
||||
(void)epochOrder;
|
||||
|
||||
return NULL;
|
||||
#endif
|
||||
}
|
||||
#endif /* WOLFSSL_DTLS */
|
||||
|
||||
const byte* wolfSSL_GetMacSecret(WOLFSSL* ssl, int verify)
|
||||
{
|
||||
#ifndef WOLFSSL_AEAD_ONLY
|
||||
@@ -11713,6 +11765,14 @@ int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
|
||||
}
|
||||
#endif /* WOLFSSL_DTLS */
|
||||
|
||||
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
|
||||
/* This may be necessary in async so that we don't try to
|
||||
* renegotiate again */
|
||||
if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
|
||||
ssl->secure_renegotiation->startScr = 0;
|
||||
}
|
||||
#endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
|
||||
|
||||
WOLFSSL_LEAVE("SSL_connect()", WOLFSSL_SUCCESS);
|
||||
return WOLFSSL_SUCCESS;
|
||||
|
||||
@@ -12094,6 +12154,14 @@ int wolfSSL_DTLS_SetCookieSecret(WOLFSSL* ssl,
|
||||
}
|
||||
#endif /* WOLFSSL_DTLS */
|
||||
|
||||
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(HAVE_SECURE_RENEGOTIATION)
|
||||
/* This may be necessary in async so that we don't try to
|
||||
* renegotiate again */
|
||||
if (ssl->secure_renegotiation && ssl->secure_renegotiation->startScr) {
|
||||
ssl->secure_renegotiation->startScr = 0;
|
||||
}
|
||||
#endif /* WOLFSSL_ASYNC_CRYPT && HAVE_SECURE_RENEGOTIATION */
|
||||
|
||||
#ifdef WOLFSSL_SESSION_EXPORT
|
||||
if (ssl->dtls_export) {
|
||||
if ((ssl->error = wolfSSL_send_session(ssl)) != 0) {
|
||||
|
85
src/tls.c
85
src/tls.c
@@ -643,71 +643,6 @@ int wolfSSL_make_eap_keys(WOLFSSL* ssl, void* msk, unsigned int len,
|
||||
}
|
||||
|
||||
|
||||
static WC_INLINE void GetSEQIncrement(WOLFSSL* ssl, int verify, word32 seq[2])
|
||||
{
|
||||
if (verify) {
|
||||
seq[0] = ssl->keys.peer_sequence_number_hi;
|
||||
seq[1] = ssl->keys.peer_sequence_number_lo++;
|
||||
if (seq[1] > ssl->keys.peer_sequence_number_lo) {
|
||||
/* handle rollover */
|
||||
ssl->keys.peer_sequence_number_hi++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
seq[0] = ssl->keys.sequence_number_hi;
|
||||
seq[1] = ssl->keys.sequence_number_lo++;
|
||||
if (seq[1] > ssl->keys.sequence_number_lo) {
|
||||
/* handle rollover */
|
||||
ssl->keys.sequence_number_hi++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#ifdef WOLFSSL_DTLS
|
||||
static WC_INLINE void DtlsGetSEQ(WOLFSSL* ssl, int order, word32 seq[2])
|
||||
{
|
||||
if (order == PREV_ORDER) {
|
||||
/* Previous epoch case */
|
||||
seq[0] = (((word32)ssl->keys.dtls_epoch - 1) << 16) |
|
||||
(ssl->keys.dtls_prev_sequence_number_hi & 0xFFFF);
|
||||
seq[1] = ssl->keys.dtls_prev_sequence_number_lo;
|
||||
}
|
||||
else if (order == PEER_ORDER) {
|
||||
seq[0] = ((word32)ssl->keys.curEpoch << 16) |
|
||||
(ssl->keys.curSeq_hi & 0xFFFF);
|
||||
seq[1] = ssl->keys.curSeq_lo; /* explicit from peer */
|
||||
}
|
||||
else {
|
||||
seq[0] = ((word32)ssl->keys.dtls_epoch << 16) |
|
||||
(ssl->keys.dtls_sequence_number_hi & 0xFFFF);
|
||||
seq[1] = ssl->keys.dtls_sequence_number_lo;
|
||||
}
|
||||
}
|
||||
#endif /* WOLFSSL_DTLS */
|
||||
|
||||
|
||||
static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
|
||||
{
|
||||
word32 seq[2] = {0, 0};
|
||||
|
||||
if (!ssl->options.dtls) {
|
||||
GetSEQIncrement(ssl, verifyOrder, seq);
|
||||
}
|
||||
else {
|
||||
#ifdef WOLFSSL_DTLS
|
||||
DtlsGetSEQ(ssl, verifyOrder, seq);
|
||||
#endif
|
||||
}
|
||||
|
||||
c32toa(seq[0], out);
|
||||
c32toa(seq[1], out + OPAQUE32_LEN);
|
||||
}
|
||||
|
||||
|
||||
/*** end copy ***/
|
||||
|
||||
|
||||
/* return HMAC digest type in wolfSSL format */
|
||||
int wolfSSL_GetHmacType(WOLFSSL* ssl)
|
||||
{
|
||||
@@ -1169,11 +1104,12 @@ static int Hmac_UpdateFinal(Hmac* hmac, byte* digest, const byte* in,
|
||||
#endif
|
||||
|
||||
int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
|
||||
int content, int verify)
|
||||
int content, int verify, int epochOrder)
|
||||
{
|
||||
Hmac hmac;
|
||||
byte myInner[WOLFSSL_TLS_HMAC_INNER_SZ];
|
||||
int ret = 0;
|
||||
const byte* macSecret = NULL;
|
||||
word32 hashSz = 0;
|
||||
|
||||
if (ssl == NULL)
|
||||
@@ -1199,7 +1135,10 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
|
||||
}
|
||||
#endif
|
||||
|
||||
wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
|
||||
if (!ssl->options.dtls)
|
||||
wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, verify);
|
||||
else
|
||||
wolfSSL_SetTlsHmacInner(ssl, myInner, sz, content, epochOrder);
|
||||
#if defined(WOLFSSL_RENESAS_TSIP_TLS) && \
|
||||
!defined(NO_WOLFSSL_RENESAS_TSIP_TLS_SESSION)
|
||||
if (tsip_useable(ssl)) {
|
||||
@@ -1219,9 +1158,19 @@ int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in, word32 sz, int padSz,
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
|
||||
#ifdef WOLFSSL_DTLS
|
||||
if (ssl->options.dtls)
|
||||
macSecret = wolfSSL_GetDtlsMacSecret(ssl, verify, epochOrder);
|
||||
else
|
||||
macSecret = wolfSSL_GetMacSecret(ssl, verify);
|
||||
#else
|
||||
macSecret = wolfSSL_GetMacSecret(ssl, verify);
|
||||
#endif
|
||||
ret = wc_HmacSetKey(&hmac, wolfSSL_GetHmacType(ssl),
|
||||
wolfSSL_GetMacSecret(ssl, verify),
|
||||
macSecret,
|
||||
ssl->specs.hash_size);
|
||||
|
||||
if (ret == 0) {
|
||||
/* Constant time verification required. */
|
||||
if (verify && padSz >= 0) {
|
||||
|
@@ -1474,7 +1474,7 @@ static void AddTls13FragHeaders(byte* output, word32 fragSz, word32 fragOffset,
|
||||
* verifyOrder Which set of sequence numbers to use.
|
||||
* out The buffer to write into.
|
||||
*/
|
||||
static WC_INLINE void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out)
|
||||
static WC_INLINE void WriteSEQTls13(WOLFSSL* ssl, int verifyOrder, byte* out)
|
||||
{
|
||||
word32 seq[2] = {0, 0};
|
||||
|
||||
@@ -1510,7 +1510,7 @@ static WC_INLINE void BuildTls13Nonce(WOLFSSL* ssl, byte* nonce, const byte* iv,
|
||||
int i;
|
||||
|
||||
/* The nonce is the IV with the sequence XORed into the last bytes. */
|
||||
WriteSEQ(ssl, order, nonce + AEAD_NONCE_SZ - SEQ_SZ);
|
||||
WriteSEQTls13(ssl, order, nonce + AEAD_NONCE_SZ - SEQ_SZ);
|
||||
for (i = 0; i < AEAD_NONCE_SZ - SEQ_SZ; i++)
|
||||
nonce[i] = iv[i];
|
||||
for (; i < AEAD_NONCE_SZ; i++)
|
||||
|
@@ -318,7 +318,9 @@ int EmbedReceiveFrom(WOLFSSL *ssl, char *buf, int sz, void *ctx)
|
||||
|
||||
WOLFSSL_ENTER("EmbedReceiveFrom()");
|
||||
|
||||
if (ssl->options.handShakeDone)
|
||||
/* Don't use ssl->options.handShakeDone since it is true even if
|
||||
* we are in the process of renegotiation */
|
||||
if (ssl->options.handShakeState == HANDSHAKE_DONE)
|
||||
dtls_timeout = 0;
|
||||
|
||||
if (!wolfSSL_get_using_nonblock(ssl)) {
|
||||
|
@@ -31,6 +31,9 @@ EXTRA_DIST += tests/test.conf \
|
||||
tests/test-psk-no-id.conf \
|
||||
tests/test-psk-no-id-sha2.conf \
|
||||
tests/test-dtls.conf \
|
||||
tests/test-dtls-group.conf \
|
||||
tests/test-dtls-reneg-client.conf \
|
||||
tests/test-dtls-reneg-server.conf \
|
||||
tests/test-dtls-sha2.conf \
|
||||
tests/test-sctp.conf \
|
||||
tests/test-sctp-sha2.conf \
|
||||
|
@@ -822,6 +822,34 @@ int SuiteTest(int argc, char** argv)
|
||||
args.return_code = EXIT_FAILURE;
|
||||
goto exit;
|
||||
}
|
||||
/* add dtls grouping suites */
|
||||
strcpy(argv0[1], "tests/test-dtls-group.conf");
|
||||
printf("starting dtls message grouping tests\n");
|
||||
test_harness(&args);
|
||||
if (args.return_code != 0) {
|
||||
printf("error from script %d\n", args.return_code);
|
||||
args.return_code = EXIT_FAILURE;
|
||||
goto exit;
|
||||
}
|
||||
#ifdef HAVE_SECURE_RENEGOTIATION
|
||||
/* add dtls renegotiation tests */
|
||||
strcpy(argv0[1], "tests/test-dtls-reneg-client.conf");
|
||||
printf("starting dtls secure renegotiation client tests\n");
|
||||
test_harness(&args);
|
||||
if (args.return_code != 0) {
|
||||
printf("error from script %d\n", args.return_code);
|
||||
args.return_code = EXIT_FAILURE;
|
||||
goto exit;
|
||||
}
|
||||
strcpy(argv0[1], "tests/test-dtls-reneg-server.conf");
|
||||
printf("starting dtls secure renegotiation server tests\n");
|
||||
test_harness(&args);
|
||||
if (args.return_code != 0) {
|
||||
printf("error from script %d\n", args.return_code);
|
||||
args.return_code = EXIT_FAILURE;
|
||||
goto exit;
|
||||
}
|
||||
#endif
|
||||
#ifdef WOLFSSL_OLDTLS_SHA2_CIPHERSUITES
|
||||
/* add dtls extra suites */
|
||||
strcpy(argv0[1], "tests/test-dtls-sha2.conf");
|
||||
|
1045
tests/test-dtls-group.conf
Normal file
1045
tests/test-dtls-group.conf
Normal file
File diff suppressed because it is too large
Load Diff
1045
tests/test-dtls-reneg-client.conf
Normal file
1045
tests/test-dtls-reneg-client.conf
Normal file
File diff suppressed because it is too large
Load Diff
1045
tests/test-dtls-reneg-server.conf
Normal file
1045
tests/test-dtls-reneg-server.conf
Normal file
File diff suppressed because it is too large
Load Diff
@@ -3003,6 +3003,13 @@ enum CipherType { aead };
|
||||
#define CIPHER_NONCE
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
|
||||
enum CipherSrc {
|
||||
KEYS_NOT_SET = 0,
|
||||
KEYS, /* keys from ssl->keys are loaded */
|
||||
SCR /* keys from ssl->secure_renegotiation->tmp_keys are loaded */
|
||||
};
|
||||
#endif
|
||||
|
||||
/* cipher for now */
|
||||
typedef struct Ciphers {
|
||||
@@ -3042,6 +3049,10 @@ typedef struct Ciphers {
|
||||
#endif
|
||||
byte state;
|
||||
byte setup; /* have we set it up flag for detection */
|
||||
#if defined(WOLFSSL_DTLS) && defined(HAVE_SECURE_RENEGOTIATION)
|
||||
enum CipherSrc src; /* DTLS uses this to determine which keys
|
||||
* are currently loaded */
|
||||
#endif
|
||||
} Ciphers;
|
||||
|
||||
|
||||
@@ -3177,7 +3188,7 @@ WOLFSSL_SESSION* GetSession(WOLFSSL*, byte*, byte);
|
||||
WOLFSSL_LOCAL
|
||||
int SetSession(WOLFSSL*, WOLFSSL_SESSION*);
|
||||
|
||||
typedef int (*hmacfp) (WOLFSSL*, byte*, const byte*, word32, int, int, int);
|
||||
typedef int (*hmacfp) (WOLFSSL*, byte*, const byte*, word32, int, int, int, int);
|
||||
|
||||
#ifndef NO_CLIENT_CACHE
|
||||
WOLFSSL_SESSION* GetSessionClient(WOLFSSL*, const byte*, int);
|
||||
@@ -3734,6 +3745,7 @@ typedef struct DtlsMsg {
|
||||
byte* msg;
|
||||
DtlsFrag* fragList;
|
||||
word32 fragSz; /* Length of fragments received */
|
||||
word16 epoch; /* Epoch that this message belongs to */
|
||||
word32 seq; /* Handshake sequence number */
|
||||
word32 sz; /* Length of whole message */
|
||||
byte type;
|
||||
@@ -3803,6 +3815,20 @@ typedef struct HS_Hashes {
|
||||
} HS_Hashes;
|
||||
|
||||
|
||||
#ifndef WOLFSSL_NO_TLS12
|
||||
/* Persistable BuildMessage arguments */
|
||||
typedef struct BuildMsgArgs {
|
||||
word32 digestSz;
|
||||
word32 sz;
|
||||
word32 pad;
|
||||
word32 idx;
|
||||
word32 headerSz;
|
||||
word16 size;
|
||||
word32 ivSz; /* TLSv1.1 IV */
|
||||
byte* iv;
|
||||
} BuildMsgArgs;
|
||||
#endif
|
||||
|
||||
#ifdef WOLFSSL_ASYNC_CRYPT
|
||||
#define MAX_ASYNC_ARGS 18
|
||||
typedef void (*FreeArgsCb)(struct WOLFSSL* ssl, void* pArgs);
|
||||
@@ -3811,6 +3837,7 @@ typedef struct HS_Hashes {
|
||||
WC_ASYNC_DEV* dev;
|
||||
FreeArgsCb freeArgs; /* function pointer to cleanup args */
|
||||
word32 args[MAX_ASYNC_ARGS]; /* holder for current args */
|
||||
BuildMsgArgs buildArgs; /* holder for current BuildMessage args */
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -4451,7 +4478,7 @@ WOLFSSL_LOCAL int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength);
|
||||
WOLFSSL_LOCAL int MakeTlsMasterSecret(WOLFSSL*);
|
||||
#ifndef WOLFSSL_AEAD_ONLY
|
||||
WOLFSSL_LOCAL int TLS_hmac(WOLFSSL* ssl, byte* digest, const byte* in,
|
||||
word32 sz, int padSz, int content, int verify);
|
||||
word32 sz, int padSz, int content, int verify, int epochOrder);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -4473,24 +4500,30 @@ WOLFSSL_LOCAL int GrowInputBuffer(WOLFSSL* ssl, int size, int usedLength);
|
||||
WOLFSSL_LOCAL DtlsMsg* DtlsMsgNew(word32, void*);
|
||||
WOLFSSL_LOCAL void DtlsMsgDelete(DtlsMsg*, void*);
|
||||
WOLFSSL_LOCAL void DtlsMsgListDelete(DtlsMsg*, void*);
|
||||
WOLFSSL_LOCAL int DtlsMsgSet(DtlsMsg*, word32, const byte*, byte,
|
||||
WOLFSSL_LOCAL void DtlsTxMsgListClean(WOLFSSL* ssl);
|
||||
WOLFSSL_LOCAL int DtlsMsgSet(DtlsMsg*, word32, word16, const byte*, byte,
|
||||
word32, word32, void*);
|
||||
WOLFSSL_LOCAL DtlsMsg* DtlsMsgFind(DtlsMsg*, word32);
|
||||
WOLFSSL_LOCAL void DtlsMsgStore(WOLFSSL*, word32, const byte*, word32,
|
||||
WOLFSSL_LOCAL DtlsMsg* DtlsMsgFind(DtlsMsg*, word32, word32);
|
||||
WOLFSSL_LOCAL void DtlsMsgStore(WOLFSSL*, word32, word32, const byte*, word32,
|
||||
byte, word32, word32, void*);
|
||||
WOLFSSL_LOCAL DtlsMsg* DtlsMsgInsert(DtlsMsg*, DtlsMsg*);
|
||||
|
||||
WOLFSSL_LOCAL int DtlsMsgPoolSave(WOLFSSL*, const byte*, word32);
|
||||
WOLFSSL_LOCAL int DtlsMsgPoolSave(WOLFSSL*, const byte*, word32, enum HandShakeType);
|
||||
WOLFSSL_LOCAL int DtlsMsgPoolTimeout(WOLFSSL*);
|
||||
WOLFSSL_LOCAL int VerifyForDtlsMsgPoolSend(WOLFSSL*, byte, word32);
|
||||
WOLFSSL_LOCAL int VerifyForTxDtlsMsgDelete(WOLFSSL* ssl, DtlsMsg* head);
|
||||
WOLFSSL_LOCAL void DtlsMsgPoolReset(WOLFSSL*);
|
||||
WOLFSSL_LOCAL int DtlsMsgPoolSend(WOLFSSL*, int);
|
||||
#endif /* WOLFSSL_DTLS */
|
||||
|
||||
#ifndef NO_TLS
|
||||
#if defined(HAVE_SECURE_RENEGOTIATION) && defined(WOLFSSL_DTLS)
|
||||
WOLFSSL_LOCAL int DtlsSCRKeysSet(WOLFSSL* ssl);
|
||||
WOLFSSL_LOCAL int IsDtlsMsgSCRKeys(WOLFSSL* ssl);
|
||||
WOLFSSL_LOCAL int DtlsUseSCRKeys(WOLFSSL* ssl);
|
||||
WOLFSSL_LOCAL int DtlsCheckOrder(WOLFSSL* ssl, int order);
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* NO_TLS */
|
||||
WOLFSSL_LOCAL void WriteSEQ(WOLFSSL* ssl, int verifyOrder, byte* out);
|
||||
|
||||
#if defined(WOLFSSL_TLS13) && (defined(HAVE_SESSION_TICKET) || !defined(NO_PSK))
|
||||
WOLFSSL_LOCAL word32 TimeNowInMilliseconds(void);
|
||||
@@ -4585,9 +4618,13 @@ WOLFSSL_LOCAL int SetDhExternal(WOLFSSL_DH *dh);
|
||||
WOLFSSL_LOCAL int InitHandshakeHashes(WOLFSSL* ssl);
|
||||
WOLFSSL_LOCAL void FreeHandshakeHashes(WOLFSSL* ssl);
|
||||
|
||||
|
||||
#ifndef WOLFSSL_NO_TLS12
|
||||
WOLFSSL_LOCAL void FreeBuildMsgArgs(WOLFSSL* ssl, BuildMsgArgs* args);
|
||||
#endif
|
||||
WOLFSSL_LOCAL int BuildMessage(WOLFSSL* ssl, byte* output, int outSz,
|
||||
const byte* input, int inSz, int type, int hashOutput,
|
||||
int sizeOnly, int asyncOkay);
|
||||
int sizeOnly, int asyncOkay, int epochOrder);
|
||||
|
||||
#ifdef WOLFSSL_TLS13
|
||||
int BuildTls13Message(WOLFSSL* ssl, byte* output, int outSz, const byte* input,
|
||||
|
@@ -2431,6 +2431,7 @@ WOLFSSL_API void wolfSSL_SetVerifyDecryptCtx(WOLFSSL* ssl, void *ctx);
|
||||
WOLFSSL_API void* wolfSSL_GetVerifyDecryptCtx(WOLFSSL* ssl);
|
||||
|
||||
WOLFSSL_API const unsigned char* wolfSSL_GetMacSecret(WOLFSSL*, int);
|
||||
WOLFSSL_API const unsigned char* wolfSSL_GetDtlsMacSecret(WOLFSSL*, int, int);
|
||||
WOLFSSL_API const unsigned char* wolfSSL_GetClientWriteKey(WOLFSSL*);
|
||||
WOLFSSL_API const unsigned char* wolfSSL_GetClientWriteIV(WOLFSSL*);
|
||||
WOLFSSL_API const unsigned char* wolfSSL_GetServerWriteKey(WOLFSSL*);
|
||||
|
Reference in New Issue
Block a user