Skip to content

Commit d9d49bb

Browse files
committed
Add tests for individual ML-KEM levels (based on #9777)
Also fix minor problems found with these tests
1 parent 721a6a9 commit d9d49bb

7 files changed

Lines changed: 67 additions & 25 deletions

File tree

.github/workflows/pq-all.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ jobs:
2727
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-acert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-quic --with-sys-crypto-policy --enable-experimental --enable-mlkem=yes,kyber,ml-kem --enable-lms --enable-xmss --enable-dilithium --enable-dual-alg-certs --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE -DWOLFSSL_TLSX_PQC_MLKEM_STORE_OBJ"',
2828
'--disable-intelasm --enable-all --enable-testcert --enable-acert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-quic --with-sys-crypto-policy --enable-experimental --enable-mlkem=yes,kyber,ml-kem,small --enable-lms=yes,small --enable-xmss=yes,small --enable-dilithium=yes,small --enable-dual-alg-certs --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE -DWOLFSSL_MLKEM_MAKEKEY_SMALL_MEM -DWOLFSSL_MLKEM_ENCAPSULATE_SMALL_MEM -DWOLFSSL_MLKEM_NO_LARGE_CODE -DWOLFSSL_DILITHIUM_SIGN_SMALL_MEM -DWOLFSSL_DILITHIUM_VERIFY_SMALL_MEM -DWOLFSSL_DILITHIUM_MAKE_KEY_SMALL_MEM -DWOLFSSL_DILITHIUM_NO_LARGE_CODE"',
2929
'--disable-intelasm --enable-smallstack --enable-smallstackcache --enable-all --enable-testcert --enable-acert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-quic --with-sys-crypto-policy --enable-experimental --enable-mlkem=yes,kyber,ml-kem,small --enable-lms=yes,small --enable-xmss=yes,small --enable-dilithium=yes,small --enable-dual-alg-certs --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE -DWOLFSSL_MLKEM_MAKEKEY_SMALL_MEM -DWOLFSSL_MLKEM_ENCAPSULATE_SMALL_MEM -DWOLFSSL_MLKEM_NO_LARGE_CODE -DWOLFSSL_DILITHIUM_SIGN_SMALL_MEM -DWOLFSSL_DILITHIUM_VERIFY_SMALL_MEM -DWOLFSSL_DILITHIUM_MAKE_KEY_SMALL_MEM -DWOLFSSL_DILITHIUM_NO_LARGE_CODE"',
30+
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-mlkem=make,enc,dec,512 --enable-tls-mlkem-standalone --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE"',
31+
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-mlkem=make,enc,dec,768 --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE"',
32+
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-mlkem=make,enc,dec,768 --enable-tls-mlkem-standalone--disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE"',
33+
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-mlkem=make,enc,dec,768 --enable-tls-mlkem-standalone --disable-pqc-hybrids --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE"',
34+
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-mlkem=make,enc,dec,1024 --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE"',
35+
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-mlkem=make,enc,dec,1024 --enable-tls-mlkem-standalone --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE"',
36+
'--enable-intelasm --enable-sp-asm --enable-all --enable-testcert --enable-dtls13 --enable-dtls-mtu --enable-dtls-frag-ch --enable-dtlscid --enable-mlkem=make,enc,dec,1024 --enable-tls-mlkem-standalone --disable-pqc-hybrids --disable-qt CPPFLAGS="-pedantic -Wdeclaration-after-statement -DWOLFCRYPT_TEST_LINT -DNO_WOLFSSL_CIPHER_SUITE_TEST -DTEST_LIBWOLFSSL_SOURCES_INCLUSION_SEQUENCE"',
3037
]
3138
name: make check
3239
if: github.repository_owner == 'wolfssl'

configure.ac

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1802,14 +1802,20 @@ then
18021802
if test "$ENABLED_MLKEM" = "no"
18031803
then
18041804
ENABLED_PQC_HYBRIDS=no
1805+
elif test "$ENABLED_MLKEM768" = "" && test "$ENABLED_MLKEM1024" = ""; then
1806+
AC_MSG_NOTICE([PQC hybrid combinations require either ML-KEM 768 or ML-KEM 1024, but both disabled.])
1807+
ENABLED_PQC_HYBRIDS=no
18051808
else
18061809
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_PQC_HYBRIDS"
18071810
fi
18081811
fi
18091812

