Skip to content

Commit 7eca4fb

Browse files
committed
ML_KEM IDs backward compat
Allow backward compatibilitly of Hybrid ML_KEM codepoints in TLS with version before wolfSSL 5.8.0. When WOLFSSL_ML_KEM_USE_OLD_IDS is defined, it will accept the old codepoints for P256 with ML-KEM-512, P384 with ML-KEM-768, P521 with ML-KEM-10124. (Others combinations were not know pre 5.8.0.) Both old client with new server and new client with new server work with old codepoints.
1 parent 5047134 commit 7eca4fb

5 files changed

Lines changed: 76 additions & 1 deletion

File tree

.wolfssl_known_macro_extras

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -724,6 +724,7 @@ WOLFSSL_MLKEM_MAKEKEY_SMALL_MEM
724724
WOLFSSL_MLKEM_NO_LARGE_CODE
725725
WOLFSSL_MLKEM_NO_MALLOC
726726
WOLFSSL_MLKEM_NTT_UNROLL
727+
WOLFSSL_ML_KEM_USE_OLD_IDS
727728
WOLFSSL_MONT_RED_CT
728729
WOLFSSL_MP_COND_COPY
729730
WOLFSSL_MP_INVMOD_CONSTANT_TIME

src/internal.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35344,6 +35344,11 @@ static int DoSessionTicket(WOLFSSL* ssl, const byte* input, word32* inOutIdx,
3534435344
case WOLFSSL_P521_ML_KEM_1024:
3534535345
case WOLFSSL_X25519_ML_KEM_512:
3534635346
case WOLFSSL_X448_ML_KEM_768:
35347+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
35348+
case WOLFSSL_P256_ML_KEM_512_OLD:
35349+
case WOLFSSL_P384_ML_KEM_768_OLD:
35350+
case WOLFSSL_P521_ML_KEM_1024_OLD:
35351+
#endif
3534735352
#endif
3534835353
#ifdef WOLFSSL_MLKEM_KYBER
3534935354
case WOLFSSL_P256_KYBER_LEVEL3:

src/ssl.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15591,6 +15591,10 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
1559115591
return "ML_KEM_512";
1559215592
case WOLFSSL_P256_ML_KEM_512:
1559315593
return "P256_ML_KEM_512";
15594+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
15595+
case WOLFSSL_P256_ML_KEM_512_OLD:
15596+
return "P256_ML_KEM_512_OLD";
15597+
#endif
1559415598
#ifdef HAVE_CURVE25519
1559515599
case WOLFSSL_X25519_ML_KEM_512:
1559615600
return "X25519_ML_KEM_512";
@@ -15601,6 +15605,10 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
1560115605
return "ML_KEM_768";
1560215606
case WOLFSSL_P384_ML_KEM_768:
1560315607
return "P384_ML_KEM_768";
15608+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
15609+
case WOLFSSL_P384_ML_KEM_768_OLD:
15610+
return "P384_ML_KEM_768_OLD";
15611+
#endif
1560415612
case WOLFSSL_P256_ML_KEM_768:
1560515613
return "P256_ML_KEM_768";
1560615614
#ifdef HAVE_CURVE25519
@@ -15617,6 +15625,10 @@ const char* wolfSSL_get_curve_name(WOLFSSL* ssl)
1561715625
return "ML_KEM_1024";
1561815626
case WOLFSSL_P521_ML_KEM_1024:
1561915627
return "P521_ML_KEM_1024";
15628+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
15629+
case WOLFSSL_P521_ML_KEM_1024_OLD:
15630+
return "P521_ML_KEM_1024_OLD";
15631+
#endif
1562015632
case WOLFSSL_P384_ML_KEM_1024:
1562115633
return "P384_ML_KEM_1024";
1562215634
#endif

src/tls.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4600,8 +4600,14 @@ static int TLSX_IsGroupSupported(int namedGroup)
46004600
case WOLFSSL_ML_KEM_1024:
46014601
case WOLFSSL_P521_ML_KEM_1024:
46024602
case WOLFSSL_P384_ML_KEM_1024:
4603+
break;
46034604
#endif
4605+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
4606+
case WOLFSSL_P256_ML_KEM_512_OLD:
4607+
case WOLFSSL_P384_ML_KEM_768_OLD:
4608+
case WOLFSSL_P521_ML_KEM_1024_OLD:
46044609
break;
4610+
#endif
46054611
#elif defined(HAVE_LIBOQS)
46064612
case WOLFSSL_ML_KEM_512:
46074613
case WOLFSSL_ML_KEM_768:
@@ -4619,6 +4625,7 @@ static int TLSX_IsGroupSupported(int namedGroup)
46194625
}
46204626
break;
46214627
}
4628+
46224629
case WOLFSSL_P256_ML_KEM_512:
46234630
case WOLFSSL_P384_ML_KEM_768:
46244631
case WOLFSSL_P256_ML_KEM_768:
@@ -5866,6 +5873,23 @@ int TLSX_UseSupportedCurve(TLSX** extensions, word16 name, void* heap)
58665873
heap);
58675874
if (ret != 0)
58685875
return ret;
5876+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
5877+
if (name == WOLFSSL_P256_ML_KEM_512) {
5878+
ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5879+
WOLFSSL_P256_ML_KEM_512_OLD, heap);
5880+
}
5881+
else if (name == WOLFSSL_P384_ML_KEM_768) {
5882+
ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5883+
WOLFSSL_P384_ML_KEM_768_OLD, heap);
5884+
}
5885+
else if (name == WOLFSSL_P521_ML_KEM_1024) {
5886+
ret = TLSX_SupportedCurve_Append((SupportedCurve*)extension->data,
5887+
WOLFSSL_P521_ML_KEM_1024_OLD, heap);
5888+
}
5889+
if (ret != 0) {
5890+
return ret;
5891+
}
5892+
#endif
58695893
}
58705894

