a  `\@sddlmZmZmZddlZddlZddlZddlZddlZddl Z ddl m Z ddl m Z ddlmZddlmZmZddlmZmZmZddlmZGd d d eZd ZGd d d eZGdddeZdS))absolute_importdivisionprint_functionN)utils)InvalidSignature) _get_backend)hashespadding)Cipher algorithmsmodes)HMACc@s eZdZdS) InvalidTokenN)__name__ __module__ __qualname__rr5/usr/lib/python3/dist-packages/cryptography/fernet.pyrsr<c@speZdZdddZeddZddZdd Zd d Zdd d Z ddZ ddZ e ddZ ddZddZdS)FernetNcCsLt|}t|}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__cCsttdS)Nr)rurlsafe_b64encodeosurandom)clsrrr generate_key,szFernet.generate_keycCs||ttSNencrypt_at_timeinttime)rdatarrrencrypt0szFernet.encryptcCstd}||||S)Nr)r$r%_encrypt_from_parts)rr- current_timeivrrrr*3s zFernet.encrypt_at_timec Cstd|ttjj}||| }t t|j t ||j}||| }dtd|||}t|jt|jd} | || } t|| S)Nr->Qr!)r _check_bytesr PKCS7r AES block_sizepadderupdatefinalizer rr CBCr encryptorstructZpackr rrSHA256rr#) rr-r0r1r9Z padded_datar= ciphertextZ basic_partshZhmacrrrr/7s  zFernet._encrypt_from_partscCs&t|\}}||||ttSr()r_get_unverified_token_data _decrypt_datar+r,)rtokenttl timestampr-rrrdecryptJszFernet.decryptcCs.|durtdt|\}}|||||S)Nz6decrypt_at_time() can only be used with a non-None ttl)rrrBrC)rrDrEr0rFr-rrrdecrypt_at_timeNs zFernet.decrypt_at_timecCst|\}}|||Sr()rrB_verify_signature)rrDrFr-rrrextract_timestampVs zFernet.extract_timestampc Cstd|zt|}Wnttjfy6tYn0|rLt |ddkrPtzt d|dd\}Wnt j ytYn0||fS)NrDrr3 ) rr5rr TypeErrorbinasciiErrorrsixZ indexbytesr>Zunpackerror)rDr-rFrrrrB\s   z!Fernet._get_unverified_token_datacCsZt|jt|jd}||ddz||ddWntyTtYn0dS)Nr4) r rrr?rr:Zverifyrr)rr-rArrrrIms  zFernet._verify_signaturec Cs|dur(|||krt|t|kr(t|||dd}|dd}tt|jt||j  }| |}z|| 7}Wnt ytYn0ttjj} | |} z| | 7} Wnt ytYn0| S)NrMrS)r_MAX_CLOCK_SKEWrIr r r7rr r<r decryptorr:r;rr r6r8unpadder) rr-rFrEr0r1r@rVZplaintext_paddedrWZunpaddedrrrrCus.           zFernet._decrypt_data)N)N)rrrr" classmethodr'r.r*r/rGrHrJ staticmethodrBrIrCrrrrrs    rc@s>eZdZddZddZddZddZdd d Zd d Zd S) MultiFernetcCst|}|std||_dS)Nz1MultiFernet requires at least one Fernet instance)listr_fernets)rZfernetsrrrr"s zMultiFernet.__init__cCs||ttSr(r))rmsgrrrr.szMultiFernet.encryptcCs|jd||S)Nr)r\r*)rr]r0rrrr*szMultiFernet.encrypt_at_timec Csjt|\}}|jD]2}z|||dd}WqLWqtyDYq0qttd}|jd|||S)Nrr)rrBr\rCrr$r%r/)rr]rFr-fpr1rrrrotates    zMultiFernet.rotateNc Cs:|jD]*}z|||WSty.Yq0qtdSr()r\rGr)rr]rEr^rrrrGs   zMultiFernet.decryptc Cs<|jD],}z||||WSty0Yq0qtdSr()r\rHr)rr]rEr0r^rrrrHs   zMultiFernet.decrypt_at_time)N) rrrr"r.r*r`rGrHrrrrrZs  rZ)Z __future__rrrrrOr$r>r,rQZ cryptographyrZcryptography.exceptionsrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrr Z&cryptography.hazmat.primitives.ciphersr r r Z#cryptography.hazmat.primitives.hmacr ExceptionrrUobjectrrZrrrrs     u