1810-
if test "$ENABLED_MLKEM" = "yes" && test "$ENABLED_TLS13" = "yes" && test "$ENABLED_PQC_HYBRIDS" = "no" && test "$ENABLED_MLKEM_STANDALONE" = "no"
1813+
if test "$ENABLED_MLKEM" != "no"
18111814
then
1812-
AC_MSG_ERROR([Both hybrid PQ/T and standalone ML-KEM are disabled, so no PQC hybrid combinations will be available.])
1815+
if test "$ENABLED_PQC_HYBRIDS" = "no" && test "$ENABLED_MLKEM_STANDALONE" = "no" && test "$ENABLED_CRYPTONLY" = "no"
1816+
then
1817+
AC_MSG_ERROR([Both hybrid PQ/T and standalone ML-KEM are disabled, so no PQC hybrid combinations will be available.])
1818+
fi
18131819
fi
18141820

18151821
# Extra PQ/T Hybrid combinations

src/tls.c

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8486,9 +8486,8 @@ static int mlkem_id2type(int id, int *type)
84868486
#endif
84878487

84888488
#if defined(WOLFSSL_NO_ML_KEM_768) && defined(WOLFSSL_NO_ML_KEM_1024) && \
8489-
!defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
8490-
#error "Non-experimental PQC hybrid combinations require either "
8491-
"ML-KEM 768 or ML-KEM 1024"
8489+
defined(WOLFSSL_PQC_HYBRIDS)
8490+
#error "PQC hybrid combinations require either ML-KEM 768 or ML-KEM 1024"
84928491
#endif
84938492

84948493
/* Structures and objects needed for hybrid key exchanges using both classic
@@ -10913,11 +10912,18 @@ int TLSX_KeyShare_Use(const WOLFSSL* ssl, word16 group, word16 len, byte* data,
1091310912
#if !defined(WOLFSSL_ASYNC_CRYPT)
1091410913
if (ssl->options.side == WOLFSSL_SERVER_END &&
1091510914
WOLFSSL_NAMED_GROUP_IS_PQC_HYBRID(group)) {
10916-
ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
10917-
keyShareEntry,
10918-
data, len);
10919-
if (ret != 0)
10920-
return ret;
10915+
if (TLSX_IsGroupSupported(group)) {
10916+
ret = TLSX_KeyShare_HandlePqcHybridKeyServer((WOLFSSL*)ssl,
10917+
keyShareEntry,
10918+
data, len);
10919+
if (ret != 0)
10920+
return ret;
10921+
}
10922+
else {
10923+
XFREE(keyShareEntry->ke, ssl->heap, DYNAMIC_TYPE_PUBLIC_KEY);
10924+
keyShareEntry->ke = NULL;
10925+
keyShareEntry->keLen = 0;
10926+
}
1092110927
}
1092210928
else
1092310929
#endif

tests/api.c

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30664,19 +30664,38 @@ static int test_dtls13_frag_ch_pq(void)
3066430664
byte buf[255];
3066530665
#if !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
3066630666
#if defined(WOLFSSL_MLKEM_KYBER)
30667+
#if !defined(WOLFSSL_NO_KYBER1024)
3066730668
int group = WOLFSSL_KYBER_LEVEL5;
3066830669
const char *group_name = "KYBER_LEVEL5";
30670+
#elif !defined(WOLFSSL_NO_KYBER768)
30671+
int group = WOLFSSL_KYBER_LEVEL3;
30672+
const char *group_name = "KYBER_LEVEL3";
30673+
#else
30674+
int group = WOLFSSL_KYBER_LEVEL1;
30675+
const char *group_name = "KYBER_LEVEL1";
30676+
#endif
3066930677
#else
30678+
#if !defined(WOLFSSL_NO_ML_KEM_1024)
3067030679
int group = WOLFSSL_ML_KEM_1024;
3067130680
const char *group_name = "ML_KEM_1024";
30681+
#elif !defined(WOLFSSL_NO_ML_KEM_768)
30682+
int group = WOLFSSL_ML_KEM_768;
30683+
const char *group_name = "ML_KEM_768";
30684+
#else
30685+
int group = WOLFSSL_ML_KEM_512;
30686+
const char *group_name = "ML_KEM_512";
30687+
#endif
3067230688
#endif
3067330689
#elif defined(WOLFSSL_PQC_HYBRIDS)
30674-
#if defined(HAVE_CURVE25519)
30690+
#if defined(HAVE_CURVE25519) && !defined(WOLFSSL_NO_ML_KEM_768)
3067530691
int group = WOLFSSL_X25519MLKEM768;
3067630692
const char *group_name = "X25519MLKEM768";
30677-
#else
30693+
#elif !defined(WOLFSSL_NO_ML_KEM_768)
3067830694
int group = WOLFSSL_SECP256R1MLKEM768;
3067930695
const char *group_name = "SecP256r1MLKEM768";
30696+
#else
30697+
int group = WOLFSSL_SECP384R1MLKEM1024;
30698+
const char *group_name = "SecP384r1MLKEM1024";
3068030699
#endif
3068130700
#endif /* WOLFSSL_TLS_NO_MLKEM_STANDALONE */
3068230701

