a
    hW                     @   s  d dl Z d dlZd dlmZmZ d dlmZ d dlmZ d dl	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mZ d dlmZ d dlmZ d d	lmZmZm Z m!Z!m"Z"m#Z#m$Z$ eG d
d deZ%eG dd deZ&dd Z'G dd de(Z)dZ*dZ+dd Z,dd Z-G dd dZ.dRddZ/dd Z0G dd dZ1d d! Z2G d"d# d#Z3d$d% Z4d&d' Z5d(d) Z6d*d+ Z7d,d- Z8d.d/ Z9d0d1 Z:d2d3 Z;d4d5 Z<d6d7 Z=d8d9 Z>d:d; Z?d<d= Z@d>ZAd?ZBd@ZCd>ZAdAZDdBZEdCZFdDZGdEZHdFZIdGZJdHZKdIZLdJdK ZMdLdM ZNdNdO ZOdPdQ ZPdS )S    N)IntEnumuniquewraps)
attrgetter)urandom)in_table_a1in_table_b1in_table_c12in_table_c21_c22in_table_c3in_table_c4in_table_c5in_table_c6in_table_c7in_table_c8in_table_c9in_table_d1in_table_d2)uuid4)Certificate)b64decb64enchhihmacuencxorc                   @   s   e Zd ZdZdZdZdZdS )ClientStage            N)__name__
__module____qualname__get_client_firstset_server_firstget_client_finalset_server_final r*   r*   F/var/www/html/efn/efnconsultor/selenium/selenium-4.34.2/scramp/core.pyr       s   r   c                   @   s   e Zd ZdZdZdZdZdS )ServerStager   r    r!   r"   N)r#   r$   r%   set_client_firstget_server_firstset_client_finalget_server_finalr*   r*   r*   r+   r,   (   s   r,   c                 C   sd   |d u r(|dkr`t d| dj dn8|dkr:t dn&||d kr`t d| |d j dd S )Nr   zThe method z must be called first.r"   z1The authentication sequence has already finished.z The next method to be called is z, not this method.)ScramExceptionname)ZStagesZcurrent_stage
next_stager*   r*   r+   _check_stage0   s    
r4   c                       s*   e Zd Zd fdd	Z fddZ  ZS )r1   Nc                    s   t  | || _d S N)super__init__server_error)selfmessager8   	__class__r*   r+   r7   >   s    zScramException.__init__c                    s(   | j d u rdn
d| j  }t  | S )N z: )r8   r6   __str__)r9   Zs_strr;   r*   r+   r>   B   s    zScramException.__str__)N)r#   r$   r%   r7   r>   __classcell__r*   r*   r;   r+   r1   =   s   r1   zSCRAM-SHA-1zSCRAM-SHA-1-PLUSSCRAM-SHA-256zSCRAM-SHA-256-PLUSzSCRAM-SHA-512zSCRAM-SHA-512-PLUSzSCRAM-SHA3-512zSCRAM-SHA3-512-PLUS)tls-server-end-point
tls-uniqueztls-unique-for-telnetc              
   C   s   | dkr| | S | dkr|jdd}t|}|j}|dv rBd}zt||}W n8 ty } z td| d| W Y d }~n
d }~0 0 |	 S td	|  d
d S )NrC   rB   T)Zbinary_form)md5sha1sha256zHash algorithm z not supported by hashlib. zChannel binding name z not recognized.)
Zget_channel_bindingZgetpeercertr   load	hash_algohashlibnew
ValueErrorr1   digest)r2   
ssl_socketZcert_binZcertrH   Zhash_objer*   r*   r+   _make_cb_dataZ   s     

rO   c                 C   s   | t | |fS r5   )rO   )r2   rM   r*   r*   r+   make_channel_bindingt   s    rP   c                   @   s   e Zd Zejdddfejdddfejdddfejdddfejdddfejddd	fejdd
dfejdd
dfdZdddZ	dddZ
dd ZdddZdS )ScramMechanismFi   r   Tr   r    r!   r"      i'        r@   rA   c                 C   sB   |t vrtd| dt  d|| _| j| \| _| _| _| _d S )NzThe mechanism name 'z1' is not supported. The supported mechanisms are .)
MECHANISMSr1   r2   MECH_LOOKUPhfuse_bindingiteration_countstrengthr9   	mechanismr*   r*   r+   r7      s    zScramMechanism.__init__Nc                 C   s2   |d u r| j }t| j|||d\}}}||||fS )N)salt)rZ   _make_auth_inforX   )r9   passwordrZ   r^   
stored_key
server_keyr*   r*   r+   make_auth_info   s    
zScramMechanism.make_auth_infoc                 C   s   t | j|\}}}||fS r5   )_c_key_stored_key_s_keyrX   )r9   salted_password_ra   rb   r*   r*   r+   make_stored_server_keys   s    z&ScramMechanism.make_stored_server_keysc                 C   s   t | |||dS )N)channel_bindings_nonce)ScramServer)r9   auth_fnrh   ri   r*   r*   r+   make_server   s    zScramMechanism.make_server)rA   )NN)NN)r#   r$   r%   rI   rE   rF   sha512sha3_512rW   r7   rc   rg   rl   r*   r*   r*   r+   rQ   x   s   

