a
    _mg,                  
   @   s  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 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)v r4e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 qfqHe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)v r&d'e:d(< e@e:ZAde	j)v rDd	eAd(< nd)eAd(< ef i eAee9e*d*d+ ZBej8d,d- ZCef i eAeeC d.d/ ZDd0d1 ZEej8d2d3 ZFd4d5 ZGd6d7 ZHej8d8d9 ZId:d; ZJef i eAeeKe*eJ d<d= ZLef i eAeeKe*ejMd>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dA  dBdC ZNdDd e*D ZOeOdEd e*D 7 ZOef i eAee9eOdFdG ZPdS )H    )with_statementdivisionN)algorithms_available)md5sha1sha224sha256sha384sha512c                 C   s   g | ]}|d vr|qS ))Zmdc2Zmd2Zmd4Z	whirlpoolZ	ripemd160 ).0ir   r   P/var/www/html/idle/venv/lib/python3.9/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new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   r0   )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   Y   r0   c                 C   s   | j |ttdsJ d S NZ	sigdecode)verifyexample_datar   )verifying_key	signaturer   r   r   test_signaturesW   s    r?   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}   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*   r=   Zold_sigr8   	to_remover   ZxorsvalZ
insert_posZinsert_datar   r   r   st_fuzzed_siga   s>    
rY   )      )HealthChecki  deadlineZsuppress_health_check   Zmax_examples
   c                 C   sF   | \}}t t  |j|ttd W d    n1 s80    Y  d S r9   r6   raisesr   r;   r<   r   )argsr=   r8   r   r   r   test_fuzzed_der_signatures   s    rc   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      rA   rZ   r   )rI   rJ   rV   r   rK   intr2   orderrN   r$   r    )rU   r*   r=   _rf   rsr8   r   r   r   st_random_der_ecdsa_sig_value   s    rj   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.
    r:   Nr`   paramsr=   r8   r   r   r   test_random_der_ecdsa_sig_value   s    rm   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.
    rB   r   )rI   buildsr    rN   rb   kwargsr   r   r   st_der_integer   s    rq   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   r[   rA   rZ   )rI   rS   rN   rL   rT   r!   )rU   rb   rp   dataZunusedr   r   r   st_der_bit_string   s    
rt   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
    )rI   rn   r"   rS   ro   r   r   r   st_der_octet_string   s    ru   c                   C   s
   t dS )z;
    Hypothesis strategy that returns DER NULL object.
    s    )rI   justr   r   r   r   st_der_null  s    rw   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   rZ   rA   '   i   2   rG   )rI   rN   rM   r#   )rU   firstsecondrestr   r   r   
st_der_oid  s    r}   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.
    r0   rZ   i   )rC      rG   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/   .  r0   z*st_der.<locals>.<lambda>.<locals>.<lambda>c                 S   s   t |  S r+   )r$   r-   r   r   r   r/   0  r0      rG   r   ?   rA   )rI   rn   r"   Zone_ofrM   r%   rN   )childrenr   r   r   r/   -  s   zst_der.<locals>.<lambda>(   )Z
max_leaves)rI   	recursiverv   rq   rt   ru   rw   r}   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 signaturer:   Nr`   rl   derr*   r=   rg   r   r   r   test_random_der_as_signature;  s    
r   r~   rG          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 signaturer:   Nr`   r   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 )rf   )
isinstancer2   r&   r   r   rf   r   r*   r=   r8   r   r   r   r   W  s   	c                 C   s*   g | ]"\}}}t |jjtr|||fqS r   )r   r2   r&   r   r   r   r   r   i  s   c                 C   sF   | \}}t t  |j|ttd W d    n1 s80    Y  d S r9   )r6   ra   r   r;   r<   r   rk   r   r   r   test_fuzzed_string_signaturest  s    r   )Q
__future__r   r   r'   r   ImportError	functoolsr   r6   sysZhypothesis.strategies
strategiesrI   Z
hypothesisr   r   r   r   r   keysr   r   utilr   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   Zellipticcurver&   r<   Zhash_and_sizeargvrV   sortedr2   Zhash_alggenerater(   skappendrK   r=   signmarkZparametrizer?   Z	compositerY   rl   version_infor\   Zdata_too_largeZfilter_too_muchZtoo_slowdictZslow_paramsrc   rj   rm   rq   rt   ru   rw   r}   r   rJ   r   rS   r   Zkeys_and_string_sigsr   r   r   r   r   <module>   s    




3


!

	
