@@ -9071,16 +9071,18 @@ static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
90719071 wc_curve448_free((curve448_key*)current->key);
90729072#endif
90739073 }
9074- #ifdef WOLFSSL_HAVE_MLKEM
90759074 else if (WOLFSSL_NAMED_GROUP_IS_PQC(current->group)) {
9075+ #ifdef WOLFSSL_HAVE_MLKEM
90769076 wc_KyberKey_Free((KyberKey*)current->key);
90779077 #ifndef WOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ
90789078 if (current->privKey != NULL) {
90799079 ForceZero(current->privKey, current->privKeyLen);
90809080 }
90819081 #endif
9082+ #endif
90829083 }
90839084 else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(current->group)) {
9085+ #ifdef WOLFSSL_HAVE_MLKEM
90849086 int ecc_group = 0;
90859087 findEccPqc(&ecc_group, NULL, NULL, current->group);
90869088
@@ -9118,8 +9120,8 @@ static void TLSX_KeyShare_FreeAll(KeyShareEntry* list, void* heap)
91189120 wc_ecc_free((ecc_key*)current->key);
91199121 #endif
91209122 }
9121- }
91229123#endif
9124+ }
91239125 else {
91249126#ifdef HAVE_ECC
91259127 #if defined(WC_ECC_NONBLOCK) && defined(WOLFSSL_ASYNC_CRYPT_SW) && \
@@ -10284,42 +10286,16 @@ static int TLSX_KeyShareEntry_Parse(const WOLFSSL* ssl, const byte* input,
1028410286 *seenGroupsCnt = i + 1;
1028510287 }
1028610288
10287- #if defined(WOLFSSL_HAVE_MLKEM)
10288- if ((WOLFSSL_NAMED_GROUP_IS_PQC(group)
10289- #if !defined(WOLFSSL_ASYNC_CRYPT)
10290- || WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)
10291- #endif
10292- ) && ssl->options.side == WOLFSSL_SERVER_END) {
10293- /* When handling a key share containing a KEM public key on the server
10294- * end, we have to perform the encapsulation immediately in order to
10295- * send the resulting ciphertext back to the client in the ServerHello
10296- * message. As the public key is not stored and we do not modify it, we
10297- * don't have to create a copy of it.
10298- * In case of a hybrid key exchange, the ECDH part is also performed
10299- * immediately (to not split the generation of the master secret).
10300- * Hence, we also don't have to store this public key either.
10301- *
10302- * When WOLFSSL_ASYNC_CRYPT is enabled, this handling is not possible
10303- * for the hybrid case, as the ECC part is performed asynchronously,
10304- * requiring the key share data to be stored.
10305- */
10306- ke = (byte *)&input[offset];
10307- } else
10308- #endif
10309- {
10310- /* Store a copy in the key share object. */
10311- ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10312- if (ke == NULL)
10313- return MEMORY_E;
10314- XMEMCPY(ke, &input[offset], keLen);
10315- }
10289+ /* Store a copy in the key share object. */
10290+ ke = (byte*)XMALLOC(keLen, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10291+ if (ke == NULL)
10292+ return MEMORY_E;
10293+ XMEMCPY(ke, &input[offset], keLen);
1031610294
1031710295 /* Populate a key share object in the extension. */
1031810296 ret = TLSX_KeyShare_Use(ssl, group, keLen, ke, kse, extensions);
1031910297 if (ret != 0) {
10320- if (ke != &input[offset]) {
10321- XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10322- }
10298+ XFREE(ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
1032310299 return ret;
1032410300 }
1032510301
@@ -11046,46 +11022,8 @@ int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
1104611022 return ret;
1104711023 }
1104811024
11049-
11050- #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11051- if (ssl->options.side == WOLFSSL_SERVER_END &&
11052- WOLFSSL_NAMED_GROUP_IS_PQC(group)) {
11053- if (TLSX_IsGroupSupported(group)) {
11054- ret = TLSX_KeyShare_HandlePqcKeyServer((WOLFSSL*)ssl,
11055- keyShareEntry,
11056- data, len,
11057- ssl->arrays->preMasterSecret,
11058- &ssl->arrays->preMasterSz);
11059- if (ret != 0)
11060- return ret;
11061- }
11062- else {
11063- XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11064- keyShareEntry->ke = NULL;
11065- keyShareEntry->keLen = 0;
11066- }
11067- }
11068- else
11069- #if !defined(WOLFSSL_ASYNC_CRYPT)
11070- if (ssl->options.side == WOLFSSL_SERVER_END &&
11071- WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
11072- if (TLSX_IsGroupSupported(group)) {
11073- ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
11074- keyShareEntry,
11075- data, len);
11076- if (ret != 0)
11077- return ret;
11078- }
11079- else {
11080- XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
11081- keyShareEntry->ke = NULL;
11082- keyShareEntry->keLen = 0;
11083- }
11084- }
11085- else
11086- #endif
11087- #endif
1108811025 if (data != NULL) {
11026+ /* Store the peer data in the key share object. */
1108911027 XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
1109011028 keyShareEntry->ke = data;
1109111029 keyShareEntry->keLen = len;
@@ -11273,7 +11211,10 @@ static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
1127311211 byte numGroups;
1127411212
1127511213 if (ssl->numGroups == 0) {
11276- return 0;
11214+ /* If the user didn't specify a group list with a preferred order,
11215+ * use the internal preferred group list. */
11216+ groups = preferredGroup;
11217+ numGroups = PREFERRED_GROUP_SZ;
1127711218 }
1127811219 else {
1127911220 groups = ssl->group;
@@ -11570,9 +11511,7 @@ int TLSX_KeyShare_Choose(const WOLFSSL *ssl, TLSX* extensions,
1157011511
1157111512 /* Use server's preference order. */
1157211513 for (clientKSE = list; clientKSE != NULL; clientKSE = clientKSE->next) {
11573- if ((clientKSE->ke == NULL) &&
11574- (!WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) &&
11575- (!WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)))
11514+ if (clientKSE->ke == NULL)
1157611515 continue;
1157711516
1157811517#ifdef WOLFSSL_SM2
@@ -11661,26 +11600,17 @@ int TLSX_KeyShare_Setup(WOLFSSL *ssl, KeyShareEntry* clientKSE)
1166111600 return ret;
1166211601
1166311602 if (clientKSE->key == NULL) {
11664- #ifdef WOLFSSL_HAVE_MLKEM
11665- if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)
11666- #if !defined(WOLFSSL_ASYNC_CRYPT)
11667- || WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)
11668- #endif
11669- ) {
11670- /* Going to need the public key (AKA ciphertext). */
11671- serverKSE->pubKey = clientKSE->pubKey;
11672- clientKSE->pubKey = NULL;
11673- serverKSE->pubKeyLen = clientKSE->pubKeyLen;
11674- clientKSE->pubKeyLen = 0;
11603+ #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_ENCAPSULATE)
11604+ if (WOLFSSL_NAMED_GROUP_IS_PQC(clientKSE->group)) {
11605+ ret = TLSX_KeyShare_HandlePqcKeyServer(ssl, serverKSE,
11606+ clientKSE->ke, clientKSE->keLen,
11607+ ssl->arrays->preMasterSecret, &ssl->arrays->preMasterSz);
1167511608 }
11676- else
11677- #if defined(WOLFSSL_ASYNC_CRYPT)
11678- if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
11609+ else if (WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(clientKSE->group)) {
1167911610 ret = TLSX_KeyShare_HandlePqcHybridKeyServer(ssl, serverKSE,
1168011611 clientKSE->ke, clientKSE->keLen);
1168111612 }
1168211613 else
11683- #endif
1168411614#endif
1168511615 {
1168611616 ret = TLSX_KeyShare_GenKey(ssl, serverKSE);
0 commit comments