Skip to content

Commit b4336b5

Browse files
committed
test random ECDSA-Sig-Value
1 parent 1955c12 commit b4336b5

File tree

1 file changed

+43
-0
lines changed

1 file changed

+43
-0
lines changed

src/ecdsa/test_malformed_sigs.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
from .util import sigencode_der, sigencode_string
1919
from .util import sigdecode_der, sigdecode_string
2020
from .curves import curves, NIST256p
21+
from .der import encode_integer, encode_sequence
2122

2223

2324
example_data = b"some data to sign"
@@ -121,6 +122,48 @@ def test_fuzzed_der_signatures(args):
121122
verifying_key.verify(sig, example_data, sigdecode=sigdecode_der)
122123

123124

125+
@st.composite
126+
def st_random_der_ecdsa_sig_value(draw):
127+
"""
128+
Hypothesis strategy for selecting random values and encoding them
129+
to ECDSA-Sig-Value object::
130+
131+
ECDSA-Sig-Value ::= SEQUENCE {
132+
r INTEGER,
133+
s INTEGER
134+
}
135+
"""
136+
name, verifying_key, _ = draw(st.sampled_from(keys_and_sigs))
137+
note("Configuration: {0}".format(name))
138+
order = verifying_key.curve.order
139+
140+
# the encode_integer doesn't suport negative numbers, would be nice
141+
# to generate them too, but we have coverage for remove_integer()
142+
# verifying that it doesn't accept them, so meh.
143+
# Test all numbers around the ones that can show up (around order)
144+
# way smaller and slightly bigger
145+
r = draw(st.integers(min_value=0, max_value=order << 4) |
146+
st.integers(min_value=order >> 2, max_value=order+1))
147+
s = draw(st.integers(min_value=0, max_value=order << 4) |
148+
st.integers(min_value=order >> 2, max_value=order+1))
149+
150+
sig = encode_sequence(encode_integer(r), encode_integer(s))
151+
152+
return verifying_key, sig
153+
154+
155+
@given(st_random_der_ecdsa_sig_value())
156+
def test_random_der_ecdsa_sig_value(params):
157+
"""
158+
Check if random values encoded in ECDSA-Sig-Value structure are rejected
159+
as signature.
160+
"""
161+
verifying_key, sig = params
162+
163+
with pytest.raises(BadSignatureError):
164+
verifying_key.verify(sig, example_data, sigdecode=sigdecode_der)
165+
166+
124167
####
125168
#
126169
# For string encoded signatures, only the length of string is important

0 commit comments

Comments
 (0)