ó
øÐLac           @   s“  d  Z  d d l Z d d l Z e j e ƒ Z d d l m Z d d l m	 Z	 m
 Z
 m Z d d l m Z m Z d d l m Z m Z m Z m Z m Z d d l m Z d d l j j Z d d	 d
 d g Z d Z d „  Z d „  Z d „  Z d „  Z  d e j! e j" e j# e j$ f d „  ƒ  YZ% d	 e j" e j& e j# e j$ f d „  ƒ  YZ' d
 e j# e j$ f d „  ƒ  YZ( d e j! e j# e j$ f d „  ƒ  YZ) d S(   sF   passlib.handlers.des_crypt - traditional unix (DES) crypt and variantsiÿÿÿÿN(   t   warn(   t
   safe_cryptt
   test_cryptt
   to_unicode(   t   h64t   h64big(   t   byte_elem_valuet   ut   uascii_to_strt   unicodet   suppress_cause(   t   des_encrypt_int_blockt	   des_cryptt
   bsdi_cryptt   bigcryptt   crypt16s    c         C   s   t  d „  t |  d  ƒ Dƒ ƒ S(   sØ   convert secret to 64-bit DES key.

    this only uses the first 8 bytes of the secret,
    and discards the high 8th bit of each byte at that.
    a null parity bit is inserted after every 7th bit of the output.
    c         s   s1   |  ]' \ } } t  | ƒ d  @d | d >Vq d S(   i   i9   i   N(   R   (   t   .0t   it   c(    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pys	   <genexpr>(   s   i   (   t   sumt	   enumerate(   t   secret(    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   _crypt_secret_to_key   s    	c         C   s¬   t  | ƒ d k s t ‚ t j | ƒ } t |  t ƒ rH |  j d ƒ }  n  t |  t ƒ s] t ‚ t |  k r~ t	 j
 j t ƒ ‚ n  t |  ƒ } t | d | d ƒ } t j | ƒ S(   s    pure-python backed for des_crypti   s   utf-8i    i   (   t   lent   AssertionErrorR   t   decode_int12t
   isinstanceR	   t   encodet   bytest   _BNULLt   uht   exct   NullPasswordErrorR   R   R   R   t   encode_int64(   R   t   saltt
   salt_valuet	   key_valuet   result(    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   _raw_des_crypt+   s    c         C   sk   t  |  ƒ } d } t |  ƒ } xF | | k  rf | d } t  |  | | !ƒ } t | | ƒ | A} | } q! W| S(   s,   convert secret to DES key used by bsdi_crypti   (   R   R   R   (   R   R$   t   idxt   endt   nextt	   tmp_value(    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   _bsdi_secret_to_keyI   s    

c         C   s”   t  j | ƒ } t |  t ƒ r0 |  j d ƒ }  n  t |  t ƒ sE t ‚ t |  k rf t j	 j
 t ƒ ‚ n  t |  ƒ } t | d | | ƒ } t j | ƒ S(   s"   pure-python backend for bsdi_crypts   utf-8i    (   R   t   decode_int24R   R	   R   R   R   R   R   R   R    R   R+   R   R   R!   (   R   t   roundsR"   R#   R$   R%   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   _raw_bsdi_cryptU   s    c           B   s»   e  Z d  Z d Z d Z e j Z d Z d Z	 Z
 e j Z d Z e j e d ƒ e j e j Bƒ Z e d „  ƒ Z d	 „  Z d
 „  Z d Z e d „  ƒ Z d „  Z e d „  ƒ Z d „  Z RS(   s›  This class implements the des-crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 2 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :param bool truncate_error:
        By default, des_crypt will silently truncate passwords larger than 8 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    R   R"   t   truncate_errori   i   i   sU   
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>[./a-z0-9]{11})?
        $c         C   s@   t  | d d ƒ } | d  | d } } |  d | d | p< d  ƒ S(   Nt   asciit   hashi   R"   t   checksum(   R   t   None(   t   clsR1   R"   t   chk(    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   from_string´   s    c         C   s&   t  d ƒ |  j |  j f } t | ƒ S(   Ns   %s%s(   R   R"   R2   R   (   t   selfR1   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt	   to_stringº   s    c         C   s&   |  j  r |  j | ƒ n  |  j | ƒ S(   N(   t   use_defaultst   _check_truncate_policyt   _calc_checksum_backend(   R7   R   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   _calc_checksumÁ   s    	t   os_cryptt   builtinc         C   s+   t  d d ƒ r# |  j |  j ƒ t St Sd  S(   Nt   testt   abgOeLfPimXQo(   R   t   _set_calc_checksum_backendt   _calc_checksum_os_cryptt   Truet   False(   R4   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   _load_backend_os_cryptÐ   s    c         C   sv   t  | |  j ƒ } | d  k r+ |  j | ƒ S| j |  j ƒ sP t | ƒ d k rn t j j |  |  j | ƒ ‚ n  | d S(   Ni   i   (	   R   R"   R3   t   _calc_checksum_builtint
   startswithR   R   R   t   CryptBackendError(   R7   R   R1   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRB   Ø   s    %c         C   s   |  j  |  j ƒ t S(   N(   RA   RF   RC   (   R4   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   _load_backend_builtinç   s    c         C   s"   t  | |  j j d ƒ ƒ j d ƒ S(   NR0   (   R&   R"   R   t   decode(   R7   R   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRF   ì   s    (   R"   R/   (   R=   R>   (   t   __name__t
   __module__t   __doc__t   namet   setting_kwdsR   t   HASH64_CHARSt   checksum_charst   checksum_sizet   min_salt_sizet   max_salt_sizet
   salt_charst   truncate_sizet   ret   compileR   t   Xt   It   _hash_regext   classmethodR6   R8   R<   t   backendsRE   RB   RI   RF   (    (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR   p   s$   	
				
	c           B   sñ   e  Z d  Z d Z d Z d Z e j Z d Z	 Z
 e j Z d Z d Z d Z d	 Z e j e d
 ƒ e j e j Bƒ Z e d „  ƒ Z d „  Z e Z e d „  ƒ Z e d „  ƒ Z d „  Z d Z e d „  ƒ Z d „  Z  e d „  ƒ Z! d „  Z" RS(   s
  This class implements the BSDi-Crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 4 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        Defaults to 5001, must be between 1 and 16777215, inclusive.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include ``rounds``
        that are too small or too large, and ``salt`` strings that are too long.

        .. versionadded:: 1.6

    .. versionchanged:: 1.6
        :meth:`hash` will now issue a warning if an even number of rounds is used
        (see :ref:`bsdi-crypt-security-issues` regarding weak DES keys).
    R   R"   R-   i   i   i‰  i   iÿÿÿ t   linears   
        ^
        _
        (?P<rounds>[./a-z0-9]{4})
        (?P<salt>[./a-z0-9]{4})
        (?P<chk>[./a-z0-9]{11})?
        $c         C   sˆ   t  | d d ƒ } |  j j | ƒ } | s? t j j |  ƒ ‚ n  | j d d d ƒ \ } } } |  d t j | j	 d ƒ ƒ d | d | ƒ S(   NR0   R1   R-   R"   R5   R2   (
   R   R[   t   matchR   R   t   InvalidHashErrort   groupR   R,   R   (   R4   R1   t   mR-   R"   R5   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR6   4  s    c         C   s>   t  d ƒ t j |  j ƒ j d ƒ |  j |  j f } t | ƒ S(   Ns   _%s%s%sR0   (   R   R   t   encode_int24R-   RJ   R"   R2   R   (   R7   R1   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR8   A  s    !c         K   s?   t  t |  ƒ j |   } | j d @s; t d t j j ƒ n  | S(   Ni   sH   bsdi_crypt rounds should be odd, as even rounds may reveal weak DES keys(   t   superR   t   usingt   default_roundsR    R   R   t   PasslibSecurityWarning(   R4   t   kwdst   subcls(    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRe   N  s
    c         C   s   t  t |  ƒ j ƒ  } | d BS(   Ni   (   Rd   R   t   _generate_rounds(   R4   R-   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRj   W  s    c         K   s'   |  j  d @s t St t |  ƒ j |   S(   Ni   (   R-   RC   Rd   R   t   _calc_needs_update(   R7   Rh   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRk   e  s    R=   R>   c         C   s+   t  d d ƒ r# |  j |  j ƒ t St Sd  S(   NR?   s   _/...lLDAxARksGCHin.(   R   RA   RB   RC   RD   (   R4   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRE   t  s    c         C   s}   |  j  ƒ  } t | | ƒ } | d  k r4 |  j | ƒ S| j | d  ƒ sZ t | ƒ d k ru t j j |  | | ƒ ‚ n  | d S(   Ni	   i   iõÿÿÿ(	   R8   R   R3   RF   RG   R   R   R   RH   (   R7   R   t   configR1   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRB   |  s    &c         C   s   |  j  |  j ƒ t S(   N(   RA   RF   RC   (   R4   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRI   Š  s    c         C   s(   t  | |  j |  j j d ƒ ƒ j d ƒ S(   NR0   (   R.   R-   R"   R   RJ   (   R7   R   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRF     s    (   R"   R-   (   R=   R>   (#   RK   RL   RM   RN   RO   RR   R   RP   RQ   RS   RT   RU   Rf   t
   min_roundst
   max_roundst   rounds_costRW   RX   R   RY   RZ   R[   R\   R6   R8   RC   t   _avoid_even_roundsRe   Rj   Rk   R]   RE   RB   RI   RF   (    (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR   ó   s0   	
					
	c           B   s…   e  Z d  Z d Z d	 Z e j Z d Z Z	 e j Z
 e j e d ƒ e j e j Bƒ Z e d „  ƒ Z d „  Z e d „ Z d „  Z RS(
   sg  This class implements the BigCrypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 22 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    R   R"   i   sX   
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>([./a-z0-9]{11})+)?
        $c         C   sj   t  | d d ƒ } |  j j | ƒ } | s? t j j |  ƒ ‚ n  | j d d ƒ \ } } |  d | d | ƒ S(   NR0   R1   R"   R5   R2   (   R   R[   R_   R   R   R`   Ra   (   R4   R1   Rb   R"   R5   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR6   Ã  s    c         C   s&   t  d ƒ |  j |  j f } t | ƒ S(   Ns   %s%s(   R   R"   R2   R   (   R7   R1   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR8   Ì  s    c         C   sG   t  t |  ƒ j | d | ƒ} t | ƒ d rC t j j |  ƒ ‚ n  | S(   Nt   relaxedi   (   Rd   R   t   _norm_checksumR   R   R   R`   (   R7   R2   Rq   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyRr   Ð  s    c         C   sŸ   t  | t ƒ r! | j d ƒ } n  t | |  j j d ƒ ƒ } d } t | ƒ } xA | | k  r‘ | d } | t | | | !| d d !ƒ 7} | } qQ W| j d ƒ S(   Ns   utf-8R0   i   iõÿÿÿi÷ÿÿÿ(   R   R	   R   R&   R"   R   RJ   (   R7   R   R5   R'   R(   R)   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR<   Ù  s    
!
(   R"   (   RK   RL   RM   RN   RO   R   RP   RQ   RS   RT   RU   RW   RX   R   RY   RZ   R[   R\   R6   R8   RD   Rr   R<   (    (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR   –  s   	
					c           B   s…   e  Z d  Z d Z d Z d Z e j Z d Z	 Z
 e j Z d Z e j e d ƒ e j e j Bƒ Z e d „  ƒ Z d	 „  Z d
 „  Z RS(   s˜  This class implements the crypt16 password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 2 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :param bool truncate_error:
        By default, crypt16 will silently truncate passwords larger than 16 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    R   R"   R/   i   i   i   sU   
        ^
        (?P<salt>[./a-z0-9]{2})
        (?P<chk>[./a-z0-9]{22})?
        $c         C   sj   t  | d d ƒ } |  j j | ƒ } | s? t j j |  ƒ ‚ n  | j d d ƒ \ } } |  d | d | ƒ S(   NR0   R1   R"   R5   R2   (   R   R[   R_   R   R   R`   Ra   (   R4   R1   Rb   R"   R5   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR6   +  s    c         C   s&   t  d ƒ |  j |  j f } t | ƒ S(   Ns   %s%s(   R   R"   R2   R   (   R7   R1   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR8   4  s    c         C   sñ   t  | t ƒ r! | j d ƒ } n  |  j r: |  j | ƒ n  y t j |  j j d ƒ ƒ } Wn# t k
 r~ t	 t d ƒ ƒ ‚ n Xt
 | ƒ } t | d | d ƒ } t
 | d d !ƒ } t | d | d ƒ } t j | ƒ t j | ƒ } | j d ƒ S(	   Ns   utf-8R0   s   invalid chars in salti    i   i   i   i   (   R   R	   R   R9   R:   R   R   R"   t
   ValueErrorR
   R   R   R   R!   RJ   (   R7   R   R#   t   key1t   result1t   key2t   result2R5   (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR<   ;  s    	(   R"   R/   (   RK   RL   RM   RN   RO   RR   R   RP   RQ   RS   RT   RU   RV   RW   RX   R   RY   RZ   R[   R\   R6   R8   R<   (    (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyR   é  s   	
				(*   RM   RW   t   loggingt	   getLoggerRK   t   logt   warningsR    t   passlib.utilsR   R   R   t   passlib.utils.binaryR   R   t   passlib.utils.compatR   R   R   R	   R
   t   passlib.crypto.desR   t   passlib.utils.handlerst   utilst   handlersR   t   __all__R   R   R&   R+   R.   t   TruncateMixint   HasManyBackendst   HasSaltt   GenericHandlerR   t	   HasRoundsR   R   R   (    (    (    sU   /var/www/html/packages/venv/lib/python3.8/site-packages/passlib/handlers/des_crypt.pyt   <module>   s,    (					+ƒ+£S