U
    ʹhI                     @   s  d dl Z d dlmZ zd dlZW n ek
r<   d dlZY nX d dlZd dlmZ	 d dl
mZmZ d dlZddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZ G dd	 d	ej Z!G d
d dej Z"G dd dej Z#G dd dej Z$G dd dej Z%G dd dej Z&G dd dej Z'G dd dej Z(G dd dej Z)G dd dej Z*G dd dej Z+G dd dej Z,e	j-d d! d"fd#d$Z.i Z/d%ej0krd e/d&< ef e/ee. d'd( Z1dS ))    N)hexlify)givensettings   )str_idx_as_int)NIST256pNIST224p)remove_integerUnexpectedDERread_lengthencode_bitstringremove_bitstringremove_object
encode_oidremove_constructedremove_implicitremove_octet_stringremove_sequenceencode_implicitc                   @   sd   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd ZdS )TestRemoveIntegerc              	   C   s"   |  t td W 5 Q R X d S )Ns    assertRaisesr
   r	   self r   4./venv/lib/python3.8/site-packages/ecdsa/test_der.pytest_non_minimal_encoding#   s    z+TestRemoveInteger.test_non_minimal_encodingc              	   C   s"   |  t td W 5 Q R X d S )Ns   r   r   r   r   r   test_negative_with_high_bit_set'   s    z1TestRemoveInteger.test_negative_with_high_bit_setc                 C   s(   t d\}}| |d | |d d S Ns           r	   assertEqualr   valZremr   r   r   test_minimal_with_high_bit_set+   s    z0TestRemoveInteger.test_minimal_with_high_bit_setc              	   C   s"   |  t td W 5 Q R X d S )Ns     r   r   r   r   r   %test_two_zero_bytes_with_high_bit_set1   s    z7TestRemoveInteger.test_two_zero_bytes_with_high_bit_setc              	   C   s"   |  t td W 5 Q R X d S )Ns    r   r   r   r   r   test_zero_length_integer5   s    z*TestRemoveInteger.test_zero_length_integerc              	   C   s"   |  t td W 5 Q R X d S Nr    r   r   r   r   r   test_empty_string9   s    z#TestRemoveInteger.test_empty_stringc                 C   s(   t d\}}| |d | |d d S )Ns    r   r    r!   r#   r   r   r   test_encoding_of_zero=   s    z'TestRemoveInteger.test_encoding_of_zeroc                 C   s(   t d\}}| |d | |d d S )Ns      r    r!   r#   r   r   r   test_encoding_of_127C   s    z&TestRemoveInteger.test_encoding_of_127c                 C   s(   t d\}}| |d | |d d S r   r!   r#   r   r   r   test_encoding_of_128I   s    z&TestRemoveInteger.test_encoding_of_128c              	   C   s4   |  t}td W 5 Q R X | dt|j d S )Ns    zwanted type 'integer'r   r
   r	   assertInstr	exceptionr   er   r   r   test_wrong_tagO   s    z TestRemoveInteger.test_wrong_tagc              	   C   s4   |  t}td W 5 Q R X | dt|j d S )Ns    Length longerr.   r2   r   r   r   test_wrong_lengthU   s    z#TestRemoveInteger.test_wrong_lengthN)__name__
