ó
Æ½òec           @   s  d  Z  d d l m Z d d l m Z d d l m Z m Z y@ d d l m	 Z	 d d l
 m Z m Z d d l m Z e Z Wn e k
 r• e Z n Xd d	 l m Z d d
 l Z d d
 l Z d d
 l Z d d
 l Z e Z d Z e e j d ƒ Z d „  Z d „  Z d Z d e  f d „  ƒ  YZ! d „  Z" d „  Z# e a$ d „  Z% d „  Z& d „  Z' d „  Z( d „  Z) d „  Z* d „  Z+ d „  Z, d „  Z- d
 S(   s   
Implements auth methods
i   (   t   PY2(   t   OperationalError(   t   byte2intt   int2byteiÿÿÿÿ(   t   default_backend(   t   serializationt   hashes(   t   padding(   t   partialNi   t   sha1c         C   sn   |  s
 d St  |  ƒ j ƒ  } t  | ƒ j ƒ  } t  ƒ  } | j | t  ƒ | j | ƒ | j ƒ  } t | | ƒ S(   s'   Scramble used for mysql_native_passwordt    (   t   sha1_newt   digestt   updatet   SCRAMBLE_LENGTHt	   _my_crypt(   t   passwordt   messaget   stage1t   stage2t   st   result(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   scramble_native_password!   s    	c         C   s\   t  |  ƒ } t r! t  | ƒ } n  x. t t | ƒ ƒ D] } | | c | | N<q4 Wt | ƒ S(   N(   t	   bytearrayR    t   ranget   lent   bytes(   t   message1t   message2R   t   i(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyR   /   s    i   t   RandStruct_323c           B   s   e  Z d  „  Z d „  Z RS(   c         C   s-   d |  _  | |  j  |  _ | |  j  |  _ d  S(   Niÿÿÿ?(   t	   max_valuet   seed1t   seed2(   t   selfR    R!   (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   __init__B   s    	c         C   sV   |  j  d |  j |  j |  _  |  j  |  j d |  j |  _ t |  j  ƒ t |  j ƒ S(   Ni   i!   (   R    R!   R   t   float(   R"   (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   my_rndG   s    (   t   __name__t
   __module__R#   R%   (    (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyR   @   s   	c         C   s?  t  j d ƒ t |  ƒ } t | t  ƒ } t j d | ƒ } t j d | ƒ } t | d | d A| d | d Aƒ } t j ƒ  } xJ t	 t
 t t | ƒ ƒ ƒ D]- } | j t t | j ƒ  d ƒ d ƒ ƒ qœ Wt t | j ƒ  d ƒ ƒ }	 | j ƒ  }
 t j ƒ  } x1 |
 D]) } | j t t | ƒ t |	 ƒ Aƒ ƒ qW| j ƒ  S(   s   Scramble for old_passwords”   old password (for MySQL <4.1) is used.  Upgrade your password with newer auth method.
old password support will be removed in future PyMySQL versions   >LLi    i   i   i@   (   t   warningst   warnt   _hash_password_323t   SCRAMBLE_LENGTH_323t   structt   unpackR   t   iot   BytesIOR   t   minR   t   writeR   t   intR%   t   getvalueR   (   R   R   t	   hash_passt   hash_messaget   hash_pass_nt   hash_message_nt   rand_stt   outbuft   _t   extrat   outt   c(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   scramble_old_passwordM   s     $"+'c         C   sµ   d } d } d } xy g  |  D] } | d k r t  | ƒ ^ q D]L } | | d @| | | d	 >d
 @N} | | d	 >| Ad
 @} | | d
 @} q> W| d @} | d @} t j d | | ƒ S(   Ni5W0Pi   iqV4t    s   	i    i	   i?   i   Iÿÿÿÿ    i   i   s   >LL(   R?   s   	i    i	   I   €    iÿÿÿI   €    iÿÿÿ(   R   R,   t   pack(   R   t   nrt   addt   nr2t   xR=   t   r1t   r2(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyR*   d   s    2"

c          C   s>   y d d l  m }  |  a Wn t k
 r9 t d ƒ ‚ n Xd  S(   Niÿÿÿÿ(   t   bindingss=   'pynacl' package is required for ed25519_password auth method(   t   naclRG   t   _nacl_bindingst   ImportErrort   RuntimeError(   RG   (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt
   _init_naclz   s
    
c         C   sc   t  |  ƒ } t t  | d d @g ƒ ƒ } t t  | d d @d Bg ƒ ƒ } | t |  d d !ƒ | S(   Ni    iø   i   i   i@   i   (   R   R   (   t   s32t   bat   ba0t   ba31(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   _scalar_clampƒ   s    !c   
      C   s×   t  s t ƒ  n  t j |  ƒ j ƒ  } t | d  ƒ } t j | d | ƒ j ƒ  } t  j | ƒ } t  j | ƒ } t  j | ƒ } t j | | | ƒ j ƒ  } t  j | ƒ } t  j | | ƒ } t  j	 | | ƒ }	 | |	 S(   sn   Sign a random scramble with elliptic curve Ed25519.

    Secret and public key are derived from password.
    i    (
   RI   RL   t   hashlibt   sha512R   RQ   t!   crypto_core_ed25519_scalar_reducet&   crypto_scalarmult_ed25519_base_noclampt   crypto_core_ed25519_scalar_mult   crypto_core_ed25519_scalar_add(
   R   t   scramblet   hR   t   rt   Rt   At   kt   kst   S(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   ed25519_passwordŠ   s    
c         C   s'   |  j  | ƒ |  j ƒ  } | j ƒ  | S(   N(   t   write_packett   _read_packett   check_error(   t   connt	   send_datat   pkt(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt
   _roundtrip³   s    
c         C   sm   | t   } t |  ƒ } t | ƒ } t | ƒ } x2 t t | ƒ ƒ D] } | | c | | | N<qA Wt | ƒ S(   N(   R   R   R   R   R   (   R   t   saltt   password_bytest   salt_lenR   (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   _xor_passwordº   s    
c      	   C   s}   t  s t d ƒ ‚ n  t |  d | ƒ } t j | t ƒ  ƒ } | j | t j d t j	 d t
 j ƒ  ƒ d t
 j ƒ  d d ƒ ƒ S(   sh   Encrypt password with salt and public_key.

    Used for sha256_password and caching_sha2_password.
    s\   'cryptography' package is required for sha256_password or caching_sha2_password auth methodss    t   mgft	   algorithmt   labelN(   t   _have_cryptographyRK   Rk   R   t   load_pem_public_keyR   t   encryptR   t   OAEPt   MGF1R   t   SHA1t   None(   R   Rh   t
   public_keyR   t   rsa_key(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   sha2_rsa_encryptÆ   s    	c         C   s  |  j  r1 t r d GHn  |  j d } t |  | ƒ S| j ƒ  r‚ | j ƒ  |  _ |  j r‚ |  j r‚ t rm d GHn  t |  d ƒ } q‚ n  | j ƒ  rÁ | j	 d |  _ t rÁ d |  j j
 d ƒ f GHqÁ n  |  j r |  j sâ t d ƒ ‚ n  t |  j |  j |  j ƒ } n d	 } t |  | ƒ S(
   Ns   sha256: Sending plain passwords    s$   sha256: Requesting server public keys   i   s   Received public key:
t   asciis$   Couldn't receive server's public keyR
   (   t   _securet   DEBUGR   Rg   t   is_auth_switch_requestt   read_allRh   t   server_public_keyt   is_extra_auth_datat   _datat   decodeR   Rx   (   Rd   Rf   t   data(    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   sha256_password_authÙ   s*    			c         C   s©   |  s
 d St  j |  ƒ j ƒ  } t  j | ƒ j ƒ  } t  j | | ƒ j ƒ  } t | ƒ } t rn t | ƒ } n  x. t t | ƒ ƒ D] } | | c | | N<q Wt | ƒ S(   sƒ   Scramble algorithm used in cached_sha2_password fast path.

    XOR(SHA256(password), SHA256(SHA256(SHA256(password)), nonce))
    R
   (   RR   t   sha256R   R   R    R   R   R   (   R   t   noncet   p1t   p2t   p3t   resR   (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   scramble_caching_sha2ø   s    c         C   sÊ  |  j  s t |  d ƒ S| j ƒ  rf t r0 d GHn  | j ƒ  |  _ t |  j  |  j ƒ } t |  | ƒ } n  | j ƒ  sŒ t d | j	 d  ƒ ‚ n  | j
 d ƒ | j ƒ  } | d k rÙ t r¿ d GHn  |  j ƒ  } | j ƒ  | S| d k rø t d | ƒ ‚ n  t rd	 GHn  |  j r1t rd
 GHn  t |  |  j  d ƒ S|  j sœt |  d ƒ } | j ƒ  sot d | j	 d  ƒ ‚ n  | j	 d |  _ t rœ|  j j d ƒ GHqœn  t |  j  |  j |  j ƒ } t |  | ƒ } d  S(   NR
   s   caching sha2: Trying fast paths.   caching sha2: Unknown packet for fast auth: %si   i   s%   caching sha2: succeeded by fast path.i   s.   caching sha2: Unknwon result for fast auth: %ss!   caching sha2: Trying full auth...s:   caching sha2: Sending plain password via secure connections    s   s/   caching sha2: Unknown packet for public key: %sRy   (   R   Rg   R|   R{   R}   Rh   RŠ   R   R   R€   t   advancet
   read_uint8Rb   Rc   Rz   R~   R   Rx   (   Rd   Rf   t	   scrambledt   nR‚   (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   caching_sha2_password_auth  sJ    	
		(.   t   __doc__t   _compatR    t   errR   t   utilR   R   t   cryptography.hazmat.backendsR   t   cryptography.hazmat.primitivesR   R   t)   cryptography.hazmat.primitives.asymmetricR   t   TrueRo   RJ   t   Falset	   functoolsR   RR   R.   R,   R(   R{   R   t   newR   R   R   R+   t   objectR   R>   R*   RI   RL   RQ   R`   Rg   Rk   Rx   Rƒ   RŠ   R   (    (    (    s:   /navires/venv/lib/python2.7/site-packages/pymysql/_auth.pyt   <module>   sD   

								)					