Skip to content

Commit 04d807e

Browse files
Generate MLDSA test cases for the driver entry points
Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
1 parent c2ce51a commit 04d807e

1 file changed

Lines changed: 54 additions & 2 deletions

File tree

util/mbedtls_maintainer/mldsa_test_generator.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,27 @@ def final_arguments(cls) -> List[str]:
8282
def secret_is_seed(cls) -> bool:
8383
return True
8484

85+
def one_mldsa_public_key_from_seed(self, key: Key,
86+
descr: str) -> test_case.TestCase:
87+
"""Construct one test case for driver export_public_key()."""
88+
tc = test_case.TestCase()
89+
tc.set_function('export_public_key')
90+
tc.set_dependencies([f'TF_PSA_CRYPTO_PQCP_MLDSA_{key.kl}_ENABLED'])
91+
tc.set_arguments(self.metadata_arguments(key.kl, True, None) + [
92+
test_case.hex_string(key.seed),
93+
test_case.hex_string(key.public),
94+
] + self.final_arguments())
95+
tc.set_description(f'MLDSA-{key.kl} export public key from seed {descr}')
96+
return tc
97+
8598
def one_mldsa_sign_deterministic_pure(self,
8699
key: Key,
87100
message: bytes,
88101
descr: str) -> test_case.TestCase:
89102
"""Construct one test case for deterministic signature."""
90103
signature = key.sign_message(message, deterministic=True)
91104
tc = test_case.TestCase()
92-
tc.set_function(self.function('sign_deterministic_pure', key.kl))
105+
tc.set_function(self.function('sign_message_deterministic', key.kl))
93106
tc.set_dependencies([f'TF_PSA_CRYPTO_PQCP_MLDSA_{key.kl}_ENABLED'])
94107
tc.set_arguments(self.metadata_arguments(key.kl, True, True) + [
95108
test_case.hex_string(key.seed if self.secret_is_seed() else key.secret),
@@ -111,7 +124,7 @@ def one_mldsa_verify_pure(self,
111124
"""
112125
signature = key.sign_message(message, deterministic=deterministic)
113126
tc = test_case.TestCase()
114-
tc.set_function(self.function('verify_pure', key.kl))
127+
tc.set_function(self.function('verify_message', key.kl))
115128
tc.set_dependencies([f'TF_PSA_CRYPTO_PQCP_MLDSA_{key.kl}_ENABLED'])
116129
tc.set_arguments(self.metadata_arguments(key.kl, False, True) + [
117130
test_case.hex_string(key.public),
@@ -159,6 +172,10 @@ class PQCPGenerator(Generator):
159172

160173
@classmethod
161174
def function(cls, func: str, kl: int) -> str:
175+
if func == 'verify_message':
176+
func = 'verify_pure'
177+
elif func == 'sign_message_deterministic':
178+
func = 'sign_deterministic_pure'
162179
return f'{func}_{kl}'
163180

164181
@classmethod
@@ -197,3 +214,38 @@ def gen_pqcp_mldsa_all() -> Iterator[test_case.TestCase]:
197214
"""Generate all test cases for mldsa-native."""
198215
generator = PQCPGenerator()
199216
yield from generator.gen_all()
217+
218+
219+
class DriverGenerator(Generator):
220+
"""Test driver entry points."""
221+
222+
@classmethod
223+
def function(cls, func: str, _kl: int) -> str:
224+
if func == 'verify_message':
225+
func = 'verify_pure'
226+
elif func == 'sign_message_deterministic':
227+
func = 'sign_deterministic_pure'
228+
return func
229+
230+
@classmethod
231+
def metadata_arguments(cls,
232+
kl: int,
233+
pair: bool,
234+
deterministic: Optional[bool]) -> List[str]:
235+
arguments = []
236+
arguments.append('PSA_KEY_TYPE_ML_DSA_KEY_PAIR' if pair else
237+
'PSA_KEY_TYPE_ML_DSA_PUBLIC_KEY')
238+
arguments.append(str(kl))
239+
if deterministic is not None:
240+
arguments.append('PSA_ALG_DETERMINISTIC_ML_DSA' if deterministic else
241+
'PSA_ALG_ML_DSA')
242+
return arguments
243+
244+
@classmethod
245+
def final_arguments(cls) -> List[str]:
246+
return ['PSA_SUCCESS']
247+
248+
def gen_key_management(self, kl: int) -> Iterator[test_case.TestCase]:
249+
"""Generate test cases for driver export_public_key()."""
250+
for i, key in enumerate(KEYS[kl], 1):
251+
yield self.one_mldsa_public_key_from_seed(key, f'key#{i}')

0 commit comments

Comments
 (0)