Xj3ddlmZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z ddl mZmZddlmZmZmZddlmZGd d eZd ZGd d ZGddZy)) annotationsN)Iterable)utils)InvalidSignature)hashespadding)Cipher algorithmsmodes)HMACc eZdZy) InvalidTokenN)__name__ __module__ __qualname__g/mnt/ssd/data/Dropbox/adrian/vault-secondbrain/venv/lib/python3.12/site-packages/cryptography/fernet.pyrrsrr<ceZdZ d ddZeddZddZddZ ddZd ddZ ddZ dd Z e dd Z dd Z dd Zy)FernetNc tj|}t |dk7r t d|dd|_|dd|_y#tj$r}t d|d}~wwxYw)Nz4Fernet key must be 32 url-safe base64-encoded bytes. )base64urlsafe_b64decodebinasciiError ValueErrorlen _signing_key_encryption_key)selfkeybackendexcs r__init__zFernet.__init__s{  **3/C s8r>F  H"23x~~ F  sAA) A$$A)cRtjtjdS)Nr)rurlsafe_b64encodeosurandom)clss r generate_keyzFernet.generate_key0s'' 277rc\|j|ttjSNencrypt_at_timeinttime)r#datas rencryptzFernet.encrypt4s ##D#diik*:;;rcRtjd}|j|||S)Nr)r*r+_encrypt_from_parts)r#r4 current_timeivs rr1zFernet.encrypt_at_time7s$ ZZ^''lB??rctjd|tjtj j j}|j||jz}tt j |jtj|j}|j||jz}d|jddz|z|z}t!|j"t%j&} | j|| j} t)j*|| zS)Nr4big)length byteorder)r _check_bytesrPKCS7r AES block_sizepadderupdatefinalizer r"r CBC encryptorto_bytesr r!rSHA256rr)) r#r4r8r9rD padded_datarH ciphertext basic_partshhmacs rr7zFernet._encrypt_from_parts;s 64(z~~889@@BmmD)FOO,==  NN4// 0 IIbM  )+ %%k2Y5G5G5II  ##1#> ?    ""FMMO 4 zz|'' d(:;;rctj|\}}|d}n|ttjf}|j |||Sr/)r_get_unverified_token_datar2r3 _decrypt_data)r#tokenttl timestampr4 time_infos rdecryptzFernet.decryptTsJ ;;EB 4 ;Ic$))+./I!!$ 9==rcv| tdtj|\}}|j||||fS)Nz6decrypt_at_time() can only be used with a non-None ttl)rrrQrR)r#rSrTr8rUr4s rdecrypt_at_timezFernet.decrypt_at_time\sI ;H !;;EB 4!!$ C3FGGrcXtj|\}}|j||Sr/)rrQ_verify_signature)r#rSrUr4s rextract_timestampzFernet.extract_timestampfs* ;;EB 4 t$rc:t|ttfs td t j |}|r|ddk7rtt|dkrttj|ddd}||fS#tt jf$rtwxYw)Nztoken must be bytes or strr r=)r?) isinstancestrbytes TypeErrorrrrrrr r2 from_bytes)rSr4rUs rrQz!Fernet._get_unverified_token_datals%#u.89 9 ++E2DtAw$  t9q= NN4!9N> $8>>*   s A:: Bct|jtj}|j |dd |j |ddy#t $rtwxYw)N)r r!rrJrEverifyrr)r#r4rNs rr[zFernet._verify_signaturesX ""FMMO 4 ds  HHT#$Z    s AA#ct|%|\}}||z|krt|tz|krt|j||dd}|dd}tt j |j tj|j}|j|} | |jz } tjtj jj!} | j| } | | jz } | S#t$rtwxYw#t$rtwxYw)Nr_rg)r_MAX_CLOCK_SKEWr[r r rBr"r rG decryptorrErFrrrArCunpadder) r#r4rUrVrTr8r9rLrlplaintext_paddedrmunpaddeds rrRzFernet._decrypt_datas7  ) C3-""o- 9"" t$ !BZ"S\  NN4// 0%))B- )+ %++J7   2 2 4 4 ==!:!:;DDF??#34  ))+ +H      sD?D'D$'D7r/)r$ bytes | strr%z typing.AnyreturnNone)rqrc)r4rcrqrc)r4rcr8r2rqrc)r4rcr8r2r9rcrqrc)rSrprT int | Nonerqrc)rSrprTr2r8r2rqrc)rSrprqr2)rSrprqztuple[int, bytes])r4rcrqrr)r4rcrUr2rVztuple[int, int] | Nonerqrc)rrrr' classmethodr-r5r1r7rWrYr\ staticmethodrQr[rRrrrrrs#( ((  (&88<@<<),<27< <2>H H'*H:=H H $!!!* !  !rrcVeZdZd dZd dZd dZd dZd ddZ ddZddZ y) MultiFernetcBt|}|s td||_y)Nz1MultiFernet requires at least one Fernet instance)listr_fernets)r#fernetss rr'zMultiFernet.__init__s'w-C   rc\|j|ttjSr/r0)r#msgs rr5zMultiFernet.encrypts ##CTYY[)9::rc@|jdj||S)Nr)rzr1)r#r}r8s rr1zMultiFernet.encrypt_at_times}}Q//\BBrctj|\}}|jD]} |j||d}ntt j d}|jdj|||S#t$rY`wxYw)Nrr)rrQrzrRrr*r+r7)r#r}rUr4fpr9s rrotatezMultiFernet.rotates ;;C@ 4 A OOD)T:   ZZ^}}Q33Ay"EE    sA:: BBNcv|jD]} |j||cSt#t$rY*wxYwr/)rzrWr)r#r}rTrs rrWzMultiFernet.decryptsG A yyc**     s , 88cx|jD]} |j|||cSt#t$rY+wxYwr/)rzrYr)r#r}rTr8rs rrYzMultiFernet.decrypt_at_timesM A ((c<@@     s - 99ct|jD]} |j|cSt#t$rY)wxYwr/)rzr\r)r#r}rs rr\zMultiFernet.extract_timestampsG A **3//     s + 77)r{zIterable[Fernet])r}rcrqrc)r}rcr8r2rqrc)r}rprqrcr/)r}rprTrsrqrc)r}rprTr2r8r2rqrc)r}rprqr2) rrrr'r5r1rrWrYr\rrrrwrwsG ;C F%(8; rrw) __future__rrrr*r3typingcollections.abcr cryptographyrcryptography.exceptionsrcryptography.hazmat.primitivesrr&cryptography.hazmat.primitives.ciphersr r r #cryptography.hazmat.primitives.hmacr ExceptionrrkrrwrrrrsX #  $4:LL4 9 LL^55r