Ë
    ýQµiv(  ã                  ó€   — d dl mZ d dlZd dlmZmZmZ d dlmZ d dl	m
Z
mZ ej                  rd dlmZ  G d„ d«      Zy)	é    )ÚannotationsN)Ú
InvalidTagÚUnsupportedAlgorithmÚ_Reasons)Úciphers)Ú
algorithmsÚmodes)ÚBackendc                  óZ   — e Zd ZdZdZdZdd„Zdd„Zdd„Zdd„Z	dd„Z
dd	„Zedd
„«       Zy)Ú_CipherContexté   r   iÿÿÿ?c                ó  — || _         || _        || _        || _        d | _        t        | j                  t        j                  «      r| j                  j                  dz  | _	        nd| _	        | j                   j                  j                  «       }| j                   j                  j                  || j                   j                  j                  «      }| j                   j                  }	 |t!        |«      t!        |«      f   } || j                   ||«      }|| j                   j                  j.                  k(  rkd|j(                  › d�}	|�|	d|j(                  › d�z  }	|	dj'                  | j                   j1                  «       «      z  }	t%        |	t*        j,                  «      ‚t        |t2        j4                  «      r0| j                   j                  j7                  |j8                  «      }
nþt        |t2        j:                  «      r0| j                   j                  j7                  |j<                  «      }
n´t        |t2        j>                  «      r0| j                   j                  j7                  |j@                  «      }
njt        |tB        jD                  «      r0| j                   j                  j7                  |j@                  «      }
n | j                   j                  j.                  }
| j                   j                  jG                  ||| j                   j                  j.                  | j                   j                  j.                  | j                   j                  j.                  |«      }| j                   jI                  |d	k7  «       | j                   j                  jK                  |tM        |jN                  «      «      }| j                   jI                  |d	k7  «       t        |t2        jP                  «      �r)| j                   j                  jS                  || j                   j                  jT                  tM        |
«      | j                   j                  j.                  «      }| j                   jI                  |d	k7  «       |jV                  �’| j                   j                  jS                  || j                   j                  jX                  tM        |jV                  «      |jV                  «      }| j                   jI                  |d	k7  «       |jV                  | _        | j                   j                  jG                  || j                   j                  j.                  | j                   j                  j.                  | j                   j                  j7                  |jN                  «      |
|«      }| j                   j[                  «       }| j                   j                  }|d	k(  ru|j\                  s)|d	   j_                  |j`                  |jb                  «      s5|jd                  r4|d	   j_                  |jf                  |jh                  «      rtk        d
«      ‚| j                   jI                  |d	k7  |¬«       | j                   j                  jm                  |d	«       || _7        y # t"        $ rC t%        dj'                  |j(                  |r|j(                  n|«      t*        j,                  «      ‚w xY w)Né   r   z6cipher {} in {} mode is not supported by this backend.zcipher ú zin z mode z_is not supported by this backend (Your version of OpenSSL may be too old. Current version: {}.)r   z+In XTS mode duplicated keys are not allowed©Úerrors)8Ú_backendÚ_cipherÚ_modeÚ
_operationÚ_tagÚ
isinstancer   ÚBlockCipherAlgorithmÚ
block_sizeÚ_block_size_bytesÚ_libÚEVP_CIPHER_CTX_newÚ_ffiÚgcÚEVP_CIPHER_CTX_freeÚ_cipher_registryÚtypeÚKeyErrorr   ÚformatÚnamer   ÚUNSUPPORTED_CIPHERÚNULLÚopenssl_version_textr	   ÚModeWithInitializationVectorÚfrom_bufferÚinitialization_vectorÚModeWithTweakÚtweakÚModeWithNonceÚnoncer   ÚChaCha20ÚEVP_CipherInit_exÚopenssl_assertÚEVP_CIPHER_CTX_set_key_lengthÚlenÚkeyÚGCMÚEVP_CIPHER_CTX_ctrlÚEVP_CTRL_AEAD_SET_IVLENÚtagÚEVP_CTRL_AEAD_SET_TAGÚ_consume_errorsÚCRYPTOGRAPHY_IS_LIBRESSLÚ_lib_reason_matchÚERR_LIB_EVPÚEVP_R_XTS_DUPLICATED_KEYSÚCryptography_HAS_PROVIDERSÚERR_LIB_PROVÚPROV_R_XTS_DUPLICATED_KEYSÚ
ValueErrorÚEVP_CIPHER_CTX_set_paddingÚ_ctx)ÚselfÚbackendÚcipherÚmodeÚ	operationÚctxÚregistryÚadapterÚ
evp_cipherÚmsgÚiv_nonceÚresr   Úlibs                 úN/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ciphers.pyÚ__init__z_CipherContext.__init__   sG  € ØˆŒØˆŒØˆŒ
Ø#ˆŒØ,0ˆŒ	ä�d—l‘l¤G×$@Ñ$@ÔAØ%)§\¡\×%<Ñ%<ÀÑ%AˆDÕ"à%&ˆDÔ"à�m‰m× Ñ ×3Ñ3Ó5ˆØ�m‰m× Ñ ×#Ñ#Ø�—‘×#Ñ#×7Ñ7ó
ˆð —=‘=×1Ñ1ˆð		Øœt F›|¬T°$«ZÐ7Ñ8ˆGñ ˜TŸ]™]¨F°DÓ9ˆ
Ø˜Ÿ™×+Ñ+×0Ñ0Ò0Ø˜FŸK™K˜=¨Ð*ˆCØÐØ˜˜TŸY™Y˜K vÐ.Ñ.�Øð8ç‰f�T—]‘]×7Ñ7Ó9Ó:ñ;ˆCô ' s¬H×,GÑ,GÓHÐHä�dœE×>Ñ>Ô?Ø—}‘}×)Ñ)×5Ñ5Ø×*Ñ*ó‰Hô ˜œe×1Ñ1Ô2Ø—}‘}×)Ñ)×5Ñ5°d·j±jÓA‰HÜ˜œe×1Ñ1Ô2Ø—}‘}×)Ñ)×5Ñ5°d·j±jÓA‰HÜ˜¤
× 3Ñ 3Ô4Ø—}‘}×)Ñ)×5Ñ5°f·l±lÓC‰Hà—}‘}×)Ñ)×.Ñ.ˆHà�m‰m× Ñ ×2Ñ2ØØØ�M‰M×Ñ×#Ñ#Ø�M‰M×Ñ×#Ñ#Ø�M‰M×Ñ×#Ñ#Øó
ˆð 	�‰×$Ñ$ S¨A¡XÔ.à�m‰m× Ñ ×>Ñ>Ø”�V—Z‘Z“ó
ˆð 	�‰×$Ñ$ S¨A¡XÔ.Ü�dœEŸI™IÕ&Ø—-‘-×$Ñ$×8Ñ8ØØ—‘×"Ñ"×:Ñ:Ü�H“Ø—‘×"Ñ"×'Ñ'ó	ˆCð �M‰M×(Ñ(¨°©Ô2Ø�x‰xÐ#Ø—m‘m×(Ñ(×<Ñ<ØØ—M‘M×&Ñ&×<Ñ<Ü˜Ÿ™“MØ—H‘Hó	�ð —‘×,Ñ,¨S°A©XÔ6Ø ŸH™H�”	ð �m‰m× Ñ ×2Ñ2ØØ�M‰M×Ñ×#Ñ#Ø�M‰M×Ñ×#Ñ#Ø�M‰M×Ñ×*Ñ*¨6¯:©:Ó6ØØó
ˆð —‘×.Ñ.Ó0ˆØ�m‰m× Ñ ˆØ�!Š8à×0Ò0Ø˜1‘I×/Ñ/Ø—O‘O S×%BÑ%Bôð
 ×.Ò.Ø˜1‘I×/Ñ/Ø×$Ñ$ c×&DÑ&Dôô
 ÐJÓKÐKà�‰×$Ñ$ S¨A¡X°fÐ$Ô=ð 	�‰×Ñ×5Ñ5°c¸1Ô=Øˆ�	øôG ò 	Ü&ð#ß#)¡6Ø—K‘K©d §¢¸ó$ô ×+Ñ+óð ð	ús   Ã-Z8 Ú8A\c                óŠ   — t        t        |«      | j                  z   dz
  «      }| j                  ||«      }t	        |d | «      S )Nr   )Ú	bytearrayr4   r   Úupdate_intoÚbytes)rF   ÚdataÚbufÚns       rS   Úupdatez_CipherContext.update�   sB   € Üœ˜D›	 D×$:Ñ$:Ñ:¸QÑ>Ó?ˆØ×Ñ˜T 3Ó'ˆÜ�S˜˜!�W‹~Ðó    c                ó\  — t        |«      }t        |«      || j                  z   dz
  k  r3t        dj                  t        |«      | j                  z   dz
  «      «      ‚d}d}| j                  j
                  j                  d«      }| j                  j
                  j                  |d¬«      }| j                  j
                  j                  |«      }||k7  rÕ||z   }	||z   }
t        | j                  ||z
  «      }| j                  j                  j                  | j                  |	||
|«      }|dk(  rIt        | j                  t        j                   «      r%| j                  j#                  «        t        d«      ‚| j                  j%                  |dk7  «       ||z  }||d   z  }||k7  rŒÕ|S )Nr   z1buffer must be at least {} bytes for this payloadr   úint *T)Úrequire_writablezeIn XTS mode you must supply at least a full block in the first update call. For AES this is 16 bytes.)r4   r   rC   r$   r   r   Únewr*   ÚminÚ_MAX_CHUNK_SIZEr   ÚEVP_CipherUpdaterE   r   r   r	   ÚXTSr;   r2   )rF   rY   rZ   Útotal_data_lenÚdata_processedÚ	total_outÚoutlenÚ
baseoutbufÚ	baseinbufÚoutbufÚinbufÚinlenrQ   s                rS   rW   z_CipherContext.update_into”   s‘  € Ü˜T›ˆÜˆs‹8�~¨×(>Ñ(>Ñ>ÀÑBÒCÜðß ™&¤ T£¨T×-CÑ-CÑ!CÀaÑ!GÓHóð ð
 ˆØˆ	Ø—‘×#Ñ#×'Ñ'¨Ó0ˆØ—]‘]×'Ñ'×3Ñ3°CÈ$Ð3ÓOˆ
Ø—M‘M×&Ñ&×2Ñ2°4Ó8ˆ	à Ò.Ø )Ñ+ˆFØ Ñ.ˆEÜ˜×,Ñ,¨n¸~Ñ.MÓNˆEà—-‘-×$Ñ$×5Ñ5Ø—	‘	˜6 6¨5°%óˆCð �aŠxœJ t§z¡z´5·9±9Ô=Ø—‘×-Ñ-Ô/Ü ðCóð ð
 —‘×,Ñ,¨S°A©XÔ6Ø˜eÑ#ˆNØ˜ ™Ñ"ˆIð#  Ó.ð& Ðr]   c                óö  — | j                   | j                  k(  r;t        | j                  t        j
                  «      r| j                  €t        d«      ‚| j                  j                  j                  d| j                  «      }| j                  j                  j                  d«      }| j                  j                  j                  | j                  ||«      }|dk(  �r| j                  j                  «       }|s*t        | j                  t        j                   «      rt"        ‚| j                  j                  }| j                  j%                  |d   j'                  |j(                  |j*                  «      xsc |j,                  xr) |d   j'                  |j.                  |j0                  «      xs* |j2                  xr |d   j4                  |j6                  k(  |¬«       t        d«      ‚t        | j                  t        j                   «      rî| j                   | j8                  k(  rÕ| j                  j                  j                  d| j                  «      }| j                  j                  j;                  | j                  | j                  j                  j<                  | j                  |«      }| j                  j%                  |dk7  «       | j                  j                  j?                  |«      d d  | _         | j                  j                  jC                  | j                  «      }| j                  j%                  |dk(  «       | j                  j                  j?                  |«      d |d    S )Nz4Authentication tag must be provided when decrypting.zunsigned char[]r_   r   r   zFThe length of the provided data is not a multiple of the block length.r   )"r   Ú_DECRYPTr   r   r	   ÚModeWithAuthenticationTagr9   rC   r   r   ra   r   r   ÚEVP_CipherFinal_exrE   r;   r6   r   r2   r=   r>   Ú'EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHr@   rA   ÚPROV_R_WRONG_FINAL_BLOCK_LENGTHÚCRYPTOGRAPHY_IS_BORINGSSLÚreasonÚ*CIPHER_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHÚ_ENCRYPTr7   ÚEVP_CTRL_AEAD_GET_TAGÚbufferr   ÚEVP_CIPHER_CTX_reset)rF   rZ   ri   rQ   r   rR   Útag_bufs          rS   Úfinalizez_CipherContext.finalize·   s¾  € à�O‰O˜tŸ}™}Ò,Ü˜4Ÿ:™:¤u×'FÑ'FÔGØ—‘Ð äØFóð ð �m‰m× Ñ ×$Ñ$Ð%6¸×8NÑ8NÓOˆØ—‘×#Ñ#×'Ñ'¨Ó0ˆØ�m‰m× Ñ ×3Ñ3°D·I±I¸sÀFÓKˆØ�!‹8Ø—]‘]×2Ñ2Ó4ˆFáœj¨¯©´U·Y±YÔ?Ü Ð à—-‘-×$Ñ$ˆCØ�M‰M×(Ñ(Ø�q‘	×+Ñ+Ø—O‘OØ×?Ñ?óò ð
 ×2Ñ2ò Ø˜q™	×3Ñ3Ø×(Ñ(Ø×;Ñ;óòð ×1Ñ1ò FØ˜q™	×(Ñ(Ø×EÑEñFð ð# )ô ô& ð$óð ô �t—z‘z¤5§9¡9Ô-Ø—‘ 4§=¡=Ò0à—m‘m×(Ñ(×,Ñ,Ø! 4×#9Ñ#9óˆGð —-‘-×$Ñ$×8Ñ8Ø—	‘	Ø—‘×"Ñ"×8Ñ8Ø×&Ñ&Øó	ˆCð �M‰M×(Ñ(¨°©Ô2ØŸ™×*Ñ*×1Ñ1°'Ó:¹1Ð=ˆDŒIà�m‰m× Ñ ×5Ñ5°d·i±iÓ@ˆØ�‰×$Ñ$ S¨A¡XÔ.Ø�}‰}×!Ñ!×(Ñ(¨Ó-¨k°°q±	Ð:Ð:r]   c                ó(  — t        |«      }|| j                  j                  k  r.t        dj	                  | j                  j                  «      «      ‚|| j
                  kD  r$t        dj	                  | j
                  «      «      ‚| j                  j                  j                  | j                  | j                  j                  j                  t        |«      |«      }| j                  j                  |dk7  «       || _        | j                  «       S )Nz.Authentication tag must be {} bytes or longer.z0Authentication tag cannot be more than {} bytes.r   )r4   r   Ú_min_tag_lengthrC   r$   r   r   r   r7   rE   r:   r2   r   r}   )rF   r9   Útag_lenrQ   s       rS   Úfinalize_with_tagz _CipherContext.finalize_with_tag÷   sá   € Ü�c“(ˆØ�T—Z‘Z×/Ñ/Ò/ÜØ@×GÑGØ—J‘J×.Ñ.óóð ð
 �t×-Ñ-Ò-ÜØB×IÑIØ×*Ñ*óóð ð
 �m‰m× Ñ ×4Ñ4Ø�I‰I�t—}‘}×)Ñ)×?Ñ?ÄÀSÃÈ3ó
ˆð 	�‰×$Ñ$ S¨A¡XÔ.ØˆŒ	Ø�}‰}‹Ðr]   c           	     ó„  — | j                   j                  j                  d«      }| j                   j                  j	                  | j
                  | j                   j                  j                  || j                   j                  j                  |«      t        |«      «      }| j                   j                  |dk7  «       y )Nr_   r   )
r   r   ra   r   rd   rE   r'   r*   r4   r2   )rF   rY   ri   rQ   s       rS   Úauthenticate_additional_dataz+_CipherContext.authenticate_additional_data  sŠ   € Ø—‘×#Ñ#×'Ñ'¨Ó0ˆØ�m‰m× Ñ ×1Ñ1Ø�I‰IØ�M‰M×Ñ×#Ñ#ØØ�M‰M×Ñ×*Ñ*¨4Ó0Ü�‹Ió
ˆð 	�‰×$Ñ$ S¨A¡XÕ.r]   c                ó   — | j                   S )N)r   )rF   s    rS   r9   z_CipherContext.tag  s   € à�y‰yÐr]   N)rG   r
   rJ   ÚintÚreturnÚNone)rY   rX   r†   rX   )rY   rX   rZ   rX   r†   r…   )r†   rX   )r9   rX   r†   rX   )rY   rX   r†   r‡   )r†   ztyping.Optional[bytes])Ú__name__Ú
__module__Ú__qualname__rx   rp   rc   rT   r\   rW   r}   r�   rƒ   Úpropertyr9   © r]   rS   r   r      sG   „ Ø€HØ€HØ€Oówóró
!óF>;ó@ó*	/ð òó ñr]   r   )Ú
__future__r   ÚtypingÚcryptography.exceptionsr   r   r   Úcryptography.hazmat.primitivesr   Ú&cryptography.hazmat.primitives.ciphersr   r	   ÚTYPE_CHECKINGÚ,cryptography.hazmat.backends.openssl.backendr
   r   rŒ   r]   rS   ú<module>r”      s1   ðõ
 #ã ç NÑ NÝ 2ß Dà	×ÒÝD÷Hò Hr]   