@@ -13,26 +13,39 @@ class TestMLDSA(unittest.TestCase):
13
13
def generic_test_ml_dsa (self , ML_DSA , count = 5 ):
14
14
for _ in range (count ):
15
15
msg = b"Signed by ML_DSA" + os .urandom (16 )
16
+ ctx = os .urandom (128 )
16
17
17
18
# Perform signature process
18
19
pk , sk = ML_DSA .keygen ()
19
- sig = ML_DSA .sign (sk , msg )
20
- check_verify = ML_DSA .verify (pk , msg , sig )
20
+ sig = ML_DSA .sign (sk , msg , ctx = ctx )
21
+ check_verify = ML_DSA .verify (pk , msg , sig , ctx = ctx )
22
+
23
+ # Sign with external_mu instead
24
+ external_mu = ML_DSA .prehash_external_mu (pk , msg , ctx = ctx )
25
+ sig_external_mu = ML_DSA .sign_external_mu (sk , external_mu )
26
+ check_external_mu = ML_DSA .verify (pk , msg , sig_external_mu , ctx = ctx )
21
27
22
28
# Generate some fail cases
23
29
pk_bad , _ = ML_DSA .keygen ()
24
- check_wrong_pk = ML_DSA .verify (pk_bad , msg , sig )
25
- check_wrong_msg = ML_DSA .verify (pk , b"" , sig )
30
+ check_wrong_pk = ML_DSA .verify (pk_bad , msg , sig , ctx = ctx )
31
+ check_wrong_msg = ML_DSA .verify (pk , b"" , sig , ctx = ctx )
32
+ check_no_ctx = ML_DSA .verify (pk , msg , sig )
26
33
27
34
# Check that signature works
28
35
self .assertTrue (check_verify )
29
36
37
+ # Check that external_mu also works
38
+ self .assertTrue (check_external_mu )
39
+
30
40
# Check changing the key breaks verify
31
41
self .assertFalse (check_wrong_pk )
32
42
33
43
# Check changing the message breaks verify
34
44
self .assertFalse (check_wrong_msg )
35
45
46
+ # Check removing the context breaks verify
47
+ self .assertFalse (check_no_ctx )
48
+
36
49
def test_ml_dsa_44 (self ):
37
50
self .generic_test_ml_dsa (ML_DSA_44 )
38
51
@@ -52,26 +65,41 @@ class TestMLDSADeterministic(unittest.TestCase):
52
65
def generic_test_ml_dsa (self , ML_DSA , count = 5 ):
53
66
for _ in range (count ):
54
67
msg = b"Signed by ML_DSA" + os .urandom (16 )
68
+ ctx = os .urandom (128 )
55
69
56
70
# Perform signature process
57
71
pk , sk = ML_DSA .keygen ()
58
- sig = ML_DSA .sign (sk , msg , deterministic = True )
59
- check_verify = ML_DSA .verify (pk , msg , sig )
72
+ sig = ML_DSA .sign (sk , msg , ctx = ctx , deterministic = True )
73
+ check_verify = ML_DSA .verify (pk , msg , sig , ctx = ctx )
74
+
75
+ # Sign with external_mu instead
76
+ external_mu = ML_DSA .prehash_external_mu (pk , msg , ctx = ctx )
77
+ sig_external_mu = ML_DSA .sign_external_mu (
78
+ sk , external_mu , deterministic = True
79
+ )
80
+ check_external_mu = ML_DSA .verify (pk , msg , sig_external_mu , ctx = ctx )
60
81
61
82
# Generate some fail cases
62
83
pk_bad , _ = ML_DSA .keygen ()
63
- check_wrong_pk = ML_DSA .verify (pk_bad , msg , sig )
64
- check_wrong_msg = ML_DSA .verify (pk , b"" , sig )
84
+ check_wrong_pk = ML_DSA .verify (pk_bad , msg , sig , ctx = ctx )
85
+ check_wrong_msg = ML_DSA .verify (pk , b"" , sig , ctx = ctx )
86
+ check_no_ctx = ML_DSA .verify (pk , msg , sig )
65
87
66
88
# Check that signature works
67
89
self .assertTrue (check_verify )
68
90
91
+ # Check that external_mu also works
92
+ self .assertTrue (check_external_mu )
93
+
69
94
# Check changing the key breaks verify
70
95
self .assertFalse (check_wrong_pk )
71
96
72
97
# Check changing the message breaks verify
73
98
self .assertFalse (check_wrong_msg )
74
99
100
+ # Check removing the context breaks verify
101
+ self .assertFalse (check_no_ctx )
102
+
75
103
def test_ml_dsa_44 (self ):
76
104
self .generic_test_ml_dsa (ML_DSA_44 )
77
105
0 commit comments