__module____qualname__r   r   r%   r&   r'   r)   r*   r,   r-   r4   r6   r   r   r   r   r       s   r   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )TestReadLengthc                 C   s   |  dtd d S )N)r   r       r"   r   r   r   r   r   test_zero_length`   s    zTestReadLength.test_zero_lengthc              	   C   s"   |  t td W 5 Q R X d S )Ns    r   r
   r   r   r   r   r   test_two_byte_zero_lengthc   s    z(TestReadLength.test_two_byte_zero_lengthc              	   C   s"   |  t td W 5 Q R X d S )Ns   r>   r   r   r   r   test_two_byte_small_lengthg   s    z)TestReadLength.test_two_byte_small_lengthc              	   C   s"   |  t td W 5 Q R X d S )N   r>   r   r   r   r   test_long_form_with_zero_lengthk   s    z.TestReadLength.test_long_form_with_zero_lengthc                 C   s   |  dtd d S )N)r      s   r<   r   r   r   r   test_smallest_two_byte_lengtho   s    z,TestReadLength.test_smallest_two_byte_lengthc              	   C   s"   |  t td W 5 Q R X d S )Ns    r>   r   r   r   r   test_zero_padded_lengthr   s    z&TestReadLength.test_zero_padded_lengthc                 C   s   |  dtd d S )N)      s    r<   r   r   r   r   test_two_three_byte_lengthv   s    z)TestReadLength.test_two_three_byte_lengthc              	   C   s"   |  t td W 5 Q R X d S r(   r>   r   r   r   r   r)   y   s    z TestReadLength.test_empty_stringc              	   C   s"   |  t td W 5 Q R X d S )Ns    r>   r   r   r   r   test_length_overflow}   s    z#TestReadLength.test_length_overflowN)r7   r8   r9   r=   r?   r@   rB   rD   rE   rH   r)   rI   r   r   r   r   r:   \   s   r:   c                   @   sL   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dS )TestEncodeBitstringc              	   C   s`   t d tt}td}W 5 Q R X | t|d | d|d j	j
d  | |d dS )z(This is the old way to use the function.always    r   zunused= needs to be specifiedr       N)warningssimplefilterpytestwarnsDeprecationWarningr   r"   lenr/   messageargs)r   rQ   derr   r   r   test_old_call_convention   s    
 z,TestEncodeBitstring.test_old_call_conventionc              	   C   s8   t   t d tdd}W 5 Q R X | |d dS )z$This is how it should be called now.error   r   rM   NrN   catch_warningsrO   r   r"   r   rV   r   r   r   test_new_call_convention   s    

z,TestEncodeBitstring.test_new_call_conventionc              	   C   s8   t   t d tdd}W 5 Q R X | |d dS )zU
        Writing bit string with already included the number of unused bits.
        rX   rL   NrM   rZ   r\   r   r   r   test_implicit_unused_bits   s    

