|
18 | 18 | from .util import sigencode_der, sigencode_string |
19 | 19 | from .util import sigdecode_der, sigdecode_string |
20 | 20 | from .curves import curves, NIST256p |
| 21 | +from .der import encode_integer, encode_sequence |
21 | 22 |
|
22 | 23 |
|
23 | 24 | example_data = b"some data to sign" |
@@ -121,6 +122,48 @@ def test_fuzzed_der_signatures(args): |
121 | 122 | verifying_key.verify(sig, example_data, sigdecode=sigdecode_der) |
122 | 123 |
|
123 | 124 |
|
| 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 | + |
124 | 167 | #### |
125 | 168 | # |
126 | 169 | # For string encoded signatures, only the length of string is important |
|
0 commit comments