@@ -9164,16 +9164,18 @@ static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
91649164 wc_curve448_free((curve448_key*)current->key);
91659165#endif
91669166 }
9167- #ifdef WOLFSSL_HAVE_MLKEM
91689167 else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
9168+ #ifdef WOLFSSL_HAVE_MLKEM
91699169 wc_KyberKey_Free((KyberKey*)current->key);
91709170 #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
91719171 if (current->privKey != NULL) {
91729172 ForceZero(current->privKey, current->privKeyLen);
91739173 }
91749174 #endif
9175+ #endif
91759176 }
91769177 else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
9178+ #ifdef WOLFSSL_HAVE_MLKEM
91779179 int ecc_group = 0;
91789180 findEccPqc(&ecc_group, NULL, NULL, current->group);
91799181
@@ -9211,8 +9213,8 @@ static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
92119213 wc_ecc_free((ecc_key*)current->key);
92129214 #endif
92139215 }
9214- }
92159216#endif
9217+ }
92169218 else {
92179219#ifdef HAVE_ECC
92189220 #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
@@ -10373,42 +10375,16 @@ static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
1037310375 *seenGroupsCnt = i + 1;
1037410376 }
1037510377
10376- #if defined(WOLFSSL_HAVE_MLKEM)
10377- if ((WOLFSSL_NAMED_GROUP_IS_PQC(group)
10378- #if !defined(WOLFSSL_ASYNC_CRYPT)
10379- || WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)
10380- #endif
10381- ) && ssl->options.side == WOLFSSL_SERVER_END) {
10382- /* When handling a key share containing a KEM public key on the server
10383- * end, we have to perform the encapsulation immediately in order to
10384- * send the resulting ciphertext back to the client in the ServerHello
10385- * message. As the public key is not stored and we do not modify it, we
10386- * don't have to create a copy of it.
10387- * In case of a hybrid key exchange, the ECDH part is also performed
10388- * immediately (to not split the generation of the master secret).
10389- * Hence, we also don't have to store this public key either.
10390- *
10391- * When WOLFSSL_ASYNC_CRYPT is enabled, this handling is not possible
10392- * for the hybrid case, as the ECC part is performed asynchronously,
10393- * requiring the key share data to be stored.
10394- */
10395- ke = (byte *)&input[offset];
10396- } else
10397- #endif
10398- {
10399- /* Store a copy in the key share object. */
10400- ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10401- if (ke == NULL)
10402- return MEMORY_E;
10403- XMEMCPY(ke, &input[offset], keLen);
10404- }
10378+ /* Store a copy in the key share object. */
10379+ ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10380+ if (ke == NULL)
10381+ return MEMORY_E;
10382+ XMEMCPY(ke, &input[offset], keLen);
1040510383
1040610384 /* Populate a key share object in the extension. */
1040710385 ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
1040810386 if (ret != 0) {
10409- if (ke != &input[offset]) {
10410- XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10411- }
10387+ XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
1041210388 return ret;
1041310389 }
1041410390
@@ -11135,46 +11111,8 @@ int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
1113511111 return ret;
1113611112 }
1113711113
11138-
11139- #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11140- if (ssl->options.side == WOLFSSL_SERVER_END &&
11141- WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
11142- if (TLSX_IsGroupSupported(group)) {
11143- ret = TLSX_KeyShare_HandlePqcKeyServer((WOLFSSL*)ssl,
11144- keyShareEntry,
11145- data, len,
11146- ssl->arrays->preMasterSecret,
11147- &ssl->arrays->preMasterSz);
11148- if (ret != 0)
11149- return ret;
11150- }
11151- else {
11152- XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11153- keyShareEntry->ke = NULL;
11154- keyShareEntry->keLen = 0;
11155- }
11156- }
11157- else
11158- #if !defined(WOLFSSL_ASYNC_CRYPT)
11159- if (ssl->options.side == WOLFSSL_SERVER_END &&
11160- WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
11161- if (TLSX_IsGroupSupported(group)) {
11162- ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
11163- keyShareEntry,
11164- data, len);
11165- if (ret != 0)
11166- return ret;
11167- }
11168- else {
11169- XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11170- keyShareEntry->ke = NULL;
11171- keyShareEntry->keLen = 0;
11172- }
11173- }
11174- else
11175- #endif
11176- #endif
1117711114 if (data != NULL) {
11115+ /* Store the peer data in the key share object. */
1117811116 XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
1117911117 keyShareEntry->ke = data;
1118011118 keyShareEntry->keLen = len;
@@ -11362,7 +11300,10 @@ static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
1136211300 byte numGroups;
1136311301
1136411302 if (ssl->numGroups == 0) {
11365- return 0;
11303+ /* If the user didn't specify a group list with a preferred order,
11304+ * use the internal preferred group list. */
11305+ groups = preferredGroup;
11306+ numGroups = PREFERRED_GROUP_SZ;
1136611307 }
1136711308 else {
1136811309 groups = ssl->group;
@@ -11664,9 +11605,7 @@ int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
1166411605
1166511606 /* Use server's preference order. */
1166611607 for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11667- if ((clientKSE->ke == NULL) &&
11668- (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) &&
11669- (!WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)))
11608+ if (clientKSE->ke == NULL)
1167011609 continue;
1167111610
1167211611#ifdef WOLFSSL_SM2
@@ -11755,26 +11694,17 @@ int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
1175511694 return ret;
1175611695
1175711696 if (clientKSE->key == NULL) {
11758- #ifdef WOLFSSL_HAVE_MLKEM
11759- if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)
11760- #if !defined(WOLFSSL_ASYNC_CRYPT)
11761- || WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)
11762- #endif
11763- ) {
11764- /* Going to need the public key (AKA ciphertext). */
11765- serverKSE->pubKey = clientKSE->pubKey;
11766- clientKSE->pubKey = NULL;
11767- serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11768- clientKSE->pubKeyLen = 0;
11697+ #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11698+ if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
11699+ ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, serverKSE,
11700+ clientKSE->ke, clientKSE->keLen,
11701+ ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
1176911702 }
11770- else
11771- #if defined(WOLFSSL_ASYNC_CRYPT)
11772- if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11703+ else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
1177311704 ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
1177411705 clientKSE->ke, clientKSE->keLen);
1177511706 }
1177611707 else
11777- #endif
1177811708#endif
1177911709 {
1178011710 ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
0 commit comments