@@ -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
661702def 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