U
    ʹh,                  
   @   s  d dl mZmZ d dlZzd dlmZ W n$ ek
rL   dddddd	gZY nX d
d eD Z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mZmZ ddlmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z& dZ'dd eD Z(de	j)kr>eeg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Z0e*1d2e,e-e0j3e0j4e'ed f qpqRej56d!d"d e*D d#d$ Z7ej8d%d& Z9i Z:e	j;d'krd d(lm<Z< d)e:d*< e<j=e<j>e<j?ge:d+< de	j)kr0d,e:d-< e@e:ZAde	j)krNdeAd-< nd.eAd-< ef eAee9e*d/d0 ZBej8d1d2 ZCef eAeeC d3d4 ZDd5d6 ZEej8d7d8 ZFd9d: ZGd;d< ZHej8d=d> ZId?d@ ZJef eAeeKe*eJ dAdB ZLef eAeeKe*ejMdCdDee*d  e#ed ed ee*d  e#ededdE ee*d  e#edgdF  dGdH ZNdId e*D ZOeOdJd e*D 7 ZOef eAee9eOdKdL ZPdS )M    )with_statementdivisionN)algorithms_availableZmd5Zsha1Zsha224Zsha256Zsha384Zsha512c                 C   s   g | ]}|d kr|qS ))Zmdc2Zmd2Zmd4Z	whirlpoolZ	ripemd160 ).0ir   r   ?./venv/lib/python3.8/site-packages/ecdsa/test_malformed_sigs.py
<listcomp>   s   r	   )partial)noteassumegivensettingsexample   )
SigningKey)BadSignatureError)sigencode_dersigencode_string)sigdecode_dersigdecode_string)curves	SECP112r2	SECP128r1)encode_integerencode_bitstringencode_octet_string
encode_oidencode_sequenceencode_constructed)	CurveEdTws   some data to signc                 C   s   g | ]}|t |jfqS r   )hashlibnewZdigest_size)r   namer   r   r   r	   2   s    z--fastc                 C   s   | j S N)baselenxr   r   r   <lambda>C       r(   )keyc                 C   s.   g | ]&\}}d |  k r"t jkrn q|qS )r   )curver%   )r   r#   sizer   r   r   r	   D   s
    
 c                 C   s   | d S )Nr   r   r&   r   r   r   r(   F   r)   )Zhashfuncz{0} {1})Z	sigencodezverifying_key,signaturec                 C   s"   g | ]\}}}t j|||d qS ))id)pytestZparam)r   r#   Zvksigr   r   r   r	   Y   s     c                 C   s   | j |ttdstd S NZ	sigdecode)verifyexample_datar   AssertionError)verifying_keyZ	signaturer   r   r   test_signaturesW   s
      r6   c                 C   s^  | t |\}}}td| t|}| t jt jdt|d ddd}|  t	|D ]
}||= q^td| 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|pF|pF| 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}N   z	xors: {0}   Zmax_sizez%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#   r5   Zold_sigr/   Z	to_remover   ZxorsvalZ
insert_posZinsert_datar   r   r   st_fuzzed_siga   s>    
rN   )      )HealthChecki  ZdeadlineZsuppress_health_check   Zmax_examples
   c              	   C   s2   | \}}t t |j|ttd W 5 Q R X d S r0   r.   raisesr   r2   r3   r   )argsr5   r/   r   r   r   test_fuzzed_der_signatures   s    rW   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
        }
    r7   r      r8   rO   r   )r?   r@   rL   r   rA   intr+   orderrD   r   r   )rK   r#   r5   _rZ   rsr/   r   r   r   st_random_der_ecdsa_sig_value   s    r^   c              	   C   s2   | \}}t t |j|ttd W 5 Q R X dS )zd
    Check if random values encoded in ECDSA-Sig-Value structure are rejected
    as signature.
    r1   NrT   paramsr5   r/   r   r   r   test_random_der_ecdsa_sig_value   s    ra   c                  O   s$   d|krd|d< t tt j| |S )z
    Hypothesis strategy that returns a random positive integer as DER
    INTEGER.
    Parameters are passed to hypothesis.strategy.integer.
    r9   r   )r?   buildsr   rD   rV   kwargsr   r   r   st_der_integer   s    re   c                 O   s\   | t j||}|rN| 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   rP   r8   rO   )r?   rI   rD   rB   rJ   r   )rK   rV   rd   dataZunusedr   r   r   st_der_bit_string   s    
rh   c                  O   s   t tt j| |S )z
    Hypothesis strategy that returns a random DER OCTET STRING object.
    Parameters are passed to hypothesis.strategy.binary
    )r?   rb   r   rI   rc   r   r   r   st_der_octet_string   s    ri   c                   C   s
   t dS )z;
    Hypothesis strategy that returns DER NULL object.
    s    )r?   justr   r   r   r   st_der_null  s    rk   c                 C   st   | 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||f| S )zI
    Hypothesis strategy that returns DER OBJECT IDENTIFIER objects.
    r   rO   r8   '   i   2   r>   )r?   rD   rC   r   )rK   firstsecondrestr   r   r   
st_der_oid  s    rq   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)   rO   i   )r:      r>   c                 S   s`   t tt | t dd t | B t dd t j| ddB t tt jdddt | B S )	Nc                 S   s
   t | dS )Nr   )r   r&   r   r   r   r(   .  r)   z*st_der.<locals>.<lambda>.<locals>.<lambda>c                 S   s   t |  S r$   )r   r&   r   r   r   r(   0  r)      r>   r   ?   r8   )r?   rb   r   Zone_ofrC   r   rD   )Zchildrenr   r   r   r(   -  s    zst_der.<locals>.<lambda>(   )Z
max_leaves)r?   	recursiverj   re   rh   ri   rk   rq   r   r   r   r   st_der  s    
rw   c              	   C   s4   | \}}}t t |j|ttd W 5 Q R X dS )z8Check if random DER structures are rejected as signaturer1   NrT   r`   derr#   r5   r[   r   r   r   test_random_der_as_signature;  s    
rz   rr   r>          c              	   C   s4   | \}}}t t |j|ttd W 5 Q R X dS )z/Check if random bytes are rejected as signaturer1   NrT   rx   r   r   r   test_random_bytes_as_signatureE  s    
r}   c                 C   sB   g | ]:\}}}t |jjts||tt||jjd |jjifqS )rZ   )
isinstancer+   r    r   r   rZ   r   r#   r5   r/   r   r   r   r	   W  s   	c                 C   s*   g | ]"\}}}t |jjtr|||fqS r   )r~   r+   r    r   r   r   r   r	   i  s   c              	   C   s2   | \}}t t |j|ttd W 5 Q R X d S r0   )r.   rU   r   r2   r3   r   r_   r   r   r   test_fuzzed_string_signaturest  s    r   )QZ
__future__r   r   r!   r   ImportError	functoolsr
   r.   sysZhypothesis.strategiesZ
strategiesr?   Z
hypothesisr   r   r   r   r   keysr   r   utilr   r   r   r   r   r   r   ry   r   r   r   r   r   r   Zellipticcurver    r3   Zhash_and_sizeargvrL   sortedr+   Zhash_algZgenerater"   skappendrA   r5   signZmarkZparametrizer6   Z	compositerN   r`   version_inforQ   Zdata_too_largeZfilter_too_muchZtoo_slowdictZslow_paramsrW   r^   ra   re   rh   ri   rk   rq   rw   r@   rz   rI   r}   Zkeys_and_string_sigsr   r   r   r   r   <module>   s   
 
 




3


!

 	