rQ   c                 C   s8   |d u rt d}t| |||}t| |\}}}|||fS )N   )r   _make_salted_passwordrd   )rX   r`   ir^   re   rf   ra   rb   r*   r*   r+   r_      s
    r_   c                 C   s`   | d u rd S t | tstdt| dkr2td| \}}|tvrJtdt |ts\tdd S )Nz=The channel_binding parameter must either be None or a tuple.r    zZThe channel_binding parameter must either be None or a tuple of two elements (type, data).zThe channel_binding parameter must either be None or a tuple with the first element a str specifying one of the channel types {CHANNEL_TYPES}.z}The channel_binding parameter must either be None or a tuple with the second element a bytes object containing the bind data.)
isinstancetupler1   lenCHANNEL_TYPESbytes)rh   channel_typeZchannel_datar*   r*   r+   _validate_channel_binding   s&    

rx   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )ScramClientNc           	         s   t |ttfstdt  dd |D } fdd|D }t|dkrXtd| t|tdd	d
 }|j|j	 | _| _	|j
| _|d u rt n|| _|| _|| _ | _d | _d S )NzFThe 'mechanisms' parameter must be a list or tuple of mechanism names.c                 s   s   | ]}t |V  qd S r5   )rQ   .0mr*   r*   r+   	<genexpr>       z'ScramClient.__init__.<locals>.<genexpr>c                    s   g | ]} d u r|j s|qS r5   )rY   rz   rh   r*   r+   
<listcomp>   r~   z(ScramClient.__init__.<locals>.<listcomp>r   z7There are no suitable mechanisms in the list provided: r[   )key)rr   listrs   r1   rx   rt   sortedr   rX   rY   r2   mechanism_name_make_noncec_nonceusernamer`   rh   stage)	r9   
mechanismsr   r`   rh   r   msZmechsmechr*   r   r+   r7      s&    zScramClient.__init__c                 C   s   t t| j| || _d S r5   )r4   r   r   r9   r3   r*   r*   r+   
_set_stage   s    zScramClient._set_stagec                 C   s,   |  tj t| j| j| j| j\| _}|S r5   )	r   r   r&   _get_client_firstr   r   rh   rY   client_first_bare)r9   client_firstr*   r*   r+   r&      s
    
zScramClient.get_client_firstc                 C   s.   |  tj || _t|| j\| _| _| _d S r5   )	r   r   r'   server_first_set_server_firstr   noncer^   
iterationsr9   r:   r*   r*   r+   r'      s
    zScramClient.set_server_firstc              
   C   s@   |  tj t| j| j| j| j| j| j	| j
| j| j	\| _}|S r5   )r   r   r(   _get_client_finalrX   r`   r^   r   r   r   r   rh   rY   server_signature)r9   Zcfinalr*   r*   r+   r(      s    
zScramClient.get_client_finalc                 C   s   |  tj t|| j d S r5   )r   r   r)   _set_server_finalr   r   r*   r*   r+   r)     s    zScramClient.set_server_final)NN)	r#   r$   r%   r7   r   r&   r'   r(   r)   r*   r*   r*   r+   ry      s    
ry   c                    s   t   fdd}|S )Nc              
      s`   z | g|R i |W S  t yZ } z*|jd urB|j| _tj| _|W Y d }~n
d }~0 0 d S r5   )r1   r8   errorr,   r/   r   )r9   argskwdsrN   fr*   r+   wrapper  s    
zset_error.<locals>.wrapperr   )r   r   r*   r   r+   	set_error  s    	r   c                   @   sV   e Zd ZdddZdd Zdd Zedd	 Zed
d Zedd Z	edd Z
dS )rj   Nc                 C   sH   t | || _|d u rt n|| _|| _d | _d | _d | _| | d S r5   )	rx   rh   r   ri   rk   r   r   r   _set_mechanism)r9   r]   rk   rh   ri   r*   r*   r+   r7     s    zScramServer.__init__c                 C   s"   |j r| jd u rtd|| _d S )NzMThe mechanism requires channel binding, and so channel_binding can't be None.)rY   rh   r1   r|   r\   r*   r*   r+   r   '  s
    zScramServer._set_mechanismc                 C   s   t t| j| || _d S r5   )r4   r,   r   r   r*   r*   r+   r   /  s    zScramServer._set_stagec                 C   sx   |  tj t|| j| j| jj\| _| _	| _
}|rPt| jj d}| | | | j	\}| _| _| _t|| _d S )Nz-PLUS)r   r,   r-   _set_client_firstri   rh   r|   rY   r   userr   rQ   r2   r   rk   ra   rb   rq   r   r^   )r9   r   upgrade_mechanismr   r^   r*   r*   r+   r-   3  s    
zScramServer.set_client_firstc                 C   s&   |  tj t| j| j| j| _| jS r5   )r   r,   r.   _get_server_firstr   r^   rq   r   r9   r*   r*   r+   r.   F  s    zScramServer.get_server_firstc              
   C   s>   |  tj t| jj|| j| j| j| j	| j
