§
    pïg}(  ã                   ór   — 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dS )é    N)Ú
InvalidTagÚUnsupportedAlgorithmÚ_Reasons)Úciphers)Ú
algorithmsÚmodes)ÚBackendc                   ó°   — e Zd ZdZdZdZdddeddfd	„Zd
edefd„Z	d
ededefd„Z
defd„Zdedefd„Zd
eddfd„Zedej        e         fd„¦   «         ZdS )Ú_CipherContexté   r   iÿÿÿ?Úbackendr	   Ú	operationÚreturnNc                 ó¤  — || _         || _        || _        || _        d | _        t          | j        t          j        ¦  «        r| j        j        dz  | _	        nd| _	        | j         j
                             ¦   «         }| j         j                             || j         j
        j        ¦  «        }| j         j        }	 |t!          |¦  «        t!          |¦  «        f         }nJ# t"          $ r= t%          d                     |j        |r|j        n|¦  «        t*          j        ¦  «        ‚w xY w || j         ||¦  «        }|| j         j        j        k    rxd                     |¦  «        }	|�|	d                     |¦  «        z  }	|	d                     | j                              ¦   «         ¦  «        z  }	t%          |	t*          j        ¦  «        ‚t          |t2          j        ¦  «        r%| j         j                             |j        ¦  «        }
nÎt          |t2          j        ¦  «        r%| j         j                             |j        ¦  «        }
n�t          |t2          j        ¦  «        r%| j         j                             |j         ¦  «        }
nPt          |tB          j"        ¦  «        r%| j         j                             |j         ¦  «        }
n| j         j        j        }
| j         j
         #                    ||| j         j        j        | j         j        j        | j         j        j        |¦  «        }| j          $                    |dk    ¦  «         | j         j
         %                    |tM          |j'        ¦  «        ¦  «        }| j          $                    |dk    ¦  «         t          |t2          j(        ¦  «        rä| j         j
         )                    || j         j
        j*        tM          |
¦  «        | j         j        j        ¦  «        }| j          $                    |dk    ¦  «         |j+        �r| j         j
         )                    || j         j
        j,        tM          |j+        ¦  «        |j+        ¦  «        }| j          $                    |dk    ¦  «         |j+        | _        | j         j
         #                    || j         j        j        | j         j        j        | j         j                             |j'        ¦  «        |
|¦  «        }| j          -                    ¦   «         }| j         j
        }|dk    ri|j.        r&|d          /                    |j0        |j1        ¦  «        s-|j2        r5|d          /                    |j3        |j4        ¦  «        rtk          d¦  «        ‚| j          $                    |dk    |¬	¦  «         | j         j
         6                    |d¦  «         || _7        d S )
