o
    l>j'                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlZejeje	Z
ejeje
dZejes<ed ed dd edD ZeedksPed ejeed  Zejd ejde d dlZd dlmZ d dlmZ dZd	d
ZG dd de jZddddddZdddddZ dZ!dZ"d a#dd Z$d/ddZ%dd  Z&d0d!d"Z'd#d$ Z(d%d& Z)d'd( Z*ed) ed* ed+ ed* e + ,eZ-e j.dd,/e- ed) ed* ed- ed* e*  e)  e(  e0d. dS )1    Nbuildz9Please run "python setup.py build" prior to running tests   c                 C   s   g | ]	}| d r|qS )lib)
startswith).0d r   A/home/thesage/.local/lib/python3.10/site-packages/srp/test_srp.py
<listcomp>   s    r
   z#Unexpected build result... aborting   2   AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73asciic                   @   s   e Zd Zejejdddf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S )%SRPTests Nc	           "      C   s  |j }	|j}
|j}d}d}|||||||\}}|	||||||d d |	}| }| \}}|	|||||||d |	}| ||  | \}}| || | || |
||||||||d |
}| }| \}}|||}|||}| || ||}|
||||||||||
}| ||  ||}| || |
|||d ||||||
} | ||   | ||}!| ||! || || | 	|
  | 	|
  | 	| 
  | 	|
  | 	|
  d S )N   testuser   testpassword)UserVerifiercreate_salted_verification_keyget_ephemeral_secretstart_authenticationassertEqualget_challengeprocess_challengeverify_session
assertTrueauthenticated)"selfu_modv_modg_modhash_algng_typen_hexg_hexk_hexr   r   r   usernamepassword_s_vusrbytes_aunameAusr2uname2A2svrbytes_bsBMM2HAMKsvr2HAMK2svr3HAMK3r   r   r	   doit/   sH   



zSRPTests.doitc                 C      |  ttt d S N)r<   _pysrpr   r   r   r	   test_pure_python_defaultsh      z"SRPTests.test_pure_python_defaultsc                 C   r=   r>   )r<   _ctsrpr@   r   r   r	   test_ctypes_defaultsk   rB   zSRPTests.test_ctypes_defaultsc                 C      |  ttt d S r>   r<   r?   rC   r@   r   r   r	   	test_mix1n   rB   zSRPTests.test_mix1c                 C      |  ttt d S r>   rF   r@   r   r   r	   	test_mix2q   rB   zSRPTests.test_mix2c                 C   rE   r>   r<   rC   r?   r@   r   r   r	   	test_mix3t   rB   zSRPTests.test_mix3c                 C   rH   r>   rJ   r@   r   r   r	   	test_mix4w   rB   zSRPTests.test_mix4c                 C      | j ttttjd d S )N)r!   )r<   rC   srpSHA512r@   r   r   r	   test_hash_SHA512{      zSRPTests.test_hash_SHA512c                 C   rM   )N)r"   )r<   rC   rN   NG_8192r@   r   r   r	   test_NG_8192~   rQ   zSRPTests.test_NG_8192c                 C   s   | j ttttjttd d S )N)r"   r#   r$   )r<   rC   rN   	NG_CUSTOM
test_n_hex
test_g_hexr@   r   r   r	   test_NG_CUSTOM      zSRPTests.test_NG_CUSTOMc              	   C   s    | j ttttjtjttd d S )N)r!   r"   r#   r$   )r<   rC   r?   rN   SHA256rT   rU   rV   r@   r   r   r	   	test_all1   s    zSRPTests.test_all1c                 C   s   | j ttttjtjd d S )N)r!   r"   )r<   rC   r?   rN   SHA224NG_4096r@   r   r   r	   	test_all2   rX   zSRPTests.test_all2c                 C   s.   t dD ]}td}| |d? dk qdS )z{
        Verify that the Python implementation guarantees byte length by
        setting most significant bit to 1
        
          r   N)ranger?   get_random_of_lengthr   )r   xvalr   r   r	   test_random_of_length   s   
zSRPTests.test_random_of_lengthc                    sX   t t d t t d} fdd}tt fD ]} |fD ]}||| q!qdS )zW
        Verify that all implementations require 32 bytes for ephemeral values
           !   c                    s    t}| jdd|d W d    n1 sw   Y  dt|j  t}| jd   |d W d    n1 s@w   Y  dt|j d S )Nr,   pwd)r+   r+   )r2   r2   )assertRaises
