xref: /aosp_15_r20/external/mbedtls/scripts/mbedtls_dev/bignum_mod.py (revision 62c56f9862f102b96d72393aff6076c951fb8148)
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