3 L]d@sddlmZmZmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZddlmZmZddlmZmZmZddlmZGd d d eZd ZGd d d eZGdddeZdS))absolute_importdivisionprint_functionN)utils)InvalidSignature)default_backend)hashespadding)Cipher algorithmsmodes)HMACc@s eZdZdS) InvalidTokenN)__name__ __module__ __qualname__rr=/tmp/pip-install-wfra5znf/cryptography/cryptography/fernet.pyrsr<c@s`eZdZdddZeddZddZdd Zdd d Zd d Z e ddZ ddZ ddZ dS)FernetNcCsR|dkrt}tj|}t|dkr,td|dd|_|dd|_||_dS)N z4Fernet key must be 32 url-safe base64-encoded bytes.)rbase64urlsafe_b64decodelen ValueError _signing_key_encryption_key_backend)selfkeybackendrrr__init__s  zFernet.__init__cCstjtjdS)Nr)rurlsafe_b64encodeosurandom)clsrrr generate_key-szFernet.generate_keycCs$ttj}tjd}|j|||S)Nr)inttimer$r%_encrypt_from_parts)rdata current_timeivrrrencrypt1s  zFernet.encryptc Cstjd|tjtjjj}|j||j }t tj|j t j ||jj}|j||j }dtjd|||}t|jtj|jd} | j|| j } tj|| S)Nr+z>Q)r!)r _check_bytesr PKCS7r AES block_sizepadderupdatefinalizer rr CBCr encryptorstructpackr rrSHA256rr#) rr+r,r-r4Z padded_datar8 ciphertextZ basic_partshhmacrrrr*6s  zFernet._encrypt_from_partscCstj|\}}|j|||S)N)r_get_unverified_token_data _decrypt_data)rtokenttl timestampr+rrrdecryptIszFernet.decryptcCstj|\}}|j||S)N)rr?_verify_signature)rrArCr+rrrextract_timestampMs zFernet.extract_timestampcCstjd|ytj|}Wnttjfk r8tYnX| sPtj |ddkrTtyt j d|dd\}Wnt j k rtYnX||fS)NrArz>Q ) rr0rr TypeErrorbinasciiErrorrsix indexbytesr9unpackerror)rAr+rCrrrr?Ss   z!Fernet._get_unverified_token_datac Cs\t|jtj|jd}|j|ddy|j|ddWntk rVtYnXdS)N)r!rii) r rrr;rr5verifyrr)rr+r=rrrrEds zFernet._verify_signaturec Csttj}|dk r4|||kr$t|t|kr4t|j||dd}|dd}ttj|jt j ||j j }|j |}y||j7}Wntk rtYnXtjtjjj} | j |} y| | j7} Wntk rtYnX| S)NrIri)r(r)r_MAX_CLOCK_SKEWrEr r r2rr r7r decryptorr5r6rr r1r3unpadder) rr+rCrBr,r-r<rTZplaintext_paddedrUZunpaddedrrrr@ls.          zFernet._decrypt_data)N)N)rrrr" classmethodr'r.r*rDrF staticmethodr?rEr@rrrrrs    rc@s.eZdZddZddZddZd dd ZdS) MultiFernetcCst|}|std||_dS)Nz1MultiFernet requires at least one Fernet instance)listr_fernets)rZfernetsrrrr"s zMultiFernet.__init__cCs|jdj|S)Nr)rZr.)rmsgrrrr.szMultiFernet.encryptc Csjtj|\}}x<|jD].}y|j||d}PWqtk rBYqXqWttjd}|jdj|||S)Nrr)rr?rZr@rr$r%r*)rr[rCr+fpr-rrrrotates   zMultiFernet.rotateNc Cs:x0|jD]&}y |j||Stk r,YqXqWtdS)N)rZrDr)rr[rBr\rrrrDs    zMultiFernet.decrypt)N)rrrr"r.r^rDrrrrrXsrX) __future__rrrrrKr$r9r)rMZ cryptographyrZcryptography.exceptionsrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrr Z&cryptography.hazmat.primitives.ciphersr r r Z#cryptography.hazmat.primitives.hmacr ExceptionrrSobjectrrXrrrrs     m