a
    ~g                     @   s   d Z ddlmZ z0ddlmZ ddlmZmZ ddlm	Z	 dZ
W n eyV   dZ
Y n0 dd	lmZ dd
lZd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)serializationhashes)paddingTF)partialN   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messageZstage1Zstage2sresult r   R/var/www/html/emsaiapi.evdpl.com/venv/lib/python3.9/site-packages/pymysql/_auth.pyscramble_native_password   s    
r   c                 C   s6   t | }tt|D ]}||  || N  < qt|S N)	bytearrayrangelenbytes)Zmessage1Zmessage2r   ir   r   r   r   ,   s    r   c                  C   s4   zddl m}  | aW n ty.   tdY n0 d S )Nr   bindingsz='pynacl' package is required for ed25519_password auth method)Znaclr   _nacl_bindingsImportErrorRuntimeErrorr   r   r   r   
_init_nacl;   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   )Zs32baZba0Zba31r   r   r   _scalar_clampG   s    r)   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   r)   Z!crypto_core_ed25519_scalar_reduceZ&crypto_scalarmult_ed25519_base_noclampZcrypto_core_ed25519_scalar_mulZcrypto_core_ed25519_scalar_add)
r   Zscramblehr   rRAkksSr   r   r   ed25519_passwordN   s    



r4   c                 C   s   |  | |  }|  |S r   )write_packet_read_packetcheck_error)conn	send_datapktr   r   r   
_roundtripw   s    
r;   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_password~   s    r?   c                 C   sP   t stdt| d |}t|t }||tjtj	t
 dt
 d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)ZmgfrA   label)_have_cryptographyr"   r?   r   Zload_pem_public_keyr   Zencryptr   ZOAEPZMGF1r   SHA1)r   r<   
public_keyr   Zrsa_keyr   r   r   sha2_rsa_encrypt   s    rF   c                 C   s   | j r&trtd | jd }t| |S | rZ| | _| jsZ| jrZtrPtd t| d}|	 r|j
dd  | _trtd| jd | jr| jstdt| j| j| j}nd	}t| |S )
Nzsha256: Sending plain passwordr@   z$sha256: Requesting server public key   r   zReceived public key:
asciiz$Couldn't receive server's public keyr   )_secureDEBUGprintr   r;   is_auth_switch_requestread_allr<   server_public_keyis_extra_auth_data_datadecoder   rF   )r8   r:   datar   r   r   sha256_password_auth   s*    



rS   c                 C   sl   | sdS t |  }t | }t ||  }t|}tt|D ]}||  || N  < qJt|S )zScramble algorithm used in cached_sha2_password fast path.

    XOR(SHA256(password), SHA256(SHA256(SHA256(password)), nonce))
    r   )r+   sha256r   r   r   r   r   )r   nonceZp1Zp2Zp3resr   r   r   r   scramble_caching_sha2   s    rW   c                 C   sX  | j st| dS | rFtr$td | | _t| j | j}t| |}| sdt	d|j
d d  |d | }|dkrtrtd |  }|  |S |dkrt	d| trtd	 | jrtrtd
 t| | j d S | js8t| d}| st	d|j
d d  |j
dd  | _tr8t| jd t| j | j| j}t| |}d S )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 connectionr@      z/caching sha2: Unknown packet for public key: %srH   )r   r;   rL   rJ   rK   rM   r<   rW   rO   r   rP   advance
read_uint8r6   r7   rI   rN   rQ   rF   )r8   r:   Z	scramblednrR   r   r   r   caching_sha2_password_auth   sN    


	


r^   )__doc__errr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   rC   r!   	functoolsr   r+   rJ   r   newr   r   r   r    r#   r)   r4   r;   r?   rF   rS   rW   r^   r   r   r   r   <module>   s2   
)