ValueErrorr   assertInstr	exceptionr   )modrd   ctxrandom31r   r   r	   verf_len   s   z0SRPTests.test_ephemeral_length.<locals>.verf_lenN)r?   long_to_bytesrb   rC   )r   random33rr   rn   rd   r   rp   r	   test_ephemeral_length   s   	zSRPTests.test_ephemeral_lengthc                 C   s<   t dd}| |   tdd}| |   d S )Ntest)r?   r   r   r   rC   )r   r*   r   r   r	   test_authenticated_on_init   s   z#SRPTests.test_authenticated_on_initc                 C   s   | j tttdd d S )N   5)r%   rJ   r@   r   r   r	   test_custom_k   s   zSRPTests.test_custom_kc              	   C   sv   t t d}tt fD ],}|d||}| t}|| W d    n1 s*w   Y  | dt	|j
 qd S )Nr_   r,   bytes_A)r?   rs   rb   rC   r   ri   rj   r   rk   rl   rm   )r   	randbytesrn   r1   ro   r   r   r	   test_verifier_requires_A   s   z!SRPTests.test_verifier_requires_A)__name__
__module____qualname__rN   SHA1NG_2048r<   rA   rD   rG   rI   rK   rL   rP   rS   rW   rZ   r]   re   ru   rw   ry   r|   r   r   r   r	   r   -   s$    9	r   zSHA1  r[   rY   SHA384rO   )r   r            i   i   i   i    )r   r   r   r   r   r   c                 C   sx   |  tt||}| \}}| ||||||}| \}	}
||	|
}||}|| | r6| s:t	dd S )NzAuthentication failed!)
r   r&   r'   r   r   r   r   r   r   	Exception)rn   r!   r"   r(   r)   r*   r,   r-   r1   r3   r4   r5   r7   r   r   r	   do_auth   s   

r   r^   c                    sn   t tt\ |a fdd}t }|dkr,t|d |d8 }|dks|  t | }|S )Nc                      s0   t dkrt  t d8 a t dksd S d S )Nr   r   )NLEFTr   r   r(   r)   r!   rn   r"   r   r	   test_thread   s   z%performance_test.<locals>.test_threadr   r   )rN   r   r&   r'   r   time_threadstart_new_thread)rn   r!   r"   niternthreadsr   startdurationr   r   r	   performance_test   s   r   c                 C   s*   ddd}d|| j  t| t| f }|S )NPythonctypes)z
srp._pysrpz
srp._ctsrpz%s, %s, %d:)r}   hash_map	prime_map)rn   r!   r"   mcfgr   r   r	   get_param_str   s
   r   c                 C   s<   t | |||}t| ||}td|dd||   || S )Nz      z%.6f)r   r   printljust)rn   r!   r"   r   r   r   r   r   r	   
param_test   s   r   c                  C   sR   t d t d tttjtj} tttjtj}t d t d t d| |  d S )N<************************************************************zDefault Parameter Timings:r   zPerformance increases: z   ctypes-module : )r   r   r?   rN   r   r   rC   )py_timect_timer   r   r	   print_default_timings  s   r   c               	   C   s   t jt jt jt jg} t jt jt jt jt j	g}t
d t
d t
d t
ddd | D ]}t
dt|  ddd q*t
d t
d	 |D ]$}t
d
t|  dd | D ]}t
dtt||d dd qRt
d qDd S )Nr   z0Hash Algorithm vs Prime Number performance tabler   z       | )endzNG_%d   z<------------------------------------------------------------z%s |z{0:>12f}r^   )rN   NG_1024r   r\   rR   r   r[   rY   r   rO   r   r   rjustr   formatr   rC   )ng_types
hash_typesngr!   r   r   r	   print_performance_table  s     
r   c                  C   sL   t d t d d} tddD ]}t d|tttjtj| ||   qd S )Nr   zThread Performance Test:d   r      z   Thread Count {0:>2}: {1:8f})r   ra   r   r   rC   rN   r   r   )r   r   r   r   r	   print_thread_performance#  s   &r   r   *z* Testing Implementation)	verbosityz* Performance Testingg?)r^   r   )r^   )1unittestos.pathossysr   r   pathdirnameabspath__file__this_dirjoin	build_direxistsr   exitlistdir	plat_dirslenplat_dirinsertrN   
srp._pysrpr?   
srp._ctsrprC   rV   encoderU   TestCaser   r   r   r&   r'   r   r   r   r   r   r   r   r   
TestLoaderloadTestsFromTestCasesuiteTextTestRunnerrunsleepr   r   r   r	   <module>   sf   

 