Né   r   z6cipher {} in {} mode is not supported by this backend.zcipher {0.name} zin {0.name} 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_OPENSSL_111D_OR_GREATERÚ_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)Úselfr   ÚcipherÚmoder   Ú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__   sE  € ð  ˆŒØˆŒØˆŒ
Ø#ˆŒØ,0ˆŒ	å�d”l¥GÔ$@ÑAÔAð 	'Ø%)¤\Ô%<ÀÑ%AˆDÔ"Ð"à%&ˆDÔ"àŒmÔ ×3Ò3Ñ5Ô5ˆØŒmÔ ×#Ò#Ø�”Ô#Ô7ñ
ô 
ˆð ”=Ô1ˆð		Ø�t F™|œ|­T°$©Z¬ZÐ7Ô8ˆGˆGøÝð 	ð 	ð 	Ý&ð#ß#)¢6Ø”K¨dÐ!< ¤ ¸ñ$ô $õ Ô+ñô ð ð	øøøð �W˜Tœ]¨F°DÑ9Ô9ˆ
Ø˜œÔ+Ô0Ò0Ð0Ø$×+Ò+¨FÑ3Ô3ˆCØÐØÐ*×1Ò1°$Ñ7Ô7Ñ7�Øð8çŠf�T”]×7Ò7Ñ9Ô9Ñ:Ô:ñ;ˆCõ ' s­HÔ,GÑHÔHÐHå�d�EÔ>Ñ?Ô?ð 	/Ø”}Ô)×5Ò5ØÔ*ñô ˆHˆHõ ˜�eÔ1Ñ2Ô2ð 	/Ø”}Ô)×5Ò5°d´jÑAÔAˆHˆHÝ˜�eÔ1Ñ2Ô2ð 	/Ø”}Ô)×5Ò5°d´jÑAÔAˆHˆHÝ˜¥
Ô 3Ñ4Ô4ð 	/Ø”}Ô)×5Ò5°f´lÑCÔCˆHˆHà”}Ô)Ô.ˆHàŒmÔ ×2Ò2ØØØŒMÔÔ#ØŒMÔÔ#ØŒMÔÔ#Øñ
ô 
ˆð 	Œ×$Ò$ S¨A¢XÑ.Ô.Ð.àŒmÔ ×>Ò>Ø•�V”Z‘”ñ
ô 
ˆð 	Œ×$Ò$ S¨A¢XÑ.Ô.Ð.Ý�d�EœIÑ&Ô&ð 	%Ø”-Ô$×8Ò8ØØ”Ô"Ô:Ý�H‘”Ø”Ô"Ô'ñ	ô ˆCð ŒM×(Ò(¨°ªÑ2Ô2Ð2ØŒxÐ#Ø”mÔ(×<Ò<ØØ”MÔ&Ô<Ý˜œ‘M”MØ”Hñ	ô �ð ”×,Ò,¨S°AªXÑ6Ô6Ð6Ø œH�”	ð ŒmÔ ×2Ò2ØØŒMÔÔ#ØŒMÔÔ#ØŒMÔ×*Ò*¨6¬:Ñ6Ô6ØØñ
ô 
ˆð ”×.Ò.Ñ0Ô0ˆØŒmÔ ˆØ�!Š8ˆ8àÔ8ð ð ˜1”I×/Ò/Ø”O SÔ%Bñô ð ð Ô.ð ð ˜1”I×/Ò/ØÔ$ cÔ&Dñô ð õ ÐJÑKÔKÐKàŒ×$Ò$ S¨A¢X°fÐ$Ñ=Ô=Ð=ð 	ŒÔ×5Ò5°c¸1Ñ=Ô=Ð=ØˆŒ	ˆ	ˆ	s   Â9$C ÃAD%Údatac                 óª   — t          t          |¦  «        | j        z   dz
  ¦  «        }|                      ||¦  «        }t	          |d |…         ¦  «        S )Nr   )Ú	bytearrayr5   r   Úupdate_intoÚbytes)rG   rT   ÚbufÚns       rR   Úupdatez_CipherContext.update�   sK   € Ý�˜D™	œ	 DÔ$:Ñ:¸QÑ>Ñ?Ô?ˆØ×Ò˜T 3Ñ'Ô'ˆÝ�S˜˜!˜”W‰~Œ~Ðó    rY   c                 ó<  — t          |¦  «        }t          |¦  «        || j        z   dz
  k     r:t          d                     t          |¦  «        | j        z   dz
  ¦  «        ¦  «        ‚d}d}| j        j                             d¦  «        }| j        j                             |d¬¦  «        }| j        j                             |¦  «        }||k    rË||z   }	||z   }
t          | j	        ||z
  ¦  «        }| j        j
                             | j        |	||