z-TestEncodeBitstring.test_implicit_unused_bitsc                 C   s   t dd}| |d d S )Ns      s   )r   r"   r\   r   r   r   test_explicit_unused_bits   s    
z-TestEncodeBitstring.test_explicit_unused_bitsc                 C   s   |  tddd d S )Nr    r   s    )r"   r   r   r   r   r   r)      s    z%TestEncodeBitstring.test_empty_stringc              	   C   s$   |  t tdd W 5 Q R X d S )Ns       r   
ValueErrorr   r   r   r   r   test_invalid_unused_count   s    z-TestEncodeBitstring.test_invalid_unused_countc              	   C   s$   |  t tdd W 5 Q R X d S )Nr    r   rb   r   r   r   r   %test_invalid_unused_with_empty_string   s    z9TestEncodeBitstring.test_invalid_unused_with_empty_stringc              	   C   s$   |  t tdd W 5 Q R X d S )NrY   rC   rb   r   r   r   r   test_non_zero_padding_bits   s    z.TestEncodeBitstring.test_non_zero_padding_bitsN)r7   r8   r9   rW   r]   r^   r`   r)   rd   re   rf   r   r   r   r   rJ      s   	rJ   c                   @   sl   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )TestRemoveBitstringc              	   C   sp   t d tt}td\}}W 5 Q R X | t|d | d|d j	j
d  | |d | |d dS )	z)This is the old way to call the function.rK   rM   r   z$expect_unused= needs to be specifiedr   rL   r    N)rN   rO   rP   rQ   rR   r   r"   rS   r/   rT   rU   )r   rQ   bitsrestr   r   r   rW      s    
 z,TestRemoveBitstring.test_old_call_conventionc              	   C   sH   t   t d tdd\}}W 5 Q R X | |d | |d d S )NrX   rM   r   rY   r    rN   r[   rO   r   r"   r   rh   ri   r   r   r   r]      s
    

z,TestRemoveBitstring.test_new_call_conventionc              	   C   sH   t   t d tdd \}}W 5 Q R X | |d | |d d S )NrX   rM   )rY   r   r    rj   rk   r   r   r   test_implicit_unexpected_unused   s
    

z3TestRemoveBitstring.test_implicit_unexpected_unusedc                 C   s*   t dd \}}| |d | |d d S )Ns   )   r_   r    )r   r"   )r   retri   r   r   r   test_with_padding   s    z%TestRemoveBitstring.test_with_paddingc              	   C   s$   |  t tdd  W 5 Q R X d S )Ns    r   r
   r   r   r   r   r   test_not_a_bitstring   s    z(TestRemoveBitstring.test_not_a_bitstringc              	   C   s$   |  t tdd  W 5 Q R X d S )Ns    rp   r   r   r   r   test_empty_encoding   s    z'TestRemoveBitstring.test_empty_encodingc              	   C   s$   |  t tdd  W 5 Q R X d S r(   rp   r   r   r   r   r)      s    z%TestRemoveBitstring.test_empty_stringc              	   C   s$   |  t tdd  W 5 Q R X d S )N   rp   r   r   r   r   test_no_length   s    z"TestRemoveBitstring.test_no_lengthc              	   C   s$   |  t tdd W 5 Q R X d S )NrM   r   rp   r   r   r   r   %test_unexpected_number_of_unused_bits   s    z9TestRemoveBitstring.test_unexpected_number_of_unused_bitsc              	   C   s$   |  t tdd  W 5 Q R X d S )Ns    rp   r   r   r   r   $test_invalid_encoding_of_unused_bits   s    z8TestRemoveBitstring.test_invalid_encoding_of_unused_bitsc              	   C   s$   |  t tdd  W 5 Q R X d S )Ns   rp   r   r   r   r   %test_invalid_encoding_of_empty_string   s    z9TestRemoveBitstring.test_invalid_encoding_of_empty_stringc              	   C   s$   |  t tdd  W 5 Q R X d S )Ns   rp   r   r   r   r   test_invalid_padding_bits   s    z-TestRemoveBitstring.test_invalid_padding_bitsN)r7   r8   r9   rW   r]   rl   ro   rq   rr   r)   rt   ru   rv   rw   rx   r   r   r   r   rg      s   		rg   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TestStrIdxAsIntc                 C   s   |  dtdd d S )Ns   r0   r   r"   r   r   r   r   r   test_str  s    zTestStrIdxAsInt.test_strc                 C   s   |  dtdd d S Nrz   s   strr   r{   r   r   r   r   
test_bytes  s    zTestStrIdxAsInt.test_bytesc                 C   s   |  dttdd d S r}   )r"   r   	bytearrayr   r   r   r   test_bytearray  s    zTestStrIdxAsInt.test_bytearrayN)r7   r8   r9   r|   r~   r   r   r   r   r   ry     s   ry   c                   @   s\   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd ZdS )TestEncodeOidc                 C   s&   t dddddd}| t|d d S )Nr   rC   H  ='  s   06072a8648ce3d0201)r   r"   r   )r   oid_ecPublicKeyr   r   r   test_pub_key_oid  s    zTestEncodeOid.test_pub_key_oidc                 C   s   |  ttjd d S )Ns   06052b81040021)r"   r   r   encoded_oidr   r   r   r   test_nist224p_oid  s    zTestEncodeOid.test_nist224p_oidc                 C   s   |  ttjd d S )Ns   06082a8648ce3d030107)r"   r   r   r   r   r   r   r   test_nist256p_oid  s     zTestEncodeOid.test_nist256p_oidc                 C   s   t ddd}| |d d S )NrC     rG      7r   r"   r   oidr   r   r   test_large_second_subid  s    z%TestEncodeOid.test_large_second_subidc                 C   s   t dd}| |d d S )NrC   r      7r   r   r   r   r   test_with_two_subids!  s    
z"TestEncodeOid.test_with_two_subidsc                 C   s   t dd}| |d d S )Nr       r   r   r   r   r   test_zero_zero%  s    
zTestEncodeOid.test_zero_zeroc              	   C   s(   |  ttf tdd  W 5 Q R X d S )Nr   )r   	TypeErrorAssertionErrorr   r   r   r   r   test_with_wrong_types)  s    z#TestEncodeOid.test_with_wrong_typesc              	   C   s$   |  t tdd W 5 Q R X d S )Nr   (   r   r   r   r   r   r   r   "test_with_small_first_large_second-  s    z0TestEncodeOid.test_with_small_first_large_secondc                 C   s   t dd}| |d d S )Nr   '   s   Or   r   r   r   r   test_small_first_max_second1  s    
z)TestEncodeOid.test_small_first_max_secondc              	   C   s$   |  t tdd W 5 Q R X d S )NrG   r   r   r   r   r   r   test_with_invalid_first5  s    z%TestEncodeOid.test_with_invalid_firstN)r7   r8   r9   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS ) TestRemoveObjectc                 C   s   t dddddd| _d S )Nr   rC   r   r   )r   r   clsr   r   r   
setUpClass;  s    zTestRemoveObject.setUpClassc                 C   s*   t | j\}}| |d | |d d S )Nr    r   rC   r   r   rC   r   r   r   r"   r   r   ri   r   r   r   r   ?  s    z!TestRemoveObject.test_pub_key_oidc                 C   s.   t | jd \}}| |d | |d d S )Ns   morer   r   r   r   r   r   test_with_extra_bytesD  s    z&TestRemoveObject.test_with_extra_bytesc                 C   s(   t d\}}| |d | |d d S )Nr   r    )rC   r   rG   r   r"   r   r   r   r   test_with_large_second_subidI  s    z-TestRemoveObject.test_with_large_second_subidc              	   C   s"   |  t td W 5 Q R X d S )Ns    r   r
   r   r   r   r   r   test_with_padded_first_subidO  s    z-TestRemoveObject.test_with_padded_first_subidc              	   C   s"   |  t td W 5 Q R X d S )Ns   7r   r   r   r   r   test_with_padded_second_subidS  s    z.TestRemoveObject.test_with_padded_second_subidc              	   C   s"   |  t td W 5 Q R X d S )Ns   7r   r   r   r   r   )test_with_missing_last_byte_of_multi_byteW  s    z:TestRemoveObject.test_with_missing_last_byte_of_multi_bytec                 C   s(   t d\}}| |d | |d d S )Nr   r    )rC   r   r   r   r   r   r   r   [  s    z%TestRemoveObject.test_with_two_subidsc                 C   s(   t d\}}| |d | |d d S )Nr   r    )r   r   r   r   r   r   r   r   `  s    zTestRemoveObject.test_zero_zeroc              	   C   s"   |  t td W 5 Q R X d S r(   r   r   r   r   r   r)   e  s    z"TestRemoveObject.test_empty_stringc              	   C   s"   |  t td W 5 Q R X d S )N   r   r   r   r   r   test_missing_lengthi  s    z$TestRemoveObject.test_missing_lengthc              	   C   s"   |  t td W 5 Q R X d S )Ns    r   r   r   r   r   test_empty_oidm  s    zTestRemoveObject.test_empty_oidc              	   C   s"   |  t td W 5 Q R X d S )Ns   r   r   r   r   r   test_empty_oid_overflowq  s    z(TestRemoveObject.test_empty_oid_overflowc              	   C   s"   |  t td W 5 Q R X d S )Ns   7r   r   r   r   r   test_with_wrong_typeu  s    z%TestRemoveObject.test_with_wrong_typec              	   C   s"   |  t td W 5 Q R X d S )Ns   7r   r   r   r   r   test_with_too_long_lengthy  s    z*TestRemoveObject.test_with_too_long_lengthN)r7   r8   r9   classmethodr   r   r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   r   r   :  s    
