o
    6hVF                     @   s  d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZ ddlmZ ddlmZ d	Zeje Zd
ZdZejdkrIdd Zndd Zejdk rWdd Zndd Zdd ZdDddZG dd dZdd Zdd Zdd Zefd d!Zefd"d#Z d$d% Z!d&d' Z"d(d) Z#d*d+ Z$d,d- Z%d.d/ Z&d0d1 Z'd2d3 Z(d4d5 Z)d6d7 Z*d8d9 Z+d:d; Z,G d<d= d=e-Z.d>d? Z/d@dA Z0dBdC Z1dS )Ea  
This module includes some utility functions.

The methods most typically used are the sigencode and sigdecode functions
to be used with :func:`~ecdsa.keys.SigningKey.sign` and
:func:`~ecdsa.keys.VerifyingKey.verify`
respectively. See the :func:`sigencode_strings`, :func:`sigdecode_string`,
:func:`sigencode_der`, :func:`sigencode_strings_canonize`,
:func:`sigencode_string_canonize`, :func:`sigencode_der_canonize`,
:func:`sigdecode_strings`, :func:`sigdecode_string`, and
:func:`sigdecode_der` functions.
    )divisionN)sha256)PY2int2bytenext   )der)normalise_bytes)r      iH  i='  r
   r   )r         r      )r   r   r   r      )r   c                 C   s&   t t| ddd t| d S )-Convert a bytestring to string of 0's and 1'sbigr
   N   )binint
from_byteszfilllenent_256 r   ^/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/ecdsa/util.pyentropy_to_bits4   s   &r   c                 C   s   d dd | D S )r    c                 s   s*    | ]}t t|d d dV  qdS )r
   Nr   )r   ordr   ).0xr   r   r   	<genexpr><   s   ( z"entropy_to_bits.<locals>.<genexpr>)joinr   r   r   r   r   :   s   )r
      c                 C   s   t t| d S )Nr
   )r   r   r   r   r   r   
bit_lengthA      r$   c                 C   s   |   pdS Nr   )r$   r#   r   r   r   r$   F      c                 C   s   dt d|   d S )Nr   z%xr
   )r   )orderr   r   r   orderlenJ   s   r)   c                 C   sv   | dksJ |du rt j}t| d }|d d }	 ||}t|}t|d| ddd }d|  k r9| k r:|S  q)a  Return a random integer k such that 1 <= k < order, uniformly
    distributed across that range. Worst case should be a mean of 2 loops at
    (2**k)+2.

    Note that this function is not declared to be forwards-compatible: we may
    change the behavior in future releases. The entropy= argument (which
    should get a callable that behaves like os.urandom) can be used to
    achieve stability within a given release (for repeatable unit tests), but
    should not be used as a long-term-compatible key generation algorithm.
    r   Nr
   r   T)baser   )osurandomr$   r   r   )r(   entropyupper_2	upper_256r   ent_2rand_numr   r   r   	randrangeN   s   r2   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )PRNGc                 C   s   |  || _d S N)block_generator	generator)selfseedr   r   r   __init__l   r%   zPRNG.__init__c                    s,    fddt |D }trd|S t|S )Nc                    s   g | ]}t  jqS r   )r   r6   )r   ir7   r   r   
