@@ -34510,6 +34510,29 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
3451034510
3451134511#ifndef WOLFSSL_NO_TLS12
3451234512
34513+ static int getSessionID(WOLFSSL* ssl)
34514+ {
34515+ int sessIdSz = 0;
34516+ (void)ssl;
34517+ #ifndef NO_SESSION_CACHE
34518+ /* if no session cache don't send a session ID */
34519+ if (!ssl->options.sessionCacheOff)
34520+ sessIdSz = ID_LEN;
34521+ #endif
34522+ #ifdef HAVE_SESSION_TICKET
34523+ /* we may be echoing an ID as part of session tickets */
34524+ if (ssl->options.useTicket) {
34525+ /* echo session id sz can be 0,32 or bogus len in between */
34526+ sessIdSz = ssl->arrays->sessionIDSz;
34527+ if (sessIdSz > ID_LEN) {
34528+ WOLFSSL_MSG("Bad bogus session id len");
34529+ return BUFFER_ERROR;
34530+ }
34531+ }
34532+ #endif /* HAVE_SESSION_TICKET */
34533+ return sessIdSz;
34534+ }
34535+
3451334536 /* handle generation of server_hello (2) */
3451434537 int SendServerHello(WOLFSSL* ssl)
3451534538 {
@@ -34518,63 +34541,31 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
3451834541 word16 length;
3451934542 word32 idx = RECORD_HEADER_SZ + HANDSHAKE_HEADER_SZ;
3452034543 int sendSz;
34521- byte sessIdSz = ID_LEN;
34522- #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
34523- byte echoId = 0; /* ticket echo id flag */
34524- #endif
34525- byte cacheOff = 0; /* session cache off flag */
34544+ byte sessIdSz;
3452634545
3452734546 WOLFSSL_START(WC_FUNC_SERVER_HELLO_SEND);
3452834547 WOLFSSL_ENTER("SendServerHello");
3452934548
34549+ ret = getSessionID(ssl);
34550+ if (ret < 0)
34551+ return ret;
34552+ sessIdSz = (byte)ret;
34553+
3453034554 length = VERSION_SZ + RAN_LEN
34531- + ID_LEN + ENUM_LEN
34555+ + ENUM_LEN + sessIdSz
3453234556 + SUITE_LEN
3453334557 + ENUM_LEN;
3453434558
3453534559#ifdef HAVE_TLS_EXTENSIONS
3453634560 ret = TLSX_GetResponseSize(ssl, server_hello, &length);
3453734561 if (ret != 0)
3453834562 return ret;
34539- #ifdef HAVE_SESSION_TICKET
34540- if (ssl->options.useTicket) {
34541- /* echo session id sz can be 0,32 or bogus len in between */
34542- sessIdSz = ssl->arrays->sessionIDSz;
34543- if (sessIdSz > ID_LEN) {
34544- WOLFSSL_MSG("Bad bogus session id len");
34545- return BUFFER_ERROR;
34546- }
34547- if (!IsAtLeastTLSv1_3(ssl->version))
34548- length -= (ID_LEN - sessIdSz); /* adjust ID_LEN assumption */
34549- echoId = 1;
34550- }
34551- #endif /* HAVE_SESSION_TICKET */
3455234563#else
3455334564 if (ssl->options.haveEMS) {
3455434565 length += HELLO_EXT_SZ_SZ + HELLO_EXT_SZ;
3455534566 }
3455634567#endif
3455734568
34558- /* is the session cache off at build or runtime */
34559- #ifdef NO_SESSION_CACHE
34560- cacheOff = 1;
34561- #else
34562- if (ssl->options.sessionCacheOff == 1) {
34563- cacheOff = 1;
34564- }
34565- #endif
34566-
34567- /* if no session cache don't send a session ID unless we're echoing
34568- * an ID as part of session tickets */
34569- if (cacheOff == 1
34570- #if defined(HAVE_TLS_EXTENSIONS) && defined(HAVE_SESSION_TICKET)
34571- && echoId == 0
34572- #endif
34573- ) {
34574- length -= ID_LEN; /* adjust ID_LEN assumption */
34575- sessIdSz = 0;
34576- }
34577-
3457834569 sendSz = length + HANDSHAKE_HEADER_SZ + RECORD_HEADER_SZ;
3457934570 #ifdef WOLFSSL_DTLS
3458034571 if (ssl->options.dtls) {
@@ -34605,18 +34596,15 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
3460534596
3460634597 /* then random and session id */
3460734598 if (!ssl->options.resuming) {
34608- /* generate random part and session id */
34609- ret = wc_RNG_GenerateBlock(ssl->rng, output + idx,
34610- RAN_LEN + sizeof(sessIdSz) + sessIdSz);
34611- if (ret != 0)
34612- return ret;
34599+ word32 genRanLen = RAN_LEN;
3461334600
3461434601#ifdef WOLFSSL_TLS13
3461534602 if (TLSv1_3_Capable(ssl)) {
3461634603 /* TLS v1.3 capable server downgraded. */
3461734604 XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
3461834605 tls13Downgrade, TLS13_DOWNGRADE_SZ);
3461934606 output[idx + RAN_LEN - 1] = (byte)IsAtLeastTLSv1_2(ssl);
34607+ genRanLen -= TLS13_DOWNGRADE_SZ + 1;
3462034608 }
3462134609 else
3462234610#endif
@@ -34628,12 +34616,21 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
3462834616 XMEMCPY(output + idx + RAN_LEN - (TLS13_DOWNGRADE_SZ + 1),
3462934617 tls13Downgrade, TLS13_DOWNGRADE_SZ);
3463034618 output[idx + RAN_LEN - 1] = 0;
34619+ genRanLen -= TLS13_DOWNGRADE_SZ + 1;
3463134620 }
3463234621
34633- /* store info in SSL for later */
34622+ /* generate random part */
34623+ ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, genRanLen);
34624+ if (ret != 0)
34625+ return ret;
3463434626 XMEMCPY(ssl->arrays->serverRandom, output + idx, RAN_LEN);
3463534627 idx += RAN_LEN;
34628+
34629+ /* generate session id */
3463634630 output[idx++] = sessIdSz;
34631+ ret = wc_RNG_GenerateBlock(ssl->rng, output + idx, sessIdSz);
34632+ if (ret != 0)
34633+ return ret;
3463734634 XMEMCPY(ssl->arrays->sessionID, output + idx, sessIdSz);
3463834635 ssl->arrays->sessionIDSz = sessIdSz;
3463934636 }
0 commit comments