o
    U6d                     @   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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   dC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\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   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)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_clampF   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_passwordM   s   



r4   c                 C   s   |  | |  }|  |S r   )Zwrite_packet_read_packetcheck_error)connZ	send_datapktr   r   r   
_roundtripv   s   
r9   c                 C   sN   |d t  }t| }t|}tt|D ]}||  |||  N  < qt|S r   )r   r   r   r   r   )r   saltZpassword_bytesZ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mgfr=   label)_have_cryptographyr"   r;   r   Zload_pem_public_keyr   Zencryptr   ZOAEPZMGF1r   SHA1)r   r:   Z
public_keyr   Zrsa_keyr   r   r   sha2_rsa_encrypt   s   rA   c                 C   s   | j rtr	td | jd }t| |S | r-| | _| js-| jr-tr(td t| d}|	 rD|j
dd  | _trDtd| jd | jrX| jsNt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   r9   is_auth_switch_requestread_allr:   server_public_keyis_extra_auth_data_datadecoder   rA   )r7   r8   datar   r   r   sha256_password_auth   s*   




rN   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   )r+   sha256r   r   r   r   r   )r   noncep1p2Zp3resr   r   r   r   scramble_caching_sha2   s   rT   c                 C   sR  | j st| dS | r#trtd | | _t| j | j}t| |}| s2t	d|j
d d  |d | }|dkrOtrEtd |  }|  |S |dkrYt	d| tr_td	 | jrptrhtd
 t| | j d S | jst| d}| st	d|j
d d  |j
dd  | _trt| 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: %srC   )r   r9   rG   rE   rF   rH   r:   rT   rJ   r   rK   advanceZ
read_uint8r5   r6   rD   rI   rL   rA   )r7   r8   Z	scramblednrM   r   r   r   caching_sha2_password_auth   sN   



	
rZ   )__doc__errr   Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r?   r!   	functoolsr   r+   rE   r   newr   r   r   r    r#   r)   r4   r9   r;   rA   rN   rT   rZ   r   r   r   r   <module>   s6    )