o
    h                     @   s   d Z ddlmZ zddlmZ ddlmZmZ ddlm	Z	 dZ
W n ey+   dZ
Y nw dd	lZdd
lmZ dZeejdZdd Zdd Zd	a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 )#z
Implements auth methods
   )OperationalError    )default_backend)hashesserialization)paddingTFN)partial   sha1c                 C   sT   | sdS t |  }t | }t  }||dt  || | }t||S )z'Scramble used for mysql_native_password    N)sha1_newdigestupdateSCRAMBLE_LENGTH	_my_crypt)passwordmessagestage1stage2sresult r   O/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/asyncmy/auth.pyscramble_native_password   s   

r   c                 C   s6   t | }tt|D ]}||  || N  < q
t|S N)	bytearrayrangelenbytes)message1message2r   ir   r   r   r   )   s   r   c                  C   s.   zddl m}  | aW d S  ty   tdw )Nr   bindingsz='pynacl' package is required for ed25519_password auth method)naclr#   _nacl_bindingsImportErrorRuntimeErrorr"   r   r   r   
_init_nacl8   s   
r(   c                 C   sP   t | }tt |d d@ g}tt |d d@ dB g}|t| dd  | S )Nr            @   r   )r   r   )s32baba0ba31r   r   r   _scalar_clampB   s   r1   c           
      C   s   t st  t|  }t|dd }t|dd |  }t |}t |}t |}t|| |  }t |}t ||}t 	||}	||	 S )znSign a random scramble with elliptic curve Ed25519.

    Secret and public key are derived from password.
    N    )
r%   r(   hashlibsha512r   r1   !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Sr   r   r   ed25519_passwordI   s   



rA   c                    s&   |  | |  I d H }|  |S r   )write_packetread_packetcheck_error)conn	send_datapktr   r   r   
_roundtripr   s
   
rH   c                 C   sN   |d t  }t| }t|}tt|D ]}||  |||  N  < qt|S r   )r   r   r   r   r   )r   saltpassword_bytessalt_lenr!   r   r   r   _xor_passwordy   s   rL   c                 C   sP   t stdt| d |}t|t }||tjtj	t
 dt
 ddS )zm
    Encrypt 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)mgfrN   label)_have_cryptographyr'   rL   r   load_pem_public_keyr   encryptr   OAEPMGF1r   SHA1)r   rI   
public_keyr   rsa_keyr   r   r   sha2_rsa_encrypt   s   rY   c                    s   | j r| jd }t| |I d H S | r(| | _| js(| jr(t| dI d H }| r5| dd  | _| jrI| js?t	dt
| j| j| j}nd}t| |I d H S )NrM      r   z$Couldn't receive server's public keyr   )_secure	_passwordrH   is_auth_switch_requestread_allrI   _server_public_keyis_extra_auth_dataget_all_datar   rY   )rE   rG   datar   r   r   sha256_password_auth   s    

rc   c                 C   sl   | sdS t |  }t | }t ||  }t|}tt|D ]}||  || N  < q%t|S )zScramble algorithm used in cached_sha2_password fast path.

    XOR(SHA256(password), SHA256(SHA256(SHA256(password)), nonce))
    r   )r3   sha256r   r   r   r   r   )r   noncep1p2p3resr!   r   r   r   scramble_caching_sha2   s   rj   c                    s:  | j st| dI d H S | r$| | _t| j | j}t| |I d H }| s4td| d d  |	d |
 }|dkrN|  I d H }|  |S |dkrXtd| | jrft| | j d I d H S | jst| dI d H }| std	| d d  | dd  | _t| j | j| j}t| |I d H }d S )
Nr   z.caching sha2: Unknown packet for fast auth: %sr         z.caching sha2: Unknwon result for fast auth: %srM      z/caching sha2: Unknown packet for public key: %s)r\   rH   r]   r^   rI   rj   r`   r   ra   advance
read_uint8rC   rD   r[   r_   rY   )rE   rG   	scramblednrb   r   r   r   caching_sha2_password_auth   s<   

	rr   )__doc__errorsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   rQ   r&   r3   	functoolsr   r   newr   r   r   r%   r(   r1   rA   rH   rL   rY   rc   rj   rr   r   r   r   r   <module>   s4    
)