3 lá˜_\ã@sÐddlmZmZmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZddlmZmZddlmZmZmZddlmZGd d „d eƒZd ZGd d „d eƒZGdd„deƒZdS)é)Úabsolute_importÚdivisionÚprint_functionN)Úutils)ÚInvalidSignature)Ú _get_backend)ÚhashesÚpadding)ÚCipherÚ algorithmsÚmodes)ÚHMACc@s eZdZdS)Ú InvalidTokenN)Ú__name__Ú __module__Ú __qualname__©rrú/usr/lib64/python3.6/fernet.pyrsré<c@speZdZddd„Zedd„ƒZdd„Zdd „Zd d „Zdd d „Z dd„Z dd„Z e dd„ƒZ dd„Zdd„ZdS)ÚFernetNcCsLt|ƒ}tj|ƒ}t|ƒdkr&tdƒ‚|dd…|_|dd…|_||_dS)Né z4Fernet key must be 32 url-safe base64-encoded bytes.é)rÚbase64Úurlsafe_b64decodeÚlenÚ ValueErrorÚ _signing_keyÚ_encryption_keyÚ_backend)ÚselfÚkeyÚbackendrrrÚ__init__s  zFernet.__init__cCstjtjdƒƒS)Nr)rÚurlsafe_b64encodeÚosÚurandom)ÚclsrrrÚ generate_key,szFernet.generate_keycCs|j|ttjƒƒƒS)N)Úencrypt_at_timeÚintÚtime)rÚdatarrrÚencrypt0szFernet.encryptcCstjdƒ}|j|||ƒS)Nr)r$r%Ú_encrypt_from_parts)rr+Ú current_timeÚivrrrr(3s zFernet.encrypt_at_timec Cs°tjd|ƒtjtjjƒjƒ}|j|ƒ|j ƒ}t tj|j ƒt j |ƒ|jƒjƒ}|j|ƒ|j ƒ}dtjd|ƒ||}t|jtjƒ|jd�} | j|ƒ| j ƒ} tj|| ƒS)Nr+ó€z>Q)r!)rÚ _check_bytesr ÚPKCS7r ÚAESÚ block_sizeÚpadderÚupdateÚfinalizer rr ÚCBCrÚ encryptorÚstructÚpackr rrÚSHA256rr#) rr+r.r/r5Z padded_datar9Ú ciphertextZ basic_partsÚhZhmacrrrr-7s  zFernet._encrypt_from_partscCs&tj|ƒ\}}|j|||ttjƒƒƒS)N)rÚ_get_unverified_token_dataÚ _decrypt_datar)r*)rÚtokenÚttlÚ timestampr+rrrÚdecryptJszFernet.decryptcCs.|dkrtdƒ‚tj|ƒ\}}|j||||ƒS)Nz6decrypt_at_time() can only be used with a non-None ttl)rrr?r@)rrArBr.rCr+rrrÚdecrypt_at_timeNs zFernet.decrypt_at_timecCstj|ƒ\}}|j|ƒ|S)N)rr?Ú_verify_signature)rrArCr+rrrÚextract_timestampVs zFernet.extract_timestampcCs’tjd|ƒytj|ƒ}Wnttjfk r8t‚YnX| sPtj |dƒdkrTt‚yt j d|dd…ƒ\}Wnt j k rˆt‚YnX||fS)NrAré€z>Qéé ) rr1rrÚ TypeErrorÚbinasciiÚErrorrÚsixZ indexbytesr:ÚunpackÚerror)rAr+rCrrrr?\s   z!Fernet._get_unverified_token_datac Cs\t|jtjƒ|jd�}|j|dd…ƒy|j|dd…ƒWntk rVt‚YnXdS)N)r!riàÿÿÿiàÿÿÿ) r rrr<rr6Zverifyrr)rr+r>rrrrFms zFernet._verify_signaturec Csè|dk r(|||krt‚|t|kr(t‚|j|ƒ|dd…}|dd…}ttj|jƒtj|ƒ|j ƒj ƒ}|j |ƒ}y||j ƒ7}Wnt k rœt‚YnXtjtjjƒjƒ} | j |ƒ} y| | j ƒ7} Wnt k rât‚YnX| S)NrJériàÿÿÿ)rÚ_MAX_CLOCK_SKEWrFr r r3rr r8rÚ decryptorr6r7rr r2r4Úunpadder) rr+rCrBr.r/r=rSZplaintext_paddedrTZunpaddedrrrr@us,         zFernet._decrypt_data)N)N)rrrr"Ú classmethodr'r,r(r-rDrErGÚ staticmethodr?rFr@rrrrrs   rc@s>eZdZdd„Zdd„Zdd„Zdd„Zdd d „Zd d „Zd S)Ú MultiFernetcCst|ƒ}|stdƒ‚||_dS)Nz1MultiFernet requires at least one Fernet instance)ÚlistrÚ_fernets)rZfernetsrrrr"”s zMultiFernet.__init__cCs|j|ttjƒƒƒS)N)r(r)r*)rÚmsgrrrr,œszMultiFernet.encryptcCs|jdj||ƒS)Nr)rYr()rrZr.rrrr(ŸszMultiFernet.encrypt_at_timec Csltj|ƒ\}}x>|jD]0}y|j||ddƒ}PWqtk rDYqXqWt‚tjdƒ}|jdj|||ƒS)Nrr)rr?rYr@rr$r%r-)rrZrCr+ÚfÚpr/rrrÚrotate¢s   zMultiFernet.rotateNc Cs:x0|jD]&}y |j||ƒStk r,YqXqWt‚dS)N)rYrDr)rrZrBr[rrrrD°s    zMultiFernet.decryptc Cs<x2|jD](}y|j|||ƒStk r.YqXqWt‚dS)N)rYrEr)rrZrBr.r[rrrrE¸s   zMultiFernet.decrypt_at_time)N) rrrr"r,r(r]rDrErrrrrW“s  rW)Z __future__rrrrrLr$r:r*rNZ cryptographyrZcryptography.exceptionsrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrr Z&cryptography.hazmat.primitives.ciphersr r r Z#cryptography.hazmat.primitives.hmacr Ú ExceptionrrRÚobjectrrWrrrrÚs     u