@@ -9082,16 +9082,18 @@ static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
90829082 wc_curve448_free((curve448_key*)current->key);
90839083#endif
90849084 }
9085- #ifdef WOLFSSL_HAVE_MLKEM
90869085 else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
9086+ #ifdef WOLFSSL_HAVE_MLKEM
90879087 wc_KyberKey_Free((KyberKey*)current->key);
90889088 #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
90899089 if (current->privKey != NULL) {
90909090 ForceZero(current->privKey, current->privKeyLen);
90919091 }
90929092 #endif
9093+ #endif
90939094 }
90949095 else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
9096+ #ifdef WOLFSSL_HAVE_MLKEM
90959097 int ecc_group = 0;
90969098 findEccPqc(&ecc_group, NULL, NULL, current->group);
90979099
@@ -9129,8 +9131,8 @@ static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
91299131 wc_ecc_free((ecc_key*)current->key);
91309132 #endif
91319133 }
9132- }
91339134#endif
9135+ }
91349136 else {
91359137#ifdef HAVE_ECC
91369138 #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
@@ -10304,42 +10306,16 @@ static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
1030410306 *seenGroupsCnt = i + 1;
1030510307 }
1030610308
10307- #if defined(WOLFSSL_HAVE_MLKEM)
10308- if ((WOLFSSL_NAMED_GROUP_IS_PQC(group)
10309- #if !defined(WOLFSSL_ASYNC_CRYPT)
10310- || WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)
10311- #endif
10312- ) && ssl->options.side == WOLFSSL_SERVER_END) {
10313- /* When handling a key share containing a KEM public key on the server
10314- * end, we have to perform the encapsulation immediately in order to
10315- * send the resulting ciphertext back to the client in the ServerHello
10316- * message. As the public key is not stored and we do not modify it, we
10317- * don't have to create a copy of it.
10318- * In case of a hybrid key exchange, the ECDH part is also performed
10319- * immediately (to not split the generation of the master secret).
10320- * Hence, we also don't have to store this public key either.
10321- *
10322- * When WOLFSSL_ASYNC_CRYPT is enabled, this handling is not possible
10323- * for the hybrid case, as the ECC part is performed asynchronously,
10324- * requiring the key share data to be stored.
10325- */
10326- ke = (byte *)&input[offset];
10327- } else
10328- #endif
10329- {
10330- /* Store a copy in the key share object. */
10331- ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10332- if (ke == NULL)
10333- return MEMORY_E;
10334- XMEMCPY(ke, &input[offset], keLen);
10335- }
10309+ /* Store a copy in the key share object. */
10310+ ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10311+ if (ke == NULL)
10312+ return MEMORY_E;
10313+ XMEMCPY(ke, &input[offset], keLen);
1033610314
1033710315 /* Populate a key share object in the extension. */
1033810316 ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
1033910317 if (ret != 0) {
10340- if (ke != &input[offset]) {
10341- XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10342- }
10318+ XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
1034310319 return ret;
1034410320 }
1034510321
@@ -11066,46 +11042,8 @@ int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
1106611042 return ret;
1106711043 }
1106811044
11069-
11070- #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11071- if (ssl->options.side == WOLFSSL_SERVER_END &&
11072- WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
11073- if (TLSX_IsGroupSupported(group)) {
11074- ret = TLSX_KeyShare_HandlePqcKeyServer((WOLFSSL*)ssl,
11075- keyShareEntry,
11076- data, len,
11077- ssl->arrays->preMasterSecret,
11078- &ssl->arrays->preMasterSz);
11079- if (ret != 0)
11080- return ret;
11081- }
11082- else {
11083- XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11084- keyShareEntry->ke = NULL;
11085- keyShareEntry->keLen = 0;
11086- }
11087- }
11088- else
11089- #if !defined(WOLFSSL_ASYNC_CRYPT)
11090- if (ssl->options.side == WOLFSSL_SERVER_END &&
11091- WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
11092- if (TLSX_IsGroupSupported(group)) {
11093- ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
11094- keyShareEntry,
11095- data, len);
11096- if (ret != 0)
11097- return ret;
11098- }
11099- else {
11100- XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11101- keyShareEntry->ke = NULL;
11102- keyShareEntry->keLen = 0;
11103- }
11104- }
11105- else
11106- #endif
11107- #endif
1110811045 if (data != NULL) {
11046+ /* Store the peer data in the key share object. */
1110911047 XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
1111011048 keyShareEntry->ke = data;
1111111049 keyShareEntry->keLen = len;
@@ -11293,7 +11231,10 @@ static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
1129311231 byte numGroups;
1129411232
1129511233 if (ssl->numGroups == 0) {
11296- return 0;
11234+ /* If the user didn't specify a group list with a preferred order,
11235+ * use the internal preferred group list. */
11236+ groups = preferredGroup;
11237+ numGroups = PREFERRED_GROUP_SZ;
1129711238 }
1129811239 else {
1129911240 groups = ssl->group;
@@ -11590,9 +11531,7 @@ int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
1159011531
1159111532 /* Use server's preference order. */
1159211533 for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11593- if ((clientKSE->ke == NULL) &&
11594- (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) &&
11595- (!WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)))
11534+ if (clientKSE->ke == NULL)
1159611535 continue;
1159711536
1159811537#ifdef WOLFSSL_SM2
@@ -11681,26 +11620,17 @@ int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
1168111620 return ret;
1168211621
1168311622 if (clientKSE->key == NULL) {
11684- #ifdef WOLFSSL_HAVE_MLKEM
11685- if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)
11686- #if !defined(WOLFSSL_ASYNC_CRYPT)
11687- || WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)
11688- #endif
11689- ) {
11690- /* Going to need the public key (AKA ciphertext). */
11691- serverKSE->pubKey = clientKSE->pubKey;
11692- clientKSE->pubKey = NULL;
11693- serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11694- clientKSE->pubKeyLen = 0;
11623+ #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11624+ if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
11625+ ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, serverKSE,
11626+ clientKSE->ke, clientKSE->keLen,
11627+ ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
1169511628 }
11696- else
11697- #if defined(WOLFSSL_ASYNC_CRYPT)
11698- if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11629+ else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
1169911630 ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
1170011631 clientKSE->ke, clientKSE->keLen);
1170111632 }
1170211633 else
11703- #endif
1170411634#endif
1170511635 {
1170611636 ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
0 commit comments