o
    l>j9                  
   @   s  d dl Z d dlZd dlZd dlZdadad*ddZd*d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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d Z!eeddddfd d!Z"d"d# Z#d$d% Z$G d&d' d'Z%G d(d) d)Z&dS ),    NFTc                 C      | a d S N)_rfc5054_compatenable r   ?/home/thesage/.local/lib/python3.10/site-packages/srp/_pysrp.pyrfc5054_enable      r	   c                 C   r   r   )_no_username_in_xr   r   r   r   no_username_in_x   r
   r               ))   EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE48E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B297BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9AFD5138FE8376435B9FC61D2FC0EB06E32)   AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73r   )   FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF5)   FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AACC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A66D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFF0x13c                 C   s(   | t k r
t|  \}}t|dt|dfS N   )	NG_CUSTOM	_ng_constint)ng_typen_hexg_hexr   r   r   get_ng   s   r    c                 C   s$   d}t | D ]}|d> |B }q|S )Nr      )six	iterbytes)snbr   r   r   bytes_to_long   s   r'   c                 C   sd   t  }d}d}|| kr&| |? d@ }|t| |||> B }|d7 }|| ks|  td|S )Nr      r!    )listappendchrreverser"   r&   join)r%   lxoffr&   r   r   r   long_to_bytes   s   r2   c                 C   s   t t| S r   )r'   osurandom)nbytesr   r   r   
get_random   s   r6   c                 C   s   | d d }t | d|> B S )Nr!   r   )r6   )r5   offsetr   r   r   get_random_of_length   s   r8   r)   c                 C   sb   t |tjr
t|}|rt |tjrt|}|r"t |tjr"t|}|| | }t| | dS r   )
isinstancer"   integer_typesr2   long	hexdigest)
hash_classs1s2s3r$   r   r   r   old_H   s   rA   c                 O   sp   | dd }|  }|D ](}|d ur3t|tjrt|n|}|d ur.tr.|t|t|  || q|	 S )Nwidth)
getr9   r"   r:   r2   r   updatebyteslendigest)r=   argskwargsrB   hr$   datar   r   r   H   s   
rL   c              	      sx   t |}t |}trt|t| nd}| |  | dd| |g td fddtdt D S )Nr           r)   c                 3   s,    | ]}t t |t|A V  qd S r   )r,   r"   
indexbytes).0ihNhgr   r   	<genexpr>   s   * zHNxorg.<locals>.<genexpr>)r2   r   rF   rG   r.   r"   r&   range)r=   Ngbin_Nbin_gpaddingr   rR   r   HNxorg   s   *r\   c              
   C   s^   t |dr	| n|}t |dr| n|}trtd}tt| |t| |td | S )Nencoder)   :)hasattrr]   r   r"   r&   r'   rL   )r=   saltusernamepasswordr   r   r   gen_x   s
   
$rc   c                 C   sf   |t kr|d u s|d u rtdt| }t|||\}	}
tt|}tt|
t||| ||	}||fS )N:Both n_hex and g_hex are required when ng_type = NG_CUSTOM)r   
ValueError	_hash_mapr    r2   r6   powrc   )ra   rb   hash_algr   r   r   salt_lenk_hexr=   rW   rX   _s_vr   r   r   create_salted_verification_key   s   rm   c           	      C   s   t |dr	| n|}|  }|t| || || |  t|tjr*t|}|| |t| |t| || | S )Nr]   )	r_   r]   rD   r\   rG   r9   r"   r:   r2   )	r=   rW   rX   Ir$   ABKrJ   r   r   r   calculate_M   s   

rr   c                 C   s0   |  }| t| | | | | | S r   )rD   r2   rG   )r=   ro   Mrq   rJ   r   r   r   calculate_H_AMK   s
   

rt   c                   @   sf   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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 | _d| _d| _	t
|||\}}t| }|
d u rOtt|||tt|d}nt|
d}|| _|| _|| _|| _|rg| | | j	s|	rrt|	| _ntd| _|| j t|| j| | | _d S d S )Nrd      z256 bytes required for bytes_bFrB   r   )r   re   rF   r$   r'   vrn   rq   _authenticatedsafety_failedr    rf   rL   r2   r   r=   rW   rX   k_set_Ar&   r8   rg   rp   )selfra   bytes_sbytes_vbytes_Arh   r   r   r   bytes_brj   rW   rX   r=   r{   r   r   r   __init__  s6   



