blob: d4bfa85a3dea3af159e95decf411f311727c8ec6 [file] [log] [blame]
Gabor Mezei95ecaaf2023-01-16 16:53:29 +01001"""Framework classes for generation of ecp test cases."""
2# Copyright The Mbed TLS Contributors
3# SPDX-License-Identifier: Apache-2.0
4#
5# Licensed under the Apache License, Version 2.0 (the "License"); you may
6# not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17from typing import List
18
Gabor Mezei95ecaaf2023-01-16 16:53:29 +010019from . import test_data_generation
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010020from . import bignum_common
Gabor Mezei95ecaaf2023-01-16 16:53:29 +010021
Gabor Mezeid034b3d2023-03-06 16:15:43 +010022
Gabor Mezei95ecaaf2023-01-16 16:53:29 +010023class EcpTarget(test_data_generation.BaseTarget):
24 #pylint: disable=abstract-method, too-few-public-methods
25 """Target for ecp test case generation."""
26 target_basename = 'test_suite_ecp.generated'
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010027
Gabor Mezeid034b3d2023-03-06 16:15:43 +010028
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010029class EcpP192R1Raw(bignum_common.ModOperationCommon,
30 EcpTarget):
Gabor Mezeid8c0e1a2023-03-28 15:34:49 +020031 """Test cases for ECP P192 fast reduction."""
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010032 symbol = "-"
Minos Galanakis13586482023-03-21 12:08:37 +000033 test_function = "ecp_mod_p_generic_raw"
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010034 test_name = "ecp_mod_p192_raw"
35 input_style = "fixed"
36 arity = 1
Minos Galanakis0a325b62023-04-06 16:33:10 +010037 dependencies = ["MBEDTLS_ECP_DP_SECP192R1_ENABLED"]
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010038
Gabor Mezeib6875082023-01-31 14:35:17 +010039 moduli = ["fffffffffffffffffffffffffffffffeffffffffffffffff"] # type: List[str]
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010040
41 input_values = [
42 "0", "1",
43
Gabor Mezei5c9f4012023-02-13 14:15:08 +010044 # Modulus - 1
45 "fffffffffffffffffffffffffffffffefffffffffffffffe",
46
Gabor Mezei62adc722023-03-28 15:04:48 +020047 # Modulus + 1
48 "ffffffffffffffffffffffffffffffff0000000000000000",
49
50 # 2^192 - 1
51 "ffffffffffffffffffffffffffffffffffffffffffffffff",
52
53 # Maximum canonical P192 multiplication result
54 ("fffffffffffffffffffffffffffffffdfffffffffffffffc"
55 "000000000000000100000000000000040000000000000004"),
56
57 # Generate an overflow during reduction
58 ("00000000000000000000000000000001ffffffffffffffff"
59 "ffffffffffffffffffffffffffffffff0000000000000000"),
60
61 # Generate an overflow during carry reduction
62 ("ffffffffffffffff00000000000000010000000000000000"
63 "fffffffffffffffeffffffffffffffff0000000000000000"),
64
Gabor Mezeibd23f3b2023-01-25 18:09:49 +010065 # First 8 number generated by random.getrandbits(384) - seed(2,2)
66 ("cf1822ffbc6887782b491044d5e341245c6e433715ba2bdd"
67 "177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
68 ("ffed9235288bc781ae66267594c9c9500925e4749b575bd1"
69 "3653f8dd9b1f282e4067c3584ee207f8da94e3e8ab73738f"),
70 ("ef8acd128b4f2fc15f3f57ebf30b94fa82523e86feac7eb7"
71 "dc38f519b91751dacdbd47d364be8049a372db8f6e405d93"),
72 ("e8624fab5186ee32ee8d7ee9770348a05d300cb90706a045"
73 "defc044a09325626e6b58de744ab6cce80877b6f71e1f6d2"),
74 ("2d3d854e061b90303b08c6e33c7295782d6c797f8f7d9b78"
75 "2a1be9cd8697bbd0e2520e33e44c50556c71c4a66148a86f"),
76 ("fec3f6b32e8d4b8a8f54f8ceacaab39e83844b40ffa9b9f1"
77 "5c14bc4a829e07b0829a48d422fe99a22c70501e533c9135"),
78 ("97eeab64ca2ce6bc5d3fd983c34c769fe89204e2e8168561"
79 "867e5e15bc01bfce6a27e0dfcbf8754472154e76e4c11ab2"),
80 ("bd143fa9b714210c665d7435c1066932f4767f26294365b2"
81 "721dea3bf63f23d0dbe53fcafb2147df5ca495fa5a91c89b"),
82
83 # Next 2 number generated by random.getrandbits(192)
84 "47733e847d718d733ff98ff387c56473a7a83ee0761ebfd2",
85 "cbd4d3e2d4dec9ef83f0be4e80371eb97f81375eecc1cb63"
86 ]
87
88 @property
89 def arg_a(self) -> str:
90 return super().format_arg('{:x}'.format(self.int_a)).zfill(2 * self.hex_digits)
91
92 def result(self) -> List[str]:
93 result = self.int_a % self.int_n
94 return [self.format_result(result)]
95
Gabor Mezeia2ef6a82023-03-06 16:57:25 +010096 @property
97 def is_valid(self) -> bool:
98 return True
99
Minos Galanakis13586482023-03-21 12:08:37 +0000100 def arguments(self):
101 args = super().arguments()
102 return ["MBEDTLS_ECP_DP_SECP192R1"] + args
103
Gabor Mezeid034b3d2023-03-06 16:15:43 +0100104
Gabor Mezeif65a0592023-02-14 18:26:36 +0100105class EcpP224R1Raw(bignum_common.ModOperationCommon,
106 EcpTarget):
Gabor Mezeid8c0e1a2023-03-28 15:34:49 +0200107 """Test cases for ECP P224 fast reduction."""
Gabor Mezeif65a0592023-02-14 18:26:36 +0100108 symbol = "-"
Minos Galanakis13586482023-03-21 12:08:37 +0000109 test_function = "ecp_mod_p_generic_raw"
Gabor Mezeif65a0592023-02-14 18:26:36 +0100110 test_name = "ecp_mod_p224_raw"
111 input_style = "arch_split"
112 arity = 1
Minos Galanakis0a325b62023-04-06 16:33:10 +0100113 dependencies = ["MBEDTLS_ECP_DP_SECP224R1_ENABLED"]
Gabor Mezeif65a0592023-02-14 18:26:36 +0100114
115 moduli = ["ffffffffffffffffffffffffffffffff000000000000000000000001"] # type: List[str]
116
117 input_values = [
118 "0", "1",
119
Gabor Mezei98791e72023-02-27 15:59:34 +0100120 # Modulus - 1
121 "ffffffffffffffffffffffffffffffff000000000000000000000000",
122
Gabor Mezei64a229f2023-03-28 15:05:57 +0200123 # Modulus + 1
124 "ffffffffffffffffffffffffffffffff000000000000000000000002",
125
126 # 2^224 - 1
127 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
128
Gabor Mezei98791e72023-02-27 15:59:34 +0100129 # Maximum canonical P224 multiplication result
Gabor Mezei61ef3602023-03-06 16:26:18 +0100130 ("fffffffffffffffffffffffffffffffe000000000000000000000000"
131 "00000001000000000000000000000000000000000000000000000000"),
Gabor Mezei98791e72023-02-27 15:59:34 +0100132
133 # Generate an overflow during reduction
134 ("00000000000000000000000000010000000070000000002000001000"
Gabor Mezei931fd642023-03-01 16:50:00 +0100135 "ffffffffffff9fffffffffe00000efff000070000000002000001003"),
Gabor Mezei98791e72023-02-27 15:59:34 +0100136
137 # Generate an underflow during reduction
138 ("00000001000000000000000000000000000000000000000000000000"
Gabor Mezei931fd642023-03-01 16:50:00 +0100139 "00000000000dc0000000000000000001000000010000000100000003"),
Gabor Mezei98791e72023-02-27 15:59:34 +0100140
Gabor Mezeif65a0592023-02-14 18:26:36 +0100141 # First 8 number generated by random.getrandbits(448) - seed(2,2)
142 ("da94e3e8ab73738fcf1822ffbc6887782b491044d5e341245c6e4337"
143 "15ba2bdd177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
144 ("cdbd47d364be8049a372db8f6e405d93ffed9235288bc781ae662675"
145 "94c9c9500925e4749b575bd13653f8dd9b1f282e4067c3584ee207f8"),
146 ("defc044a09325626e6b58de744ab6cce80877b6f71e1f6d2ef8acd12"
147 "8b4f2fc15f3f57ebf30b94fa82523e86feac7eb7dc38f519b91751da"),
148 ("2d6c797f8f7d9b782a1be9cd8697bbd0e2520e33e44c50556c71c4a6"
149 "6148a86fe8624fab5186ee32ee8d7ee9770348a05d300cb90706a045"),
150 ("8f54f8ceacaab39e83844b40ffa9b9f15c14bc4a829e07b0829a48d4"
151 "22fe99a22c70501e533c91352d3d854e061b90303b08c6e33c729578"),
152 ("97eeab64ca2ce6bc5d3fd983c34c769fe89204e2e8168561867e5e15"
153 "bc01bfce6a27e0dfcbf8754472154e76e4c11ab2fec3f6b32e8d4b8a"),
154 ("a7a83ee0761ebfd2bd143fa9b714210c665d7435c1066932f4767f26"
155 "294365b2721dea3bf63f23d0dbe53fcafb2147df5ca495fa5a91c89b"),
156 ("74667bffe202849da9643a295a9ac6decbd4d3e2d4dec9ef83f0be4e"
157 "80371eb97f81375eecc1cb6347733e847d718d733ff98ff387c56473"),
158
159 # Next 2 number generated by random.getrandbits(224)
160 "eb9ac688b9d39cca91551e8259cc60b17604e4b4e73695c3e652c71a",
161 "f0caeef038c89b38a8acb5137c9260dc74e088a9b9492f258ebdbfe3"
162 ]
163
164 @property
165 def arg_a(self) -> str:
166 hex_digits = bignum_common.hex_digits_for_limb(448 // self.bits_in_limb, self.bits_in_limb)
167 return super().format_arg('{:x}'.format(self.int_a)).zfill(hex_digits)
168
169 def result(self) -> List[str]:
170 result = self.int_a % self.int_n
171 return [self.format_result(result)]
172
Gabor Mezeia2ef6a82023-03-06 16:57:25 +0100173 @property
174 def is_valid(self) -> bool:
175 return True
176
Minos Galanakis13586482023-03-21 12:08:37 +0000177 def arguments(self):
178 args = super().arguments()
179 return ["MBEDTLS_ECP_DP_SECP224R1"] + args
180
Minos Galanakis37f4cb62023-03-09 11:15:15 +0000181
Gabor Mezeic33a36b2023-03-28 15:32:47 +0200182class EcpP256R1Raw(bignum_common.ModOperationCommon,
183 EcpTarget):
184 """Test cases for ECP P256 fast reduction."""
185 symbol = "-"
Minos Galanakis13586482023-03-21 12:08:37 +0000186 test_function = "ecp_mod_p_generic_raw"
Gabor Mezeic33a36b2023-03-28 15:32:47 +0200187 test_name = "ecp_mod_p256_raw"
188 input_style = "fixed"
189 arity = 1
Minos Galanakis0a325b62023-04-06 16:33:10 +0100190 dependencies = ["MBEDTLS_ECP_DP_SECP256R1_ENABLED"]
Gabor Mezeic33a36b2023-03-28 15:32:47 +0200191
192 moduli = ["ffffffff00000001000000000000000000000000ffffffffffffffffffffffff"] # type: List[str]
193
194 input_values = [
195 "0", "1",
196
197 # Modulus - 1
198 "ffffffff00000001000000000000000000000000fffffffffffffffffffffffe",
199
200 # Modulus + 1
201 "ffffffff00000001000000000000000000000001000000000000000000000000",
202
203 # 2^256 - 1
204 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
205
206 # Maximum canonical P256 multiplication result
207 ("fffffffe00000002fffffffe0000000100000001fffffffe00000001fffffffc"
208 "00000003fffffffcfffffffffffffffffffffffc000000000000000000000004"),
209
210 # Generate an overflow during reduction
211 ("0000000000000000000000010000000000000000000000000000000000000000"
212 "00000000000000000000000000000000000000000000000000000000ffffffff"),
213
214 # Generate an underflow during reduction
215 ("0000000000000000000000000000000000000000000000000000000000000010"
216 "ffffffff00000000000000000000000000000000000000000000000000000000"),
217
218 # Generate an overflow during carry reduction
219 ("aaaaaaaa00000000000000000000000000000000000000000000000000000000"
220 "00000000000000000000000000000000aaaaaaacaaaaaaaaaaaaaaaa00000000"),
221
222 # Generate an underflow during carry reduction
223 ("000000000000000000000001ffffffff00000000000000000000000000000000"
224 "0000000000000000000000000000000000000002000000020000000100000002"),
225
226 # First 8 number generated by random.getrandbits(512) - seed(2,2)
227 ("4067c3584ee207f8da94e3e8ab73738fcf1822ffbc6887782b491044d5e34124"
228 "5c6e433715ba2bdd177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
229 ("82523e86feac7eb7dc38f519b91751dacdbd47d364be8049a372db8f6e405d93"
230 "ffed9235288bc781ae66267594c9c9500925e4749b575bd13653f8dd9b1f282e"),
231 ("e8624fab5186ee32ee8d7ee9770348a05d300cb90706a045defc044a09325626"
232 "e6b58de744ab6cce80877b6f71e1f6d2ef8acd128b4f2fc15f3f57ebf30b94fa"),
233 ("829a48d422fe99a22c70501e533c91352d3d854e061b90303b08c6e33c729578"
234 "2d6c797f8f7d9b782a1be9cd8697bbd0e2520e33e44c50556c71c4a66148a86f"),
235 ("e89204e2e8168561867e5e15bc01bfce6a27e0dfcbf8754472154e76e4c11ab2"
236 "fec3f6b32e8d4b8a8f54f8ceacaab39e83844b40ffa9b9f15c14bc4a829e07b0"),
237 ("bd143fa9b714210c665d7435c1066932f4767f26294365b2721dea3bf63f23d0"
238 "dbe53fcafb2147df5ca495fa5a91c89b97eeab64ca2ce6bc5d3fd983c34c769f"),
239 ("74667bffe202849da9643a295a9ac6decbd4d3e2d4dec9ef83f0be4e80371eb9"
240 "7f81375eecc1cb6347733e847d718d733ff98ff387c56473a7a83ee0761ebfd2"),
241 ("d08f1bb2531d6460f0caeef038c89b38a8acb5137c9260dc74e088a9b9492f25"
242 "8ebdbfe3eb9ac688b9d39cca91551e8259cc60b17604e4b4e73695c3e652c71a"),
243
244 # Next 2 number generated by random.getrandbits(256)
245 "c5e2486c44a4a8f69dc8db48e86ec9c6e06f291b2a838af8d5c44a4eb3172062",
246 "d4c0dca8b4c9e755cc9c3adcf515a8234da4daeb4f3f87777ad1f45ae9500ec9"
247 ]
248
249 @property
250 def arg_a(self) -> str:
251 return super().format_arg('{:x}'.format(self.int_a)).zfill(2 * self.hex_digits)
252
253 def result(self) -> List[str]:
254 result = self.int_a % self.int_n
255 return [self.format_result(result)]
256
257 @property
258 def is_valid(self) -> bool:
259 return True
260
Minos Galanakis13586482023-03-21 12:08:37 +0000261 def arguments(self):
262 args = super().arguments()
263 return ["MBEDTLS_ECP_DP_SECP256R1"] + args
264
Gabor Mezeic33a36b2023-03-28 15:32:47 +0200265
Minos Galanakis37f4cb62023-03-09 11:15:15 +0000266class EcpP384R1Raw(bignum_common.ModOperationCommon,
267 EcpTarget):
Gabor Mezeid8c0e1a2023-03-28 15:34:49 +0200268 """Test cases for ECP P384 fast reduction."""
Minos Galanakis13586482023-03-21 12:08:37 +0000269 test_function = "ecp_mod_p_generic_raw"
Minos Galanakisf359c912023-03-06 11:39:54 +0000270 test_name = "ecp_mod_p384_raw"
Minos Galanakis37f4cb62023-03-09 11:15:15 +0000271 input_style = "fixed"
Minos Galanakisf359c912023-03-06 11:39:54 +0000272 arity = 1
Minos Galanakis0a325b62023-04-06 16:33:10 +0100273 dependencies = ["MBEDTLS_ECP_DP_SECP384R1_ENABLED"]
Minos Galanakisf359c912023-03-06 11:39:54 +0000274
Gabor Mezeifede2762023-03-28 15:29:40 +0200275 moduli = [("ffffffffffffffffffffffffffffffffffffffffffffffff"
276 "fffffffffffffffeffffffff0000000000000000ffffffff")
Minos Galanakisf359c912023-03-06 11:39:54 +0000277 ] # type: List[str]
278
279 input_values = [
280 "0", "1",
281
282 # Modulus - 1
Gabor Mezeifede2762023-03-28 15:29:40 +0200283 ("ffffffffffffffffffffffffffffffffffffffffffffffff"
284 "fffffffffffffffeffffffff0000000000000000fffffffe"),
Minos Galanakisf359c912023-03-06 11:39:54 +0000285
Gabor Mezei54ad6472023-03-28 15:30:32 +0200286 # Modulus + 1
287 ("ffffffffffffffffffffffffffffffffffffffffffffffff"
288 "fffffffffffffffeffffffff000000000000000100000000"),
289
290 # 2^384 - 1
291 ("ffffffffffffffffffffffffffffffffffffffffffffffff"
292 "ffffffffffffffffffffffffffffffffffffffffffffffff"),
293
Minos Galanakisf359c912023-03-06 11:39:54 +0000294 # Maximum canonical P384 multiplication result
Gabor Mezeifede2762023-03-28 15:29:40 +0200295 ("ffffffffffffffffffffffffffffffffffffffffffffffff"
296 "fffffffffffffffdfffffffe0000000000000001fffffffc"
297 "000000000000000000000000000000010000000200000000"
298 "fffffffe000000020000000400000000fffffffc00000004"),
Minos Galanakisf359c912023-03-06 11:39:54 +0000299
300 # Testing with overflow in A(12) + A(21) + A(20);
Gabor Mezeifede2762023-03-28 15:29:40 +0200301 ("497811378624857a2c2af60d70583376545484cfae5c812f"
302 "e2999fc1abb51d18b559e8ca3b50aaf263fdf8f24bdfb98f"
303 "ffffffff20e65bf9099e4e73a5e8b517cf4fbeb8fd1750fd"
304 "ae6d43f2e53f82d5ffffffffffffffffcc6f1e06111c62e0"),
Minos Galanakisf359c912023-03-06 11:39:54 +0000305
306 # Testing with underflow in A(13) + A(22) + A(23) - A(12) - A(20);
Gabor Mezeifede2762023-03-28 15:29:40 +0200307 ("dfdd25e96777406b3c04b8c7b406f5fcf287e1e576003a09"
308 "2852a6fbe517f2712b68abef41dbd35183a0614fb7222606"
309 "ffffffff84396eee542f18a9189d94396c784059c17a9f18"
310 "f807214ef32f2f10ffffffff8a77fac20000000000000000"),
Minos Galanakisf359c912023-03-06 11:39:54 +0000311
Minos Galanakis37f4cb62023-03-09 11:15:15 +0000312 # Testing with overflow in A(23) + A(20) + A(19) - A(22);
Gabor Mezeifede2762023-03-28 15:29:40 +0200313 ("783753f8a5afba6c1862eead1deb2fcdd907272be3ffd185"
314 "42b24a71ee8b26cab0aa33513610ff973042bbe1637cc9fc"
315 "99ad36c7f703514572cf4f5c3044469a8f5be6312c19e5d3"
316 "f8fc1ac6ffffffffffffffff8c86252400000000ffffffff"),
Minos Galanakis37f4cb62023-03-09 11:15:15 +0000317
318 # Testing with underflow in A(23) + A(20) + A(19) - A(22);
Gabor Mezeifede2762023-03-28 15:29:40 +0200319 ("65e1d2362fce922663b7fd517586e88842a9b4bd092e93e6"
320 "251c9c69f278cbf8285d99ae3b53da5ba36e56701e2b17c2"
321 "25f1239556c5f00117fa140218b46ebd8e34f50d0018701f"
322 "a8a0a5cc00000000000000004410bcb4ffffffff00000000"),
Minos Galanakis37f4cb62023-03-09 11:15:15 +0000323
Minos Galanakis4af90bb2023-03-20 12:20:46 +0000324 # Testing the second round of carry reduction
Gabor Mezeifede2762023-03-28 15:29:40 +0200325 ("000000000000000000000000ffffffffffffffffffffffff"
326 "ffffffffffffffffffffffffffffffff0000000000000000"
327 "0000000000000000ffffffff000000000000000000000001"
328 "00000000000000000000000000000000ffffffff00000001"),
Minos Galanakis4af90bb2023-03-20 12:20:46 +0000329
Minos Galanakisf359c912023-03-06 11:39:54 +0000330 # First 8 number generated by random.getrandbits(768) - seed(2,2)
Gabor Mezeifede2762023-03-28 15:29:40 +0200331 ("ffed9235288bc781ae66267594c9c9500925e4749b575bd1"
332 "3653f8dd9b1f282e4067c3584ee207f8da94e3e8ab73738f"
333 "cf1822ffbc6887782b491044d5e341245c6e433715ba2bdd"
334 "177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
335 ("e8624fab5186ee32ee8d7ee9770348a05d300cb90706a045"
336 "defc044a09325626e6b58de744ab6cce80877b6f71e1f6d2"
337 "ef8acd128b4f2fc15f3f57ebf30b94fa82523e86feac7eb7"
338 "dc38f519b91751dacdbd47d364be8049a372db8f6e405d93"),
339 ("fec3f6b32e8d4b8a8f54f8ceacaab39e83844b40ffa9b9f1"
340 "5c14bc4a829e07b0829a48d422fe99a22c70501e533c9135"
341 "2d3d854e061b90303b08c6e33c7295782d6c797f8f7d9b78"
342 "2a1be9cd8697bbd0e2520e33e44c50556c71c4a66148a86f"),
343 ("bd143fa9b714210c665d7435c1066932f4767f26294365b2"
344 "721dea3bf63f23d0dbe53fcafb2147df5ca495fa5a91c89b"
345 "97eeab64ca2ce6bc5d3fd983c34c769fe89204e2e8168561"
346 "867e5e15bc01bfce6a27e0dfcbf8754472154e76e4c11ab2"),
347 ("8ebdbfe3eb9ac688b9d39cca91551e8259cc60b17604e4b4"
348 "e73695c3e652c71a74667bffe202849da9643a295a9ac6de"
349 "cbd4d3e2d4dec9ef83f0be4e80371eb97f81375eecc1cb63"
350 "47733e847d718d733ff98ff387c56473a7a83ee0761ebfd2"),
351 ("d4c0dca8b4c9e755cc9c3adcf515a8234da4daeb4f3f8777"
352 "7ad1f45ae9500ec9c5e2486c44a4a8f69dc8db48e86ec9c6"
353 "e06f291b2a838af8d5c44a4eb3172062d08f1bb2531d6460"
354 "f0caeef038c89b38a8acb5137c9260dc74e088a9b9492f25"),
355 ("0227eeb7b9d7d01f5769da05d205bbfcc8c69069134bccd3"
356 "e1cf4f589f8e4ce0af29d115ef24bd625dd961e6830b54fa"
357 "7d28f93435339774bb1e386c4fd5079e681b8f5896838b76"
358 "9da59b74a6c3181c81e220df848b1df78feb994a81167346"),
359 ("d322a7353ead4efe440e2b4fda9c025a22f1a83185b98f5f"
360 "c11e60de1b343f52ea748db9e020307aaeb6db2c3a038a70"
361 "9779ac1f45e9dd320c855fdfa7251af0930cdbd30f0ad2a8"
362 "1b2d19a2beaa14a7ff3fe32a30ffc4eed0a7bd04e85bfcdd"),
Minos Galanakisf359c912023-03-06 11:39:54 +0000363
364 # Next 2 number generated by random.getrandbits(384)
Gabor Mezeifede2762023-03-28 15:29:40 +0200365 ("5c3747465cc36c270e8a35b10828d569c268a20eb78ac332"
366 "e5e138e26c4454b90f756132e16dce72f18e859835e1f291"),
367 ("eb2b5693babb7fbb0a76c196067cfdcb11457d9cf45e2fa0"
368 "1d7f4275153924800600571fac3a5b263fdf57cd2c006497")
Minos Galanakisf359c912023-03-06 11:39:54 +0000369 ]
370
371 @property
372 def arg_a(self) -> str:
Minos Galanakis37f4cb62023-03-09 11:15:15 +0000373 return super().format_arg('{:x}'.format(self.int_a)).zfill(2 * self.hex_digits)
Minos Galanakisf359c912023-03-06 11:39:54 +0000374
375 def result(self) -> List[str]:
376 result = self.int_a % self.int_n
377 return [self.format_result(result)]
378
379 @property
380 def is_valid(self) -> bool:
381 return True
Gabor Mezeid034b3d2023-03-06 16:15:43 +0100382
Minos Galanakis13586482023-03-21 12:08:37 +0000383 def arguments(self):
384 args = super().arguments()
385 return ["MBEDTLS_ECP_DP_SECP384R1"] + args
386
387
Gabor Mezeid8f67b92023-02-06 15:49:42 +0100388class EcpP521R1Raw(bignum_common.ModOperationCommon,
389 EcpTarget):
Gabor Mezeid8c0e1a2023-03-28 15:34:49 +0200390 """Test cases for ECP P521 fast reduction."""
Minos Galanakis13586482023-03-21 12:08:37 +0000391 test_function = "ecp_mod_p_generic_raw"
Gabor Mezeid8f67b92023-02-06 15:49:42 +0100392 test_name = "ecp_mod_p521_raw"
Gabor Mezei2c8e1442023-02-16 10:25:08 +0100393 input_style = "arch_split"
Gabor Mezeid8f67b92023-02-06 15:49:42 +0100394 arity = 1
Minos Galanakis0a325b62023-04-06 16:33:10 +0100395 dependencies = ["MBEDTLS_ECP_DP_SECP521R1_ENABLED"]
Gabor Mezeid8f67b92023-02-06 15:49:42 +0100396
397 moduli = [("01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
398 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
399 ] # type: List[str]
400
401 input_values = [
402 "0", "1",
403
Gabor Mezeia9a68722023-03-28 15:06:51 +0200404 # Modulus - 1
405 ("01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
406 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"),
407
408 # Modulus + 1
409 ("020000000000000000000000000000000000000000000000000000000000000000"
410 "000000000000000000000000000000000000000000000000000000000000000000"),
411
412 # Maximum canonical P521 multiplication result
Janos Follath755ff0e2023-02-07 15:27:44 +0000413 ("0003ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
414 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
415 "fffff800"
416 "0000000000000000000000000000000000000000000000000000000000000000"
417 "0000000000000000000000000000000000000000000000000000000000000004"),
418
Gabor Mezeid8f67b92023-02-06 15:49:42 +0100419 # Test case for overflow during addition
420 ("0001efffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
421 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
422 "000001ef"
423 "0000000000000000000000000000000000000000000000000000000000000000"
424 "000000000000000000000000000000000000000000000000000000000f000000"),
425
426 # First 8 number generated by random.getrandbits(1042) - seed(2,2)
427 ("0003cc2e82523e86feac7eb7dc38f519b91751dacdbd47d364be8049a372db8f"
428 "6e405d93ffed9235288bc781ae66267594c9c9500925e4749b575bd13653f8dd"
429 "9b1f282e"
430 "4067c3584ee207f8da94e3e8ab73738fcf1822ffbc6887782b491044d5e34124"
431 "5c6e433715ba2bdd177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
432 ("00017052829e07b0829a48d422fe99a22c70501e533c91352d3d854e061b9030"
433 "3b08c6e33c7295782d6c797f8f7d9b782a1be9cd8697bbd0e2520e33e44c5055"
434 "6c71c4a6"
435 "6148a86fe8624fab5186ee32ee8d7ee9770348a05d300cb90706a045defc044a"
436 "09325626e6b58de744ab6cce80877b6f71e1f6d2ef8acd128b4f2fc15f3f57eb"),
437 ("00021f15a7a83ee0761ebfd2bd143fa9b714210c665d7435c1066932f4767f26"
438 "294365b2721dea3bf63f23d0dbe53fcafb2147df5ca495fa5a91c89b97eeab64"
439 "ca2ce6bc"
440 "5d3fd983c34c769fe89204e2e8168561867e5e15bc01bfce6a27e0dfcbf87544"
441 "72154e76e4c11ab2fec3f6b32e8d4b8a8f54f8ceacaab39e83844b40ffa9b9f1"),
442 ("000381bc2a838af8d5c44a4eb3172062d08f1bb2531d6460f0caeef038c89b38"
443 "a8acb5137c9260dc74e088a9b9492f258ebdbfe3eb9ac688b9d39cca91551e82"
444 "59cc60b1"
445 "7604e4b4e73695c3e652c71a74667bffe202849da9643a295a9ac6decbd4d3e2"
446 "d4dec9ef83f0be4e80371eb97f81375eecc1cb6347733e847d718d733ff98ff3"),
447 ("00034816c8c69069134bccd3e1cf4f589f8e4ce0af29d115ef24bd625dd961e6"
448 "830b54fa7d28f93435339774bb1e386c4fd5079e681b8f5896838b769da59b74"
449 "a6c3181c"
450 "81e220df848b1df78feb994a81167346d4c0dca8b4c9e755cc9c3adcf515a823"
451 "4da4daeb4f3f87777ad1f45ae9500ec9c5e2486c44a4a8f69dc8db48e86ec9c6"),
452 ("000397846c4454b90f756132e16dce72f18e859835e1f291d322a7353ead4efe"
453 "440e2b4fda9c025a22f1a83185b98f5fc11e60de1b343f52ea748db9e020307a"
454 "aeb6db2c"
455 "3a038a709779ac1f45e9dd320c855fdfa7251af0930cdbd30f0ad2a81b2d19a2"
456 "beaa14a7ff3fe32a30ffc4eed0a7bd04e85bfcdd0227eeb7b9d7d01f5769da05"),
457 ("00002c3296e6bc4d62b47204007ee4fab105d83e85e951862f0981aebc1b00d9"
458 "2838e766ef9b6bf2d037fe2e20b6a8464174e75a5f834da70569c018eb2b5693"
459 "babb7fbb"
460 "0a76c196067cfdcb11457d9cf45e2fa01d7f4275153924800600571fac3a5b26"
461 "3fdf57cd2c0064975c3747465cc36c270e8a35b10828d569c268a20eb78ac332"),
462 ("00009d23b4917fc09f20dbb0dcc93f0e66dfe717c17313394391b6e2e6eacb0f"
463 "0bb7be72bd6d25009aeb7fa0c4169b148d2f527e72daf0a54ef25c0707e33868"
464 "7d1f7157"
465 "5653a45c49390aa51cf5192bbf67da14be11d56ba0b4a2969d8055a9f03f2d71"
466 "581d8e830112ff0f0948eccaf8877acf26c377c13f719726fd70bddacb4deeec"),
467
468 # Next 2 number generated by random.getrandbits(521)
469 ("12b84ae65e920a63ac1f2b64df6dff07870c9d531ae72a47403063238da1a1fe"
470 "3f9d6a179fa50f96cd4aff9261aa92c0e6f17ec940639bc2ccdf572df00790813e3"),
471 ("166049dd332a73fa0b26b75196cf87eb8a09b27ec714307c68c425424a1574f1"
472 "eedf5b0f16cdfdb839424d201e653f53d6883ca1c107ca6e706649889c0c7f38608")
473 ]
474
475 @property
476 def arg_a(self) -> str:
Gabor Mezeicf228702023-02-15 16:52:33 +0100477 # Number of limbs: 2 * N
478 return super().format_arg('{:x}'.format(self.int_a)).zfill(2 * self.hex_digits)
Gabor Mezeid8f67b92023-02-06 15:49:42 +0100479
480 def result(self) -> List[str]:
481 result = self.int_a % self.int_n
482 return [self.format_result(result)]
Gabor Mezeia2ef6a82023-03-06 16:57:25 +0100483
484 @property
485 def is_valid(self) -> bool:
486 return True
Minos Galanakis13586482023-03-21 12:08:37 +0000487
488 def arguments(self):
489 args = super().arguments()
490 return ["MBEDTLS_ECP_DP_SECP521R1"] + args
Gabor Mezeib86ead32023-04-11 15:43:12 +0200491
492
493class EcpP192K1Raw(bignum_common.ModOperationCommon,
494 EcpTarget):
495 """Test cases for ECP P192K1 fast reduction."""
496 symbol = "-"
497 test_function = "ecp_mod_p192k1"
498 test_name = "ecp_mod_p192k1"
499 input_style = "fixed"
500 arity = 1
Gabor Mezeicec50602023-04-17 14:56:03 +0200501 dependencies = ["MBEDTLS_ECP_DP_SECP192K1_ENABLED"]
Gabor Mezeib86ead32023-04-11 15:43:12 +0200502
503 moduli = ["fffffffffffffffffffffffffffffffffffffffeffffee37"] # type: List[str]
504
505 input_values = [
506 "0", "1",
507
508 # Modulus - 1
509 "fffffffffffffffffffffffffffffffffffffffeffffee36",
510
511 # Modulus + 1
512 "fffffffffffffffffffffffffffffffffffffffeffffee38",
513
514 # 2^192 - 1
515 "ffffffffffffffffffffffffffffffffffffffffffffffff",
516
517 # Maximum canonical P192K1 multiplication result
518 ("fffffffffffffffffffffffffffffffffffffffdffffdc6c"
519 "0000000000000000000000000000000100002394013c7364"),
520
521 # First 8 number generated by random.getrandbits(384) - seed(2,2)
522 ("cf1822ffbc6887782b491044d5e341245c6e433715ba2bdd"
523 "177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
524 ("ffed9235288bc781ae66267594c9c9500925e4749b575bd1"
525 "3653f8dd9b1f282e4067c3584ee207f8da94e3e8ab73738f"),
526 ("ef8acd128b4f2fc15f3f57ebf30b94fa82523e86feac7eb7"
527 "dc38f519b91751dacdbd47d364be8049a372db8f6e405d93"),
528 ("e8624fab5186ee32ee8d7ee9770348a05d300cb90706a045"
529 "defc044a09325626e6b58de744ab6cce80877b6f71e1f6d2"),
530 ("2d3d854e061b90303b08c6e33c7295782d6c797f8f7d9b78"
531 "2a1be9cd8697bbd0e2520e33e44c50556c71c4a66148a86f"),
532 ("fec3f6b32e8d4b8a8f54f8ceacaab39e83844b40ffa9b9f1"
533 "5c14bc4a829e07b0829a48d422fe99a22c70501e533c9135"),
534 ("97eeab64ca2ce6bc5d3fd983c34c769fe89204e2e8168561"
535 "867e5e15bc01bfce6a27e0dfcbf8754472154e76e4c11ab2"),
536 ("bd143fa9b714210c665d7435c1066932f4767f26294365b2"
537 "721dea3bf63f23d0dbe53fcafb2147df5ca495fa5a91c89b"),
538
539 # Next 2 number generated by random.getrandbits(192)
540 "47733e847d718d733ff98ff387c56473a7a83ee0761ebfd2",
541 "cbd4d3e2d4dec9ef83f0be4e80371eb97f81375eecc1cb63"
542 ]
543
544 @property
545 def arg_a(self) -> str:
546 return super().format_arg('{:x}'.format(self.int_a)).zfill(2 * self.hex_digits)
547
548 def result(self) -> List[str]:
549 result = self.int_a % self.int_n
550 return [self.format_result(result)]
551
552 @property
553 def is_valid(self) -> bool:
554 return True
Minos Galanakise5dab972023-04-11 16:42:06 +0100555
556
557class EcpP224K1Raw(bignum_common.ModOperationCommon,
558 EcpTarget):
559 """Test cases for ECP P224 fast reduction."""
560 symbol = "-"
561 test_function = "ecp_mod_p224k1"
562 test_name = "ecp_mod_p224k1"
563 input_style = "fixed"
564 arity = 1
565 dependencies = ["MBEDTLS_ECP_DP_SECP224K1_ENABLED"]
566
567 moduli = ["fffffffffffffffffffffffffffffffffffffffffffffffeffffe56d"] # type: List[str]
568
569 input_values = [
570 "0", "1",
571
572 # Modulus - 1
573 "fffffffffffffffffffffffffffffffffffffffffffffffeffffe56c",
574
575 # Modulus + 1
576 "fffffffffffffffffffffffffffffffffffffffffffffffeffffe56e",
577
578 # 2^224 - 1
579 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
580
581 # Maximum canonical P224 multiplication result
582 ("fffffffffffffffffffffffffffffffffffffffffffffffdffffcad8"
583 "00000000000000000000000000000000000000010000352802c26590"),
584
585 # First 8 number generated by random.getrandbits(448) - seed(2,2)
586 ("da94e3e8ab73738fcf1822ffbc6887782b491044d5e341245c6e4337"
587 "15ba2bdd177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
588 ("cdbd47d364be8049a372db8f6e405d93ffed9235288bc781ae662675"
589 "94c9c9500925e4749b575bd13653f8dd9b1f282e4067c3584ee207f8"),
590 ("defc044a09325626e6b58de744ab6cce80877b6f71e1f6d2ef8acd12"
591 "8b4f2fc15f3f57ebf30b94fa82523e86feac7eb7dc38f519b91751da"),
592 ("2d6c797f8f7d9b782a1be9cd8697bbd0e2520e33e44c50556c71c4a6"
593 "6148a86fe8624fab5186ee32ee8d7ee9770348a05d300cb90706a045"),
594 ("8f54f8ceacaab39e83844b40ffa9b9f15c14bc4a829e07b0829a48d4"
595 "22fe99a22c70501e533c91352d3d854e061b90303b08c6e33c729578"),
596 ("97eeab64ca2ce6bc5d3fd983c34c769fe89204e2e8168561867e5e15"
597 "bc01bfce6a27e0dfcbf8754472154e76e4c11ab2fec3f6b32e8d4b8a"),
598 ("a7a83ee0761ebfd2bd143fa9b714210c665d7435c1066932f4767f26"
599 "294365b2721dea3bf63f23d0dbe53fcafb2147df5ca495fa5a91c89b"),
600 ("74667bffe202849da9643a295a9ac6decbd4d3e2d4dec9ef83f0be4e"
601 "80371eb97f81375eecc1cb6347733e847d718d733ff98ff387c56473"),
602
603 # Next 2 number generated by random.getrandbits(224)
604 ("eb9ac688b9d39cca91551e8259cc60b17604e4b4e73695c3e652c71a"),
605 ("f0caeef038c89b38a8acb5137c9260dc74e088a9b9492f258ebdbfe3"),
606 ]
607
608 @property
609 def arg_a(self) -> str:
610 hex_digits = bignum_common.hex_digits_for_limb(448 // self.bits_in_limb, self.bits_in_limb)
611 return super().format_arg('{:x}'.format(self.int_a)).zfill(hex_digits)
612
613 def result(self) -> List[str]:
614 result = self.int_a % self.int_n
615 return [self.format_result(result)]
616
617 @property
618 def is_valid(self) -> bool:
619 return True
Minos Galanakisd6751dc2023-04-11 17:25:31 +0100620
621
622class EcpP256K1Raw(bignum_common.ModOperationCommon,
623 EcpTarget):
624 """Test cases for ECP P256 fast reduction."""
625 symbol = "-"
626 test_function = "ecp_mod_p256k1"
627 test_name = "ecp_mod_p256k1"
628 input_style = "fixed"
629 arity = 1
630 dependencies = ["MBEDTLS_ECP_DP_SECP256K1_ENABLED"]
631
632 moduli = ["fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"] # type: List[str]
633
634 input_values = [
635 "0", "1",
636
637 # Modulus - 1
638 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2e",
639
640 # Modulus + 1
641 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc30",
642
643 # 2^256 - 1
644 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
645
646 # Maximum canonical P256 multiplication result
647 ("fffffffffffffffffffffffffffffffffffffffffffffffffffffffdfffff85c0"
648 "00000000000000000000000000000000000000000000001000007a4000e9844"),
649
650 # First 8 number generated by random.getrandbits(512) - seed(2,2)
651 ("4067c3584ee207f8da94e3e8ab73738fcf1822ffbc6887782b491044d5e34124"
652 "5c6e433715ba2bdd177219d30e7a269fd95bafc8f2a4d27bdcf4bb99f4bea973"),
653 ("82523e86feac7eb7dc38f519b91751dacdbd47d364be8049a372db8f6e405d93"
654 "ffed9235288bc781ae66267594c9c9500925e4749b575bd13653f8dd9b1f282e"),
655 ("e8624fab5186ee32ee8d7ee9770348a05d300cb90706a045defc044a09325626"
656 "e6b58de744ab6cce80877b6f71e1f6d2ef8acd128b4f2fc15f3f57ebf30b94fa"),
657 ("829a48d422fe99a22c70501e533c91352d3d854e061b90303b08c6e33c729578"
658 "2d6c797f8f7d9b782a1be9cd8697bbd0e2520e33e44c50556c71c4a66148a86f"),
659 ("e89204e2e8168561867e5e15bc01bfce6a27e0dfcbf8754472154e76e4c11ab2"
660 "fec3f6b32e8d4b8a8f54f8ceacaab39e83844b40ffa9b9f15c14bc4a829e07b0"),
661 ("bd143fa9b714210c665d7435c1066932f4767f26294365b2721dea3bf63f23d0"
662 "dbe53fcafb2147df5ca495fa5a91c89b97eeab64ca2ce6bc5d3fd983c34c769f"),
663 ("74667bffe202849da9643a295a9ac6decbd4d3e2d4dec9ef83f0be4e80371eb9"
664 "7f81375eecc1cb6347733e847d718d733ff98ff387c56473a7a83ee0761ebfd2"),
665 ("d08f1bb2531d6460f0caeef038c89b38a8acb5137c9260dc74e088a9b9492f25"
666 "8ebdbfe3eb9ac688b9d39cca91551e8259cc60b17604e4b4e73695c3e652c71a"),
667
668 # Next 2 number generated by random.getrandbits(256)
669 ("c5e2486c44a4a8f69dc8db48e86ec9c6e06f291b2a838af8d5c44a4eb3172062"),
670 ("d4c0dca8b4c9e755cc9c3adcf515a8234da4daeb4f3f87777ad1f45ae9500ec9"),
671 ]
672
673 @property
674 def arg_a(self) -> str:
675 hex_digits = bignum_common.hex_digits_for_limb(448 // self.bits_in_limb, self.bits_in_limb)
676 return super().format_arg('{:x}'.format(self.int_a)).zfill(hex_digits)
677
678 def result(self) -> List[str]:
679 result = self.int_a % self.int_n
680 return [self.format_result(result)]
681
682 @property
683 def is_valid(self) -> bool:
684 return True
Paul Elliott16648be2023-04-23 23:19:21 +0100685
686
687class EcpP448Raw(bignum_common.ModOperationCommon,
688 EcpTarget):
689 """Test cases for ECP P448 fast reduction."""
690 symbol = "-"
691 test_function = "ecp_mod_p448"
692 test_name = "ecp_mod_p448"
693 input_style = "fixed"
694 arity = 1
695 dependencies = ["MBEDTLS_ECP_DP_CURVE448_ENABLED"]
696
697 moduli = [("fffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
698 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff")] # type: List[str]
699
700 input_values = [
701 "0", "1",
702
703 # Modulus - 1
704 ("fffffffffffffffffffffffffffffffffffffffffffffffffffffffe"
705 "fffffffffffffffffffffffffffffffffffffffffffffffffffffffe"),
706
707 # Modulus + 1
708 ("ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
709 "00000000000000000000000000000000000000000000000000000000"),
710
711 # 2^448 - 1
712 ("ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
713 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"),
714
715 # Maximum canonical P448 multiplication result
716 ("fffffffffffffffffffffffffffffffffffffffffffffffffffffffd"
717 "ffffffffffffffffffffffffffffffffffffffffffffffffffffffff"
718 "00000000000000000000000000000000000000000000000000000002"
719 "00000000000000000000000000000000000000000000000000000001"),
720
721 # First 8 number generated by random.getrandbits(896) - seed(2,2)
722 ("74667bffe202849da9643a295a9ac6decbd4d3e2d4dec9ef83f0be4e"
723 "80371eb97f81375eecc1cb6347733e847d718d733ff98ff387c56473"
724 "a7a83ee0761ebfd2bd143fa9b714210c665d7435c1066932f4767f26"
725 "294365b2721dea3bf63f23d0dbe53fcafb2147df5ca495fa5a91c89b"),
726 ("4da4daeb4f3f87777ad1f45ae9500ec9c5e2486c44a4a8f69dc8db48"
727 "e86ec9c6e06f291b2a838af8d5c44a4eb3172062d08f1bb2531d6460"
728 "f0caeef038c89b38a8acb5137c9260dc74e088a9b9492f258ebdbfe3"
729 "eb9ac688b9d39cca91551e8259cc60b17604e4b4e73695c3e652c71a"),
730 ("bc1b00d92838e766ef9b6bf2d037fe2e20b6a8464174e75a5f834da7"
731 "0569c018eb2b5693babb7fbb0a76c196067cfdcb11457d9cf45e2fa0"
732 "1d7f4275153924800600571fac3a5b263fdf57cd2c0064975c374746"
733 "5cc36c270e8a35b10828d569c268a20eb78ac332e5e138e26c4454b9"),
734 ("8d2f527e72daf0a54ef25c0707e338687d1f71575653a45c49390aa5"
735 "1cf5192bbf67da14be11d56ba0b4a2969d8055a9f03f2d71581d8e83"
736 "0112ff0f0948eccaf8877acf26c377c13f719726fd70bddacb4deeec"
737 "0b0c995e96e6bc4d62b47204007ee4fab105d83e85e951862f0981ae"),
738 ("84ae65e920a63ac1f2b64df6dff07870c9d531ae72a47403063238da"
739 "1a1fe3f9d6a179fa50f96cd4aff9261aa92c0e6f17ec940639bc2ccd"
740 "f572df00790813e32748dd1db4917fc09f20dbb0dcc93f0e66dfe717"
741 "c17313394391b6e2e6eacb0f0bb7be72bd6d25009aeb7fa0c4169b14"),
742 ("2bb3b36f29421c4021b7379f0897246a40c270b00e893302aba9e7b8"
743 "23fc5ad2f58105748ed5d1b7b310b730049dd332a73fa0b26b75196c"
744 "f87eb8a09b27ec714307c68c425424a1574f1eedf5b0f16cdfdb8394"
745 "24d201e653f53d6883ca1c107ca6e706649889c0c7f3860895bfa813"),
746 ("af3f5d7841b1256d5c1dc12fb5a1ae519fb8883accda6559caa538a0"
747 "9fc9370d3a6b86a7975b54a31497024640332b0612d4050771d7b14e"
748 "b6c004cc3b8367dc3f2bb31efe9934ad0809eae3ef232a32b5459d83"
749 "fbc46f1aea990e94821d46063b4dbf2ca294523d74115c86188b1044"),
750 ("7430051376e31f5aab63ad02854efa600641b4fa37a47ce41aeffafc"
751 "3b45402ac02659fe2e87d4150511baeb198ababb1a16daff3da95cd2"
752 "167b75dfb948f82a8317cba01c75f67e290535d868a24b7f627f2855"
753 "09167d4126af8090013c3273c02c6b9586b4625b475b51096c4ad652"),
754
755 # Next 2 number generated by random.getrandbits(448)
756 ("8f54f8ceacaab39e83844b40ffa9b9f15c14bc4a829e07b0829a48d4"
757 "22fe99a22c70501e533c91352d3d854e061b90303b08c6e33c729578"),
758 ("97eeab64ca2ce6bc5d3fd983c34c769fe89204e2e8168561867e5e15"
759 "bc01bfce6a27e0dfcbf8754472154e76e4c11ab2fec3f6b32e8d4b8a"),
760
761 ]
762
763 @property
764 def arg_a(self) -> str:
765 hex_digits = bignum_common.hex_digits_for_limb(448 // self.bits_in_limb, self.bits_in_limb)
766 return super().format_arg('{:x}'.format(self.int_a)).zfill(hex_digits)
767
768 def result(self) -> List[str]:
769 result = self.int_a % self.int_n
770 return [self.format_result(result)]
771
772 @property
773 def is_valid(self) -> bool:
774 return True