o
    l>jO                  
   @   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dadadYddZdYddZ	d Z
dZd	Zd
ZdZd ZdZd	Zd
ZdZe
ejeejeejeejeejiZdddfdddfdddfdddffZe ZejZedkryeej !d n8dev rdD ]Z"zeej !e" W q   Y qnzeej !d W n e#y   eej !d Y nw G dd dej$Z%G dd dej$Z&e'e%Z(e'e&Z)ej*fddZ+e+d g e( e+d!e(gd e+d"e(gd e+d#g e) e+d$e)gd e+d%e(ej*gd dZ,e+d&e(e(gej* e+d'e(gej* e+d(e(e(e(g e+d)e(e(e(g e+d*e(e(e(e)g e+d+e(e(e(e(e)g e+d,e(e(e(e(e)g e+d-e(ej*ej*ej*g e+d.e(ej-g e+d/ej-ej*e(ge( e+d0e'e(ej-g e+d1e(gej- e+d2ej-g e+d3ej-ej*g d4d5 Z.d6d7 Z/d8d9 Z0d:d; Z1d<d= Z2d>d? Z3d@dA Z4dBdC Z5dDdE Z6dFdG Z7dHdI Z8dJdK Z9dLdM Z:dNdO Z;dPdQ Z<e
eddddfdRdSZ=G dTdU dUZ>G dVdW dWZ?e@e AdXdX dS )Z    NFTc                 C      | a d S N)_rfc5054_compatenable r   ?/home/thesage/.local/lib/python3.10/site-packages/srp/_ctsrp.pyrfc5054_enable      r	   c                 C   r   r   )_no_username_in_xr   r   r   r   no_username_in_x   r
   r                  EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE48E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B297BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9AFD5138FE8376435B9FC61D2FC0EB06E3ascii   2   AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73   FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF   5   FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AACC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFFs   13darwinzlibssl.32.dylibwin)zlibeay32.dllzlibssl32.dllzssleay32.dllzlibssl.so.1.1.0z	libssl.soc                   @   s8   e Zd ZdejfdejfdejfdejfdejfgZdS )BIGNUM_StructdtopdmaxnegflagsN)__name__
__module____qualname__ctypesc_void_pc_int_fields_r   r   r   r   r      s    r   c                   @   s   e Zd ZdejfgZdS )BN_CTX_Struct_N)r    r!   r"   r#   c_byter&   r   r   r   r   r'      s    r'   c                 C   sR   t jt j}d }tD ]}zt|| }||_||_||| < W  d S    Y q
td)Nz/Unable to load required functions from SSL dlls)	sysmodulesr    __dict__dllsgetattrargtypesrestypeImportError)nameargsreturnsr   fdllr   r   r   	load_func   s   
r7   BN_newBN_freeBN_clear
BN_CTX_newBN_CTX_freeBN_set_flagsBN_cmpBN_num_bitsBN_addBN_subBN_mulBN_div
BN_mod_expBN_rand	BN_bn2bin	BN_bin2bn	BN_hex2bn	BN_bn2hexCRYPTO_free	RAND_seedc                 C   s   t | d d S )N      )r?   )ar   r   r   BN_num_bytes      rO   c                 C   s   t d | |||S r   )rC   )remmr   ctxr   r   r   BN_mod   rP   rT   c                 C   s   | d j dkS )Nr   )r   )nr   r   r   
BN_is_zero   s   rV   c                 C   s   t t| }t| | |jS r   )r#   create_string_bufferrO   rF   raw)rU   br   r   r   bn_to_bytes   s   
rZ   c                 C   s   t |t||  d S r   )rG   len)dest_bnbytesr   r   r   bytes_to_bn   s   r^   c                 C   s*   | |  }t|}t|t|t d S r   )digestr#   rW   rG   r[   dest)
hash_classr\   sr   buffr   r   r   H_str   s   
rd   c                 C   s:   t t|}t|| | |j }t|t|| d S r   )r#   rW   rO   rF   rX   r_   rG   r[   )ra   r`   rU   binr   r   r   r   H_bn   s   
rf   c           	      C   s   |  }t t|}t t|}t|| t|| tr)|t|t|j  ||j tr=|t|t|j  ||j |	 }t
|t|| d S r   )r#   rW   rO   rF   r   updater]   r[   rX   r_   rG   )	ra   r`   n1n2widthhbin1bin2r   r   r   r   H_bn_bn  s   

