a fWcw@sdZddlmZmZddlZddlZeeZddl m Z ddl m m ZddlmZmZmZmZddlmZdgZGdddejejejejZdS) zpasslib.handlers.fshp ) b64encode b64decodeN) to_unicode) bascii_to_str iteritemsuunicode)pbkdf1fshpcseZdZdZdZdZejZe dZ dZ dZ dZ dZdZd ZdZd d d d dZeddeDddeeDZed#fdd ZdZd$fdd ZeddZeddZeddZee dej Z!eddZ"dd Z#d!d"Z$Z%S)%r apThis 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_sizeroundsvariantz{FSHPNiSlZlinear)Zsha1)Zsha256 )Zsha3840)Zsha512@)rrcCsg|]}t||fqS)r).0krr9/usr/lib/python3.9/site-packages/passlib/handlers/fshp.py _zfshp.cCsg|]\}}|d|fqS)rr)rrvrrrr`rc s.tt|jfi|}|dur*|||_|S)N)superr using _norm_variantdefault_variant)clsrkwdssubcls __class__rrrfs z fshp.usingc sr|d|_|dur ||}n2|jrJ|j}|||ksRJd|fntd||_tt|jfi|dS)N use_defaultszinvalid default variant: %rzno variant specified) getr'r r! TypeErrorrrr __init__)selfrr#r%rrr*us  z fshp.__init__cCspt|tr|d}t|trHz|j|}WntyFtdYn0t|tsZtd||j vrltd|S)Nasciizinvalid fshp variantz'fshp variant must be int or known alias) isinstancebytesdecoder_variant_aliasesKeyError ValueErrorintr) _variant_info)r"rrrrr s      zfshp._norm_variantcCs|j|jdS)Nrr4rr+rrr checksum_algszfshp.checksum_algcCs|j|jdS)Nrr5r6rrr checksum_sizeszfshp.checksum_sizez ^ \{FSHP (\d+)\| # variant (\d+)\| # salt size (\d+)\} # rounds ([a-zA-Z0-9+/]+={0,3}) # digest $c Cst|dd}|j|}|s(tj||dddd\}}}}t|}t|}t|}zt| d}Wnt ytj |Yn0|d|}||d}|||||dS)Nr,hashrrr)r checksumr r) r _hash_regexmatchuhexcZInvalidHashErrorgroupr3rencoder)ZMalformedHashError) r"r9mrr r datar chkrrr from_strings      zfshp.from_stringcCs4|j}|j}tt||}d|jt||j|fS)Nz{FSHP%d|%d|%d}%s)r;r rrrlenr )r+rDr rCrrr to_stringszfshp.to_stringcCs.t|tr|d}t|j|j||j|jdS)Nzutf-8)digestsecretr r Zkeylen)r-rrAr r7r r r8)r+rIrrr_calc_checksums  zfshp._calc_checksum)N)N)&__name__ __module__ __qualname____doc__nameZ setting_kwdsr>ZPADDED_BASE64_CHARSZchecksum_charsridentZdefault_salt_sizeZ max_salt_sizeZdefault_roundsZ min_roundsZ max_roundsZ rounds_costr!r4dictrr0 classmethodrrr*r propertyr7r8recompileXr<rErGrJ __classcell__rrr%rr sN)          )rNbase64rrrTZloggingZ getLoggerrKlogZ passlib.utilsrZpasslib.utils.handlersZutilshandlersr>Zpasslib.utils.compatrrrrZpasslib.crypto.digestr __all__Z HasRoundsZ HasRawSaltZHasRawChecksumZGenericHandlerr rrrrs