U
    ʹhd                     @   s:  d dl Z d dlZzd dlZW n ek
r8   d dlZY nX d dl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mZ ddlmZmZmZmZ ddlmZmZmZmZmZmZmZ ddlm Z  ddl!m"Z" i Z#ej$dkrd	e#d
< i Z%dej&kr
de%d< nde%d< G dd dej'Z(G dd dej'Z)dS )    N)givenassumesettingsexample   )CurveFpPointJacobiINFINITYPoint)generator_256	curve_256generator_224generator_brainpoolp160r1curve_brainpoolp160r1generator_112r2curve_112r2)inverse_mod)	randrange)      i  Zdeadlinez--fastr   Zmax_examples
   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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/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zef e e!e"j#d9e$e%& d: d;d<d= Z'ef e e!e"j#d9e$e%& d: d;e(d9e(e$e%& d>d? Z)ef e e!e"j#d:e$e%& d: d;e"j#d:e$e%& d: d;e(d@d@dAdB Z*ef e e!e"j#d:e$e%& d: d;e"j#d:e$e%& d: d;e"j#d:e$e+, d: d;dCdD Z-e.j/j0ef e e!e"j#d:e$e%& d: d;e"j#d:e$e%& d: d;e"j#d:e$e+, d: d;e(d:d:d:e(d@d@d@e(dEe$e%& dE d:e(dEe$e%& dE d@dFdG Z1dHdI Z2e.j/j0ef e e!e"j#d:e$e%& d: d;e"j#d:e$e%& d: d;e"j3e"j#d:e$e+, d: d;dEdEdJdKe(dEdEdEd:ge(dEdEdEd@ge(dEe$e%& dE dEd@ge(dEe$e%& dE dEd:gdLdM Z4dNdO Z5dPdQ Z6dRdS Z7dTdU Z8dVdW Z9dXdY Z:dZd[ Z;d\d] Z<d^d_ Z=d`da Z>dbdc Z?ddde Z@dfdg ZAdhdi ZBdjdk ZCdldm ZDdndo ZEdpdq ZFdrds ZGe!e"j#d9e$eH& d: d;e"j#d9e$eH& d: d;e"j#d9e$eH& d: d;e(dtdEdudvdw ZIdxdy ZJdzd{ ZKd|d} ZLd~d ZMdd ZNdd ZOdd ZPdd ZQdd ZRdd ZSdd ZTdd ZUdd ZVdd ZWe.j/j0ef eXe.j/jYeZ[ dkdde!e"j#d:dd;dd Z\e.j/j0e.j/jYeZ] dkpjeZ[ dkdddd Z^dS )
TestJacobic                 C   sj   t  }d}d}d}d}t|||||}| | | | | | | | | | | | d S )Nr      r      )objectr   assertEqualorderassertIscurvexy)selfr   r   r    zr   pj r$   7./venv/lib/python3.8/site-packages/ecdsa/test_jacobi.pytest___init__,   s    zTestJacobi.test___init__c              	   C   s6   t t}t t}| t ||  W 5 Q R X d S N)r   from_affiner   r   assertRaises
ValueErrorr!   p_ap_br$   r$   r%   test_add_with_different_curves9   s    

z)TestJacobi.test_add_with_different_curvesc                 C   s   |  tt d S r'   )assertNotEqualr   r   r!   r$   r$   r%   test_compare_different_curves@   s    z(TestJacobi.test_compare_different_curvesc                 C   s   t t}| |d d S )Nvaluer   r(   r   r/   r!   r#   r$   r$   r%   test_equality_with_non_pointC   s    
z'TestJacobi.test_equality_with_non_pointc                 C   s"   t t}| }| t| d S r'   r   r(   r   	to_affiner   r!   r#   pwr$   r$   r%   test_conversionH   s    
zTestJacobi.test_conversionc                 C   sF   t t}t }| }| | |  | | |  d S r'   )r   r(   r   doubler   r   r    r8   r$   r$   r%   test_single_doubleN   s
    
