
    Yh                         d Z ddlmZ 	 ddlmZ ddlmZmZ ddlm	Z	 dZ
dd	lmZ dd
lZdZdZ eej"                  d      Zd Zd Zdad Zd Zd Zd Zd Zd Zd Zd Zd Zy
# e$ r dZ
Y Nw xY w)z
Implements auth methods
   )OperationalError    )default_backend)serializationhashes)paddingTF)partialN   sha1c                 
   | syt        |       j                         }t        |      j                         }t               }|j                  |dt                |j                  |       |j                         }t	        ||      S )z'Scramble used for mysql_native_password    N)sha1_newdigestupdateSCRAMBLE_LENGTH	_my_crypt)passwordmessagestage1stage2sresults         ^/var/www/django-portfolio.reubendavern.link/venv/lib/python3.12/site-packages/pymysql/_auth.pyscramble_native_passwordr      sm    h&&(Ff$$&F
AHHW%o&'HHVXXZFVV$$r   c                     t        |       }t        t        |            D ]  }||xx   ||   z  cc<    t        |      S N)	bytearrayrangelenbytes)message1message2r   is       r   r   r   ,   sB    x F3v; !q	Xa[ 	! =r   c                  F    	 ddl m}  | ay # t        $ r t	        d      w xY w)Nr   bindingsz='pynacl' package is required for ed25519_password auth method)naclr&   _nacl_bindingsImportErrorRuntimeErrorr%   s    r   
_init_naclr+   ;   s.    
!! 
K
 	

s     c                     t        |       }t        t        |d   dz  g            }t        t        |d   dz  dz  g            }|t        | dd       z   |z   S )Nr            @   r   )r   r    )s32baba0ba31s       r   _scalar_clampr5   G   s^    	3B
	2a53;-(
)CRVc\R/012Ds1Ry!!D((r   c                 2   t         s
t                t        j                  |       j	                         }t        |dd       }t        j                  |dd |z         j	                         }t         j                  |      }t         j                  |      }t         j                  |      }t        j                  ||z   |z         j	                         }t         j                  |      }t         j                  ||      }t         j                  ||      }	||	z   S )znSign a random scramble with elliptic curve Ed25519.

    Secret and public key are derived from password.
    N    )
r(   r+   hashlibsha512r   r5   !crypto_core_ed25519_scalar_reduce&crypto_scalarmult_ed25519_base_noclampcrypto_core_ed25519_scalar_mulcrypto_core_ed25519_scalar_add)
r   scramblehr   rRAkksSs
             r   ed25519_passwordrF   N   s      	x '')A 	afA 	qv()002A 	88;A==a@A 	==a@A 	q1ux'(//1A 	88;A		6	6q!	<B55b!<A q5Lr   c                 h    | j                  |       | j                         }|j                          |S r   )write_packet_read_packetcheck_error)conn	send_datapkts      r   
_roundtriprN   w   s-    i 



COOJr   c                     |d t          }t        |       }t        |      }t        t        |            D ]  }||xx   |||z     z  cc<    t	        |      S r   )r   r   r   r   r    )r   saltpassword_bytessalt_lenr#   s        r   _xor_passwordrS   ~   sa      !Dx(N4yH3~&' 0qT!h,//0  r   c           	      >   t         st        d      t        | dz   |      }t        j                  |t                     }|j                  |t        j                  t        j                  t        j                               t        j                         d            S )zhEncrypt password with salt and public_key.

    Used for sha256_password and caching_sha2_password.
    z\'cryptography' package is required for sha256_password or caching_sha2_password auth methods    )	algorithmN)mgfrV   label)_have_cryptographyr*   rS   r   load_pem_public_keyr   encryptr   OAEPMGF1r   SHA1)r   rP   
public_keyr   rsa_keys        r   sha2_rsa_encryptra      s    
 4
 	
 Hu,d3G//
O<MNG??v{{}5kkm	
 r   c                 ~   | j                   r,t        rt        d       | j                  dz   }t	        | |      S |j                         rJ|j                         | _        | j                  s)| j                  rt        rt        d       t	        | d      }|j                         r?|j                  dd  | _        t        r%t        d| j                  j                  d             | j                  rC| j                  st        d      t        | j                  | j                  | j                        }nd	}t	        | |      S )
Nzsha256: Sending plain passwordrU   z$sha256: Requesting server public key   r   zReceived public key:
asciiz$Couldn't receive server's public keyr   )_secureDEBUGprintr   rN   is_auth_switch_requestread_allrP   server_public_keyis_extra_auth_data_datadecoder   ra   )rK   rM   datas      r   sha256_password_authro      s    ||23}}u$$%%
!!#LLN	%%$--<=T5)C
!$12*D,B,B,I,I',RS}}%%"#IJJtyy$:P:PQdD!!r   c                 ^   | syt        j                  |       j                         }t        j                  |      j                         }t        j                  ||z         j                         }t        |      }t	        t        |            D ]  }||xx   ||   z  cc<    t        |      S )zScramble algorithm used in cached_sha2_password fast path.

    XOR(SHA256(password), SHA256(SHA256(SHA256(password)), nonce))
    r   )r8   sha256r   r   r   r   r    )r   noncep1p2p3resr#   s          r   scramble_caching_sha2rw      s     		!	(	(	*B			"	"	$B	U
	#	*	*	,B
B-C3r7^ A"Q% :r   c                 $   | j                   st        | d      S |j                         rRt        rt	        d       |j                         | _        t        | j                   | j                        }t        | |      }|j                         st        d|j                  d d z        |j                  d       |j                         }|dk(  r3t        rt	        d       | j                         }|j                          |S |dk7  rt        d|z        t        rt	        d	       | j                  r*t        rt	        d
       t        | | j                   dz         S | j                   sut        | d      }|j                         st        d|j                  d d z        |j                  dd  | _        t        r$t	        | j                   j#                  d             t%        | j                   | j                  | j                         }t        | |      }y )Nr   zcaching sha2: Trying fast pathz.caching sha2: Unknown packet for fast auth: %sr      z%caching sha2: succeeded by fast path.   z.caching sha2: Unknown result for fast auth: %sz!caching sha2: Trying full auth...z:caching sha2: Sending plain password via secure connectionrU      z/caching sha2: Unknown packet for public key: %srd   )r   rN   rh   rf   rg   ri   rP   rw   rk   r   rl   advance
read_uint8rI   rJ   re   rj   rm   ra   )rK   rM   	scramblednrn   s        r   caching_sha2_password_authr      s   ==$$$
!!#23LLN	)$--C	y) !!#<syy!}L
 	
 KKNAAv9:!
AvORSSTT12||NO$ 566!!w'%%'"ACIIbqMQ  "%12$((//89DMM499d6L6LMD
T4
 Cr   )__doc__errr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   rY   r)   	functoolsr	   r8   rf   r   newr   r   r   r(   r+   r5   rF   rN   rS   ra   ro   rw   r    r   r   <module>r      s    "<DA   	7;;'% 	
)#R	!,">(9!K  s   A% %A/.A/