@@ -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) */
3320133254int 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