zTestJacobi.test_single_doublec                 C   s&   t tddd}| }| |t d S Nr   r   r   r   r;   r   r	   r4   r$   r$   r%   test_double_with_zero_pointW   s    z&TestJacobi.test_double_with_zero_pointc                 C   s&   t tddd}| }| |t d S Nr   r>   r4   r$   r$   r%   &test_double_with_zero_equivalent_point^   s    z1TestJacobi.test_double_with_zero_equivalent_pointc                 C   s*   t tddt }| }| |t d S r=   r   r   pr;   r   r	   r4   r$   r$   r%   <test_double_with_zero_equivalent_point_non_zero_z_non_zero_ye   s    zGTestJacobi.test_double_with_zero_equivalent_point_non_zero_z_non_zero_yc                 C   s*   t tddt }| }| |t d S r@   rB   r4   r$   r$   r%   1test_double_with_zero_equivalent_point_non_zero_zl   s    z<TestJacobi.test_double_with_zero_equivalent_point_non_zero_zc                 C   s.   t t}| }| || | || d S r'   r6   r!   r#   par$   r$   r%   test_compare_with_affine_points   s    
z)TestJacobi.test_compare_with_affine_pointc                 C   s&   t tddd}| }| |t d S r@   )r   r   r7   r   r	   rF   r$   r$   r%   test_to_affine_with_zero_pointz   s    z)TestJacobi.test_to_affine_with_zero_pointc                 C   s.   t t}| }|| }| ||  d S r'   r   r(   r   r7   r   r;   r!   r#   rG   sr$   r$   r%   test_add_with_affine_point   s    
z%TestJacobi.test_add_with_affine_pointc                 C   s.   t t}| }|| }| ||  d S r'   rJ   rK   r$   r$   r%   test_radd_with_affine_point   s    
z&TestJacobi.test_radd_with_affine_pointc                 C   s"   t t}|t }| || d S r'   )r   r(   r   r	   r   )r!   r#   rL   r$   r$   r%   test_add_with_infinity   s    
z!TestJacobi.test_add_with_infinityc                 C   s4   t t }t tddd}|| }| || d S r@   )r   r(   r   r7   r   r   )r!   rG   r#   rL   r$   r$   r%   test_add_zero_point_to_affine   s    z(TestJacobi.test_add_zero_point_to_affinec                 C   s"   t t}|d }| |t d S r@   )r   r(   r   r   r	   r4   r$   r$   r%   test_multiply_by_zero   s    
z TestJacobi.test_multiply_by_zeroc                 C   s&   t tddd}|d }| |t d S r=   )r   r   r   r	   r4   r$   r$   r%   test_zero_point_multiply_by_one   s    z*TestJacobi.test_zero_point_multiply_by_onec                 C   sF   t t}td }|d }| | |  | | |  d S Nr   r   r(   r   r   r   r    r8   r$   r$   r%   test_multiply_by_one   s
    
zTestJacobi.test_multiply_by_onec                 C   sF   t t}td }|d }| | |  | | |  d S Nr   rT   r8   r$   r$   r%   test_multiply_by_two   s
    
zTestJacobi.test_multiply_by_twoc                 C   s*   t t}td }d| }| || d S rV   r   r(   r   r   r8   r$   r$   r%   test_rmul_by_two   s    
zTestJacobi.test_rmul_by_twoc                 C   s   t t}| |t d S r'   )r   r(   r   r/   r	   r4   r$   r$   r%   #test_compare_non_zero_with_infinity   s    
z.TestJacobi.test_compare_non_zero_with_infinityc                 C   s   t tddd}| |t d S )Nr   r   r   r   r   r	   r4   r$   r$   r%   -test_compare_non_zero_bad_scale_with_infinity   s    z8TestJacobi.test_compare_non_zero_bad_scale_with_infinityc                 C   s<   t ddd}t|ddd}| |dd | |t d S N   r   r   r   r   
assertTruecontains_pointr/   r	   r!   c_23r#   r$   r$   r%   "test_eq_x_0_on_curve_with_infinity   s    z-TestJacobi.test_eq_x_0_on_curve_with_infinityc                 C   s<   t ddd}t|ddd}| |dd | |t d S )Nr^   r   r   r   r_   rb   r$   r$   r%   "test_eq_y_0_on_curve_with_infinity   s    z-TestJacobi.test_eq_y_0_on_curve_with_infinityc                 C   s8   t ddd}t|ddd}t|ddd}| || d S )Nr^   r   r      )r   r   r/   )r!   rc   r,   r-   r$   r$   r%   test_eq_with_same_x_different_y   s    z*TestJacobi.test_eq_with_same_x_different_yc                 C   s   t tddd}| |t d S r@   r[   r4   r$   r$   r%   %test_compare_zero_point_with_infinity   s    z0TestJacobi.test_compare_zero_point_with_infinityc                 C   s*   t t}| }|d }| || d S rV   )r   r(   r   r;   r   )r!   r#   ZdblZmlplr$   r$   r%   !test_compare_double_with_multiply   s    
z,TestJacobi.test_compare_double_with_multiplyr   r   )Z	min_valueZ	max_valuec                 C   sR   t t}| | }|| }| | | f| | f | || d S r'   )r   r(   r   r7   r   r   r    )r!   mulr#   r9   r$   r$   r%   test_multiplications   s
    