| j| jj	| _d S r5   )r   r,   r/   _set_client_finalr|   rX   ri   ra   rb   r   r   rh   rY   r   )r9   client_finalr*   r*   r+   r/   P  s    zScramServer.set_client_finalc                 C   s   |  tj t| j| jS r5   )r   r,   r0   _get_server_finalr   r   r   r*   r*   r+   r0   _  s    zScramServer.get_server_final)NN)r#   r$   r%   r7   r   r   r   r-   r.   r/   r0   r*   r*   r*   r+   rj     s   


	
rj   c                   C   s   t t ddS )N-r=   )strr   replacer*   r*   r*   r+   r   e  s    r   c                 C   s   | ||f}t d|S )N,)r   join)r   r   client_final_without_proofmsgr*   r*   r+   _make_auth_messagei  s    
r   c                 C   s   t | tt|||S r5   )r   r   saslprep)rX   r`   r^   r   r*   r*   r+   rp   n  s    rp   c                 C   s,   t | |d}t| |}t | |d}|||fS )Ns
   Client Keys
   Server Key)r   r   )rX   re   
client_keyra   rb   r*   r*   r+   rd   r  s    
rd   c                 C   s:   t | ||}t|t|}t| |}||kr6tdtd S )NzThe client keys don't match.)r   r   r   r   r1   SERVER_ERROR_INVALID_PROOF)rX   ra   auth_msgproofclient_signaturer   r   r*   r*   r+   _check_client_keyz  s
    
r   c                 C   s0   | d u rdS |r(| \}}dd| dfS dS d S )N)nzn,,pzp=z,,)yzy,,r*   )rh   rY   rw   rf   r*   r*   r+   _make_gs2_header  s    r   c                 C   sP   t | |\}}|d}|dv r$|S |dkr<| \}}|| S td| dd S )Nascii)r   r   r   zThe gs2_cbind_flag 'z' is not recognized)r   encoder1   )rh   rY   gs2_cbind_flag
gs2_headerZgs2_header_binrf   Z
cbind_datar*   r*   r+   _make_cbind_input  s    
r   c                 G   s   i }|  dD ]B}t|dk s*|d dkr<td| dt|dd  ||d < qdd	 |  dD }d
| }|D ]}||krx|  S qxt|dkrd|d  d}n
d| }td| d| d| dtd S )Nr   r    r   =z
Malformed zm message. Attributes must be separated by a ',' and each attribute must start with a letter followed by a '='r   c                 S   s   i | ]}|d  |dd qS )r   r    Nr*   )r{   rN   r*   r*   r+   
<dictcomp>  r~   z"_parse_message.<locals>.<dictcomp>r=   'zone of z, message. Expected the attribute list to be z but found ')splitrt   r1   SERVER_ERROR_OTHER_ERRORr   keys)r   ZdescZvalidationsr|   r   ZkeystrZ
validationval_strr*   r*   r+   _parse_message  s,    


r   c           	   
   C   sv   zt | }W n4 ty@ } zt|jd tW Y d }~n
d }~0 0 dd| d| f}t||\}}||| fS )Nr   r   zn=r=)r   r1   r   &SERVER_ERROR_INVALID_USERNAME_ENCODINGr   r   )	r   r   rh   rY   urN   Zbarerf   r   r*   r*   r+   r     s    &r   c                 C   sf  z|  d}|  d|d }W n ty:   tdtY n0 | d | d}z|d }|d }W n ty~   tdtY n0 d}	|dkr|d urtdtn|d	kr|rtd
tnn|dkr|d u rtdt|sd}	|\}
}|dd }||
kr&td| d|
 tntd| dt| |d d  }t	|dd}|d }|| }|d	 }||||	fS )Nr   r   z)The client sent a malformed first messager   z"The client sent malformed gs2 dataFr   z|Recieved GS2 flag 'y' which indicates that the client doesn't think the server supports channel binding, but in fact it doesr   zjReceived GS2 flag 'n' which indicates that the client doesn't require channel binding, but the server doesr   zgReceived GS2 flag 'p' which indicates that the client requires channel binding, but the server does notTr   r   zReceived channel binding name z3 but this server supports the channel binding name zReceived GS2 flag z which isn't recognizedzclient first barenrr)
indexrK   r1   r   r   
IndexError0SERVER_ERROR_SERVER_DOES_SUPPORT_CHANNEL_BINDING*SERVER_ERROR_CHANNEL_BINDING_NOT_SUPPORTED-SERVER_ERROR_UNSUPPORTED_CHANNEL_BINDING_TYPEr   )r   ri   rh   rY   Zfirst_commaZsecond_commar   r   Zgs2_charr   rw   rf   Zcb_namer   r   r   r   r   r*   r*   r+   r     sr    





r   c                 C   s"   d d|  d| d| fS )Nr   r   zs=zi=)r   )r   r^   r   r*   r*   r+   r     s    r   c                 C   s`   t | dd}d|v r&td|d  |d }|d }t|d }||sVtdt|||fS )	Nzserver firstZrsirN   The server returned the error: r   srq   zClient nonce doesn't match.)r   r1   int
startswithr   )r   r   r   r   r^   r   r*   r*   r+   r     s    