|¦  «        }|dk    rGt          | j        t          j        ¦  «        r(| j                             ¦   «          t          d¦  «        ‚| j                             |dk    ¦  «         ||z  }||d         z  }||k    °Ë|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.)r5   r   rD   r%   r   r   Únewr+   ÚminÚ_MAX_CHUNK_SIZEr   ÚEVP_CipherUpdaterF   r   r   r   ÚXTSr<   r3   )rG   rT   rY   Útotal_data_lenÚdata_processedÚ	total_outÚoutlenÚ
baseoutbufÚ	baseinbufÚoutbufÚinbufÚinlenrP   s                rR   rW   z_CipherContext.update_into•   sª  € Ý˜T™œˆÝˆs‰8Œ8�~¨Ô(>Ñ>ÀÑBÒCÐCÝðß š&¥ T¡¤¨TÔ-CÑ!CÀaÑ!GÑHÔHñô ð ð
 ˆØˆ	Ø”Ô#×'Ò'¨Ñ0Ô0ˆØ”]Ô'×3Ò3°CÈ$Ð3ÑOÔOˆ
Ø”MÔ&×2Ò2°4Ñ8Ô8ˆ	à Ò.Ð.Ø )Ñ+ˆFØ Ñ.ˆEÝ˜Ô,¨n¸~Ñ.MÑNÔNˆEà”-Ô$×5Ò5Ø”	˜6 6¨5°%ñô ˆCð �aŠxˆx�J t¤zµ5´9Ñ=Ô=ˆxØ”×-Ò-Ñ/Ô/Ð/Ý ðCñô ð ð
 ”×,Ò,¨S°AªXÑ6Ô6Ð6Ø˜eÑ#ˆNØ˜ œÑ"ˆIð#  Ò.Ð.ð& Ðr\   c                 óÈ  — | j         | j        k    r5t          | j        t          j        ¦  «        r| j        €t          d¦  «        ‚| j        j	         
                    d| j        ¦  «        }| j        j	         
                    d¦  «        }| j        j                             | j        ||¦  «        }|dk    ræ| j                             ¦   «         }|s&t          | j        t          j        ¦  «        rt"          ‚| j        j        }| j                             |d                              |j        |j        ¦  «        pI|j        o%|d                              |j        |j        ¦  «        p|j        o|d         j        |j        k    |¬¦  «         t          d¦  «        ‚t          | j        t          j        ¦  «        rº| j         | j        k    rª| j        j	         
                    d| j        ¦  «        }| j        j                             | j        | j        j        j        | j        |¦  «        }| j                             |dk    ¦  «         | j        j	                             |¦  «        d d …         | _         | j        j         !                    | j        ¦  «        }| j                             |dk    ¦  «         | 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   ÚModeWithAuthenticationTagr:   rD   r   r   r`   r   r   ÚEVP_CipherFinal_exrF   r<   r7   r   r3   r>   r?   Ú'EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHrA   rB   ÚPROV_R_WRONG_FINAL_BLOCK_LENGTHÚCRYPTOGRAPHY_IS_BORINGSSLÚreasonÚ*CIPHER_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTHÚ_ENCRYPTr8   ÚEVP_CTRL_AEAD_GET_TAGÚbufferr   ÚEVP_CIPHER_CTX_reset)rG   rY   rh   rP   r   rQ   Útag_bufs          rR   Úfinalizez_CipherContext.finalize¸   s¸  € àŒO˜tœ}Ò,Ð,Ý˜4œ:¥uÔ'FÑGÔGð -à”Ð åØFñô ð ð ŒmÔ ×$Ò$Ð%6¸Ô8NÑOÔOˆØ”Ô#×'Ò'¨Ñ0Ô0ˆØŒmÔ ×3Ò3°D´I¸sÀFÑKÔKˆØ�!Š8ˆ8Ø”]×2Ò2Ñ4Ô4ˆFàð !�j¨¬µU´YÑ?Ô?ð !Ý Ð à”-Ô$ˆCØŒM×(Ò(Ø�q”	×+Ò+Ø”OØÔ?ñô ð ð
 Ô2ð Ø˜qœ	×3Ò3ØÔ(ØÔ;ñô ðð Ô1ð FØ˜qœ	Ô(ØÔEòFð ð# )ñ ô ð õ& ð$ñô ð õ �t”z¥5¤9Ñ-Ô-ð	>à” 4¤=Ò0Ð0à”mÔ(×,Ò,Ø! 4Ô#9ñô ˆGð ”-Ô$×8Ò8Ø”	Ø”Ô"Ô8ØÔ&Øñ	ô ˆCð ŒM×(Ò(¨°ªÑ2Ô2Ð2ØœÔ*×1Ò1°'Ñ:Ô:¸1¸1¸1Ô=ˆDŒIàŒmÔ ×5Ò5°d´iÑ@Ô@ˆØŒ×$Ò$ S¨A¢XÑ.Ô.Ð.ØŒ}Ô!×(Ò(¨Ñ-Ô-¨k°°q´	¨kÔ:Ð:r\   r:   c                 óô  — t          |¦  «        }|| j        j        k     r,t          d                     | j        j        ¦  «        ¦  «        ‚|| j        k    r't          d                     | j        ¦  «        ¦  «        ‚| j        j                             | j	        | j        j        j
        t          |¦  «        |¦  «        }| j                             |dk    ¦  «         || _        |                      ¦   «         S )Nz.Authentication tag must be {} bytes or longer.z0Authentication tag cannot be more than {} bytes.r   )r5   r   Ú_min_tag_lengthrD   r%   r   r   r   r8   rF   r;   r3   r   r|   )rG   r:   Útag_lenrP   s       rR   Úfinalize_with_tagz _CipherContext.finalize_with_tagø   së   € Ý�c‘(”(ˆØ�T”ZÔ/Ò/Ð/ÝØ@×GÒGØ”JÔ.ñô ñô ð ð
 �tÔ-Ò-Ð-ÝØB×IÒIØÔ*ñô ñô ð ð
 ŒmÔ ×4Ò4ØŒI�t”}Ô)Ô?ÅÀSÁÄÈ3ñ
ô 
ˆð 	Œ×$Ò$ S¨A¢XÑ.Ô.Ð.ØˆŒ	Ø�}Š}‰ŒÐr\   c           	      óB  — | j         j                             d¦  «        }| j         j                             | j        | j         j        j        || j         j                             |¦  «        t          |¦  «        ¦  «        }| j          	                    |dk    ¦  «         d S )Nr^   r   )
r   r   r`   r   rc   rF   r(   r+   r5   r3   )rG   rT   rh   rP   s       rR   Úauthenticate_additional_dataz+_CipherContext.authenticate_additional_data  sˆ   € Ø”Ô#×'Ò'¨Ñ0Ô0ˆØŒmÔ ×1Ò1ØŒIØŒMÔÔ#ØØŒMÔ×*Ò*¨4Ñ0Ô0Ý�‰IŒIñ
ô 
ˆð 	Œ×$Ò$ S¨A¢XÑ.Ô.Ð.Ð.Ð.r\   c                 ó   — | j         S )N)r   )rG   s    rR   r:   z_CipherContext.tag  s
   € àŒyÐr\   )Ú__name__Ú
__module__Ú__qualname__rw   ro   rb   ÚintrS   rX   r[   rW   r|   r€   r‚   ÚpropertyÚtypingÚOptionalr:   © r\   rR   r   r      s1  € € € € € Ø€HØ€HØ€OðyØ ðyØ;>ðyà	ðyð yð yð yðv˜5ð  Uð ð ð ð ð
! ð !¨Eð !°cð !ð !ð !ð !ðF>;˜%ð >;ð >;ð >;ð >;ð@ Uð ¨uð ð ð ð ð*	/°ð 	/¸4ð 	/ð 	/ð 	/ð 	/ð ð�V”_ UÔ+ð ð ð ñ „Xðð ð r\   r   )r‰   Úcryptography.exceptionsr   r   r   Úcryptography.hazmat.primitivesr   Ú&cryptography.hazmat.primitives.ciphersr   r   ÚTYPE_CHECKINGÚ,cryptography.hazmat.backends.openssl.backendr	   r   r‹   r\   rR   ú<module>r‘      s´   ðð
 €€€à NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ 2Ð 2Ð 2Ð 2Ð 2Ð 2Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ Dð 
Ôð EØDÐDÐDÐDÐDÐDðJð Jð Jð Jð Jñ Jô Jð Jð Jð Jr\   