$zTestJacobi.test_multiplicationsc                 C   s:   t }| |j tt }|| }|| }| || d S r'   )r   r`   _PointJacobi__precomputer   r(   r   )r!   rj   Zprecompr#   abr$   r$   r%   test_precompute  s    	
zTestJacobi.test_precomputer   c                 C   sF   t t}t || }t || }|| }| ||||   d S r'   )r   r(   r   r   )r!   a_mulb_mulj_grm   rn   cr$   r$   r%   test_add_scaled_points  s
    
z!TestJacobi.test_add_scaled_pointsc           
      C   s   t t}t || }t || }t }tt|| || | }t t| | | | | | | |}|| }	| 	|	|||   d S r'   
r   r(   r   r   rC   r   r   r   r    r   
r!   rp   rq   new_zrr   rm   rn   rC   Znew_zzrs   r$   r$   r%   test_add_one_scaled_point(  s    
z$TestJacobi.test_add_one_scaled_pointr   c           
      C   s   t t}t || }t || }t }tt|| || | }t t| | | | | | | |}t t| | | | | | | |}|| }	| 	|	|||   d S r'   ru   rv   r$   r$   r%   test_add_same_scale_pointsH  s(    
z%TestJacobi.test_add_same_scale_pointsc                 C   s   t }t }|d }|  d}tt| |d  | | |d  | |}tt| |d  | | |d  | |}|| }| |||  d S )N      r   r   r   r   rC   scaler   r   r    r   )r!   rr   rC   rm   z1r   r    rs   r$   r$   r%   !test_add_same_scale_points_statics  s&    z,TestJacobi.test_add_same_scale_points_staticT)Zmin_sizeZmax_sizeuniquec                 C   s   t t}t || }t || }t }tt|d | tt|d | |d |d  | }|d |d  | }	t t| | | | | |d  | |d }t t| |	 | | |	 |d  | |d }|| }
| 	|
|||   d S r=   ru   )r!   rp   rq   rw   rr   rm   rn   rC   Znew_zz0Znew_zz1rs   r$   r$   r%   test_add_different_scale_points  s,    
z*TestJacobi.test_add_different_scale_pointsc           	      C   s   t }t }|d }|  d}tt| |d  | | |d  | |}d}tt| |d  | | |d  | |}|| }| |||  d S )Nrz   r{   r   r      r|   )	r!   rr   rC   rm   r~   r   Zz2r    rs   r$   r$   r%   &test_add_different_scale_points_static  s(    z1TestJacobi.test_add_different_scale_points_staticc           	      C   s   t }t }|d }|  |d }d}tt| |d  | | |d  | |}tt| |d  | | |d  | |}|| }| |||  d S )Nrz      r{   r   r   r|   )	r!   rr   rC   rm   rn   r"   r   r    rs   r$   r$   r%   +test_add_different_points_same_scale_static  s(    z6TestJacobi.test_add_different_points_same_scale_staticc                 C   s   t }t }d}|| }|  tt| |d  | | |d  | |}tt| | d}|| }| |||  d S )Nrz   r   r   r   )r   r   rC   r}   r   r   r    r   )r!   rr   rC   r"   rm   r   r    rs   r$   r$   r%   5test_add_same_point_different_scale_second_z_1_static  s&    z@TestJacobi.test_add_same_point_different_scale_second_z_1_staticc                 C   s^   t }d}|| }|  | }tt| | d}tt| | d}| t||  d S )Nrz   r   )r   r}   r   r   r   r    r   r	   )r!   rr   r"   rm   rn   r   r    r$   r$   r%   test_add_to_infinity_static  s$    z&TestJacobi.test_add_to_infinity_staticc                 C   s&   t t}| |d || |  d S )Nr   rX   r!   rr   r$   r$   r%   test_add_point_3_times  s    
z!TestJacobi.test_add_point_3_timesc                 C   s.   t tt t d}| |t  t d S rS   )r   r   r   r   r    r   r   r	   r   r$   r$   r%   test_mul_without_order#  s    z!TestJacobi.test_mul_without_orderc                 C   s$   t t}| ||dtd d S rS   r   r(   r   r   mul_addr	   r   r$   r$   r%   test_mul_add_inf(  s    
zTestJacobi.test_mul_add_infc                 C   s(   t t}| |d |d|d d S )Nr   r   r   r(   r   r   r   r   r$   r$   r%   test_mul_add_same-  s    
zTestJacobi.test_mul_add_samec                 C   sj   t td}t |d d}| |d ||  | |d |d |d   | |d |d|d d S )NT      i     r   r   r(   r   r   r   r!   rr   rn   r$   r$   r%   test_mul_add_precompute2  s
    z"TestJacobi.test_mul_add_precomputec                 C   sj   t td}t |d d}| |d ||  | |d |d |d   | |d |d|d d S )NTr   r         r   r   r$   r$   r%   test_mul_add_precompute_large:  s      z(TestJacobi.test_mul_add_precompute_largec                 C   s0   t t}|d }|d|d}| || d S )Nr   r   r   )r   r(   r   r   r   )r!   rr   rm   rn   r$   r$   r%   test_mul_add_to_mulF  s    
zTestJacobi.test_mul_add_to_mulc                 C   s0   t t}|d }| |d|d|d  d S )Nr   r   r   r   )r!   rr   w_ar$   r$   r%   test_mul_add_differntN  s    
z TestJacobi.test_mul_add_differntc                 C   s@   t t}|d }|d }| |d|d|d |d   d S )Nr   r   r   r   )r!   rr   r   w_br$   r$   r%   test_mul_add_slightly_differentU  s    
z*TestJacobi.test_mul_add_slightly_differentc                 C   sH   t t}td }td }|d }|d|d}| | ||  d S )Nr   i        r   r(   r   r   r   r7   r!   rr   r   r   Zj_bretr$   r$   r%   test_mul_add]  s    
zTestJacobi.test_mul_addc                 C   sH   t t}td }td }|d }|d|d}| | ||  d S )Nr   r   r   r   r   r$   r$   r%   test_mul_add_zeroh  s    
zTestJacobi.test_mul_add_zeroc                 C   sf   t t}t |d }| |d ||  | |d |d |d   | |d |d|d d S )Nr   r   r   r   r   r   r   r$   r$   r%   test_mul_add_larget  s    
  zTestJacobi.test_mul_add_largec                 C   sB   t t}t }t td }| ||d ||d t d S )Nr   )r   r(   r   r   r   r   r	   )r!   rr   r   rn   r$   r$   r%   $test_mul_add_with_infinity_as_result  s    