"zVerifier.__init__c                 C      | j S r   ry   r}   r   r   r   authenticated*     zVerifier.authenticatedc                 C   r   r   rn   r   r   r   r   get_username.  r   zVerifier.get_usernamec                 C   
   t | jS r   )r2   r&   r   r   r   r   get_ephemeral_secret2     
zVerifier.get_ephemeral_secretc                 C      | j r| jS d S r   ry   rq   r   r   r   r   get_session_key6     zVerifier.get_session_keyc                 C   s   | j rdS | jt| jfS )N)NN)rz   r$   r2   rp   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 )Nro   zRbytes_A must be provided through Verifier constructor or verify_session parameter.T)r|   r_   re   rz   _derive_H_AMKrs   ry   H_AMK)r}   user_Mr   r   r   r   verify_sessionA  s   


zVerifier.verify_sessionc                 C   s    t || _| j| j dk| _d S )Nr   )r'   ro   rW   rz   )r}   r   r   r   r   r|   M  s   
zVerifier._set_Ac              	   C   s   t t| j| j| jtt| jd| _t	| 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 )Nrw   )r'   rL   r=   ro   rp   rF   r2   rW   urg   rx   r&   SrG   rq   rr   rX   rn   r$   rs   rt   r   r   r   r   r   r   S  s
   &&(zVerifier._derive_H_AMKr   )__name__
__module____qualname__SHA1NG_2048r   r   r   r   r   r   r   r|   r   r   r   r   r   ru     s    $
ru   c                   @   s\   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S )UserNc
                 C   s   |t kr|d u s|d u rtd|rt|dkrtdt|||\}
}t| }|	d u r;tt||
|tt|
d}nt|	d}|| _	|| _
|rNt|| _ntd| _|r[t|| _nt|| j|
| _d | _d | _d | _d | _d| _|| _|
| _|| _|| _d S )Nrd   rv   z256 bytes required for bytes_arw   r   F)r   re   rF   r    rf   r'   rL   r2   r   rn   par8   ro   rg   rx   rs   rq   r   ry   r=   rW   rX   r{   )r}   ra   rb   rh   r   r   r   bytes_ar   rj   rW   rX   r=   r{   r   r   r   r   ^  s4   


zUser.__init__c                 C   r   r   r   r   r   r   r   r     r   zUser.authenticatedc                 C   r   r   r   r   r   r   r   r     r   zUser.get_usernamec                 C   r   r   )r2   r   r   r   r   r   r     r   zUser.get_ephemeral_secretc                 C   r   r   r   r   r   r   r   r     r   zUser.get_session_keyc                 C   s   | j t| jfS r   )rn   r2   ro   r   r   r   r   start_authentication  r   zUser.start_authenticationc              	   C   s
  || _ t|| _| j}| j}| j}| j}| j| dkrd S tt|| j| jt	t
|d| _| jdkr5d S t|| j | j| j| _t|| j|| _t| j|| j  | j| j| j  || _|t
| j | _t|||| j| j | j| j| j| _t|| j| j| j| _| jS )Nr   rw   )r$   r'   rp   rW   rX   r{   r=   rL   ro   rF   r2   r   rc   rn   r   r0   rg   rx   r   r   rG   rq   rr   rs   rt   r   )r}   r~   bytes_BrW   rX   r{   r=   r   r   r   process_challenge  s$   
"
("zUser.process_challengec                 C   s   | j |kr
d| _d S d S )NT)r   ry   )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   ]  s    ""r   )T)r)   r)   )'hashlibr3   binasciir"   r   r   r	   r   r   SHA224SHA256SHA384SHA512NG_1024r   NG_4096NG_8192r   sha1sha224sha256sha384sha512rf   r   r    r'   r2   r6   r8   rA   rL   r\   rc   rm   rr   rt   ru   r   r   r   r   r   <module>   sN   

R


Y