r   c                   @   s   e Zd Zdd Zdd ZdS )TestRemoveConstructedc                 C   s:   d}t |\}}}| |d | |d | |d d S )Ns   r      r    )r   r"   r   datatagbodyri   r   r   r   test_simple  s
    z!TestRemoveConstructed.test_simplec              	   C   s8   d}|  t}t| W 5 Q R X | dt|j d S )Ns   zconstructed tag)r   r
   r   r/   r0   r1   r   r   r3   r   r   r   test_with_malformed_tag  s    z-TestRemoveConstructed.test_with_malformed_tagNr7   r8   r9   r   r   r   r   r   r   r   ~  s   	r   c                   @   sX   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd ZdS )TestRemoveImplicitc                 C   s"   d| _ d| _d| _d| _d| _d S )N      
   F
   
   
)exp_tagexp_datadata_applicationdata_context_specificdata_privater   r   r   r   r     s
    zTestRemoveImplicit.setUpClassc                 C   s<   t | j\}}}| || j | || j | |d d S r(   r   r   r"   r   r   r   r   r   ri   r   r   r   r     s    zTestRemoveImplicit.test_simplec              	   C   s8   |  t}t| jd W 5 Q R X | dt|j d S )Nfoobarzinvalid `exp_class` value)r   rc   r   r   r/   r0   r1   r2   r   r   r   test_wrong_expected_class  s    z,TestRemoveImplicit.test_wrong_expected_classc              	   C   s6   |  t}t| j W 5 Q R X | dt|j d S )Nz+wanted class context-specific, got 0x46 tag)r   r
   r   r   r/   r0   r1   r2   r   r   r   test_with_wrong_class  s     z(TestRemoveImplicit.test_with_wrong_classc                 C   s>   t | jd\}}}| || j | || j | |d d S )Napplicationr    )r   r   r"   r   r   r   r   r   r   test_with_application_class  s    z.TestRemoveImplicit.test_with_application_classc                 C   s>   t | jd\}}}| || j | || j | |d d S )Nprivater    )r   r   r"   r   r   r   r   r   r   test_with_private_class  s    z*TestRemoveImplicit.test_with_private_classc                 C   sD   d}t | j| \}}}| || j | || j | || d S )Ns    r   )r   Z
