3 \Hã@sìdZddlZddlZddlmZddlmZ ej ej dZ eƒZ Gdd„de ddƒƒZdd d „Zdd d „Zed dddƒZeddddƒZeddddƒZeddddƒZgZx:eeeefD]*ZedeƒZer¶eeƒejkr¶ejeƒq¶W[[dS)zEWrapper to the POSIX crypt library call and associated functionality.éN)Ú SystemRandom)Ú namedtuplez./c@seZdZdZdd„ZdS)Ú_MethodziClass representing a salt method per the Modular Crypt Format or the legacy 2-character crypt method.cCs dj|jƒS)Nz)ÚformatÚname)Úself©rú/usr/lib64/python3.6/crypt.pyÚ__repr__sz_Method.__repr__N)Ú__name__Ú __module__Ú __qualname__Ú__doc__r rrrr r srz name ident salt_chars total_sizecCsH|dkrtd}|jr"dj|jƒnd}|djdd„t|jƒDƒƒ7}|S)zsGenerate a salt for the specified method. If not specified, the strongest available method will be used. Nrz${}$Úcss|]}tjtƒVqdS)N)Ú_srZchoiceÚ _saltchars)Ú.0Úcharrrr ú szmksalt..)ÚmethodsZidentrÚjoinÚrangeZ salt_chars)ÚmethodÚsrrr Úmksalts rcCs&|dkst|tƒrt|ƒ}tj||ƒS)aRReturn a string representing the one-way hash of a password, with a salt prepended. If ``salt`` is not specified or is ``None``, the strongest available method will be selected and a salt generated. Otherwise, ``salt`` may be one of the ``crypt.METHOD_*`` values, or a string as returned by ``crypt.mksalt()``. N)Ú isinstancerrÚ_cryptÚcrypt)ZwordZsaltrrr r#s rZCRYPTéé ZMD5Ú1éé"ZSHA256Ú5éé?ZSHA512Ú6éjr)N)N)rrÚstringZ_stringZrandomrZ _SystemRandomÚ collectionsrZ _namedtupleZ ascii_lettersZdigitsrrrrrZ METHOD_CRYPTZ METHOD_MD5Z METHOD_SHA256Z METHOD_SHA512rÚ_methodZ_resultÚlenZ total_sizeÚappendrrrr Ús&