a ‚oeæã@s°ddlmZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z ddlmZmZmZddlmZGdd „d eƒZd ZGd d „d ƒZGd d„dƒZdS)é)Ú annotationsN)Úutils)ÚInvalidSignature)ÚhashesÚpadding)ÚCipherÚ algorithmsÚmodes)ÚHMACc@s eZdZdS)Ú InvalidTokenN)Ú__name__Ú __module__Ú __qualname__©rrú4C:\Program Files\Certbot\pkgs\cryptography\fernet.pyr sr é<c@sØeZdZd)ddddœdd„Zedd œd d „ƒZddd œd d„Zddddœdd„Zdddddœdd„Zd*ddddœdd„Z dddddœdd„Z dddœdd„Z e dd dœd!d"„ƒZ ddd œd#d$„Zddd%dd&œd'd(„ZdS)+ÚFernetNútyping.Union[bytes, str]z typing.AnyÚNone)ÚkeyÚbackendÚreturnc Cstzt |¡}Wn0tjy>}ztdƒ|‚WYd}~n d}~00t|ƒdkrTtdƒ‚|dd…|_|dd…|_dS)Nz4Fernet key must be 32 url-safe base64-encoded bytes.é é)Úbase64Úurlsafe_b64decodeÚbinasciiÚErrorÚ ValueErrorÚlenÚ _signing_keyÚ_encryption_key)ÚselfrrÚexcrrrÚ__init__sÿþ ÿzFernet.__init__Úbytes)rcCst t d¡¡S)Nr)rÚurlsafe_b64encodeÚosÚurandom)ÚclsrrrÚ generate_key/szFernet.generate_key)ÚdatarcCs| |tt ¡ƒ¡S©N©Úencrypt_at_timeÚintÚtime)r"r+rrrÚencrypt3szFernet.encryptr/)r+Ú current_timercCst d¡}| |||¡S)Nr)r'r(Ú_encrypt_from_parts)r"r+r2Úivrrrr.6s zFernet.encrypt_at_time)r+r2r4rc Cs¨t d|¡t tjj¡ ¡}| |¡|  ¡}t t |j ¡t   |¡ƒ ¡}| |¡|  ¡}d|jddd�||}t|jt ¡ƒ} |  |¡|   ¡} t || ¡S)Nr+ó€éÚbig)ÚlengthÚ byteorder)rZ _check_bytesrÚPKCS7rÚAESÚ block_sizeÚpadderÚupdateÚfinalizerr!r ÚCBCÚ encryptorÚto_bytesr r rÚSHA256rr&) r"r+r2r4r=Z padded_datarAÚ ciphertextZ basic_partsÚhZhmacrrrr3:s(  þ ÿþýÿ zFernet._encrypt_from_partsútyping.Optional[int])ÚtokenÚttlrcCs:t |¡\}}|durd}n|tt ¡ƒf}| |||¡Sr,)rÚ_get_unverified_token_datar/r0Ú _decrypt_data)r"rGrHÚ timestampr+Ú time_inforrrÚdecryptSs zFernet.decrypt)rGrHr2rcCs0|durtdƒ‚t |¡\}}| ||||f¡S)Nz6decrypt_at_time() can only be used with a non-None ttl)rrrIrJ)r"rGrHr2rKr+rrrÚdecrypt_at_time]s ÿzFernet.decrypt_at_time)rGrcCst |¡\}}| |¡|Sr,)rrIÚ_verify_signature)r"rGrKr+rrrÚextract_timestampgs zFernet.extract_timestampztyping.Tuple[int, bytes]c Cs„t|ttfƒstdƒ‚zt |¡}Wnttjfy@t‚Yn0|rR|ddkrVt‚t |ƒdkrft‚t j |dd…dd�}||fS)Nztoken must be bytes or strré€é ér7)r9) Ú isinstanceÚstrr%Ú TypeErrorrrrrr rr/Ú from_bytes)rGr+rKrrrrIms  z!Fernet._get_unverified_token_datacCsTt|jt ¡ƒ}| |dd…¡z| |dd…¡WntyNt‚Yn0dS)Néàÿÿÿ)r r rrCr>Zverifyrr )r"r+rErrrrO‚s  zFernet._verify_signaturez'typing.Optional[typing.Tuple[int, int]])r+rKrLrc Csè|dur0|\}}|||kr t‚|t|kr0t‚| |¡|dd…}|dd…}tt |j¡t |¡ƒ  ¡}|  |¡} z| |  ¡7} Wnt yžt‚Yn0t  tjj¡ ¡} |   | ¡} z| |   ¡7} Wnt yât‚Yn0| S)NrRérX)r Ú_MAX_CLOCK_SKEWrOrrr;r!r r@Ú decryptorr>r?rrr:r<Úunpadder) r"r+rKrLrHr2r4rDr[Zplaintext_paddedr\ZunpaddedrrrrJŠs0     ÿ      zFernet._decrypt_data)N)N)r r rr$Ú classmethodr*r1r.r3rMrNrPÚ staticmethodrIrOrJrrrrrsýÿ  rc@steZdZddœdd„Zdddœdd„Zdd dd œd d „Zd ddœdd„Zdd dddœdd„Zd d d ddœdd„ZdS)Ú MultiFernetztyping.Iterable[Fernet])ÚfernetscCst|ƒ}|stdƒ‚||_dS)Nz1MultiFernet requires at least one Fernet instance)ÚlistrÚ_fernets)r"r`rrrr$¯s ÿzMultiFernet.__init__r%)ÚmsgrcCs| |tt ¡ƒ¡Sr,r-)r"rcrrrr1·szMultiFernet.encryptr/)rcr2rcCs|jd ||¡S)Nr)rbr.)r"rcr2rrrr.ºszMultiFernet.encrypt_at_timerc Csht |¡\}}|jD]0}z| ||d¡}WqJWqtyBYq0qt‚t d¡}|jd |||¡S)Nrr)rrIrbrJr r'r(r3)r"rcrKr+ÚfÚpr4rrrÚrotate½s    zMultiFernet.rotateNrF)rcrHrc Cs:|jD]*}z| ||¡WSty.Yq0qt‚dSr,)rbrMr )r"rcrHrdrrrrMËs   zMultiFernet.decrypt)rcrHr2rc Cs<|jD],}z| |||¡WSty0Yq0qt‚dSr,)rbrNr )r"rcrHr2rdrrrrNÕs   zMultiFernet.decrypt_at_time)N) r r rr$r1r.rfrMrNrrrrr_®sÿ r_)Z __future__rrrr'r0ÚtypingZ cryptographyrZcryptography.exceptionsrZcryptography.hazmat.primitivesrrZ&cryptography.hazmat.primitives.ciphersrrr Z#cryptography.hazmat.primitives.hmacr Ú Exceptionr rZrr_rrrrÚs