a
    db(                  
   @   sZ  d dl mZmZ d dlZzd dlmZ W n eyB   g dZY n0 d dlmZ d dlZd dl	Z	d dl
mZ d dlmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZ ddlmZ ddlmZmZmZm Z m!Z!m"Z" dZ#dd eD Z$g Z%e&edd dD ]bZ'dd e&e$dd dD D ]@Z(ej)e'eej*e(dZ+e%,d-e'e(e+j.e+j/e#edf q0qej01ddd e%D dd Z2ej3dd Z4i Z5e	j6dkrd d lm7Z7 d!e5d"< e7j8e7j9e7j:ge5d#< e;e5Z<d$e<d%< ef i e5ee4e%d&d' Z=ej3d(d) Z>ef i e<ee> d*d+ Z?d,d- Z@ej3d.d/ ZAd0d1 ZBd2d3 ZCej3d4d5 ZDd6d7 ZEef i e5eeFe%eE d8d9 ZGef i e5eeFe%ejHd:d;ee%d  e!ed ed ee%d  e!ededd< ee%d  e!edgd=  d>d? ZId@d e%D ZJef i e5ee4eJdAdB ZKdS )C    )with_statementdivisionN)algorithms_available)md5sha1sha224sha256sha384sha512)partial)noteassumegivensettingsexample   )
SigningKey)BadSignatureError)sigencode_dersigencode_string)sigdecode_dersigdecode_string)curves)encode_integerencode_bitstringencode_octet_string
encode_oidencode_sequenceencode_constructeds   some data to signc                 C   s   g | ]}|t |jfqS  )hashlibnewdigest_size).0namer   r   j/home/tom/ab/renpy-build/tmp/install.linux-x86_64/lib/python3.9/site-packages/ecdsa/test_malformed_sigs.py
<listcomp>)   s   r&   c                 C   s   | j S N)baselenxr   r   r%   <lambda>6       r+   )keyc                 C   s.   g | ]&\}}d |  k r"t jkrn q|qS )r   )curver(   )r#   r$   sizer   r   r%   r&   7   s   c                 C   s   | d S )Nr   r   r)   r   r   r%   r+   9   r,   )hashfuncz{0} {1})Z	sigencodezverifying_key,signaturec                 C   s"   g | ]\}}}t j|||d qS ))id)pytestparam)r#   r$   Zvksigr   r   r%   r&   L   r,   c                 C   s   | j |ttdsJ d S NZ	sigdecode)verifyexample_datar   )verifying_key	signaturer   r   r%   test_signaturesJ   s    r;   c                 C   sZ  | t |\}}}td| t|}| t jt jdt|d ddd}|  t	|D ]
}||= q^td| |r| t 
t jdt|d dt jddd}| D ]\}}	||  |	N  < qtd	| | t jdt|d}
| t jd
d}|d|
 | ||
d  }td|
| t|}t|pB|pB| t||k ||fS )z
    Hypothesis strategy that generates pairs of VerifyingKey and malformed
    signatures created by fuzzing of a valid signature.
    Configuration: {0}r   r   	min_value	max_valueT)uniquezRemove bytes: {0}   z	xors: {0}   max_sizeNz%Inserted at position {0} bytes: {1!r})stsampled_fromr   format	bytearraylistsintegerslensortreversedZdictionariesitemsbinarybytesr   )drawkeys_and_sigsr$   r9   Zold_sigr4   	to_removeiZxorsvalZ
insert_posZinsert_datar   r   r%   st_fuzzed_sigT   s<    
rV   )      )HealthChecki  deadlineZsuppress_health_check
   Zmax_examplesc                 C   sF   | \}}t t  |j|ttd W d    n1 s80    Y  d S r5   r2   raisesr   r7   r8   r   )argsr9   r4   r   r   r%   test_fuzzed_der_signatures   s    r_   c                 C   s   | t t\}}}td| t|jj}| t jd|d> dt j|d? |d dB }| t jd|d> dt j|d? |d dB }t	t
