Skip to content

Commit e7716b8

Browse files
committed
Returns back the not extended sig decoding for der
1 parent ff8d3b1 commit e7716b8

2 files changed

Lines changed: 46 additions & 5 deletions

File tree

src/ecdsa/test_malformed_sigs.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030
from .keys import SigningKey
3131
from .keys import BadSignatureError
32-
from .util import number_to_string, sigencode_der, sigencode_der_sig_value_a, sigencode_string
32+
from .util import number_to_string, sigdecode_der_extended, sigencode_der, sigencode_der_sig_value_a, sigencode_string
3333
from .util import sigdecode_der, sigdecode_string
3434
from .curves import curves, SECP112r2, SECP128r1
3535
from .der import (
@@ -305,7 +305,7 @@ def test_random_der_ecdsa_sig_value_full_r(params):
305305

306306
with pytest.raises(BadSignatureError):
307307
verifying_key.verify(
308-
sig, example_data, sigdecode=sigdecode_der)
308+
sig, example_data, sigdecode=sigdecode_der_extended)
309309

310310

311311
@settings(**slow_params)
@@ -319,7 +319,7 @@ def test_random_der_ecdsa_sig_value_a(params):
319319

320320
with pytest.raises(BadSignatureError):
321321
verifying_key.verify(
322-
sig, example_data, sigdecode=sigdecode_der)
322+
sig, example_data, sigdecode=sigdecode_der_extended)
323323

324324

325325
def st_der_integer(*args, **kwargs): # pragma: no cover

src/ecdsa/util.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,47 @@ def sigdecode_der(sig_der, order):
629629
"""
630630
Decoder for DER format of ECDSA signatures.
631631
632+
DER format of signature is one that uses the :term:`ASN.1` :term:`DER`
633+
rules to encode it as a sequence of two integers::
634+
635+
Ecdsa-Sig-Value ::= SEQUENCE {
636+
r INTEGER,
637+
s INTEGER
638+
}
639+
640+
It's expected that this function will be used as as the ``sigdecode=``
641+
parameter to the :func:`ecdsa.keys.VerifyingKey.verify` method.
642+
643+
:param sig_der: encoded signature
644+
:type sig_der: bytes like object
645+
:param order: order of the curve over which the signature was computed
646+
:type order: int
647+
648+
:raises UnexpectedDER: when the encoding of signature is invalid
649+
650+
:return: tuple with decoded ``r`` and ``s`` values of signature
651+
:rtype: tuple of ints
652+
"""
653+
sig_der = normalise_bytes(sig_der)
654+
# return der.encode_sequence(der.encode_integer(r), der.encode_integer(s))
655+
rs_strings, empty = der.remove_sequence(sig_der)
656+
if empty != b"":
657+
raise der.UnexpectedDER(
658+
"trailing junk after DER sig: %s" % binascii.hexlify(empty)
659+
)
660+
r, rest = der.remove_integer(rs_strings)
661+
s, empty = der.remove_integer(rest)
662+
if empty != b"":
663+
raise der.UnexpectedDER(
664+
"trailing junk after DER numbers: %s" % binascii.hexlify(empty)
665+
)
666+
return r, s
667+
668+
669+
def sigdecode_der_extended(sig_der, order):
670+
"""
671+
Decoder for DER format of ECDSA signatures.
672+
632673
DER format of signature is one that uses the :term:`ASN.1` :term:`DER`
633674
rules to encode it as one of the choices::
634675
@@ -655,7 +696,7 @@ def sigdecode_der(sig_der, order):
655696
# what signature is encoded depends on the tag presence
656697
if not der.is_sequence(sig_der):
657698
return sigdecode_der_full_r(sig_der, order)
658-
return sigdecode_der_ecdsa_sig_value(sig_der, order)
699+
return sigdecode_der_ecdsa_sig_extended(sig_der, order)
659700

660701

661702
def sigdecode_der_full_r(sig_der, order):
@@ -708,7 +749,7 @@ def sigdecode_der_full_r(sig_der, order):
708749
return r, s
709750

710751

711-
def sigdecode_der_ecdsa_sig_value(sig_der, order):
752+
def sigdecode_der_ecdsa_sig_extended(sig_der, order):
712753
"""
713754
Decoder for DER format of ECDSA-Sig-Value signatures.
714755

0 commit comments

Comments
 (0)