Skip to content

Commit 2847cbf

Browse files
committed
Simplify TLS 1.2 session ID logic
Optimize entropy use. Only generate the exact amount of random data that we will actually keep. Refactor done as part of work on ZD18822
1 parent 846ef15 commit 2847cbf

File tree

1 file changed

+42
-45
lines changed

1 file changed

+42
-45
lines changed

src/internal.c

Lines changed: 42 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)