@@ -451,15 +451,35 @@ static uint32_t get_pubkey_size(uint32_t keyType)
451451 case KEYGEN_XMSS :
452452 size = KEYSTORE_PUBKEY_SIZE_XMSS ;
453453 break ;
454- #ifdef KEYSTORE_PUBKEY_SIZE_ML_DSA
455454 case KEYGEN_ML_DSA :
456- size = KEYSTORE_PUBKEY_SIZE_ML_DSA ;
455+ {
456+ char * env_ml_dsa_level = getenv ("ML_DSA_LEVEL" );
457+ if (env_ml_dsa_level == NULL ) {
458+ fprintf (stderr , "warning: ML_DSA_LEVEL environment variable"
459+ " not set, assuming level 2\n" );
460+ size = ML_DSA_L2_PUBKEY_SIZE ;
461+ } else {
462+ int level = atoi (env_ml_dsa_level );
463+ switch (level ) {
464+ case 2 :
465+ size = ML_DSA_L2_PUBKEY_SIZE ;
466+ break ;
467+ case 3 :
468+ size = ML_DSA_L3_PUBKEY_SIZE ;
469+ break ;
470+ case 5 :
471+ size = ML_DSA_L5_PUBKEY_SIZE ;
472+ break ;
473+ default :
474+ fprintf (stderr , "error: invalid ML_DSA_LEVEL: %d\n" , level );
475+ exit (1 );
476+ }
477+ }
457478 break ;
458- #endif
459479 default :
460480 size = 0 ;
481+ }
461482 }
462-
463483 return size ;
464484}
465485
@@ -520,7 +540,6 @@ void keystore_add(uint32_t ktype, uint8_t *key, uint32_t sz, const char *keyfile
520540}
521541
522542
523- #if !defined(NO_RSA ) && defined(WOLFSSL_KEY_GEN )
524543static void keygen_rsa (const char * keyfile , int kbits , uint32_t id_mask )
525544{
526545 RsaKey k ;
@@ -570,9 +589,7 @@ static void keygen_rsa(const char *keyfile, int kbits, uint32_t id_mask)
570589 else if (kbits == 4096 )
571590 keystore_add (KEYGEN_RSA4096 , pub_der , publen , keyfile , id_mask );
572591}
573- #endif
574592
575- #ifdef HAVE_ECC
576593#define MAX_ECC_KEY_SIZE 66
577594
578595static void keygen_ecc (const char * priv_fname , uint16_t ecc_key_size ,
@@ -676,10 +693,8 @@ static void keygen_ecc(const char *priv_fname, uint16_t ecc_key_size,
676693 else if (ecc_key_size == 66 )
677694 keystore_add (KEYGEN_ECC521 , k_buffer , 2 * ecc_key_size , priv_fname , id_mask );
678695}
679- #endif
680696
681697
682- #ifdef HAVE_ED25519
683698static void keygen_ed25519 (const char * privkey , uint32_t id_mask )
684699{
685700 ed25519_key k ;
@@ -716,9 +731,7 @@ static void keygen_ed25519(const char *privkey, uint32_t id_mask)
716731
717732 keystore_add (KEYGEN_ED25519 , pub , ED25519_PUB_KEY_SIZE , privkey , id_mask );
718733}
719- #endif
720734
721- #ifdef HAVE_ED448
722735static void keygen_ed448 (const char * privkey , uint32_t id_mask )
723736{
724737 ed448_key k ;
@@ -755,9 +768,7 @@ static void keygen_ed448(const char *privkey, uint32_t id_mask)
755768
756769 keystore_add (KEYGEN_ED448 , pub , ED448_PUB_KEY_SIZE , privkey , id_mask );
757770}
758- #endif
759771
760- #if defined(WOLFSSL_HAVE_LMS )
761772#include "../lms/lms_common.h"
762773
763774static void keygen_lms (const char * priv_fname , uint32_t id_mask )
@@ -844,9 +855,7 @@ static void keygen_lms(const char *priv_fname, uint32_t id_mask)
844855
845856 wc_LmsKey_Free (& key );
846857}
847- #endif /* if defined(WOLFSSL_HAVE_LMS) */
848858
849- #if defined(WOLFSSL_HAVE_XMSS )
850859#include "../xmss/xmss_common.h"
851860
852861static void keygen_xmss (const char * priv_fname , uint32_t id_mask )
@@ -942,9 +951,7 @@ static void keygen_xmss(const char *priv_fname, uint32_t id_mask)
942951
943952 wc_XmssKey_Free (& key );
944953}
945- #endif /* if defined(WOLFSSL_HAVE_XMSS) */
946954
947- #if defined(WOLFSSL_WC_DILITHIUM )
948955
949956static void keygen_ml_dsa (const char * priv_fname , uint32_t id_mask )
950957{
@@ -957,17 +964,24 @@ static void keygen_ml_dsa(const char *priv_fname, uint32_t id_mask)
957964 word32 pub_len = 0 ;
958965 int ml_dsa_priv_len = 0 ;
959966 int ml_dsa_pub_len = 0 ;
967+ int ml_dsa_level = ML_DSA_LEVEL ;
968+ char * env_ml_dsa_level = getenv ("ML_DSA_LEVEL" );
969+ if (env_ml_dsa_level != NULL ) {
970+ ml_dsa_level = atoi (env_ml_dsa_level );
971+ }
972+
973+ fprintf (stderr , "info: using DSA level %d\n" , ml_dsa_level );
960974
961975 ret = wc_MlDsaKey_Init (& key , NULL , INVALID_DEVID );
962976 if (ret != 0 ) {
963977 fprintf (stderr , "error: wc_MlDsaKey_Init returned %d\n" , ret );
964978 exit (1 );
965979 }
966980
967- ret = wc_MlDsaKey_SetParams (& key , ML_DSA_LEVEL );
981+ ret = wc_MlDsaKey_SetParams (& key , ml_dsa_level );
968982 if (ret != 0 ) {
969983 fprintf (stderr , "error: wc_MlDsaKey_SetParams(%d) returned %d\n" ,
970- ML_DSA_LEVEL , ret );
984+ ml_dsa_level , ret );
971985 exit (1 );
972986 }
973987
@@ -985,6 +999,7 @@ static void keygen_ml_dsa(const char *priv_fname, uint32_t id_mask)
985999 ret );
9861000 exit (1 );
9871001 }
1002+ printf ("info: ml-dsa public key length: %d\n" , ml_dsa_pub_len );
9881003
9891004 /* Get the ML-DSA private key length. This API returns
9901005 * the public + private length. */
@@ -994,6 +1009,7 @@ static void keygen_ml_dsa(const char *priv_fname, uint32_t id_mask)
9941009 ret );
9951010 exit (1 );
9961011 }
1012+ printf ("info: ml-dsa private key length: %d\n" , ml_dsa_priv_len );
9971013
9981014 if (ml_dsa_priv_len <= ml_dsa_pub_len ) {
9991015 printf ("error: ml-dsa: unexpected key lengths: %d, %d" ,
@@ -1026,9 +1042,9 @@ static void keygen_ml_dsa(const char *priv_fname, uint32_t id_mask)
10261042 exit (1 );
10271043 }
10281044
1029- if (pub_len != sizeof ( pub ) ) {
1045+ if (( int ) pub_len != ml_dsa_pub_len ) {
10301046 fprintf (stderr , "error: wc_MlDsaKey_ExportPubRaw returned pub_len=%d, " \
1031- "expected %zu \n" , pub_len , sizeof ( pub ) );
1047+ "expected %d \n" , pub_len , ml_dsa_pub_len );
10321048 exit (1 );
10331049 }
10341050
@@ -1050,14 +1066,13 @@ static void keygen_ml_dsa(const char *priv_fname, uint32_t id_mask)
10501066 fwrite (pub , pub_len , 1 , fpriv );
10511067 fclose (fpriv );
10521068
1053- keystore_add (KEYGEN_ML_DSA , pub , KEYSTORE_PUBKEY_SIZE_ML_DSA ,
1069+ keystore_add (KEYGEN_ML_DSA , pub , pub_len ,
10541070 priv_fname , id_mask );
10551071
10561072 wc_MlDsaKey_Free (& key );
10571073 free (priv );
10581074 priv = NULL ;
10591075}
1060- #endif /* if defined(WOLFSSL_WC_DILITHIUM) */
10611076
10621077static void key_gen_check (const char * kfilename )
10631078{
0 commit comments