1a8e1175bSopenharmony_ci"""Framework classes for generation of bignum mod test cases."""
2a8e1175bSopenharmony_ci# Copyright The Mbed TLS Contributors
3a8e1175bSopenharmony_ci# SPDX-License-Identifier: Apache-2.0
4a8e1175bSopenharmony_ci#
5a8e1175bSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); you may
6a8e1175bSopenharmony_ci# not use this file except in compliance with the License.
7a8e1175bSopenharmony_ci# You may obtain a copy of the License at
8a8e1175bSopenharmony_ci#
9a8e1175bSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0
10a8e1175bSopenharmony_ci#
11a8e1175bSopenharmony_ci# Unless required by applicable law or agreed to in writing, software
12a8e1175bSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13a8e1175bSopenharmony_ci# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14a8e1175bSopenharmony_ci# See the License for the specific language governing permissions and
15a8e1175bSopenharmony_ci# limitations under the License.
16a8e1175bSopenharmony_ci
17a8e1175bSopenharmony_cifrom typing import Dict, List
18a8e1175bSopenharmony_ci
19a8e1175bSopenharmony_cifrom . import test_data_generation
20a8e1175bSopenharmony_cifrom . import bignum_common
21a8e1175bSopenharmony_cifrom .bignum_data import ONLY_PRIME_MODULI
22a8e1175bSopenharmony_ci
23a8e1175bSopenharmony_ciclass BignumModTarget(test_data_generation.BaseTarget):
24a8e1175bSopenharmony_ci    #pylint: disable=abstract-method, too-few-public-methods
25a8e1175bSopenharmony_ci    """Target for bignum mod test case generation."""
26a8e1175bSopenharmony_ci    target_basename = 'test_suite_bignum_mod.generated'
27a8e1175bSopenharmony_ci
28a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 1
29a8e1175bSopenharmony_ci
30a8e1175bSopenharmony_ci# END MERGE SLOT 1
31a8e1175bSopenharmony_ci
32a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 2
33a8e1175bSopenharmony_ci
34a8e1175bSopenharmony_ciclass BignumModMul(bignum_common.ModOperationCommon,
35a8e1175bSopenharmony_ci                   BignumModTarget):
36a8e1175bSopenharmony_ci    # pylint:disable=duplicate-code
37a8e1175bSopenharmony_ci    """Test cases for bignum mpi_mod_mul()."""
38a8e1175bSopenharmony_ci    symbol = "*"
39a8e1175bSopenharmony_ci    test_function = "mpi_mod_mul"
40a8e1175bSopenharmony_ci    test_name = "mbedtls_mpi_mod_mul"
41a8e1175bSopenharmony_ci    input_style = "arch_split"
42a8e1175bSopenharmony_ci    arity = 2
43a8e1175bSopenharmony_ci
44a8e1175bSopenharmony_ci    def arguments(self) -> List[str]:
45a8e1175bSopenharmony_ci        return [self.format_result(self.to_montgomery(self.int_a)),
46a8e1175bSopenharmony_ci                self.format_result(self.to_montgomery(self.int_b)),
47a8e1175bSopenharmony_ci                bignum_common.quote_str(self.arg_n)
48a8e1175bSopenharmony_ci               ] + self.result()
49a8e1175bSopenharmony_ci
50a8e1175bSopenharmony_ci    def result(self) -> List[str]:
51a8e1175bSopenharmony_ci        result = (self.int_a * self.int_b) % self.int_n
52a8e1175bSopenharmony_ci        return [self.format_result(self.to_montgomery(result))]
53a8e1175bSopenharmony_ci
54a8e1175bSopenharmony_ci# END MERGE SLOT 2
55a8e1175bSopenharmony_ci
56a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 3
57a8e1175bSopenharmony_ci
58a8e1175bSopenharmony_ciclass BignumModSub(bignum_common.ModOperationCommon, BignumModTarget):
59a8e1175bSopenharmony_ci    """Test cases for bignum mpi_mod_sub()."""
60a8e1175bSopenharmony_ci    symbol = "-"
61a8e1175bSopenharmony_ci    test_function = "mpi_mod_sub"
62a8e1175bSopenharmony_ci    test_name = "mbedtls_mpi_mod_sub"
63a8e1175bSopenharmony_ci    input_style = "fixed"
64a8e1175bSopenharmony_ci    arity = 2
65a8e1175bSopenharmony_ci
66a8e1175bSopenharmony_ci    def result(self) -> List[str]:
67a8e1175bSopenharmony_ci        result = (self.int_a - self.int_b) % self.int_n
68a8e1175bSopenharmony_ci        # To make negative tests easier, append 0 for success to the
69a8e1175bSopenharmony_ci        # generated cases
70a8e1175bSopenharmony_ci        return [self.format_result(result), "0"]
71a8e1175bSopenharmony_ci
72a8e1175bSopenharmony_ciclass BignumModInvNonMont(bignum_common.ModOperationCommon, BignumModTarget):
73a8e1175bSopenharmony_ci    """Test cases for bignum mpi_mod_inv() - not in Montgomery form."""
74a8e1175bSopenharmony_ci    moduli = ONLY_PRIME_MODULI  # for now only prime moduli supported
75a8e1175bSopenharmony_ci    symbol = "^ -1"
76a8e1175bSopenharmony_ci    test_function = "mpi_mod_inv_non_mont"
77a8e1175bSopenharmony_ci    test_name = "mbedtls_mpi_mod_inv non-Mont. form"
78a8e1175bSopenharmony_ci    input_style = "fixed"
79a8e1175bSopenharmony_ci    arity = 1
80a8e1175bSopenharmony_ci    suffix = True
81a8e1175bSopenharmony_ci    disallow_zero_a = True
82a8e1175bSopenharmony_ci
83a8e1175bSopenharmony_ci    def result(self) -> List[str]:
84a8e1175bSopenharmony_ci        result = bignum_common.invmod_positive(self.int_a, self.int_n)
85a8e1175bSopenharmony_ci        # To make negative tests easier, append 0 for success to the
86a8e1175bSopenharmony_ci        # generated cases
87a8e1175bSopenharmony_ci        return [self.format_result(result), "0"]
88a8e1175bSopenharmony_ci
89a8e1175bSopenharmony_ciclass BignumModInvMont(bignum_common.ModOperationCommon, BignumModTarget):
90a8e1175bSopenharmony_ci    """Test cases for bignum mpi_mod_inv() - Montgomery form."""
91a8e1175bSopenharmony_ci    moduli = ONLY_PRIME_MODULI  # for now only prime moduli supported
92a8e1175bSopenharmony_ci    symbol = "^ -1"
93a8e1175bSopenharmony_ci    test_function = "mpi_mod_inv_mont"
94a8e1175bSopenharmony_ci    test_name = "mbedtls_mpi_mod_inv Mont. form"
95a8e1175bSopenharmony_ci    input_style = "arch_split"  # Mont. form requires arch_split
96a8e1175bSopenharmony_ci    arity = 1
97a8e1175bSopenharmony_ci    suffix = True
98a8e1175bSopenharmony_ci    disallow_zero_a = True
99a8e1175bSopenharmony_ci    montgomery_form_a = True
100a8e1175bSopenharmony_ci
101a8e1175bSopenharmony_ci    def result(self) -> List[str]:
102a8e1175bSopenharmony_ci        result = bignum_common.invmod_positive(self.int_a, self.int_n)
103a8e1175bSopenharmony_ci        mont_result = self.to_montgomery(result)
104a8e1175bSopenharmony_ci        # To make negative tests easier, append 0 for success to the
105a8e1175bSopenharmony_ci        # generated cases
106a8e1175bSopenharmony_ci        return [self.format_result(mont_result), "0"]
107a8e1175bSopenharmony_ci
108a8e1175bSopenharmony_ci# END MERGE SLOT 3
109a8e1175bSopenharmony_ci
110a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 4
111a8e1175bSopenharmony_ci
112a8e1175bSopenharmony_ci# END MERGE SLOT 4
113a8e1175bSopenharmony_ci
114a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 5
115a8e1175bSopenharmony_ciclass BignumModAdd(bignum_common.ModOperationCommon, BignumModTarget):
116a8e1175bSopenharmony_ci    """Test cases for bignum mpi_mod_add()."""
117a8e1175bSopenharmony_ci    count = 0
118a8e1175bSopenharmony_ci    symbol = "+"
119a8e1175bSopenharmony_ci    test_function = "mpi_mod_add"
120a8e1175bSopenharmony_ci    test_name = "mbedtls_mpi_mod_add"
121a8e1175bSopenharmony_ci    input_style = "fixed"
122a8e1175bSopenharmony_ci
123a8e1175bSopenharmony_ci    def result(self) -> List[str]:
124a8e1175bSopenharmony_ci        result = (self.int_a + self.int_b) % self.int_n
125a8e1175bSopenharmony_ci        # To make negative tests easier, append "0" for success to the
126a8e1175bSopenharmony_ci        # generated cases
127a8e1175bSopenharmony_ci        return [self.format_result(result), "0"]
128a8e1175bSopenharmony_ci
129a8e1175bSopenharmony_ci
130a8e1175bSopenharmony_ci# END MERGE SLOT 5
131a8e1175bSopenharmony_ci
132a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 6
133a8e1175bSopenharmony_ci
134a8e1175bSopenharmony_ci# END MERGE SLOT 6
135a8e1175bSopenharmony_ci
136a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 7
137a8e1175bSopenharmony_ci
138a8e1175bSopenharmony_ci# END MERGE SLOT 7
139a8e1175bSopenharmony_ci
140a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 8
141a8e1175bSopenharmony_ci
142a8e1175bSopenharmony_ci# END MERGE SLOT 8
143a8e1175bSopenharmony_ci
144a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 9
145a8e1175bSopenharmony_ci
146a8e1175bSopenharmony_ci# END MERGE SLOT 9
147a8e1175bSopenharmony_ci
148a8e1175bSopenharmony_ci# BEGIN MERGE SLOT 10
149a8e1175bSopenharmony_ci
150a8e1175bSopenharmony_ci# END MERGE SLOT 10
151