@@ -25,20 +25,62 @@ class ModExpInput(TestParameterGroup):
25
25
extra_data : Bytes = Field (default_factory = Bytes )
26
26
raw_input : Bytes | None = None
27
27
28
+ override_base_length : int | None = None
29
+ override_exponent_length : int | None = None
30
+ override_modulus_length : int | None = None
31
+
28
32
@property
29
33
def length_base (self ) -> Bytes :
30
34
"""Return the length of the base."""
31
- return Bytes (len (self .base ).to_bytes (32 , "big" ))
35
+ length = (
36
+ self .override_base_length if self .override_base_length is not None else len (self .base )
37
+ )
38
+ return Bytes (length .to_bytes (32 , "big" ))
32
39
33
40
@property
34
41
def length_exponent (self ) -> Bytes :
35
42
"""Return the length of the exponent."""
36
- return Bytes (len (self .exponent ).to_bytes (32 , "big" ))
43
+ length = (
44
+ self .override_exponent_length
45
+ if self .override_exponent_length is not None
46
+ else len (self .exponent )
47
+ )
48
+ return Bytes (length .to_bytes (32 , "big" ))
37
49
38
50
@property
39
51
def length_modulus (self ) -> Bytes :
40
52
"""Return the length of the modulus."""
41
- return Bytes (len (self .modulus ).to_bytes (32 , "big" ))
53
+ length = (
54
+ self .override_modulus_length
55
+ if self .override_modulus_length is not None
56
+ else len (self .modulus )
57
+ )
58
+ return Bytes (length .to_bytes (32 , "big" ))
59
+
60
+ @property
61
+ def declared_base_length (self ) -> int :
62
+ """Return the declared base length as int."""
63
+ return (
64
+ self .override_base_length if self .override_base_length is not None else len (self .base )
65
+ )
66
+
67
+ @property
68
+ def declared_exponent_length (self ) -> int :
69
+ """Return the declared exponent length as int."""
70
+ return (
71
+ self .override_exponent_length
72
+ if self .override_exponent_length is not None
73
+ else len (self .exponent )
74
+ )
75
+
76
+ @property
77
+ def declared_modulus_length (self ) -> int :
78
+ """Return the declared modulus length as int."""
79
+ return (
80
+ self .override_modulus_length
81
+ if self .override_modulus_length is not None
82
+ else len (self .modulus )
83
+ )
42
84
43
85
def __bytes__ (self ):
44
86
"""Generate input for the MODEXP precompile."""
@@ -86,6 +128,26 @@ def from_bytes(cls, input_data: Bytes | str) -> "ModExpInput":
86
128
87
129
return cls (base = base , exponent = exponent , modulus = modulus , raw_input = input_data )
88
130
131
+ @classmethod
132
+ def create_mismatch (
133
+ cls ,
134
+ base = "" ,
135
+ exponent = "" ,
136
+ modulus = "" ,
137
+ declared_base_length = None ,
138
+ declared_exponent_length = None ,
139
+ declared_modulus_length = None ,
140
+ ):
141
+ """Create a ModExpInput with mismatched lengths."""
142
+ return cls (
143
+ base = Bytes (base ),
144
+ exponent = Bytes (exponent ),
145
+ modulus = Bytes (modulus ),
146
+ override_base_length = declared_base_length ,
147
+ override_exponent_length = declared_exponent_length ,
148
+ override_modulus_length = declared_modulus_length ,
149
+ )
150
+
89
151
90
152
class ModExpOutput (TestParameterGroup ):
91
153
"""
0 commit comments