@@ -33197,6 +33197,55 @@ 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+ #endif
33224+
33225+ #ifndef NO_PSK
33226+ static void MakePSKPreMasterSecret(Arrays* arrays, word16 sz)
33227+ {
33228+ byte* pms = arrays->preMasterSecret;
33229+
33230+ if ((int)arrays->psk_keySz > 0) {
33231+ /* sz + sz 0s + length of key + key */
33232+ c16toa(sz, pms);
33233+ pms += OPAQUE16_LEN;
33234+
33235+ XMEMSET(pms, 0, sz);
33236+ pms += sz;
33237+
33238+ c16toa(arrays->psk_keySz, pms);
33239+ pms += OPAQUE16_LEN;
33240+
33241+ XMEMCPY(pms, arrays->psk_key, arrays->psk_keySz);
33242+ arrays->preMasterSz = sz + arrays->psk_keySz + OPAQUE16_LEN * 2;
33243+ ForceZero(arrays->psk_key, arrays->psk_keySz);
33244+ }
33245+ arrays->psk_keySz = 0; /* no further need */
33246+ }
33247+ #endif /*NO_PSK*/
33248+
3320033249/* handle generation client_key_exchange (16) */
3320133250int SendClientKeyExchange(WOLFSSL* ssl)
3320233251{
@@ -33626,7 +33675,6 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3362633675 #ifndef NO_PSK
3362733676 case psk_kea:
3362833677 {
33629- byte* pms = ssl->arrays->preMasterSecret;
3363033678 ssl->arrays->psk_keySz = ssl->options.client_psk_cb(ssl,
3363133679 ssl->arrays->server_hint, ssl->arrays->client_identity,
3363233680 MAX_PSK_ID_LEN, ssl->arrays->psk_key, MAX_PSK_KEY_LEN);
@@ -33645,24 +33693,8 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3364533693 XMEMCPY(args->encSecret, ssl->arrays->client_identity,
3364633694 args->encSz);
3364733695 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 */
33696+ MakePSKPreMasterSecret(ssl->arrays,
33697+ (word16)ssl->arrays->psk_keySz);
3366633698 break;
3366733699 }
3366833700 #endif /* !NO_PSK */
@@ -34160,39 +34192,23 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3416034192 #if !defined(NO_DH) && !defined(NO_PSK)
3416134193 case dhe_psk_kea:
3416234194 {
34163- byte* pms = ssl->arrays->preMasterSecret;
34164-
3416534195 /* validate args */
3416634196 if (args->output == NULL || args->length == 0) {
3416734197 ERROR_OUT(BAD_FUNC_ARG, exit_scke);
3416834198 }
3416934199
3417034200 c16toa((word16)args->length, args->output);
3417134201 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 */
34202+
34203+ MakePSKPreMasterSecret(ssl->arrays,
34204+ (word16)ssl->arrays->preMasterSz);
3418734205 break;
3418834206 }
3418934207 #endif /* !NO_DH && !NO_PSK */
3419034208 #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
3419134209 defined(HAVE_CURVE448)) && !defined(NO_PSK)
3419234210 case ecdhe_psk_kea:
3419334211 {
34194- byte* pms = ssl->arrays->preMasterSecret;
34195-
3419634212 /* validate args */
3419734213 if (args->output == NULL || args->length > ENCRYPT_LEN) {
3419834214 ERROR_OUT(BAD_FUNC_ARG, exit_scke);
@@ -34204,19 +34220,8 @@ int SendClientKeyExchange(WOLFSSL* ssl)
3420434220
3420534221 /* Create pre master secret is the concatenation of
3420634222 * 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 */
34223+ MakePSKPreMasterSecret(ssl->arrays,
34224+ (word16)ssl->arrays->preMasterSz);
3422034225 break;
3422134226 }
3422234227 #endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) && !NO_PSK */
@@ -40999,7 +41004,6 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
4099941004 #ifndef NO_PSK
4100041005 case psk_kea:
4100141006 {
41002- byte* pms = ssl->arrays->preMasterSecret;
4100341007 word16 ci_sz;
4100441008
4100541009 if ((args->idx - args->begin) + OPAQUE16_LEN > size) {
@@ -41020,42 +41024,11 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
4102041024 XMEMCPY(ssl->arrays->client_identity,
4102141025 input + args->idx, ci_sz);
4102241026 args->idx += ci_sz;
41023-
4102441027 ssl->arrays->client_identity[ci_sz] = '\0'; /* null term */
41025- ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
41026- ssl->arrays->client_identity, ssl->arrays->psk_key,
41027- MAX_PSK_KEY_LEN);
41028-
41029- if (ssl->arrays->psk_keySz == 0 ||
41030- (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
41031- (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
41032- #if defined(WOLFSSL_EXTRA_ALERTS) || \
41033- defined(WOLFSSL_PSK_IDENTITY_ALERT)
41034- SendAlert(ssl, alert_fatal,
41035- unknown_psk_identity);
41036- #endif
41028+ if (AddPSKtoPreMasterSecret(ssl))
4103741029 ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41038- }
41039- /* SERVER: Pre-shared Key for peer authentication. */
41040- ssl->options.peerAuthGood = 1;
41041-
41042- /* make psk pre master secret */
41043- if ((int)ssl->arrays->psk_keySz > 0) {
41044- /* length of key + length 0s + length of key + key */
41045- c16toa((word16) ssl->arrays->psk_keySz, pms);
41046- pms += OPAQUE16_LEN;
41047-
41048- XMEMSET(pms, 0, ssl->arrays->psk_keySz);
41049- pms += ssl->arrays->psk_keySz;
41050-
41051- c16toa((word16) ssl->arrays->psk_keySz, pms);
41052- pms += OPAQUE16_LEN;
41053-
41054- XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41055- ssl->arrays->preMasterSz = (ssl->arrays->psk_keySz * 2) +
41056- (OPAQUE16_LEN * 2);
41057- }
41058- ssl->arrays->psk_keySz = 0; /* no further need */
41030+ MakePSKPreMasterSecret(ssl->arrays,
41031+ (word16)ssl->arrays->psk_keySz);
4105941032 break;
4106041033 }
4106141034 #endif /* !NO_PSK */
@@ -41854,82 +41827,37 @@ static int DefTicketEncCb(WOLFSSL* ssl, byte key_name[WOLFSSL_TICKET_NAME_SZ],
4185441827 #if !defined(NO_DH) && !defined(NO_PSK)
4185541828 case dhe_psk_kea:
4185641829 {
41857- byte* pms = ssl->arrays->preMasterSecret;
4185841830 word16 clientSz = (word16)args->sigSz;
4185941831
4186041832 args->idx += clientSz;
41861- c16toa((word16)ssl->arrays->preMasterSz, pms);
41862- ssl->arrays->preMasterSz += OPAQUE16_LEN;
41863- pms += ssl->arrays->preMasterSz;
4186441833
4186541834 /* Use the PSK hint to look up the PSK and add it to the
4186641835 * preMasterSecret here. */
41867- ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
41868- ssl->arrays->client_identity, ssl->arrays->psk_key,
41869- MAX_PSK_KEY_LEN);
41870-
41871- if (ssl->arrays->psk_keySz == 0 ||
41872- (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
41873- (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
41874- #if defined(WOLFSSL_EXTRA_ALERTS) || \
41875- defined(WOLFSSL_PSK_IDENTITY_ALERT)
41876- SendAlert(ssl, alert_fatal,
41877- unknown_psk_identity);
41878- #endif
41836+ if (AddPSKtoPreMasterSecret(ssl))
4187941837 ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41880- }
41881- /* SERVER: Pre-shared Key for peer authentication. */
41882- ssl->options.peerAuthGood = 1;
41883-
41884- if ((int)ssl->arrays->psk_keySz > 0) {
41885- c16toa((word16) ssl->arrays->psk_keySz, pms);
41886- pms += OPAQUE16_LEN;
41887-
41888- XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41889- ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
41890- ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41891- }
41892- ssl->arrays->psk_keySz = 0; /* no further need */
41838+ MakePSKPreMasterSecret(ssl->arrays,
41839+ (word16)ssl->arrays->preMasterSz);
4189341840 break;
4189441841 }
4189541842 #endif /* !NO_DH && !NO_PSK */
4189641843 #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
4189741844 defined(HAVE_CURVE448)) && !defined(NO_PSK)
4189841845 case ecdhe_psk_kea:
4189941846 {
41900- byte* pms = ssl->arrays->preMasterSecret;
4190141847 word16 clientSz = (word16)args->sigSz;
4190241848
4190341849 /* skip past the imported peer key */
4190441850 args->idx += args->length;
4190541851
4190641852 /* Add preMasterSecret */
41907- c16toa(clientSz, pms);
41908- ssl->arrays->preMasterSz = OPAQUE16_LEN + clientSz;
41909- pms += ssl->arrays->preMasterSz;
41853+ ssl->arrays->preMasterSz = clientSz;
4191041854
4191141855 /* Use the PSK hint to look up the PSK and add it to the
4191241856 * preMasterSecret here. */
41913- ssl->arrays->psk_keySz = ssl->options.server_psk_cb(ssl,
41914- ssl->arrays->client_identity, ssl->arrays->psk_key,
41915- MAX_PSK_KEY_LEN);
41916-
41917- if (ssl->arrays->psk_keySz == 0 ||
41918- (ssl->arrays->psk_keySz > MAX_PSK_KEY_LEN &&
41919- (int)ssl->arrays->psk_keySz != WC_NO_ERR_TRACE(USE_HW_PSK))) {
41857+ if (AddPSKtoPreMasterSecret(ssl))
4192041858 ERROR_OUT(PSK_KEY_ERROR, exit_dcke);
41921- }
41922- /* SERVER: Pre-shared Key for peer authentication. */
41923- ssl->options.peerAuthGood = 1;
41924- if ((int)ssl->arrays->psk_keySz > 0) {
41925- c16toa((word16) ssl->arrays->psk_keySz, pms);
41926- pms += OPAQUE16_LEN;
41927-
41928- XMEMCPY(pms, ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41929- ssl->arrays->preMasterSz += ssl->arrays->psk_keySz + OPAQUE16_LEN;
41930- ForceZero(ssl->arrays->psk_key, ssl->arrays->psk_keySz);
41931- }
41932- ssl->arrays->psk_keySz = 0; /* no further need */
41859+ MakePSKPreMasterSecret(ssl->arrays,
41860+ (word16)ssl->arrays->preMasterSz);
4193341861 break;
4193441862 }
4193541863 #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && !NO_PSK */
0 commit comments