z/TestJacobi.test_mul_add_with_infinity_as_resultc                 C   sf   t tt t d}t }td }|  t t| | d}| ||d ||d t	 d S )Nr   "   )
r   r   r   r   r    r   r}   r   r   r	   )r!   rr   r   r   rn   r$   r$   r%   test_mul_add_without_order  s    z%TestJacobi.test_mul_add_without_orderc                 C   s2   t td }d|  }| |d|dt d S )N   r   r   r   )r!   rr   Zdbl_negr$   r$   r%   ,test_mul_add_with_doubled_negation_of_itself  s    
z7TestJacobi.test_mul_add_with_doubled_negation_of_itselfi  i  c                 C   s<   t t}t| }||||}| ||| ||   d S r'   )r   r(   r   r   r   )r!   Zmul1Zmul2Zmul3r,   r-   resr$   r$   r%   test_mul_add_random  s    
zTestJacobi.test_mul_add_randomc                 C   sH   t tddddddddd}t tddddddddd}| || d S Nr^   r   r   r   r   r   r    r"   r   )r   r   r   )r!   pj1Zpj2r$   r$   r%   test_equality  s    zTestJacobi.test_equalityc                 C   s   t t}| |d d S )Nr   r3   r   r$   r$   r%   !test_equality_with_invalid_object  s    
z,TestJacobi.test_equality_with_invalid_objectc                 C   s$   t t}t t}| || d S r'   )r   r(   r   r   r/   r+   r$   r$   r%   test_equality_with_wrong_curves  s    

