|  | """Framework classes for generation of bignum mod test cases.""" | 
|  | # Copyright The Mbed TLS Contributors | 
|  | # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later | 
|  | # | 
|  |  | 
|  | from typing import Dict, List | 
|  |  | 
|  | from . import test_data_generation | 
|  | from . import bignum_common | 
|  | from .bignum_data import ONLY_PRIME_MODULI | 
|  |  | 
|  | class BignumModTarget(test_data_generation.BaseTarget): | 
|  | #pylint: disable=abstract-method, too-few-public-methods | 
|  | """Target for bignum mod test case generation.""" | 
|  | target_basename = 'test_suite_bignum_mod.generated' | 
|  |  | 
|  |  | 
|  | class BignumModMul(bignum_common.ModOperationCommon, | 
|  | BignumModTarget): | 
|  | # pylint:disable=duplicate-code | 
|  | """Test cases for bignum mpi_mod_mul().""" | 
|  | symbol = "*" | 
|  | test_function = "mpi_mod_mul" | 
|  | test_name = "mbedtls_mpi_mod_mul" | 
|  | input_style = "arch_split" | 
|  | arity = 2 | 
|  |  | 
|  | def arguments(self) -> List[str]: | 
|  | return [self.format_result(self.to_montgomery(self.int_a)), | 
|  | self.format_result(self.to_montgomery(self.int_b)), | 
|  | bignum_common.quote_str(self.arg_n) | 
|  | ] + self.result() | 
|  |  | 
|  | def result(self) -> List[str]: | 
|  | result = (self.int_a * self.int_b) % self.int_n | 
|  | return [self.format_result(self.to_montgomery(result))] | 
|  |  | 
|  |  | 
|  | class BignumModSub(bignum_common.ModOperationCommon, BignumModTarget): | 
|  | """Test cases for bignum mpi_mod_sub().""" | 
|  | symbol = "-" | 
|  | test_function = "mpi_mod_sub" | 
|  | test_name = "mbedtls_mpi_mod_sub" | 
|  | input_style = "fixed" | 
|  | arity = 2 | 
|  |  | 
|  | def result(self) -> List[str]: | 
|  | result = (self.int_a - self.int_b) % self.int_n | 
|  | # To make negative tests easier, append 0 for success to the | 
|  | # generated cases | 
|  | return [self.format_result(result), "0"] | 
|  |  | 
|  | class BignumModInvNonMont(bignum_common.ModOperationCommon, BignumModTarget): | 
|  | """Test cases for bignum mpi_mod_inv() - not in Montgomery form.""" | 
|  | moduli = ONLY_PRIME_MODULI  # for now only prime moduli supported | 
|  | symbol = "^ -1" | 
|  | test_function = "mpi_mod_inv_non_mont" | 
|  | test_name = "mbedtls_mpi_mod_inv non-Mont. form" | 
|  | input_style = "fixed" | 
|  | arity = 1 | 
|  | suffix = True | 
|  | disallow_zero_a = True | 
|  |  | 
|  | def result(self) -> List[str]: | 
|  | result = bignum_common.invmod_positive(self.int_a, self.int_n) | 
|  | # To make negative tests easier, append 0 for success to the | 
|  | # generated cases | 
|  | return [self.format_result(result), "0"] | 
|  |  | 
|  | class BignumModInvMont(bignum_common.ModOperationCommon, BignumModTarget): | 
|  | """Test cases for bignum mpi_mod_inv() - Montgomery form.""" | 
|  | moduli = ONLY_PRIME_MODULI  # for now only prime moduli supported | 
|  | symbol = "^ -1" | 
|  | test_function = "mpi_mod_inv_mont" | 
|  | test_name = "mbedtls_mpi_mod_inv Mont. form" | 
|  | input_style = "arch_split"  # Mont. form requires arch_split | 
|  | arity = 1 | 
|  | suffix = True | 
|  | disallow_zero_a = True | 
|  | montgomery_form_a = True | 
|  |  | 
|  | def result(self) -> List[str]: | 
|  | result = bignum_common.invmod_positive(self.int_a, self.int_n) | 
|  | mont_result = self.to_montgomery(result) | 
|  | # To make negative tests easier, append 0 for success to the | 
|  | # generated cases | 
|  | return [self.format_result(mont_result), "0"] | 
|  |  | 
|  |  | 
|  | class BignumModAdd(bignum_common.ModOperationCommon, BignumModTarget): | 
|  | """Test cases for bignum mpi_mod_add().""" | 
|  | count = 0 | 
|  | symbol = "+" | 
|  | test_function = "mpi_mod_add" | 
|  | test_name = "mbedtls_mpi_mod_add" | 
|  | input_style = "fixed" | 
|  |  | 
|  | def result(self) -> List[str]: | 
|  | result = (self.int_a + self.int_b) % self.int_n | 
|  | # To make negative tests easier, append "0" for success to the | 
|  | # generated cases | 
|  | return [self.format_result(result), "0"] |