quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

bignum_mod.py (3676B)


      1 """Framework classes for generation of bignum mod test cases."""
      2 # Copyright The Mbed TLS Contributors
      3 # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
      4 #
      5 
      6 from typing import Dict, List
      7 
      8 from . import test_data_generation
      9 from . import bignum_common
     10 from .bignum_data import ONLY_PRIME_MODULI
     11 
     12 class BignumModTarget(test_data_generation.BaseTarget):
     13     #pylint: disable=abstract-method, too-few-public-methods
     14     """Target for bignum mod test case generation."""
     15     target_basename = 'test_suite_bignum_mod.generated'
     16 
     17 
     18 class BignumModMul(bignum_common.ModOperationCommon,
     19                    BignumModTarget):
     20     # pylint:disable=duplicate-code
     21     """Test cases for bignum mpi_mod_mul()."""
     22     symbol = "*"
     23     test_function = "mpi_mod_mul"
     24     test_name = "mbedtls_mpi_mod_mul"
     25     input_style = "arch_split"
     26     arity = 2
     27 
     28     def arguments(self) -> List[str]:
     29         return [self.format_result(self.to_montgomery(self.int_a)),
     30                 self.format_result(self.to_montgomery(self.int_b)),
     31                 bignum_common.quote_str(self.arg_n)
     32                ] + self.result()
     33 
     34     def result(self) -> List[str]:
     35         result = (self.int_a * self.int_b) % self.int_n
     36         return [self.format_result(self.to_montgomery(result))]
     37 
     38 
     39 class BignumModSub(bignum_common.ModOperationCommon, BignumModTarget):
     40     """Test cases for bignum mpi_mod_sub()."""
     41     symbol = "-"
     42     test_function = "mpi_mod_sub"
     43     test_name = "mbedtls_mpi_mod_sub"
     44     input_style = "fixed"
     45     arity = 2
     46 
     47     def result(self) -> List[str]:
     48         result = (self.int_a - self.int_b) % self.int_n
     49         # To make negative tests easier, append 0 for success to the
     50         # generated cases
     51         return [self.format_result(result), "0"]
     52 
     53 class BignumModInvNonMont(bignum_common.ModOperationCommon, BignumModTarget):
     54     """Test cases for bignum mpi_mod_inv() - not in Montgomery form."""
     55     moduli = ONLY_PRIME_MODULI  # for now only prime moduli supported
     56     symbol = "^ -1"
     57     test_function = "mpi_mod_inv_non_mont"
     58     test_name = "mbedtls_mpi_mod_inv non-Mont. form"
     59     input_style = "fixed"
     60     arity = 1
     61     suffix = True
     62     disallow_zero_a = True
     63 
     64     def result(self) -> List[str]:
     65         result = bignum_common.invmod_positive(self.int_a, self.int_n)
     66         # To make negative tests easier, append 0 for success to the
     67         # generated cases
     68         return [self.format_result(result), "0"]
     69 
     70 class BignumModInvMont(bignum_common.ModOperationCommon, BignumModTarget):
     71     """Test cases for bignum mpi_mod_inv() - Montgomery form."""
     72     moduli = ONLY_PRIME_MODULI  # for now only prime moduli supported
     73     symbol = "^ -1"
     74     test_function = "mpi_mod_inv_mont"
     75     test_name = "mbedtls_mpi_mod_inv Mont. form"
     76     input_style = "arch_split"  # Mont. form requires arch_split
     77     arity = 1
     78     suffix = True
     79     disallow_zero_a = True
     80     montgomery_form_a = True
     81 
     82     def result(self) -> List[str]:
     83         result = bignum_common.invmod_positive(self.int_a, self.int_n)
     84         mont_result = self.to_montgomery(result)
     85         # To make negative tests easier, append 0 for success to the
     86         # generated cases
     87         return [self.format_result(mont_result), "0"]
     88 
     89 
     90 class BignumModAdd(bignum_common.ModOperationCommon, BignumModTarget):
     91     """Test cases for bignum mpi_mod_add()."""
     92     count = 0
     93     symbol = "+"
     94     test_function = "mpi_mod_add"
     95     test_name = "mbedtls_mpi_mod_add"
     96     input_style = "fixed"
     97 
     98     def result(self) -> List[str]:
     99         result = (self.int_a + self.int_b) % self.int_n
    100         # To make negative tests easier, append "0" for success to the
    101         # generated cases
    102         return [self.format_result(result), "0"]