@@ -838,4 +838,101 @@ int test_mldsa_import_mismatched_pubpriv(void* data)
838838 return err ;
839839}
840840
841+ /* FIPS 204 permits an empty message: sign and verify zero-length input. */
842+ int test_mldsa_empty_message (void * data )
843+ {
844+ int err = 0 ;
845+ size_t i ;
846+ EVP_PKEY * k = NULL ;
847+ EVP_MD_CTX * mdctx = NULL ;
848+ unsigned char * sig = NULL ;
849+ size_t sigLen = 0 ;
850+
851+ (void )data ;
852+ for (i = 0 ; (err == 0 ) && (i < MLDSA_LEVEL_COUNT ); i ++ ) {
853+ PRINT_MSG ("Empty message %s" , mldsa_levels [i ].name );
854+
855+ err = mldsa_keygen (mldsa_levels [i ].name , & k );
856+ if (err == 0 ) {
857+ mdctx = EVP_MD_CTX_new ();
858+ err = (mdctx == NULL );
859+ }
860+ if (err == 0 ) {
861+ err = EVP_DigestSignInit_ex (mdctx , NULL , NULL , wpLibCtx , NULL , k ,
862+ NULL ) != 1 ;
863+ }
864+ /* No update calls: message is the empty string. */
865+ if (err == 0 ) {
866+ err = EVP_DigestSign (mdctx , NULL , & sigLen , NULL , 0 ) != 1 ;
867+ }
868+ if (err == 0 ) {
869+ sig = (unsigned char * )OPENSSL_malloc (sigLen );
870+ err = (sig == NULL );
871+ }
872+ if (err == 0 ) {
873+ err = EVP_DigestSign (mdctx , sig , & sigLen , NULL , 0 ) != 1 ;
874+ if (err ) PRINT_ERR_MSG ("Empty-message sign failed" );
875+ }
876+ if (err == 0 ) {
877+ err = mldsa_verify_msg (k , NULL , 0 , sig , sigLen ) != 1 ;
878+ if (err ) PRINT_ERR_MSG ("Empty-message verify failed" );
879+ }
880+
881+ OPENSSL_free (sig ); sig = NULL ; sigLen = 0 ;
882+ EVP_MD_CTX_free (mdctx ); mdctx = NULL ;
883+ EVP_PKEY_free (k ); k = NULL ;
884+ }
885+ return err ;
886+ }
887+
888+ /* Reinitialize a sign context with a NULL key: the key already on the
889+ * context must be reused (OpenSSL reinit contract). */
890+ int test_mldsa_reinit_null_key (void * data )
891+ {
892+ static const unsigned char msg [16 ] = "mldsa-reinit-msg" ;
893+ int err = 0 ;
894+ EVP_PKEY * k = NULL ;
895+ EVP_MD_CTX * mdctx = NULL ;
896+ unsigned char * sig = NULL ;
897+ size_t sigLen = 0 ;
898+
899+ (void )data ;
900+ PRINT_MSG ("Reinit with NULL key reuses context key" );
901+
902+ err = mldsa_keygen ("ML-DSA-44" , & k );
903+ if (err == 0 ) {
904+ mdctx = EVP_MD_CTX_new ();
905+ err = (mdctx == NULL );
906+ }
907+ if (err == 0 ) {
908+ err = EVP_DigestSignInit_ex (mdctx , NULL , NULL , wpLibCtx , NULL , k ,
909+ NULL ) != 1 ;
910+ }
911+ /* Reinit with NULL pkey: reuse the key already attached. */
912+ if (err == 0 ) {
913+ err = EVP_DigestSignInit_ex (mdctx , NULL , NULL , wpLibCtx , NULL , NULL ,
914+ NULL ) != 1 ;
915+ if (err ) PRINT_ERR_MSG ("Reinit with NULL key failed" );
916+ }
917+ if (err == 0 ) {
918+ err = EVP_DigestSign (mdctx , NULL , & sigLen , msg , sizeof (msg )) != 1 ;
919+ }
920+ if (err == 0 ) {
921+ sig = (unsigned char * )OPENSSL_malloc (sigLen );
922+ err = (sig == NULL );
923+ }
924+ if (err == 0 ) {
925+ err = EVP_DigestSign (mdctx , sig , & sigLen , msg , sizeof (msg )) != 1 ;
926+ }
927+ if (err == 0 ) {
928+ err = mldsa_verify_msg (k , msg , sizeof (msg ), sig , sigLen ) != 1 ;
929+ if (err ) PRINT_ERR_MSG ("Sign after NULL-key reinit did not verify" );
930+ }
931+
932+ OPENSSL_free (sig );
933+ EVP_MD_CTX_free (mdctx );
934+ EVP_PKEY_free (k );
935+ return err ;
936+ }
937+
841938#endif /* WP_HAVE_MLDSA */
0 commit comments