z*TestJacobi.test_equality_with_wrong_curvesc              	   C   sN   t tddddddddd}|ddddddd\}}}| |||fd d S )	Nr^   r   r   r   r   r   r   )r   r   r   )r   r   Z_addr   )r!   r   r   r    r"   r$   r$   r%   test_add_with_point_at_infinity  s    z*TestJacobi.test_add_with_point_at_infinityc                 C   sj   t ddd}t|ddd}| }| | | fd | |t | }| |t | |t d S Nr^   r   rz      r   r   )	r   r   r;   r   r   r    r/   r	   r   r!   rc   rC   p2Zp3r$   r$   r%   test_double_to_infinity  s    z"TestJacobi.test_double_to_infinityc                 C   s>   t ddd}t|ddd}| }| | | fd d S )Nr^   r   r   	   )r      )r   r   r;   r   r   r    )r!   Zc_23_2rC   r   r$   r$   r%   test_double_to_x_0  s    zTestJacobi.test_double_to_x_0c                 C   sj   t ddd}t|ddd}|d }| | | fd | |t |d }| |t | |t d S )Nr^   r   rz   r   r   r   r   r   r   r   r    r/   r	   r   r   r$   r$   r%   test_mul_to_infinity  s    zTestJacobi.test_mul_to_infinityc                 C   sj   t ddd}t|ddd}|| }| | | fd | |t || }| |t | |t d S r   r   r   r$   r$   r%   test_add_to_infinity  s    zTestJacobi.test_add_to_infinityc                 C   s>   t ddd}t|ddd}|d }| | | fd d S )Nr^   r   r   r   r{   r   rf   r   r   r   r   r    r!   rc   rC   r   r$   r$   r%   test_mul_to_x_0  s    zTestJacobi.test_mul_to_x_0c                 C   s>   t ddd}t|ddd}|d }| | | fd d S )Nr^   r   r   r      r   r   r   r$   r$   r%   test_mul_to_y_0  s    zTestJacobi.test_mul_to_y_0c                 C   sB   t ddd}t|ddd}|d | }| | | fd d S )Nr^   r   r   r   r   r   r   r   r$   r$   r%   test_add_to_x_0  s    zTestJacobi.test_add_to_x_0c                 C   sB   t ddd}t|ddd}|d | }| | | fd d S )Nr^   r   r   r   r{   r   r   r   r$   r$   r%   test_add_to_y_0  s    zTestJacobi.test_add_to_y_0c                 C   s:   t ddd}t|ddd}|d |d  }| |t d S )Nr^   r   r   r   r      )r   r   r   r	   )r!   rc   rC   rs   r$   r$   r%   test_add_diff_z_to_infinity  s    z&TestJacobi.test_add_diff_z_to_infinityc                 C   s8   t tddddddddd}| tt|| d S r   )r   r   r   pickleloadsdumpsr4   r$   r$   r%   test_pickle  s    zTestJacobi.test_pickleZPyPyz!threading on PyPy breaks coverage)reasonr   c                 C   s   t d  t }t| | | d| d}| |jg  dd }g }t|D ]}|	t
j||fd qP|D ]}|  qp|| |D ]}|  q| |jt j d S )Nr   r   Tc                 S   s&   |   }tdD ]}| t|  qd S )Nr   r   ranger   	generatorr   _r$   r$   r%   runner  s    z.TestJacobi.test_multithreading.<locals>.runnertargetargs)r   r   r   r   r    r   r   rl   r   append	threadingThreadstartjoin)r!   
thread_numgenr   threadsr   tr$   r$   r%   test_multithreading  s"    	"