<listcomp>p   s    z!PRNG.__call__.<locals>.<listcomp>r   )ranger   r!   bytes)r7   numbytesar   r;   r   __call__o   s   
zPRNG.__call__c                 c   s6    d}	 t d||f   D ]}|V  q|d7 }q)Nr   Tz
prng-%d-%sr   )r   encodedigest)r7   r8   counterbyter   r   r   r5   w   s   zPRNG.block_generatorN)__name__
__module____qualname__r9   rA   r5   r   r   r   r   r3   f   s    r3   c                 C   sX   t | dt| }tt|d|d  d }d|  kr"|k s*n J d||f|S )Nr
      r   )r3   r)   r   binasciihexlify)r8   r(   r*   numberr   r   r   %randrange_from_seed__overshoot_modulo   s   $rM   c                 C   s   d| > d S r&   r   )numbitsr   r   r   lsb_of_ones   r'   rO   c                 C   s2   t t| d dd }|d }|d }|||fS )Nr   r
   r   )r   mathlog)r(   bitsr>   	extrabitsr   r   r   bits_and_bytes   s   
rT   c                 C   sv   t |\}}}|r|d7 }||  d | }d|t|  | }dtt|d }d|  kr6|k s9J  J |S )Nr    rI   )rT   rC   r   r   rJ   rK   )r8   r(   hashmodrR   _bytesrS   r*   rL   r   r   r   #randrange_from_seed__truncate_bytes   s   rX   c                 C   s   t t|d dd }|d d }||  d | }d|t|  | }d| | }|r@tt|d t|@ |dd   }dt t	|d }d|  krU|k sXJ  J |S )Nr   r
   r"   r   rU   r   rI   )
r   rP   rQ   rC   r   r   r   rO   rJ   rK   )r8   r(   rV   rR   maxbytesr*   topbitsrL   r   r   r   "randrange_from_seed__truncate_bits   s   $r[   c                 C   sr   |dksJ t |\}}}t| }	 d}|r"tt|dt|@ }t||| d }d|  kr7|k r8|S  q)Nr   T    )rT   r3   r   r   rO   string_to_number)r8   r(   rR   r>   rS   generate	extrabyteguessr   r   r    randrange_from_seed__trytryagain   s   ra   c                 C   sN   t |}dtd|  d }t||   }t||ks%J t||f|S Nz%0r
   r   )r)   strrJ   	unhexlifyrB   r   numr(   lfmt_strstringr   r   r   number_to_string   s
   rj   c                 C   s:   t |}dtd|  d }t||   }|d | S rb   )r)   rc   rJ   rd   rB   re   r   r   r   number_to_string_crop   s   rk   c                 C   s   t t| dS NrI   )r   rJ   rK   )ri   r   r   r   r]      r%   r]   c                 C   s4   t |}t| |ksJ t| |ftt| dS rl   )r)   r   r   rJ   rK   )ri   r(   rg   r   r   r   string_to_number_fixedlen   s   rm   c                 C   s   t | |}t ||}||fS )aZ  
    Encode the signature to a pair of strings in a tuple

    Encodes signature into raw encoding (:term:`raw encoding`) with the
    ``r`` and ``s`` parts of the signature encoded separately.

    It's expected that this function will be used as a ``sigencode=`` parameter
    in :func:`ecdsa.keys.SigningKey.sign` method.

    :param int r: first parameter of the signature
    :param int s: second parameter of the signature
    :param int order: the order of the curve over which the signature was
        computed

    :return: raw encoding of ECDSA signature
    :rtype: tuple(bytes, bytes)
    )rj   rsr(   r_strs_strr   r   r   sigencode_strings   s   

rs   c                 C   s   t | ||\}}|| S )a  
    Encode the signature to raw format (:term:`raw encoding`)

    It's expected that this function will be used as a ``sigencode=`` parameter
    in :func:`ecdsa.keys.SigningKey.sign` method.

    :param int r: first parameter of the signature
    :param int s: second parameter of the signature
    :param int order: the order of the curve over which the signature was
        computed

    :return: raw encoding of ECDSA signature
    :rtype: bytes
    )rs   rn   r   r   r   sigencode_string  s   rt   c                 C   s   t t | t |S )a  
    Encode the signature into the ECDSA-Sig-Value structure using :term:`DER`.

    Encodes the signature to the following :term:`ASN.1` structure::

        Ecdsa-Sig-Value ::= SEQUENCE {
            r       INTEGER,
            s       INTEGER
        }

    It's expected that this function will be used as a ``sigencode=`` parameter
    in :func:`ecdsa.keys.SigningKey.sign` method.

    :param int r: first parameter of the signature
    :param int s: second parameter of the signature
    :param int order: the order of the curve over which the signature was
        computed

    :return: DER encoding of ECDSA signature
    :rtype: bytes
    )r   encode_sequenceencode_integerro   rp   r(   r   r   r   sigencode_der  s   rx   c                 C   s   | |d kr
||  } | S )a8  
    Internal function for ensuring that the ``s`` value of a signature is in
    the "canonical" format.

    :param int s: the second parameter of ECDSA signature
    :param int order: the order of the curve over which the signatures was
        computed

    :return: canonical value of s
    :rtype: int
    r
   r   )rp   r(   r   r   r   	_canonize3  s   ry   c                 C      t ||}t| ||S )a  
    Encode the signature to a pair of strings in a tuple

    Encodes signature into raw encoding (:term:`raw encoding`) with the
    ``r`` and ``s`` parts of the signature encoded separately.

    Makes sure that the signature is encoded in the canonical format, where
    the ``s`` parameter is always smaller than ``order / 2``.
    Most commonly used in bitcoin.

    It's expected that this function will be used as a ``sigencode=`` parameter
    in :func:`ecdsa.keys.SigningKey.sign` method.

    :param int r: first parameter of the signature
    :param int s: second parameter of the signature
    :param int order: the order of the curve over which the signature was
        computed

    :return: raw encoding of ECDSA signature
    :rtype: tuple(bytes, bytes)
    )ry   rs   rw   r   r   r   sigencode_strings_canonizeD  s   
r{   c                 C   rz   )aw  
    Encode the signature to raw format (:term:`raw encoding`)

    Makes sure that the signature is encoded in the canonical format, where
    the ``s`` parameter is always smaller than ``order / 2``.
    Most commonly used in bitcoin.

    It's expected that this function will be used as a ``sigencode=`` parameter
    in :func:`ecdsa.keys.SigningKey.sign` method.

    :param int r: first parameter of the signature
    :param int s: second parameter of the signature
    :param int order: the order of the curve over which the signature was
        computed

    :return: raw encoding of ECDSA signature
    :rtype: bytes
    )ry   rt   rw   r   r   r   sigencode_string_canonize^  s   