|t
|}||fS )z
    Hypothesis strategy for selecting random values and encoding them
    to ECDSA-Sig-Value object::

        ECDSA-Sig-Value ::= SEQUENCE {
            r INTEGER,
            s INTEGER
        }
    r<   r      r=   rW   r   )rE   rF   rR   r   rG   intr.   orderrJ   r   r   )rQ   r$   r9   _rb   rsr4   r   r   r%   st_random_der_ecdsa_sig_value   s    rf   c                 C   sF   | \}}t t  |j|ttd W d   n1 s80    Y  dS )zd
    Check if random values encoded in ECDSA-Sig-Value structure are rejected
    as signature.
    r6   Nr\   paramsr9   r4   r   r   r%   test_random_der_ecdsa_sig_value   s    ri   c                  O   s(   d|vrd|d< t tt j| i |S )z
    Hypothesis strategy that returns a random positive integer as DER
    INTEGER.
    Parameters are passed to hypothesis.strategy.integer.
    r>   r   )rE   buildsr   rJ   r^   kwargsr   r   r%   st_der_integer   s    rm   c                 O   s`   | t j|i |}|rR| t jddd}t|}|d  d|  M  < t|}nd}t||S )z|
    Hypothesis strategy that returns a random DER BIT STRING.
    Parameters are passed to hypothesis.strategy.binary.
    r   rX   r=   rW   )rE   rO   rJ   rH   rP   r   )rQ   r^   rl   dataZunusedr   r   r%   st_der_bit_string   s    
rp   c                  O   s   t tt j| i |S )z
    Hypothesis strategy that returns a random DER OCTET STRING object.
    Parameters are passed to hypothesis.strategy.binary
    )rE   rj   r   rO   rk   r   r   r%   st_der_octet_string   s    rq   c                   C   s
   t dS )z;
    Hypothesis strategy that returns DER NULL object.
    s    )rE   justr   r   r   r%   st_der_null   s    rs   c                 C   sv   | t jddd}|dk r.| t jddd}n| t jddd d}| t jt jddd ddd}t||g|R  S )zI
    Hypothesis strategy that returns DER OBJECT IDENTIFIER objects.
    r   rW   r=   '   i   2   rC   )rE   rJ   rI   r   )rQ   firstsecondrestr   r   r%   
st_der_oid   s    ry   c                   C   sH   t jt dtdd dB tddB tddB t B t B dd d	d
S )z
    Hypothesis strategy that returns random DER structures.

    A valid DER structure is any primitive object, an octet encoding
    of a valid DER structure, sequence of valid DER objects or a constructed
    encoding of any of the above.
    r,   rW   i   )r?      rC   c                 S   sh   t dd t | t dd t | B t dd t j| ddB t dd t jdd	d
t | B S )Nc                 S   s   t | S r'   )r   r)   r   r   r%   r+     r,   z*st_der.<locals>.<lambda>.<locals>.<lambda>c                 S   s
   t | dS )Nr   )r   r)   r   r   r%   r+     r,   c                 S   s   t |  S r'   )r   r)   r   r   r%   r+     r,      rC   c                 S   s
   t | |S r'   )r   )tagr*   r   r   r%   r+   "  r,   r   ?   r=   )rE   rj   Zone_ofrI   rJ   )childrenr   r   r%   r+     s   zst_der.<locals>.<lambda>(   )Z
max_leaves)rE   	recursiverr   rm   rp   rq   rs   ry   r   r   r   r%   st_der  s    r   c                 C   sH   | \}}}t t  |j|ttd W d   n1 s:0    Y  dS )z8Check if random DER structures are rejected as signaturer6   Nr\   rh   derr$   r9   rc   r   r   r%   test_random_der_as_signature*  s    
r   rz   rC          c                 C   sH   | \}}}t t  |j|ttd W d   n1 s:0    Y  dS )z/Check if random bytes are rejected as signaturer6   Nr\   r   r   r   r%   test_random_bytes_as_signature4  s    
r   c                 C   s4   g | ],\}}}||t t||jjd |jjifqS )rb   )r   r   r.   rb   )r#   r$   r9   r4   r   r   r%   r&   F  s   	c                 C   sF   | \}}t t  |j|ttd W d    n1 s80    Y  d S r5   )r2   r]   r   r7   r8   r   rg   r   r   r%   test_fuzzed_string_signaturesW  s    r   )L
__future__r   r   r    r   ImportError	functoolsr   r2   sysZhypothesis.strategies
strategiesrE   Z
hypothesisr   r   r   r   r   keysr   r   utilr   r   r   r   r   r   r   r   r   r   r   r   r8   Zhash_and_sizerR   sortedr.   Zhash_alggenerater!   skappendrG   r9   signmarkZparametrizer;   Z	compositerV   rh   version_inforY   Zdata_too_largeZfilter_too_muchZtoo_slowdictZslow_paramsr_   rf   ri   rm   rp   rq   rs   ry   r   rF   r   rO   r   Zkeys_and_string_sigsr   r   r   r   r%   <module>   s    





2

!

	