rn   c                 C   sP   |  }t t|}t|| ||j || | }t|t|| d S r   )	r#   rW   rO   rF   rg   rX   r_   rG   r[   )ra   r`   rU   rb   rk   re   r   r   r   r   H_bn_str  s   

ro   c                 C   sd   t |dr	| n|}t |dr| n|}trd}| |d |  }t| ||| t|t d S )Nencode       :)hasattrrp   r   r_   ro   r=   BN_FLG_CONSTTIME)ra   r`   saltusernamepasswordupr   r   r   calculate_x  s   ry   c                 C   s(   t t|}t|| | |j d S r   )r#   rW   rO   rF   rg   rX   )rS   rU   rc   r   r   r   update_hash(  s   
rz   c           	      C   sp   t |dr	| n|}|  }|t| || || |  t|| t|| t|| || | S )Nrp   )rs   rp   rg   HNxorgr_   rz   )	ra   NgIrb   ABKrk   r   r   r   calculate_M.  s   



r   c                 C   s,   |  }t || || || | S r   )rz   rg   r_   )ra   r   Mr   rk   r   r   r   calculate_H_AMK:  s
   


r   c                    s   t t|}t t|}t|| t|| tr"t|t| nd}| |j  | dd| |jg d fddt	dt D 
dS )Nr   rq        c                 3   s$    | ]}t  | | A V  qd S r   )chr).0ihNhgr   r   	<genexpr>N  s   " zHNxorg.<locals>.<genexpr>latin1)r#   rW   rO   rF   r   r[   rX   r_   joinrangerp   )ra   r|   r}   bNbgpaddingr   r   r   r{   B  s   

*r{   c                 C   sl   |t k r
t| \}}t }t }t }t|| t|| t| |||t|d tr1t|||| |||fS N)rj   )	NG_CUSTOM	_ng_constr8   rH   rn   rO   r   rT   )ra   ng_typen_hexg_hexrS   r|   r}   kr   r   r   get_ngkQ  s   


r   c                 C   s   |t kr|d u s|d u rtdt }t }	t }
t }t| }t|||||\}}}t||d dd t||
|| | t|	||
|| t	|}t	|	}t
| t
|	 t
|
 t
| t
| t
| t| ||fS )N:Both n_hex and g_hex are required when ng_type = NG_CUSTOMrM   r   )r   
ValueErrorr8   r;   	_hash_mapr   rE   ry   rD   rZ   r9   r<   )rv   rw   hash_algr   r   r   salt_lenk_hexrb   vxrS   ra   r|   r}   r   ru   verifierr   r   r   create_salted_verification_keyb  s*   r   c                   @   sn   e Zd Zdeed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dZdd Zdd ZdS )VerifierNc                 C   s  |t kr|d u s|d u rtd|	rt|	dkrtdt | _d | _t | _t | _t | _t | _	t | _
t | _t | _t | _|| _d | _d | _d| _d| _t| }t||||| j\}}}|
d urkt||
 || _|| _|| _|| _t| j	| t| j
| |r| | | js|	rt| j|	 nt| jddd t| jt t | j|| j
| j t!| j|| j|| j t"| j| j| j t#| j| j|| j d S d S )Nr       z32 bytes required for bytes_bF   r   )$r   r   r[   r8   r   r   SurY   rb   r   tmp1tmp2r;   rS   r~   r   H_AMK_authenticatedsafety_failedr   r   rH   ra   r|   r}   r   r^   _set_ArE   r=   rt   rB   rD   r@   rT   )selfrv   bytes_sbytes_vbytes_Ar   r   r   r   bytes_br   ra   r|   r}   r   r   r   r   __init__  sR   

zVerifier.__init__c                 C   s   t | dsd S t| j t| j t| j t| j t| j t| j t| j t| j	 t| j
 t| j t| j t| j t| j d S )Nr   )rs   r9   r   r   r   r   rY   rb   r   r|   r}   r   r   r   r<   rS   r   r   r   r   __del__  s   












zVerifier.__del__c                 C      | j S r   r   r   r   r   r   authenticated     zVerifier.authenticatedc                 C   r   r   )r~   r   r   r   r   get_username  r   zVerifier.get_usernamec                 C   
   t | jS r   )rZ   rY   r   r   r   r   get_ephemeral_secret     
zVerifier.get_ephemeral_secretc                 C      | j r| jS d S r   r   r   r   r   r   r   get_session_key  rP   zVerifier.get_session_keyc                 C   s   | j rdS t| jt| jfS )N)NN)r   rZ   rb   r   r   r   r   r   get_challenge  s   zVerifier.get_challengec                 C   sL   |r|  | t| dstd| js"|   || jkr$d| _| jS d S d S )Nr   zRbytes_A must be provided through Verifier constructor or verify_session parameter.T)r   rs   r   r   _derive_H_AMKr   r   r   )r   user_Mr   r   r   r   verify_session  s   


zVerifier.verify_sessionc                 C   sB   t  | _t| j| t| j| j| j| j t| jrd| _d S d S NT)	r8   r   r^   rT   r   r|   rS   rV   r   )r   r   r   r   r   r     s   

zVerifier._set_Ac              	   C   s   t | j| j| j| jt| jd t| j| j	| j| j| j
 t| j| j| j| j
 t| j| j| j| j| j
 | t| j | _t| j| j| j| j| j| j| j| j| _t| j| j| j| j| _d S r   )rn   ra   r   r   r   rO   r|   rD   r   r   rS   rB   r   r   rY   rZ   r_   r   r   r}   r~   rb   r   r   r   r   r   r   r   r     s    (zVerifier._derive_H_AMKr   )r    r!   r"   SHA1NG_2048r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    3

r   c                   @   sd   e Zd Zeedd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S )UserNc
                 C   sb  |t kr|d u s|d u rtd|rt|dkrtd|| _|| _t | _t | _t | _t | _	t | _
t | _t | _t | _t | _t | _t | _t | _d | _d | _d | _d| _t| }
t|
|||| j\}}}|	d urwt||	 |
| _|| _|| _|| _|rt| j| nt| jddd |rt| j| d S t | jt! t"| j|| j|| j d S )Nr   r   z32 bytes required for bytes_aFr   r   )#r   r   r[   rv   rw   r8   rN   r   r   rb   r   r   r   r   r   r   tmp3r;   rS   r   r   r   r   r   r   rH   ra   r|   r}   r   r^   rE   r=   rt   rD   )r   rv   rw   r   r   r   r   bytes_ar   r   ra   r|   r}   r   r   r   r   r     sJ   
zUser.__init__c                 C   s   t | dsd S t| j t| j t| j t| j t| j t| j t| j t| j	 t| j
 t| j t| j t| j t| j t| j t| j d S )NrN   )rs   r9   rN   r   r   rb   r   r   r   r   r|   r}   r   r   r   r   r<   rS   r   r   r   r   r   4  s"   














zUser.__del__c                 C   r   r   r   r   r   r   r   r   H  r   zUser.authenticatedc                 C   r   r   )rv   r   r   r   r   r   L  r   zUser.get_usernamec                 C   r   r   )rZ   rN   r   r   r   r   r   P  r   zUser.get_ephemeral_secretc                 C   r   r   r   r   r   r   r   r   T  rP   zUser.get_session_keyc                 C   s   | j t| jfS r   )rv   rZ   r   r   r   r   r   start_authenticationX  rP   zUser.start_authenticationc              	   C   sd  | j }| j}| j}| j}t| j| t| j| t| jrd S t|| j	| j
| jt|d t| j	r4d S t|| j| j| j| j t| j|| j|| j t| j| j	| j| j t| j| j| j t| j|| j|| j t| j|| j| j t| j| j| j t| j| j| j|| j |t| j | _t|||| j| j| j
| j| j| _t || j
| j| j| _!| jS r   )"ra   r|   r}   r   r^   rb   r   rV   rn   r   r   rO   ry   r   rv   rw   rD   r   rS   rB   r   r@   r   rN   r   rA   r   rZ   r_   r   r   r   r   r   )r   r   bytes_Bra   r|   r}   r   r   r   r   process_challenge]  s.   

"zUser.process_challengec                 C   s   | j |kr
d| _d S d S r   )r   r   )r   	host_HAMKr   r   r   r     s   

zUser.verify_session)r    r!   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    /(r   r   )T)Bosr*   hashlibrandomr#   timer   r   r	   r   r   SHA224SHA256SHA384SHA512NG_1024r   NG_4096NG_8192r   sha1sha224sha256sha384sha512r   rp   r   listr-   platformappendcdllLoadLibraryr   OSError	Structurer   r'   POINTERBIGNUMBN_CTXr%   r7   rt   c_char_prO   rT   rV   rZ   r^   rd   rf   rn   ro   ry   rz   r   r   r{   r   r   r   r   rK   urandomr   r   r   r   <module>   s   

	
%X



   