o {nh(@s,dZddlmZmZddlmZddlmZddlm Z m Z zddl m Z ddl mZmZdd lmZd ZWn eyAd ZYnwdd lmZdd lZdd lZdd lZdd lZd ZdZeejdZddZddZdZ Gddde!Z"ddZ#ddZ$ddZ%ddZ&dd Z'd!d"Z(d#d$Z)d%d&Z*d S)'z Implements auth methods ) text_typePY2)CLIENT)OperationalError)byte2intint2byte)default_backend) serializationhashes)paddingTF)partialNsha1cCsT|sdSt|}t|}t}||dt|||}t||S)z'Scramble used for mysql_native_passwordN)sha1_newdigestupdateSCRAMBLE_LENGTH _my_crypt)passwordmessagestage1stage2sresultr8/usr/local/lib/python3.10/dist-packages/pymysql/_auth.pyscramble_native_password"s    rcCsBt|}tr t|}tt|D] }||||N<qt|SN) bytearrayrrangelenbytes)message1message2rirrrr0s rc@seZdZddZddZdS)RandStruct_323cCs"d|_||j|_||j|_dS)Ni?) max_valueseed1seed2)selfr*r+rrr__init__Cs zRandStruct_323.__init__cCsD|jd|j|j|_|j|jd|j|_t|jt|jS)N!)r*r+r)float)r,rrrmy_rndHszRandStruct_323.my_rndN)__name__ __module__ __qualname__r-r1rrrrr(As r(c Cstdt|}t|dt}td|}td|}t|d|dA|d|dA}t}t t tt |D]}| t t|ddq;t t|d} |} t}| D]} | t t| t| Aqa|S)zScramble for old_passwordzold password (for MySQL <4.1) is used. Upgrade your password with newer auth method. old password support will be removed in future PyMySQL versionN>LLrr@)warningswarn_hash_password_323SCRAMBLE_LENGTH_323structunpackr(ioBytesIOr!minr"writerintr1getvaluer) rr hash_pass hash_message hash_pass_nhash_message_nrand_stoutbuf_extraoutcrrrscramble_old_passwordNs"    rNcCs~d}d}d}dd|DD]"}||d@|||d>d@N}||d>|Ad@}||d@}q |d @}|d @}td ||S) Ni5W0PiqV4cSsg|] }|dvrt|qS))  )r).0xrrr ksz&_hash_password_323..?r'lir5)r<pack)rnraddnr2rMr1r2rrrr:es r:cCs|||}||Sr) write_packet _read_packet check_error)conn send_datapktrrr _roundtripxs rdcCsJt|}t|}t|}tt|D]}|||||N<qt|Sr)r r"r!r#)rsaltpassword_bytessalt_lenr&rrr _xor_passwords rhcCsPtstdt|d|}t|t}||tjtj t dt ddS)zhEncrypt password with salt and public_key. Used for sha256_password and caching_sha2_password. zEcryptography is required for sha256_password or caching_sha2_password) algorithmN)mgfrjlabel) _have_cryptography RuntimeErrorrhr load_pem_public_keyr encryptr OAEPMGF1r SHA1)rre public_keyrrsa_keyrrrsha2_rsa_encryptsrvcCs|jrtr td|jd}t||S|r-||_|js-|jr-tr(tdt|d}| rD|j dd|_trDtd|j d|jrX|jsNt dt |j|j|j}nd }t||S) Nzsha256: Sending plain passwordriz$sha256: Requesting server public keyrzReceived public key: asciiz$Couldn't receive server's public keyr)_secureDEBUGprintrrdis_auth_switch_requestread_allreserver_public_keyis_extra_auth_data_datadecoderrv)rarcdatarrrsha256_password_auths*      rcCsx|sdSt|}t|}t||}t|}tr%t|}tt|D] }||||N<q+t|S)zScramble algorithm used in cached_sha2_password fast path. XOR(SHA256(password), SHA256(SHA256(SHA256(password)), nonce)) r)hashlibsha256rr rr!r"r#)rnoncep1p2p3resr&rrrscramble_caching_sha2srcCsR|jst|dS|r#trtd||_t|j|j}t||}|s2t d|j dd| d| }|dkrOtrEtd| }||S|dkrYt d|tr_td |jrptrhtd t||jd S|jst|d }|st d |j dd|j dd|_trt|jdt|j|j|j}t||}dS)Nrzcaching sha2: Trying fast pathz.caching sha2: Unknown packet for fast auth: %srr.z%caching sha2: succeeded by fast path.z.caching sha2: Unknwon result for fast auth: %sz!caching sha2: Trying full auth...z:caching sha2: Sending plain password via secure connectionriz/caching sha2: Unknown packet for public key: %srx)rrdr|rzr{r}rerrrradvance read_uint8r_r`ryr~rrv)rarc scramblednrrrrcaching_sha2_password_authsN      r)+__doc___compatrr constantsrerrrutilrrcryptography.hazmat.backendsr cryptography.hazmat.primitivesr r )cryptography.hazmat.primitives.asymmetricr rm ImportError functoolsr rr>r<r8rzrnewrrrr;objectr(rNr:rdrhrvrrrrrrrsB