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