@@ -169,57 +169,151 @@ static int IsValidCipherSuite(const char* line, char *suite, size_t suite_spc)
169169}
170170
171171#if defined(WOLFSSL_HAVE_MLKEM )
172+
173+ #define MATCH_PQC (b , s , l ) ((l) == sizeof(s) - 1 && \
174+ XSTRNCMP((b), (s), sizeof(s) - 1) == 0)
175+
172176static int IsKyberLevelAvailable (const char * line )
173177{
174178 int available = 0 ;
175- const char * find = "--pqc " ;
176- const char * begin = strstr (line , find );
177- const char * end ;
179+ const char * begin = XSTRSTR (line , "--pqc" );
180+ size_t len = 0 ;
178181
179182 if (begin != NULL ) {
180- begin += 6 ;
181- end = XSTRSTR (begin , " " );
183+ begin += XSTRLEN ("--pqc" );
184+ while (* begin == ' ' || * begin == '\t' ) {
185+ begin ++ ;
186+ }
182187
183- #ifndef WOLFSSL_NO_ML_KEM
184- if ((size_t )end - (size_t )begin == 10 ) {
188+ if (* begin != '\0' ) {
189+ const char * end = begin ;
190+ while (* end != '\0' && * end != ' ' && * end != '\t' ) {
191+ end ++ ;
192+ }
193+ len = (size_t )(end - begin );
194+ }
195+ }
196+
197+ if (begin != NULL && len > 0 ) {
198+ #ifndef WOLFSSL_NO_ML_KEM
185199 #ifndef WOLFSSL_NO_ML_KEM_512
186- if (XSTRNCMP (begin , "ML_KEM_512" , 10 ) == 0 ) {
200+ if (MATCH_PQC (begin , "ML_KEM_512" , len ) ) {
187201 available = 1 ;
188202 }
189203 #endif
190204 #ifndef WOLFSSL_NO_ML_KEM_768
191- if (XSTRNCMP (begin , "ML_KEM_768" , 10 ) == 0 ) {
205+ if (MATCH_PQC (begin , "ML_KEM_768" , len ) ) {
192206 available = 1 ;
193207 }
194208 #endif
195- }
196209 #ifndef WOLFSSL_NO_ML_KEM_1024
197- if ((size_t )end - (size_t )begin == 11 ) {
198- if (XSTRNCMP (begin , "ML_KEM_1024" , 11 ) == 0 ) {
210+ if (MATCH_PQC (begin , "ML_KEM_1024" , len )) {
199211 available = 1 ;
200212 }
201- }
202213 #endif
203- #endif
204- #ifdef WOLFSSL_MLKEM_KYBER
205- if ((size_t )end - (size_t )begin == 12 ) {
214+
215+ #if !defined(WOLFSSL_NO_ML_KEM_512 ) && defined(HAVE_ECC )
216+ if (MATCH_PQC (begin , "SecP256r1MLKEM512" , len )) {
217+ available = 1 ;
218+ }
219+ #ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
220+ if (MATCH_PQC (begin , "P256_ML_KEM_512_OLD" , len )) {
221+ available = 1 ;
222+ }
223+ #endif
224+ #endif
225+ #if !defined(WOLFSSL_NO_ML_KEM_768 ) && defined(HAVE_ECC )
226+ if (MATCH_PQC (begin , "SecP384r1MLKEM768" , len )) {
227+ available = 1 ;
228+ }
229+ if (MATCH_PQC (begin , "SecP256r1MLKEM768" , len )) {
230+ available = 1 ;
231+ }
232+ #ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
233+ if (MATCH_PQC (begin , "P384_ML_KEM_768_OLD" , len )) {
234+ available = 1 ;
235+ }
236+ #endif
237+ #endif
238+ #if !defined(WOLFSSL_NO_ML_KEM_768 ) && defined(HAVE_CURVE25519 )
239+ if (MATCH_PQC (begin , "X25519MLKEM768" , len )) {
240+ available = 1 ;
241+ }
242+ #endif
243+ #if !defined(WOLFSSL_NO_ML_KEM_1024 ) && defined(HAVE_ECC )
244+ if (MATCH_PQC (begin , "SecP521r1MLKEM1024" , len )) {
245+ available = 1 ;
246+ }
247+ if (MATCH_PQC (begin , "SecP384r1MLKEM1024" , len )) {
248+ available = 1 ;
249+ }
250+ #ifdef WOLFSSL_ML_KEM_USE_OLD_IDS
251+ if (MATCH_PQC (begin , "P521_ML_KEM_1024_OLD" , len )) {
252+ available = 1 ;
253+ }
254+ #endif
255+ #endif
256+ #if !defined(WOLFSSL_NO_ML_KEM_512 ) && defined(HAVE_CURVE25519 )
257+ if (MATCH_PQC (begin , "X25519MLKEM512" , len )) {
258+ available = 1 ;
259+ }
260+ #endif
261+ #if !defined(WOLFSSL_NO_ML_KEM_768 ) && defined(HAVE_CURVE448 )
262+ if (MATCH_PQC (begin , "X448MLKEM768" , len )) {
263+ available = 1 ;
264+ }
265+ #endif
266+ #endif /* !WOLFSSL_NO_ML_KEM */
267+ #ifdef WOLFSSL_MLKEM_KYBER
206268 #ifndef WOLFSSL_NO_KYBER512
207- if (XSTRNCMP (begin , "KYBER_LEVEL1" , 12 ) == 0 ) {
269+ if (MATCH_PQC (begin , "KYBER_LEVEL1" , len )) {
270+ available = 1 ;
271+ }
272+ #ifdef HAVE_ECC
273+ if (MATCH_PQC (begin , "P256_KYBER_LEVEL1" , len )) {
208274 available = 1 ;
209275 }
210276 #endif
277+ #endif
211278 #ifndef WOLFSSL_NO_KYBER768
212- if (XSTRNCMP (begin , "KYBER_LEVEL3" , 12 ) == 0 ) {
279+ if (MATCH_PQC (begin , "KYBER_LEVEL3" , len )) {
280+ available = 1 ;
281+ }
282+ #ifdef HAVE_ECC
283+ if (MATCH_PQC (begin , "P384_KYBER_LEVEL3" , len )) {
213284 available = 1 ;
214285 }
286+ if (MATCH_PQC (begin , "P256_KYBER_LEVEL3" , len )) {
287+ available = 1 ;
288+ }
289+ #endif
215290 #endif
216291 #ifndef WOLFSSL_NO_KYBER1024
217- if (XSTRNCMP (begin , "KYBER_LEVEL5" , 12 ) == 0 ) {
292+ if (MATCH_PQC (begin , "KYBER_LEVEL5" , len )) {
293+ available = 1 ;
294+ }
295+ #ifdef HAVE_ECC
296+ if (MATCH_PQC (begin , "P521_KYBER_LEVEL5" , len )) {
218297 available = 1 ;
219298 }
220299 #endif
221- }
222- #endif
300+ #endif
301+ #if !defined(WOLFSSL_NO_KYBER512 ) && defined(HAVE_CURVE25519 )
302+ if (MATCH_PQC (begin , "X25519_KYBER_LEVEL1" , len )) {
303+ available = 1 ;
304+ }
305+ #endif
306+ #if !defined(WOLFSSL_NO_KYBER768 ) && defined(HAVE_CURVE25519 )
307+ if (MATCH_PQC (begin , "X25519_KYBER_LEVEL3" , len )) {
308+ available = 1 ;
309+ }
310+ #endif
311+ #if !defined(WOLFSSL_NO_KYBER768 ) && defined(HAVE_CURVE448 )
312+ if (MATCH_PQC (begin , "X448_KYBER_LEVEL3" , len )) {
313+ available = 1 ;
314+ }
315+ #endif
316+ #endif /* WOLFSSL_MLKEM_KYBER */
223317 }
224318
225319#if defined(WOLFSSL_MLKEM_NO_MAKE_KEY ) || \
@@ -910,7 +1004,7 @@ int SuiteTest(int argc, char** argv)
9101004 char * myArgv [3 ];
9111005
9121006#ifdef WOLFSSL_STATIC_MEMORY
913- byte memory [200000 ];
1007+ byte memory [320000 ];
9141008#endif
9151009
9161010 printf (" Begin Cipher Suite Tests\n" );
0 commit comments