r|   c                 C   rz   )a9  
    Encode the signature into the ECDSA-Sig-Value structure using :term:`DER`.

    Makes sure that the signature is encoded in the canonical format, where
    the ``s`` parameter is always smaller than ``order / 2``.
    Most commonly used in bitcoin.

    Encodes the signature to the following :term:`ASN.1` structure::

        Ecdsa-Sig-Value ::= SEQUENCE {
            r       INTEGER,
            s       INTEGER
        }

    It's expected that this function will be used as a ``sigencode=`` parameter
    in :func:`ecdsa.keys.SigningKey.sign` method.

    :param int r: first parameter of the signature
    :param int s: second parameter of the signature
    :param int order: the order of the curve over which the signature was
        computed

    :return: DER encoding of ECDSA signature
    :rtype: bytes
    )ry   rx   rw   r   r   r   sigencode_der_canonizeu  s   
r}   c                   @   s   e Zd ZdZdS )MalformedSignatureaB  
    Raised by decoding functions when the signature is malformed.

    Malformed in this context means that the relevant strings or integers
    do not match what a signature over provided curve would create. Either
    because the byte strings have incorrect lengths or because the encoded
    values are too large.
    N)rF   rG   rH   __doc__r   r   r   r   r~     s    	r~   c                 C   sd   t | } t|}t| d| kstdd| t| t| d| |}t| |d |}||fS )a  
    Decoder for :term:`raw encoding`  of ECDSA signatures.

    raw encoding is a simple concatenation of the two integers that comprise
    the signature, with each encoded using the same amount of bytes depending
    on curve size/order.

    It's expected that this function will be used as the ``sigdecode=``
    parameter to the :func:`ecdsa.keys.VerifyingKey.verify` method.

    :param signature: encoded signature
    :type signature: bytes like object
    :param order: order of the curve over which the signature was computed
    :type order: int

    :raises MalformedSignature: when the encoding of the signature is invalid

    :return: tuple with decoded ``r`` and ``s`` values of signature
    :rtype: tuple of ints
    r
   zWInvalid length of signature, expected {0} bytes long, provided string is {1} bytes longN)r	   r)   r   r~   formatrm   )	signaturer(   rg   ro   rp   r   r   r   sigdecode_string  s   r   c                 C   s   t | dkstdt | | \}}t|}t|}t|}t ||ks/td|t |t ||ks?td|t |t||}t||}||fS )a  
    Decode the signature from two strings.

    First string needs to be a big endian encoding of ``r``, second needs to
    be a big endian encoding of the ``s`` parameter of an ECDSA signature.

    It's expected that this function will be used as the ``sigdecode=``
    parameter to the :func:`ecdsa.keys.VerifyingKey.verify` method.

    :param list rs_strings: list of two bytes-like objects, each encoding one
        parameter of signature
    :param int order: order of the curve over which the signature was computed

    :raises MalformedSignature: when the encoding of the signature is invalid

    :return: tuple with decoded ``r`` and ``s`` values of signature
    :rtype: tuple of ints
    r
   z3Invalid number of strings provided: {0}, expected 2zjInvalid length of first string ('r' parameter), expected {0} bytes long, provided string is {1} bytes longzkInvalid length of second string ('s' parameter), expected {0} bytes long, provided string is {1} bytes long)r   r~   r   r	   r)   rm   )
rs_stringsr(   rq   rr   rg   ro   rp   r   r   r   sigdecode_strings  s.   

r   c                 C   sr   t | } t| \}}|dkrtdt| t|\}}t|\}}|dkr5tdt| ||fS )a  
    Decoder for DER format of ECDSA signatures.

    DER format of signature is one that uses the :term:`ASN.1` :term:`DER`
    rules to encode it as a sequence of two integers::

        Ecdsa-Sig-Value ::= SEQUENCE {
            r       INTEGER,
            s       INTEGER
        }

    It's expected that this function will be used as as the ``sigdecode=``
    parameter to the :func:`ecdsa.keys.VerifyingKey.verify` method.

    :param sig_der: encoded signature
    :type sig_der: bytes like object
    :param order: order of the curve over which the signature was computed
    :type order: int

    :raises UnexpectedDER: when the encoding of signature is invalid

    :return: tuple with decoded ``r`` and ``s`` values of signature
    :rtype: tuple of ints
    r\   ztrailing junk after DER sig: %sz#trailing junk after DER numbers: %s)r	   r   remove_sequenceUnexpectedDERrJ   rK   remove_integer)sig_derr(   r   emptyro   restrp   r   r   r   sigdecode_der  s   r   r4   )2r   
__future__r   r+   rP   rJ   syshashlibr   sixr   r   r   r   r   _compatr	   oid_ecPublicKey
encode_oidencoded_oid_ecPublicKeyoid_ecDH	oid_ecMQVversion_infor   r$   r)   r2   r3   rM   rO   rT   rX   r[   ra   rj   rk   r]   rm   rs   rt   rx   ry   r{   r|   r}   	Exceptionr~   r   r   r   r   r   r   r   <module>   sX    





!.