tests/api/test_dtls.c

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1619,15 +1619,23 @@ int test_dtls_rtx_across_epoch_change(void)
16191619
*into two messages */
16201620
int helloMsgCount = 2;
16211621
int groups[2] = {
1622-
#if defined(HAVE_CURVE25519) && defined(WOLFSSL_PQC_HYBRIDS)
1622+
#if defined(HAVE_CURVE25519) && defined(WOLFSSL_PQC_HYBRIDS) && \
1623+
!defined(WOLFSSL_NO_ML_KEM_768)
16231624
WOLFSSL_X25519MLKEM768,
1624-
#elif defined(HAVE_ECC) && defined(WOLFSSL_PQC_HYBRIDS)
1625+
#elif defined(HAVE_ECC) && defined(WOLFSSL_PQC_HYBRIDS) && \
1626+
!defined(WOLFSSL_NO_ML_KEM_768)
16251627
WOLFSSL_SECP256R1MLKEM768,
1628+
#elif defined(HAVE_ECC) && defined(WOLFSSL_PQC_HYBRIDS) && \
1629+
!defined(WOLFSSL_NO_ML_KEM_1024)
1630+
WOLFSSL_SECP384R1MLKEM1024,
16261631
#elif !defined(WOLFSSL_NO_ML_KEM_1024) && \
16271632
!defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16281633
WOLFSSL_ML_KEM_1024,
1629-
#else
1634+
#elif !defined(WOLFSSL_NO_ML_KEM_768) && \
1635+
!defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
16301636
WOLFSSL_ML_KEM_768,
1637+
#else
1638+
WOLFSSL_ML_KEM_512,
16311639
#endif
16321640
WOLFSSL_ECC_SECP256R1,
16331641
};

tests/api/test_tls13.c

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -160,12 +160,8 @@ int test_tls13_apis(void)
160160
":SecP256r1MLKEM512"
161161
#elif !defined(WOLFSSL_NO_ML_KEM_768) && defined(WOLFSSL_PQC_HYBRIDS)
162162
":SecP256r1MLKEM768"
163-
#elif !defined(WOLFSSL_NO_ML_KEM_1024) && \
164-
!defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
165-
":ML_KEM_1024"
166-
#elif !defined(WOLFSSL_NO_ML_KEM_768) && \
167-
!defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
168-
":ML_KEM_768"
163+
#elif !defined(WOLFSSL_NO_ML_KEM_1024) && defined(WOLFSSL_PQC_HYBRIDS)
164+
":SecP384r1MLKEM1024"
169165
#endif
170166
#endif
171167
#endif
@@ -184,11 +180,11 @@ int test_tls13_apis(void)
184180
":KYBER_LEVEL5"
185181
#endif
186182
#elif !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
187-
#ifndef WOLFSSL_NO_KYBER512
183+
#if !defined(WOLFSSL_NO_ML_KEM_512)
188184
":ML_KEM_512"
189-
#elif !defined(WOLFSSL_NO_KYBER768)
185+
#elif !defined(WOLFSSL_NO_ML_KEM_768)
190186
":ML_KEM_768"
191-
#else
187+
#elif !defined(WOLFSSL_NO_ML_KEM_1024)
192188
":ML_KEM_1024"
193189
#endif
194190
#endif

wolfssl/internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1752,7 +1752,7 @@ enum Misc {
17521752
ECDHE_SIZE = 32, /* ECDHE server size defaults to 256 bit */
17531753
#endif
17541754
MAX_EXPORT_ECC_SZ = 256, /* Export ANSI X9.62 max future size */
1755-
MAX_CURVE_NAME_SZ = 18, /* Maximum size of curve name string */
1755+
MAX_CURVE_NAME_SZ = 20, /* Maximum size of curve name string */
17561756

17571757
NEW_SA_MAJOR = 8, /* Most significant byte used with new sig algos */
17581758
RSA_PSS_RSAE_SHA256_MINOR = 0x04,

0 commit comments

Comments
 (0)