forked from wolfSSL/wolfssl
Differentiate between empty and missing extension
This commit is contained in:
52
src/dtls.c
52
src/dtls.c
@ -115,6 +115,15 @@ int DtlsIgnoreError(int err)
|
|||||||
#define DTLS_COOKIE_SZ WC_SHA256_DIGEST_SIZE
|
#define DTLS_COOKIE_SZ WC_SHA256_DIGEST_SIZE
|
||||||
#endif /* !NO_SHA256 */
|
#endif /* !NO_SHA256 */
|
||||||
|
|
||||||
|
#if defined(WOLFSSL_DTLS13) && (defined(HAVE_SESSION_TICKET) || \
|
||||||
|
!defined(NO_PSK))
|
||||||
|
typedef struct PskInfo {
|
||||||
|
byte cipherSuite0;
|
||||||
|
byte cipherSuite;
|
||||||
|
byte isValid:1;
|
||||||
|
} PskInfo;
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct WolfSSL_ConstVector {
|
typedef struct WolfSSL_ConstVector {
|
||||||
word32 size;
|
word32 size;
|
||||||
const byte* elements;
|
const byte* elements;
|
||||||
@ -266,7 +275,7 @@ static int ParseClientHello(const byte* input, word32 helloSz, WolfSSL_CH* ch)
|
|||||||
#if (defined(WOLFSSL_DTLS_NO_HVR_ON_RESUME) && defined(HAVE_SESSION_TICKET)) \
|
#if (defined(WOLFSSL_DTLS_NO_HVR_ON_RESUME) && defined(HAVE_SESSION_TICKET)) \
|
||||||
|| defined(WOLFSSL_DTLS13)
|
|| defined(WOLFSSL_DTLS13)
|
||||||
static int TlsxFindByType(WolfSSL_ConstVector* ret, word16 extType,
|
static int TlsxFindByType(WolfSSL_ConstVector* ret, word16 extType,
|
||||||
WolfSSL_ConstVector exts)
|
WolfSSL_ConstVector exts, int* tlsxFound)
|
||||||
{
|
{
|
||||||
word32 len, idx = 0;
|
word32 len, idx = 0;
|
||||||
word16 type;
|
word16 type;
|
||||||
@ -274,6 +283,7 @@ static int TlsxFindByType(WolfSSL_ConstVector* ret, word16 extType,
|
|||||||
|
|
||||||
XMEMSET(ret, 0, sizeof(*ret));
|
XMEMSET(ret, 0, sizeof(*ret));
|
||||||
len = exts.size;
|
len = exts.size;
|
||||||
|
*tlsxFound = FALSE;
|
||||||
/* type + len */
|
/* type + len */
|
||||||
while (len >= OPAQUE16_LEN + OPAQUE16_LEN) {
|
while (len >= OPAQUE16_LEN + OPAQUE16_LEN) {
|
||||||
ato16(exts.elements + idx, &type);
|
ato16(exts.elements + idx, &type);
|
||||||
@ -283,6 +293,7 @@ static int TlsxFindByType(WolfSSL_ConstVector* ret, word16 extType,
|
|||||||
return BUFFER_ERROR;
|
return BUFFER_ERROR;
|
||||||
if (type == extType) {
|
if (type == extType) {
|
||||||
XMEMCPY(ret, &ext, sizeof(ext));
|
XMEMCPY(ret, &ext, sizeof(ext));
|
||||||
|
*tlsxFound = TRUE;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
len = exts.size - idx;
|
len = exts.size - idx;
|
||||||
@ -300,8 +311,10 @@ static int TlsTicketIsValid(const WOLFSSL* ssl, WolfSSL_ConstVector exts,
|
|||||||
byte tempTicket[SESSION_TICKET_LEN];
|
byte tempTicket[SESSION_TICKET_LEN];
|
||||||
InternalTicket* it = NULL;
|
InternalTicket* it = NULL;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
int tlsxFound;
|
||||||
|
|
||||||
ret = TlsxFindByType(&tlsxSessionTicket, TLSX_SESSION_TICKET, exts);
|
ret = TlsxFindByType(&tlsxSessionTicket, TLSX_SESSION_TICKET, exts,
|
||||||
|
&tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (tlsxSessionTicket.size == 0)
|
if (tlsxSessionTicket.size == 0)
|
||||||
@ -400,12 +413,13 @@ static int TlsCheckSupportedVersion(const WOLFSSL* ssl,
|
|||||||
WolfSSL_ConstVector tlsxSupportedVersions;
|
WolfSSL_ConstVector tlsxSupportedVersions;
|
||||||
int ret;
|
int ret;
|
||||||
ProtocolVersion pv = ssl->version;
|
ProtocolVersion pv = ssl->version;
|
||||||
|
int tlsxFound;
|
||||||
|
|
||||||
ret = TlsxFindByType(&tlsxSupportedVersions, TLSX_SUPPORTED_VERSIONS,
|
ret = TlsxFindByType(&tlsxSupportedVersions, TLSX_SUPPORTED_VERSIONS,
|
||||||
ch->extension);
|
ch->extension, &tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (tlsxSupportedVersions.size == 0) {
|
if (!tlsxFound) {
|
||||||
*isTls13 = 0;
|
*isTls13 = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -473,6 +487,7 @@ static void FindPskSuiteFromExt(const WOLFSSL* ssl, TLSX* extensions,
|
|||||||
ret = WOLFSSL_TICKET_RET_CREATE;
|
ret = WOLFSSL_TICKET_RET_CREATE;
|
||||||
break;
|
break;
|
||||||
case PSK_DECRYPT_FAIL:
|
case PSK_DECRYPT_FAIL:
|
||||||
|
default:
|
||||||
ret = WOLFSSL_TICKET_RET_REJECT;
|
ret = WOLFSSL_TICKET_RET_REJECT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -510,10 +525,12 @@ static void FindPskSuiteFromExt(const WOLFSSL* ssl, TLSX* extensions,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Empty return necessary so we can have both the label and macro guard */
|
||||||
cleanup:
|
cleanup:
|
||||||
#ifdef HAVE_SESSION_TICKET
|
#ifdef HAVE_SESSION_TICKET
|
||||||
CleanupClientTickets((PreSharedKey*)pskExt->data);
|
CleanupClientTickets((PreSharedKey*)pskExt->data);
|
||||||
#endif
|
#endif
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -533,6 +550,7 @@ static int SendStatelessReplyDtls13(const WOLFSSL* ssl, WolfSSL_CH* ch)
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
TLSX* parsedExts = NULL;
|
TLSX* parsedExts = NULL;
|
||||||
WolfSSL_ConstVector tlsx;
|
WolfSSL_ConstVector tlsx;
|
||||||
|
int tlsxFound;
|
||||||
Suites suites;
|
Suites suites;
|
||||||
byte haveSA = 0;
|
byte haveSA = 0;
|
||||||
byte haveKS = 0;
|
byte haveKS = 0;
|
||||||
@ -585,11 +603,13 @@ static int SendStatelessReplyDtls13(const WOLFSSL* ssl, WolfSSL_CH* ch)
|
|||||||
|
|
||||||
/* Signature algs */
|
/* Signature algs */
|
||||||
ret = TlsxFindByType(&tlsx, TLSX_SIGNATURE_ALGORITHMS,
|
ret = TlsxFindByType(&tlsx, TLSX_SIGNATURE_ALGORITHMS,
|
||||||
ch->extension);
|
ch->extension, &tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto dtls13_cleanup;
|
goto dtls13_cleanup;
|
||||||
if (tlsx.size > OPAQUE16_LEN) {
|
if (tlsxFound) {
|
||||||
WolfSSL_ConstVector sigAlgs;
|
WolfSSL_ConstVector sigAlgs;
|
||||||
|
if (tlsx.size < OPAQUE16_LEN)
|
||||||
|
ERROR_OUT(BUFFER_ERROR, dtls13_cleanup);
|
||||||
ReadVector16(tlsx.elements, &sigAlgs);
|
ReadVector16(tlsx.elements, &sigAlgs);
|
||||||
if (sigAlgs.size != tlsx.size - OPAQUE16_LEN)
|
if (sigAlgs.size != tlsx.size - OPAQUE16_LEN)
|
||||||
ERROR_OUT(BUFFER_ERROR, dtls13_cleanup);
|
ERROR_OUT(BUFFER_ERROR, dtls13_cleanup);
|
||||||
@ -602,10 +622,10 @@ static int SendStatelessReplyDtls13(const WOLFSSL* ssl, WolfSSL_CH* ch)
|
|||||||
|
|
||||||
/* Supported groups */
|
/* Supported groups */
|
||||||
ret = TlsxFindByType(&tlsx, TLSX_SUPPORTED_GROUPS,
|
ret = TlsxFindByType(&tlsx, TLSX_SUPPORTED_GROUPS,
|
||||||
ch->extension);
|
ch->extension, &tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto dtls13_cleanup;
|
goto dtls13_cleanup;
|
||||||
if (tlsx.size != 0) {
|
if (tlsxFound) {
|
||||||
ret = TLSX_SupportedCurve_Parse(ssl, tlsx.elements,
|
ret = TLSX_SupportedCurve_Parse(ssl, tlsx.elements,
|
||||||
(word16)tlsx.size, 1, &parsedExts);
|
(word16)tlsx.size, 1, &parsedExts);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -615,10 +635,10 @@ static int SendStatelessReplyDtls13(const WOLFSSL* ssl, WolfSSL_CH* ch)
|
|||||||
|
|
||||||
/* Key share */
|
/* Key share */
|
||||||
ret = TlsxFindByType(&tlsx, TLSX_KEY_SHARE,
|
ret = TlsxFindByType(&tlsx, TLSX_KEY_SHARE,
|
||||||
ch->extension);
|
ch->extension, &tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto dtls13_cleanup;
|
goto dtls13_cleanup;
|
||||||
if (tlsx.size != 0) {
|
if (tlsxFound) {
|
||||||
ret = TLSX_KeyShare_Parse_ClientHello(ssl, tlsx.elements,
|
ret = TLSX_KeyShare_Parse_ClientHello(ssl, tlsx.elements,
|
||||||
(word16)tlsx.size, &parsedExts);
|
(word16)tlsx.size, &parsedExts);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -628,10 +648,10 @@ static int SendStatelessReplyDtls13(const WOLFSSL* ssl, WolfSSL_CH* ch)
|
|||||||
|
|
||||||
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
|
#if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
|
||||||
/* Pre-shared key */
|
/* Pre-shared key */
|
||||||
ret = TlsxFindByType(&tlsx, TLSX_PRE_SHARED_KEY, ch->extension);
|
ret = TlsxFindByType(&tlsx, TLSX_PRE_SHARED_KEY, ch->extension, &tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto dtls13_cleanup;
|
goto dtls13_cleanup;
|
||||||
if (tlsx.size != 0) {
|
if (tlsxFound) {
|
||||||
/* Let's just assume that the binders are correct here. We will
|
/* Let's just assume that the binders are correct here. We will
|
||||||
* actually verify this in the stateful part of the processing
|
* actually verify this in the stateful part of the processing
|
||||||
* and if they don't match we will error out there anyway. */
|
* and if they don't match we will error out there anyway. */
|
||||||
@ -645,10 +665,10 @@ static int SendStatelessReplyDtls13(const WOLFSSL* ssl, WolfSSL_CH* ch)
|
|||||||
|
|
||||||
if (pskInfo.isValid) {
|
if (pskInfo.isValid) {
|
||||||
ret = TlsxFindByType(&tlsx, TLSX_PSK_KEY_EXCHANGE_MODES,
|
ret = TlsxFindByType(&tlsx, TLSX_PSK_KEY_EXCHANGE_MODES,
|
||||||
ch->extension);
|
ch->extension, &tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
goto dtls13_cleanup;
|
goto dtls13_cleanup;
|
||||||
if (tlsx.size == 0)
|
if (!tlsxFound)
|
||||||
ERROR_OUT(PSK_KEY_ERROR, dtls13_cleanup);
|
ERROR_OUT(PSK_KEY_ERROR, dtls13_cleanup);
|
||||||
ret = TLSX_PskKeyModes_Parse_Modes(tlsx.elements, tlsx.size,
|
ret = TLSX_PskKeyModes_Parse_Modes(tlsx.elements, tlsx.size,
|
||||||
client_hello, &modes);
|
client_hello, &modes);
|
||||||
@ -832,7 +852,9 @@ int DoClientHelloStateless(WOLFSSL* ssl, const byte* input,
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (isTls13) {
|
if (isTls13) {
|
||||||
ret = TlsxFindByType(&ch.cookieExt, TLSX_COOKIE, ch.extension);
|
int tlsxFound;
|
||||||
|
ret = TlsxFindByType(&ch.cookieExt, TLSX_COOKIE, ch.extension,
|
||||||
|
&tlsxFound);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -4404,10 +4404,7 @@ int SendTls13ClientHello(WOLFSSL* ssl)
|
|||||||
if (ssl->options.dtls) {
|
if (ssl->options.dtls) {
|
||||||
ret = Dtls13HandshakeSend(ssl, args->output, (word16)args->sendSz,
|
ret = Dtls13HandshakeSend(ssl, args->output, (word16)args->sendSz,
|
||||||
(word16)args->idx, client_hello, 0);
|
(word16)args->idx, client_hello, 0);
|
||||||
|
break;
|
||||||
WOLFSSL_LEAVE("SendTls13ClientHello", ret);
|
|
||||||
WOLFSSL_END(WC_FUNC_CLIENT_HELLO_SEND);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
#endif /* WOLFSSL_DTLS13 */
|
#endif /* WOLFSSL_DTLS13 */
|
||||||
|
|
||||||
|
@ -3942,14 +3942,6 @@ typedef struct TicketNonce {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef WOLFSSL_DTLS
|
|
||||||
typedef struct PskInfo {
|
|
||||||
byte cipherSuite0;
|
|
||||||
byte cipherSuite;
|
|
||||||
byte isValid:1;
|
|
||||||
} PskInfo;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* wolfSSL session type */
|
/* wolfSSL session type */
|
||||||
struct WOLFSSL_SESSION {
|
struct WOLFSSL_SESSION {
|
||||||
/* WARNING Do not add fields here. They will be ignored in
|
/* WARNING Do not add fields here. They will be ignored in
|
||||||
|
Reference in New Issue
Block a user