zTestJacobi.test_multithreadingZWindowszFthere are no signals on Windows, and threading breaks coverage on PyPyc              	   C   s2  d}t d  t }t| | | d| d}| |jg  dd }dd }g }t|D ]}|	t
j||fd	 q\t
 }|  t
 }|  t
 }	|	  |	t
j||||	fd	 |D ]}
|
  q| t& |  |  || |	  W 5 Q R X |D ]}
|
  q| |jt j d S )
Nr   r   r   Tc                 S   s&   |   }tdD ]}| t|  qd S )N2   r   r   r$   r$   r%   r   E  s    z>TestJacobi.test_multithreading_with_interrupts.<locals>.runnerc                 S   s.   |    |  tt tj |   d S r'   )releaseacquireoskillgetpidsignalSIGINT)barrier_startbarrier_end	lock_exitr$   r$   r%   interrupterJ  s    zCTestJacobi.test_multithreading_with_interrupts.<locals>.interrupterr   )r   r   r   r   r    r   r   rl   r   r   r   r   Lockr   r   r)   KeyboardInterruptr   r   )r!   r   r   r   r   r   r   r   r   r   r   r$   r$   r%   #test_multithreading_with_interrupts3  sF    "
z.TestJacobi.test_multithreading_with_interruptsN)___name__
__module____qualname__r&   r.   r1   r5   r:   r<   r?   rA   rD   rE   rH   rI   rM   rN   rO   rP   rQ   rR   rU   rW   rY   rZ   r\   rd   re   rg   rh   ri   r   SLOW_SETTINGSr   stZintegersintr   r   rk   r   ro   rt   r   rC   rx   pytestZmarkZslowry   r   Zlistsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   NO_OLD_SETTINGSZskipifplatformZpython_implementationr   systemr   r$   r$   r$   r%   r   +   sX  			 	 
  	  	  	

   	




 
r   c                   @   sH   e Zd 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S )TestZeroCurvez.Tests with curve that has (0, 0) on the curve.c                 C   s   t ddd| _d S r]   )r   r   r0   r$   r$   r%   setUp{  s    zTestZeroCurve.setUpc                 C   s   |  | jdd d S r@   )r`   r   ra   r0   r$   r$   r%   test_zero_point_on_curve~  s    z&TestZeroCurve.test_zero_point_on_curvec                 C   s@   t | jddd}| }| |t | d| | f d S )Nr   r   r   r   r   r   r;   r/   r	   r   r   r    r!   rC   dr$   r$   r%   test_double_to_0_0_point  s    z&TestZeroCurve.test_double_to_0_0_pointc                 C   sT   d}t | jd|d  d|d  |}| }| |t | d| | f d S )Nr   r   r   r   r   r   )r!   r"   rC   r  r$   r$   r%   'test_double_to_0_0_point_with_non_one_z  s
     z5TestZeroCurve.test_double_to_0_0_point_with_non_one_zc                 C   s@   t | jddd}|d }| |t | d| | f d S )Nrz   r{   r   r   r   )r   r   r/   r	   r   r   r    r  r$   r$   r%   test_mul_to_0_0_point  s    z#TestZeroCurve.test_mul_to_0_0_pointc                 C   s(   t | jddd}| }| |t d S r=   )r   r   r;   r   r	   r  r$   r$   r%   test_double_of_0_0_point  s    z&TestZeroCurve.test_double_of_0_0_pointc                 C   sD   t | jddd}t| jdd}tdD ]}| || ||  q&d S )Nrz   r{   r      )r   r   r
   r   r   )r!   rC   Zp_cir$   r$   r%   "test_compare_to_old_implementation  s    z0TestZeroCurve.test_compare_to_old_implementationN)r   r   r   __doc__r   r   r  r  r  r  r	  r$   r$   r$   r%   r   x  s   	r   )*r   sysZ	unittest2ZunittestImportErrorr   r   r   r   r   Zhypothesis.strategiesZ
strategiesr   Z
hypothesisr   r   r   r   Zellipticcurver   r   r	   r
   Zecdsar   r   r   r   r   r   r   Znumbertheoryr   utilr   r   version_infor   argvZTestCaser   r   r$   r$   r$   r%   <module>   s>   $	

      S