r   c	                 C   s   t |}	t| ||	|}
t| |
\}}}t||}dt| d| }t|||}t| ||}t||}t| ||}| dt| }t||fS )Nc=,r=z,p=)r   rp   rd   r   r   r   r   r   )rX   r`   Zsalt_strr   r   r   r   rh   rY   r^   re   r   ra   rb   Zcbind_inputr   r   r   Zclient_proofr   r   r*   r*   r+   r     s    

r   zinvalid-encodingzextensions-not-supportedzinvalid-proofzchannel-bindings-dont-matchz#server-does-support-channel-bindingz'server does not support channel bindingzchannel-binding-not-supportedz unsupported-channel-binding-typezunknown-userzinvalid-username-encodingzno-resourceszother-errorc	                 C   s   t |dd}	|	d }
|	d }|	d }|rDt|
t||krDtdt||sXtdtd|
 d	| }t|||}t| ||| t	| ||}t
|S )
Nzclient finalZcrpcr   r   z!The channel bindings don't match.zServer nonce doesn't match.r   r   )r   r   r   r1   (SERVER_ERROR_CHANNEL_BINDINGS_DONT_MATCHendswithr   r   r   r   r   )rX   r   ri   ra   rb   r   r   rh   rY   r   Zchan_bindingr   r   r   r   sigr*   r*   r+   r   K  s(    

r   c                 C   s   |d u rd|  S d| S )Nzv=ze=r*   )r   r   r*   r*   r+   r   p  s    r   c                 C   sB   t | ddd}d|v r(td|d  ||d kr>tdtd S )Nzserver finalvrN   r   z#The server signature doesn't match.)r   r1   r   )r:   r   r   r*   r*   r+   r   t  s    r   c                 C   s   d dd | D }td|}|s(dS t}||d rT||d sNtdtt}n|}|D ]}t|rpJ dt|rJ d	t	d
ft
dftdftdftdftdftdftdftdf|dff
D ]\}}||rt|tqq\|S )Nr=   c                 s   s&   | ]}t |st|rd n|V  qdS ) N)r	   r
   )r{   r   r*   r*   r+   r}     r~   zsaslprep.<locals>.<genexpr>NFKCr   r   zmalformed bidi sequencez$failed to strip B.1 in mapping stagez(failed to replace C.1.2 in mapping stagez unassigned code points forbiddenzcontrol characters forbiddenz private use characters forbiddenznon-char code points forbiddenzsurrogate codes forbiddenznon-plaintext chars forbiddenznon-canonical chars forbiddenz,display-modifying/deprecated chars forbiddenztagged characters forbiddenzforbidden bidi character)r   unicodedata	normalizer   r1   SERVER_ERROR_INVALID_ENCODINGr   r	   r
   r   r   r   r   r   r   r   r   r   )sourcedataZis_ral_charZis_forbidden_bidi_charr   r   r   r*   r*   r+   r     s:    r   )N)QrI   r   enumr   r   	functoolsr   operatorr   osr   Z
stringprepr   r	   r
   r   r   r   r   r   r   r   r   r   r   uuidr   Zasn1crypto.x509r   Zscramp.utilsr   r   r   r   r   r   r   r   r,   r4   	Exceptionr1   rV   ru   rO   rP   rQ   r_   rx   ry   r   rj   r   r   rp   rd   r   r   r   r   r   r   r   r   r   r   Z%SERVER_ERROR_EXTENSIONS_NOT_SUPPORTEDr   r   r   Z4SERVER_ERROR_SERVER_DOES_NOT_SUPPORT_CHANNEL_BINDINGr   r   ZSERVER_ERROR_UNKNOWN_USERr   ZSERVER_ERROR_NO_RESOURCESr   r   r   r   r   r*   r*   r*   r+   <module>   sp   <$
,
	BK	G%