U §Ãq`Šã@s¼ddlZddlZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z mZddlmZmZmZddlmZGdd „d eƒZd ZGd d „d eƒZGd d„deƒZdS)éN)Úutils)ÚInvalidSignature)Ú _get_backend)ÚhashesÚpadding)ÚCipherÚ algorithmsÚmodes)ÚHMACc@s eZdZdS)Ú InvalidTokenN)Ú__name__Ú __module__Ú __qualname__©rrú:/tmp/pip-target-nv4zd3e_/lib/python/cryptography/fernet.pyr sr é<c@sôeZdZd!edœdd„Zeedœdd„ƒZeedœd d „Zeeed œd d „Z eeeedœdd„Z d"ee j eedœdd„Z eeeedœdd„Zeedœdd„Zeee jeefdœdd„ƒZeddœdd„Zeee j e jeefedœdd „ZdS)#ÚFernetN)ÚkeycCsLt|ƒ}t |¡}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)ÚselfrÚbackendrrrÚ__init__s  ÿzFernet.__init__)ÚreturncCst t d¡¡S)Nr)rÚurlsafe_b64encodeÚosÚurandom)ÚclsrrrÚ generate_key*szFernet.generate_key)Údatar cCs| |tt ¡ƒ¡S©N©Úencrypt_at_timeÚintÚtime)rr&rrrÚencrypt.szFernet.encrypt)r&Ú current_timer cCst d¡}| |||¡S)Nr)r"r#Ú_encrypt_from_parts)rr&r-Úivrrrr)1s zFernet.encrypt_at_time)r&r-r/r c Cs°t d|¡t tjj¡ ¡}| |¡|  ¡}t t |j ¡t   |¡|jƒ ¡}| |¡|  ¡}dt d|¡||}t|jt ¡|jd} |  |¡|   ¡} t || ¡S)Nr&ó€ú>Q©r)rÚ _check_bytesrÚPKCS7rÚAESÚ block_sizeÚpadderÚupdateÚfinalizerrr ÚCBCrÚ encryptorÚstructÚpackr rrÚSHA256rr!) rr&r-r/r7Z padded_datar;Ú ciphertextZ basic_partsÚhÚhmacrrrr.5s  ÿÿ zFernet._encrypt_from_parts)ÚtokenÚttlr cCs:t |¡\}}|dkrd}n|tt ¡ƒf}| |||¡Sr')rÚ_get_unverified_token_datar*r+Ú _decrypt_data)rrBrCÚ timestampr&Ú time_inforrrÚdecryptJs zFernet.decrypt)rBrCr-r cCs0|dkrtdƒ‚t |¡\}}| ||||f¡S)Nz6decrypt_at_time() can only be used with a non-None ttl)rrrDrE)rrBrCr-rFr&rrrÚdecrypt_at_timeRs ÿzFernet.decrypt_at_time)rBr cCst |¡\}}| |¡|Sr')rrDÚ_verify_signature)rrBrFr&rrrÚextract_timestamp\s zFernet.extract_timestampc CsŒt d|¡zt |¡}Wnttjfk r8t‚YnX|rJ|ddkrNt‚zt  d|dd…¡\}Wntj k r‚t‚YnX||fS)NrBré€r1éé ) rr3rrÚ TypeErrorÚbinasciiÚErrorr r<ÚunpackÚerror)rBr&rFrrrrDbs   z!Fernet._get_unverified_token_datacCs\t|jt ¡|jd}| |dd…¡z| |dd…¡Wntk rVt‚YnXdS)Nr2éàÿÿÿ) r rrr>rr8Úverifyrr )rr&r@rrrrJss zFernet._verify_signature)r&rFrGr c Csð|dk r0|\}}|||kr t‚|t|kr0t‚| |¡|dd…}|dd…}tt |j¡t |¡|j ƒ  ¡}|  |¡} z| |  ¡7} Wnt k r¤t‚YnXt tjj¡ ¡} |   | ¡} z| |   ¡7} Wnt k rêt‚YnX| S)NrNérT)r Ú_MAX_CLOCK_SKEWrJrrr5rr r:rÚ decryptorr8r9rrr4r6Úunpadder) rr&rFrGrCr-r/r?rXZplaintext_paddedrYZunpaddedrrrrE{s4      ÿ    zFernet._decrypt_data)N)N)r r rÚbytesrÚ classmethodr%r,r*r)r.ÚtypingÚOptionalrHrIrKÚ staticmethodÚTuplerDrJrErrrrrs2 þ  þ  ûrc@s€eZdZejedœdd„Zeedœdd„Zee edœdd „Z eedœd d „Z deej e ed œdd„Z ee e edœdd„Zd S)Ú MultiFernet)ÚfernetscCst|ƒ}|stdƒ‚||_dS)Nz1MultiFernet requires at least one Fernet instance)ÚlistrÚ_fernets)rrarrrr s ÿzMultiFernet.__init__)Úmsgr cCs| |tt ¡ƒ¡Sr'r()rrdrrrr,¨szMultiFernet.encrypt)rdr-r cCs|jd ||¡S)Nr)rcr))rrdr-rrrr)«szMultiFernet.encrypt_at_timec Csjt |¡\}}|jD]2}z| ||d¡}WqLWqtk rDYqXqt‚t d¡}|jd |||¡S)Nrr)rrDrcrEr r"r#r.)rrdrFr&ÚfÚpr/rrrÚrotate®s   zMultiFernet.rotateN)rdrCr c Cs<|jD],}z| ||¡WStk r0YqXqt‚dSr')rcrHr )rrdrCrerrrrH¼s  zMultiFernet.decrypt)rdrCr-r c Cs>|jD].}z| |||¡WStk r2YqXqt‚dSr')rcrIr )rrdrCr-rerrrrIÄs  zMultiFernet.decrypt_at_time)N)r r rr\ÚIterablerrrZr,r*r)rgr]rHrIrrrrr`Ÿs þr`)rrPr"r<r+r\Z cryptographyrZcryptography.exceptionsrZcryptography.hazmat.backendsrZcryptography.hazmat.primitivesrrZ&cryptography.hazmat.primitives.ciphersrrr Z#cryptography.hazmat.primitives.hmacr Ú Exceptionr rWÚobjectrr`rrrrÚs