
    XR_w                         d Z ddlmZmZ ddlZddlZ ej        e          Zddl	m
Z
 ddlmc mZ ddlmZmZmZmZ ddlmZ dgZ G d dej        ej        ej        ej                  ZdS )	zpasslib.handlers.fshp
    )	b64encode	b64decodeN)
to_unicode)bascii_to_str	iteritemsuunicode)pbkdf1fshpc                       e Zd ZdZd ZdZej        Z e	d          Z
dZdZdZdZdZd	ZdZd
ddddZ ed eD             d  ee          D             z             Zed fd	            ZdZd fd	Zed             Zed             Zed             Z ej         e	d          ej                   Z!ed             Z"d Z#d Z$ xZ%S )r   ap  This class implements the FSHP password hash, and follows the :ref:`password-hash-api`.

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

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

    :param salt:
        Optional raw salt string.
        If not specified, one will be autogenerated (this is recommended).

    :param salt_size:
        Optional number of bytes to use when autogenerating new salts.
        Defaults to 16 bytes, but can be any non-negative value.

    :param rounds:
        Optional number of rounds to use.
        Defaults to 480000, must be between 1 and 4294967295, inclusive.

    :param variant:
        Optionally specifies variant of FSHP to use.

        * ``0`` - uses SHA-1 digest (deprecated).
        * ``1`` - uses SHA-2/256 digest (default).
        * ``2`` - uses SHA-2/384 digest.
        * ``3`` - uses SHA-2/512 digest.

    :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
    )salt	salt_sizeroundsvariantz{FSHP   Ni S    l    linear)sha1   )sha256    )sha3840   )sha512@   )r   r         c                 0    g | ]}t          |          |fS  )r	   ).0ks     7/usr/lib/python3/dist-packages/passlib/handlers/fshp.py
<listcomp>zfshp.<listcomp>_   s"    ///A'!**Q///    c                 (    g | ]\  }}|d          |fS )r   r   )r    r!   vs      r"   r#   zfshp.<listcomp>`   s$    666ca!A$q666r$   c                      t          t          |           j        di |}||                     |          |_        |S )Nr   )superr   using_norm_variantdefault_variant)clsr   kwdssubcls	__class__s       r"   r)   z
fshp.usingf   sF    'tS!!'//$//%(%6%6w%?%?F"r$   c                 B   |                     d          | _        ||                     |          }nD| j        r.| j        }|                     |          |k    sJ d|            nt	          d          || _         t          t          |           j        di | d S )Nuse_defaultszinvalid default variant: zno variant specifiedr   )	getr1   r*   r+   	TypeErrorr   r(   r   __init__)selfr   r-   r/   s      r"   r4   zfshp.__init__u   s     HH^44((11GG 	4*G%%g..'9999\c\c;e99992333"dD"**T*****r$   c                 T   t          |t                    r|                    d          }t          |t                    r,	 | j        |         }n# t
          $ r t          d          w xY wt          |t                    st          d          || j	        vrt          d          |S )Nasciizinvalid fshp variantz'fshp variant must be int or known alias)

isinstancebytesdecoder	   _variant_aliasesKeyError
ValueErrorintr3   _variant_info)r,   r   s     r"   r*   zfshp._norm_variant   s    gu%% 	.nnW--Ggw'' 	99.w7 9 9 9 !78889'3'' 	GEFFF#+++3444s   A A)c                 2    | j         | j                 d         S )Nr   r?   r   r5   s    r"   checksum_algzfshp.checksum_alg       !$,/22r$   c                 2    | j         | j                 d         S )Nr   rA   rB   s    r"   checksum_sizezfshp.checksum_size   rD   r$   z
            ^
            \{FSHP
            (\d+)\| # variant
            (\d+)\| # salt size
            (\d+)\} # rounds
            ([a-zA-Z0-9+/]+={0,3}) # digest
            $c                    t          |dd          }| j                            |          }|st          j                            |           |                    dddd          \  }}}}t          |          }t          |          }t          |          }	 t          |	                    d                    }n-# t          $ r  t          j                            |           w xY w|d |         }||d          } | ||||          S )Nr7   hashr   r   r      )r   checksumr   r   )r   _hash_regexmatchuhexcInvalidHashErrorgroupr>   r   encoder3   MalformedHashError)	r,   rH   mr   r   r   datar   chks	            r"   from_stringzfshp.from_string   s   $00O!!$'' 	/&))#...+,771Qq+;+;(FDg,,	NN	V	1T[[1122DD 	1 	1 	1&++C000	1JYJ9::ss67KKKKs   "B; ;*C%c                     | j         }| j        }t          t          ||z                       }d| j        t          |          | j        |fz  S )Nz{FSHP%d|%d|%d}%s)rJ   r   r   r   r   lenr   )r5   rU   r   rT   s       r"   	to_stringzfshp.to_string   sG    myYtCx0011!T\3t99dk4$PPPr$   c                     t          |t                    r|                    d          }t          | j        | j        || j        | j                  S )Nzutf-8)digestsecretr   r   keylen)r8   r	   rQ   r
   rC   r   r   rF   )r5   r\   s     r"   _calc_checksumzfshp._calc_checksum   sW    fg&& 	,]]7++F $9;%   	r$   )N)&__name__
__module____qualname____doc__namesetting_kwdsrM   PADDED_BASE64_CHARSchecksum_charsr   identdefault_salt_sizemax_salt_sizedefault_rounds
min_rounds
max_roundsrounds_costr+   r?   dictr   r;   classmethodr)   r   r4   r*   propertyrC   rF   recompileXrK   rV   rY   r^   __classcell__)r/   s   @r"   r   r      s       # #R D=L+NAgJJE M
 NJJK O 
 
M t/////66YY}55666	7
 
      [ G
+ + + + + +   [ 3 3 X3 3 3 X3 "*QQ     4 K L L [L"Q Q Q      r$   )rb   base64r   r   rq   logging	getLoggerr_   logpasslib.utilsr   passlib.utils.handlersutilshandlersrM   passlib.utils.compatr   r   r   r	   passlib.crypto.digestr
   __all__	HasRounds
HasRawSaltHasRawChecksumGenericHandlerr   r   r$   r"   <module>r      s$    ( ' ' ' ' ' ' ' 				 'g'11 % $ $ $ $ $ # # # # # # # # #) ) ) ) ) ) ) ) ) ) ) ) ( ( ( ( ( ( u u u u u2<(92;L u u u u ur$   