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