Skip to content

Commit 7bbe159

Browse files
authored
Merge pull request #9290 from effbiae/make-pre-master-secret
refactor to Make(Dhe)PSKPreMasterSecret
2 parents d54f5e7 + f087b13 commit 7bbe159

1 file changed

Lines changed: 64 additions & 138 deletions

File tree

src/internal.c

Lines changed: 64 additions & 138 deletions
Original file line numberDiff line numberDiff line change
@@ -33197,6 +33197,59 @@ static void FreeSckeArgs(WOLFSSL* ssl, void* pArgs)
3319733197
args->input = NULL;
3319833198
}
3319933199

33200+
#ifndef NO_PSK
33201+
static int AddPSKtoPreMasterSecret(WOLFSSL* ssl)
33202+
{
33203+
int ret = 0;
33204+
/* Use the PSK hint to look up the PSK and add it to the
33205+
* preMasterSecret here. */
33206+
ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
33207+
ssl->arrays->client_identity, ssl->arrays->psk_key,
33208+
MAX_PSK_KEY_LEN);
33209+
33210+
if (ssl->arrays->psk_keySz == 0 ||
33211+
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
33212+
(int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
33213+
#if defined(WOLFSSL_EXTRA_ALERTS) || defined(WOLFSSL_PSK_IDENTITY_ALERT)
33214+
SendAlert(ssl, alert_fatal, unknown_psk_identity);
33215+
#endif
33216+
ret = 1;
33217+
}
33218+
if (ret == 0)
33219+
/* Pre-shared Key for peer authentication. */
33220+
ssl->options.peerAuthGood = 1;
33221+
return ret;
33222+
}
33223+
33224+
static void MakePSKPreMasterSecret(Arrays* arrays, byte use_psk_key)
33225+
{
33226+
byte* pms = arrays->preMasterSecret;
33227+
word16 sz;
33228+
33229+
/* sz + (use_psk_key ? sz 0s : sz unaltered) + length of psk + psk */
33230+
if (!use_psk_key) {
33231+
sz = (word16)arrays->preMasterSz;
33232+
c16toa(sz, pms);
33233+
pms += OPAQUE16_LEN + sz;
33234+
}
33235+
if ((int)arrays->psk_keySz > 0) {
33236+
if (use_psk_key) {
33237+
sz = (word16)arrays->psk_keySz;
33238+
c16toa(sz, pms);
33239+
pms += OPAQUE16_LEN;
33240+
XMEMSET(pms, 0, sz);
33241+
pms += sz;
33242+
}
33243+
c16toa(arrays->psk_keySz, pms);
33244+
pms += OPAQUE16_LEN;
33245+
XMEMCPY(pms, arrays->psk_key, arrays->psk_keySz);
33246+
arrays->preMasterSz = sz + arrays->psk_keySz + OPAQUE16_LEN * 2;
33247+
ForceZero(arrays->psk_key, arrays->psk_keySz);
33248+
}
33249+
arrays->psk_keySz = 0; /* no further need */
33250+
}
33251+
#endif /*!NO_PSK*/
33252+
3320033253
/* handle generation client_key_exchange (16) */
3320133254
int SendClientKeyExchange(WOLFSSL* ssl)
3320233255
{
@@ -33626,7 +33679,6 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3362633679
#ifndef NO_PSK
3362733680
case psk_kea:
3362833681
{
33629-
byte* pms = ssl->arrays->preMasterSecret;
3363033682
ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
3363133683
ssl->arrays->server_hint, ssl->arrays->client_identity,
3363233684
MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
@@ -33645,24 +33697,7 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3364533697
XMEMCPY(args->encSecret, ssl->arrays->client_identity,
3364633698
args->encSz);
3364733699
ssl->options.peerAuthGood = 1;
33648-
if ((int)ssl->arrays->psk_keySz > 0) {
33649-
/* CLIENT: Pre-shared Key for peer authentication. */
33650-
33651-
/* make psk pre master secret */
33652-
/* length of key + length 0s + length of key + key */
33653-
c16toa((word16)ssl->arrays->psk_keySz, pms);
33654-
pms += OPAQUE16_LEN;
33655-
XMEMSET(pms, 0, ssl->arrays->psk_keySz);
33656-
pms += ssl->arrays->psk_keySz;
33657-
c16toa((word16)ssl->arrays->psk_keySz, pms);
33658-
pms += OPAQUE16_LEN;
33659-
XMEMCPY(pms, ssl->arrays->psk_key,
33660-
ssl->arrays->psk_keySz);
33661-
ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2)
33662-
+ (2 * OPAQUE16_LEN);
33663-
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
33664-
}
33665-
ssl->arrays->psk_keySz = 0; /* No further need */
33700+
MakePSKPreMasterSecret(ssl->arrays, 1);
3366633701
break;
3366733702
}
3366833703
#endif /* !NO_PSK */
@@ -34160,39 +34195,22 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3416034195
#if !defined(NO_DH) && !defined(NO_PSK)
3416134196
case dhe_psk_kea:
3416234197
{
34163-
byte* pms = ssl->arrays->preMasterSecret;
34164-
3416534198
/* validate args */
3416634199
if (args->output == NULL || args->length == 0) {
3416734200
ERROR_OUT(BAD_FUNC_ARG, exit_scke);
3416834201
}
3416934202

3417034203
c16toa((word16)args->length, args->output);
3417134204
args->encSz += args->length + OPAQUE16_LEN;
34172-
c16toa((word16)ssl->arrays->preMasterSz, pms);
34173-
ssl->arrays->preMasterSz += OPAQUE16_LEN;
34174-
pms += ssl->arrays->preMasterSz;
34175-
34176-
/* make psk pre master secret */
34177-
if ((int)ssl->arrays->psk_keySz > 0) {
34178-
/* length of key + length 0s + length of key + key */
34179-
c16toa((word16)ssl->arrays->psk_keySz, pms);
34180-
pms += OPAQUE16_LEN;
34181-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34182-
ssl->arrays->preMasterSz +=
34183-
ssl->arrays->psk_keySz + OPAQUE16_LEN;
34184-
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34185-
}
34186-
ssl->arrays->psk_keySz = 0; /* No further need */
34205+
34206+
MakePSKPreMasterSecret(ssl->arrays, 0);
3418734207
break;
3418834208
}
3418934209
#endif /* !NO_DH && !NO_PSK */
3419034210
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
3419134211
defined(HAVE_CURVE448)) && !defined(NO_PSK)
3419234212
case ecdhe_psk_kea:
3419334213
{
34194-
byte* pms = ssl->arrays->preMasterSecret;
34195-
3419634214
/* validate args */
3419734215
if (args->output == NULL || args->length > ENCRYPT_LEN) {
3419834216
ERROR_OUT(BAD_FUNC_ARG, exit_scke);
@@ -34204,19 +34222,7 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3420434222

3420534223
/* Create pre master secret is the concatenation of
3420634224
* eccSize + eccSharedKey + pskSize + pskKey */
34207-
c16toa((word16)ssl->arrays->preMasterSz, pms);
34208-
ssl->arrays->preMasterSz += OPAQUE16_LEN;
34209-
pms += ssl->arrays->preMasterSz;
34210-
34211-
if ((int)ssl->arrays->psk_keySz > 0) {
34212-
c16toa((word16)ssl->arrays->psk_keySz, pms);
34213-
pms += OPAQUE16_LEN;
34214-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34215-
ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
34216-
34217-
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
34218-
}
34219-
ssl->arrays->psk_keySz = 0; /* No further need */
34225+
MakePSKPreMasterSecret(ssl->arrays, 0);
3422034226
break;
3422134227
}
3422234228
#endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
@@ -41191,7 +41197,6 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
4119141197
#ifndef NO_PSK
4119241198
case psk_kea:
4119341199
{
41194-
byte* pms = ssl->arrays->preMasterSecret;
4119541200
word16 ci_sz;
4119641201

4119741202
if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
@@ -41212,42 +41217,10 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
4121241217
XMEMCPY(ssl->arrays->client_identity,
4121341218
input + args->idx, ci_sz);
4121441219
args->idx += ci_sz;
41215-
4121641220
ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
41217-
ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
41218-
ssl->arrays->client_identity, ssl->arrays->psk_key,
41219-
MAX_PSK_KEY_LEN);
41220-
41221-
if (ssl->arrays->psk_keySz == 0 ||
41222-
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
41223-
(int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
41224-
#if defined(WOLFSSL_EXTRA_ALERTS) || \
41225-
defined(WOLFSSL_PSK_IDENTITY_ALERT)
41226-
SendAlert(ssl, alert_fatal,
41227-
unknown_psk_identity);
41228-
#endif
41221+
if (AddPSKtoPreMasterSecret(ssl))
4122941222
ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41230-
}
41231-
/* SERVER: Pre-shared Key for peer authentication. */
41232-
ssl->options.peerAuthGood = 1;
41233-
41234-
/* make psk pre master secret */
41235-
if ((int)ssl->arrays->psk_keySz > 0) {
41236-
/* length of key + length 0s + length of key + key */
41237-
c16toa((word16) ssl->arrays->psk_keySz, pms);
41238-
pms += OPAQUE16_LEN;
41239-
41240-
XMEMSET(pms, 0, ssl->arrays->psk_keySz);
41241-
pms += ssl->arrays->psk_keySz;
41242-
41243-
c16toa((word16) ssl->arrays->psk_keySz, pms);
41244-
pms += OPAQUE16_LEN;
41245-
41246-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41247-
ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
41248-
(OPAQUE16_LEN * 2);
41249-
}
41250-
ssl->arrays->psk_keySz = 0; /* no further need */
41223+
MakePSKPreMasterSecret(ssl->arrays, 1);
4125141224
break;
4125241225
}
4125341226
#endif /* !NO_PSK */
@@ -41736,82 +41709,35 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
4173641709
#if !defined(NO_DH) && !defined(NO_PSK)
4173741710
case dhe_psk_kea:
4173841711
{
41739-
byte* pms = ssl->arrays->preMasterSecret;
4174041712
word16 clientSz = (word16)args->sigSz;
4174141713

4174241714
args->idx += clientSz;
41743-
c16toa((word16)ssl->arrays->preMasterSz, pms);
41744-
ssl->arrays->preMasterSz += OPAQUE16_LEN;
41745-
pms += ssl->arrays->preMasterSz;
4174641715

4174741716
/* Use the PSK hint to look up the PSK and add it to the
4174841717
* preMasterSecret here. */
41749-
ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
41750-
ssl->arrays->client_identity, ssl->arrays->psk_key,
41751-
MAX_PSK_KEY_LEN);
41752-
41753-
if (ssl->arrays->psk_keySz == 0 ||
41754-
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
41755-
(int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
41756-
#if defined(WOLFSSL_EXTRA_ALERTS) || \
41757-
defined(WOLFSSL_PSK_IDENTITY_ALERT)
41758-
SendAlert(ssl, alert_fatal,
41759-
unknown_psk_identity);
41760-
#endif
41718+
if (AddPSKtoPreMasterSecret(ssl))
4176141719
ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41762-
}
41763-
/* SERVER: Pre-shared Key for peer authentication. */
41764-
ssl->options.peerAuthGood = 1;
41765-
41766-
if ((int)ssl->arrays->psk_keySz > 0) {
41767-
c16toa((word16) ssl->arrays->psk_keySz, pms);
41768-
pms += OPAQUE16_LEN;
41769-
41770-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41771-
ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
41772-
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41773-
}
41774-
ssl->arrays->psk_keySz = 0; /* no further need */
41720+
MakePSKPreMasterSecret(ssl->arrays, 0);
4177541721
break;
4177641722
}
4177741723
#endif /* !NO_DH && !NO_PSK */
4177841724
#if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4177941725
defined(HAVE_CURVE448)) && !defined(NO_PSK)
4178041726
case ecdhe_psk_kea:
4178141727
{
41782-
byte* pms = ssl->arrays->preMasterSecret;
4178341728
word16 clientSz = (word16)args->sigSz;
4178441729

4178541730
/* skip past the imported peer key */
4178641731
args->idx += args->length;
4178741732

4178841733
/* Add preMasterSecret */
41789-
c16toa(clientSz, pms);
41790-
ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
41791-
pms += ssl->arrays->preMasterSz;
41734+
ssl->arrays->preMasterSz = clientSz;
4179241735

4179341736
/* Use the PSK hint to look up the PSK and add it to the
4179441737
* preMasterSecret here. */
41795-
ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
41796-
ssl->arrays->client_identity, ssl->arrays->psk_key,
41797-
MAX_PSK_KEY_LEN);
41798-
41799-
if (ssl->arrays->psk_keySz == 0 ||
41800-
(ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
41801-
(int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
41738+
if (AddPSKtoPreMasterSecret(ssl))
4180241739
ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41803-
}
41804-
/* SERVER: Pre-shared Key for peer authentication. */
41805-
ssl->options.peerAuthGood = 1;
41806-
if ((int)ssl->arrays->psk_keySz > 0) {
41807-
c16toa((word16) ssl->arrays->psk_keySz, pms);
41808-
pms += OPAQUE16_LEN;
41809-
41810-
XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41811-
ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
41812-
ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41813-
}
41814-
ssl->arrays->psk_keySz = 0; /* no further need */
41740+
MakePSKPreMasterSecret(ssl->arrays, 0);
4181541741
break;
4181641742
}
4181741743
#endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */

0 commit comments

Comments
 (0)