B \] @sdZddlZddlZddlmZddlmZ ej ej dZ eZ Gddde ddZd#dd d d Zd$d d ZgZdd ddZeddddeddddx,dD]$Zeddeddeedd rPqWedddded dd!d"[[dS)%zEWrapper to the POSIX crypt library call and associated functionality.N) SystemRandom) namedtuplez./c@seZdZdZddZdS)_MethodziClass representing a salt method per the Modular Crypt Format or the legacy 2-character crypt method.cCs d|jS)Nz)formatname)selfr!/usr/local/lib/python3.7/crypt.py__repr__sz_Method.__repr__N)__name__ __module__ __qualname____doc__r rrrr r srz name ident salt_chars total_size)roundscCsB|dkrtd}|dk r4t|ts4t|jjd|js@d}nd|jd}|jr|jddkr|dkrpd}n@t|d}|d|>krtd d |krd ksntd ||d d7}n^|jdkr|dk r d|krdksntd|d|d7}n|dk r t|d|d ddt |j D7}|S)zsGenerate a salt for the specified method. If not specified, the strongest available method will be used. Nrz+ object cannot be interpreted as an integer$2 zrounds must be a power of 2z%rounds out of the range 2**4 to 2**31Z02d)56iiɚ;z+rounds out of the range 1000 to 999_999_999zrounds=z$ doesn't support the rounds argumentcss|]}ttVqdS)N)_srchoice _saltchars).0charrrr 8szmksalt..) methods isinstanceint TypeError __class__r Zident bit_length ValueErrorjoinrangeZ salt_chars)methodrsZ log_roundsrrr mksalts2    r*cCs&|dkst|trt|}t||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)r rr*_cryptcrypt)Zwordsaltrrr r,<s r,cGsVt|f|}|td|<t||d}td|}|rRt||jkrRt|dSdS)NZMETHOD_)rrTF)rglobalsr*r,lenZ total_sizerappend)rrargsr(r-resultrrr _add_methodNs   r3ZSHA512rjZSHA256r?)byarZBLOWFISHr;ZMD51"ZCRYPT )N)N)rr+stringZ_stringZrandomrZ _SystemRandom collectionsrZ _namedtupleZ ascii_lettersdigitsrrrr*r,rr3Z_vr/rrrr s&   &