58715895
return WOLFSSL_SUCCESS;
@@ -8436,6 +8460,11 @@ static const PqcHybridMapping pqc_hybrid_mapping[] = {
84368460
{WOLFSSL_P256_ML_KEM_768, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_768, 0},
84378461
{WOLFSSL_P521_ML_KEM_1024, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
84388462
{WOLFSSL_P384_ML_KEM_1024, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_1024, 0},
8463+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
8464+
{WOLFSSL_P256_ML_KEM_512_OLD, WOLFSSL_ECC_SECP256R1, WOLFSSL_ML_KEM_512, 0},
8465+
{WOLFSSL_P384_ML_KEM_768_OLD, WOLFSSL_ECC_SECP384R1, WOLFSSL_ML_KEM_768, 0},
8466+
{WOLFSSL_P521_ML_KEM_1024_OLD, WOLFSSL_ECC_SECP521R1, WOLFSSL_ML_KEM_1024, 0},
8467+
#endif
84398468
#ifdef HAVE_CURVE25519
84408469
{WOLFSSL_X25519_ML_KEM_512, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_512, 1},
84418470
{WOLFSSL_X25519_ML_KEM_768, WOLFSSL_ECC_X25519, WOLFSSL_ML_KEM_768, 1},
@@ -10541,6 +10570,18 @@ int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
1054110570
/* Try to find the key share entry with this group. */
1054210571
keyShareEntry = (KeyShareEntry*)extension->data;
1054310572
while (keyShareEntry != NULL) {
10573+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10574+
if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10575+
keyShareEntry->group == WOLFSSL_P256_ML_KEM_512) ||
10576+
(group == WOLFSSL_P384_ML_KEM_768_OLD &&
10577+
keyShareEntry->group == WOLFSSL_P384_ML_KEM_768) ||
10578+
(group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10579+
keyShareEntry->group == WOLFSSL_P521_ML_KEM_1024)) {
10580+
keyShareEntry->group = group;
10581+
break;
10582+
}
10583+
else
10584+
#endif
1054410585
if (keyShareEntry->group == group)
1054510586
break;
1054610587
keyShareEntry = keyShareEntry->next;
@@ -10778,9 +10819,20 @@ static int TLSX_KeyShare_GroupRank(const WOLFSSL* ssl, int group)
1077810819
return WOLFSSL_FATAL_ERROR;
1077910820
#endif
1078010821

10781-
for (i = 0; i < numGroups; i++)
10822+
for (i = 0; i < numGroups; i++) {
10823+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
10824+
if ((group == WOLFSSL_P256_ML_KEM_512_OLD &&
10825+
groups[i] == WOLFSSL_P256_ML_KEM_512) ||
10826+
(group == WOLFSSL_P384_ML_KEM_768_OLD &&
10827+
groups[i] == WOLFSSL_P384_ML_KEM_768) ||
10828+
(group == WOLFSSL_P521_ML_KEM_1024_OLD &&
10829+
groups[i] == WOLFSSL_P521_ML_KEM_1024)) {
10830+
return i;
10831+
}
10832+
#endif
1078210833
if (groups[i] == (word16)group)
1078310834
return i;
10835+
}
1078410836

1078510837
return WOLFSSL_FATAL_ERROR;
1078610838
}

wolfssl/ssl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4617,6 +4617,11 @@ enum {
46174617
* https://github.com/open-quantum-safe/oqs-provider/blob/main/oqs-template/
46184618
* oqs-kem-info.md
46194619
*/
4620+
#ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
4621+
WOLFSSL_P256_ML_KEM_512_OLD = 12103,
4622+
WOLFSSL_P384_ML_KEM_768_OLD = 12104,
4623+
WOLFSSL_P521_ML_KEM_1024_OLD = 12105,
4624+
#endif
46204625
WOLFSSL_P256_ML_KEM_512 = 12107,
46214626
WOLFSSL_P384_ML_KEM_768 = 12108,
46224627
WOLFSSL_P521_ML_KEM_1024 = 12109,

0 commit comments

Comments
 (0)