@@ -993,27 +993,38 @@ int mld_sign_verify_internal(const uint8_t *sig, size_t siglen,
993993 mld_polyveck * t1 ;
994994 mld_polyveck * w1 ;
995995
996+ /* TODO: Remove the following workaround for
997+ * https://github.com/diffblue/cbmc/issues/8813 */
998+ typedef MLD_UNION_OR_STRUCT
999+ {
1000+ mld_polymat mat ;
1001+ mld_polyveck h ;
1002+ }
1003+ math_u ;
1004+ mld_polymat * mat ;
1005+ mld_polyveck * h ;
1006+
9961007 MLD_ALLOC (buf , uint8_t , (MLDSA_K * MLDSA_POLYW1_PACKEDBYTES ), context );
9971008 MLD_ALLOC (rho , uint8_t , MLDSA_SEEDBYTES , context );
9981009 MLD_ALLOC (mu , uint8_t , MLDSA_CRHBYTES , context );
9991010 MLD_ALLOC (c , uint8_t , MLDSA_CTILDEBYTES , context );
10001011 MLD_ALLOC (c2 , uint8_t , MLDSA_CTILDEBYTES , context );
10011012 MLD_ALLOC (cp , mld_poly , 1 , context );
1002- MLD_ALLOC (mat , mld_polymat , 1 , context );
1013+ MLD_ALLOC (math , math_u , 1 , context );
10031014 MLD_ALLOC (z , mld_polyvecl , 1 , context );
10041015 MLD_ALLOC (t1w1 , t1w1_u , 1 , context );
10051016 MLD_ALLOC (tmp , mld_polyveck , 1 , context );
1006- MLD_ALLOC (h , mld_polyveck , 1 , context );
10071017
10081018 if (buf == NULL || rho == NULL || mu == NULL || c == NULL || c2 == NULL ||
1009- cp == NULL || mat == NULL || z == NULL || t1w1 == NULL || tmp == NULL ||
1010- h == NULL )
1019+ cp == NULL || math == NULL || z == NULL || t1w1 == NULL || tmp == NULL )
10111020 {
10121021 ret = MLD_ERR_OUT_OF_MEMORY ;
10131022 goto cleanup ;
10141023 }
10151024 t1 = & t1w1 -> t1 ;
10161025 w1 = & t1w1 -> w1 ;
1026+ mat = & math -> mat ;
1027+ h = & math -> h ;
10171028
10181029 if (siglen != MLDSA_CRYPTO_BYTES )
10191030 {
@@ -1023,14 +1034,10 @@ int mld_sign_verify_internal(const uint8_t *sig, size_t siglen,
10231034
10241035 mld_unpack_pk (rho , t1 , pk );
10251036
1026- /* mld_unpack_sig and mld_polyvecl_chknorm signal failure through a
1037+ mld_unpack_sig_c_z (c , z , sig );
1038+ /* mld_polyvecl_chknorm signals failure through a
10271039 * single non-zero error code that's not yet aligned with MLD_ERR_XXX.
10281040 * Map it to MLD_ERR_FAIL explicitly. */
1029- if (mld_unpack_sig (c , z , h , sig ))
1030- {
1031- ret = MLD_ERR_FAIL ;
1032- goto cleanup ;
1033- }
10341041 if (mld_polyvecl_chknorm (z , MLDSA_GAMMA1 - MLDSA_BETA ))
10351042 {
10361043 ret = MLD_ERR_FAIL ;
@@ -1070,6 +1077,14 @@ int mld_sign_verify_internal(const uint8_t *sig, size_t siglen,
10701077
10711078 /* Reconstruct w1 */
10721079 mld_polyveck_caddq (w1 );
1080+ /* mld_unpack_sig_h signals failure through a
1081+ * single non-zero error code that's not yet aligned with MLD_ERR_XXX.
1082+ * Map it to MLD_ERR_FAIL explicitly. */
1083+ if (mld_unpack_sig_h (h , sig ))
1084+ {
1085+ ret = MLD_ERR_FAIL ;
1086+ goto cleanup ;
1087+ }
10731088 mld_polyveck_use_hint (tmp , w1 , h );
10741089 mld_polyveck_pack_w1 (buf , tmp );
10751090 /* Call random oracle and verify challenge */
@@ -1085,11 +1100,10 @@ int mld_sign_verify_internal(const uint8_t *sig, size_t siglen,
10851100
10861101cleanup :
10871102 /* @[FIPS204, Section 3.6.3] Destruction of intermediate values. */
1088- MLD_FREE (h , mld_polyveck , 1 , context );
10891103 MLD_FREE (tmp , mld_polyveck , 1 , context );
10901104 MLD_FREE (t1w1 , t1w1_u , 1 , context );
10911105 MLD_FREE (z , mld_polyvecl , 1 , context );
1092- MLD_FREE (mat , mld_polymat , 1 , context );
1106+ MLD_FREE (math , math_u , 1 , context );
10931107 MLD_FREE (cp , mld_poly , 1 , context );
10941108 MLD_FREE (c2 , uint8_t , MLDSA_CTILDEBYTES , context );
10951109 MLD_FREE (c , uint8_t , MLDSA_CTILDEBYTES , context );
0 commit comments