extra_datar   r   ri   r   r   r   test_with_data_following  s    
z+TestRemoveImplicit.test_with_data_followingc              	   C   s8   d}|  t}t| W 5 Q R X | dt|j d S )Ns   
z#wanted type primitive, got 0xa6 tag)r   r
   r   r/   r0   r1   r   r   r   r   test_with_constructed  s    z(TestRemoveImplicit.test_with_constructedc                 C   sD   d}t td|dd\}}}| |d | || | |d d S )Ns   some longish stringr   r   r    )r   r   r"   r   r   r   r   test_encode_decode  s    
 
z%TestRemoveImplicit.test_encode_decodeN)r7   r8   r9   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   

r   c                   @   sH   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )TestEncodeImplicitc                 C   s   d| _ d| _d| _d| _d S )Nr   r   r   r   )r   r   r   r   r   r   r   r   r     s    zTestEncodeImplicit.setUpClassc                 C   s   t d| j}| || j d S )Nr   r   r   r"   r   r   rn   r   r   r   test_encode_with_default_class  s    z1TestEncodeImplicit.test_encode_with_default_classc                 C   s    t d| jd}| || j d S )Nr   r   )r   r   r"   r   r   r   r   r   "test_encode_with_application_class  s    z5TestEncodeImplicit.test_encode_with_application_classc                 C   s    t d| jd}| || j d S )Nr   zcontext-specificr   r   r   r   r   'test_encode_with_context_specific_class  s    z:TestEncodeImplicit.test_encode_with_context_specific_classc                 C   s    t d| jd}| || j d S )Nr   r   )r   r   r"   r   r   r   r   r   test_encode_with_private_class  s    z1TestEncodeImplicit.test_encode_with_private_classc              	   C   s:   |  t}td| jd W 5 Q R X | dt|j d S )Nr   r   zinvalid tag classr   rc   r   r   r/   r0   r1   r2   r   r   r   test_encode_with_invalid_class  s    z1TestEncodeImplicit.test_encode_with_invalid_classc              	   C   s8   |  t}td| j W 5 Q R X | dt|j d S )N    zLong tags not supportedr   r2   r   r   r   test_encode_with_too_large_tag  s    z1TestEncodeImplicit.test_encode_with_too_large_tagN)r7   r8   r9   r   r   r   r   r   r   r   r   r   r   r   r   r     s   
	r   c                   @   s   e Zd Zdd Zdd ZdS )TestRemoveOctetStringc                 C   s,   d}t |\}}| |d | |d d S )Ns   s   r    )r   r"   r   r   r   ri   r   r   r   r     s    z!TestRemoveOctetString.test_simplec              	   C   s8   d}|  t}t| W 5 Q R X | dt|j d S )Ns   Zoctetstring)r   r
   r   r/   r0   r1   r   r   r   r   r     s    z-TestRemoveOctetString.test_with_malformed_tagNr   r   r   r   r   r     s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestRemoveSequencec                 C   s,   d}t |\}}| |d | |d d S )Ns   0r   r    )r   r"   r   r   r   r   r     s    zTestRemoveSequence.test_simplec              	   C   s4   |  t}td W 5 Q R X | dt|j d S )Nr    zEmpty stringr   r
   r   r/   r0   r1   r2   r   r   r   test_with_empty_string!  s    z)TestRemoveSequence.test_with_empty_stringc              	   C   s8   d}|  t}t| W 5 Q R X | dt|j d S )Ns    zwanted type 'sequence'r   r   r   r   r   test_with_wrong_tag'  s    z&TestRemoveSequence.test_with_wrong_tagc              	   C   s8   d}|  t}t| W 5 Q R X | dt|j d S )Ns   0r5   r   r   r   r   r   test_with_wrong_length/  s    z)TestRemoveSequence.test_with_wrong_lengthN)r7   r8   r9   r   r   r   r   r   r   r   r   r     s   r   rC   i   2   c                 C   sl   | t jddd}|dk r.| t jddd}n| t jd|d}| t jt jd|d|d}||ft| S )z
    Hypothesis strategy that returns valid OBJECT IDENTIFIERs as tuples

    :param max_value: maximum value of any single sub-identifier
    :param max_size: maximum length of the generated OID
    r   rC   )Z	min_value	max_valuer   )max_size)stZintegersZliststuple)Zdrawr   r   firstsecondri   r   r   r   st_oid8  s     r   z--fastZmax_examplesc                 C   s0   t |  }t|\}}|dks t|| ks,td S r(   )r   r   r   )Zidsr   Zdecoded_oidri   r   r   r   	test_oidsT  s    r   )2rN   Zbinasciir   Z	unittest2ZunittestImportErrorsysZhypothesis.strategiesZ
strategiesr   Z
hypothesisr   r   rP   Z_compatr   Zcurvesr   r   rV   r	   r
   r   r   r   r   r   r   r   r   r   r   ZTestCaser   r:   rJ   rg   ry   r   r   r   r   r   r   r   Z	compositer   ZHYP_SETTINGSargvr   r   r   r   r   <module>   s@   8<&:H+DN,