
    +hv(                        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                        }
nt        |t2        j:                        r0| j                   j                  j7                  |j<                        }
nt        |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                 _/var/www/html/venv/lib/python3.12/site-packages/cryptography/hazmat/backends/openssl/ciphers.py__init__z_CipherContext.__init__   sG   
#,0	dllG$@$@A%)\\%<%<%AD"%&D"mm  335mm  ####77
 ==11		tF|T$Z78G T]]FD9
++000FKK=*CTYYKv..8fT]]779:;C 'sH,G,GHHdE>>?}}))55**H e112}}))55djjAHe112}}))55djjAH
 3 34}}))55fllCH}}))..Hmm  22MM##MM##MM##
 	$$SAX.mm  >>VZZ
 	$$SAX.dEII&--$$88""::H""''	C MM((2xx#mm((<<MM&&<<MHH	 ,,SAX6 HH	 mm  22MM##MM##MM**6::6
 ..0mm  !8001I//OOS%B%B
 ..1I//$$c&D&D
 JKK$$SAXf$= 	55c1=	G  	&##)6KKd$ ++ 	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>?T3'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s8~(>(>>BC &TT-C-C!Ca!GH 
 	##''0]]''33C$3O
MM&&2248	.)+F.E,,n~.MNE--$$55		665%C axJtzz599=--/ C 
 ,,SAX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   OOt}},4::u'F'FG F  mm  $$%68N8NO##''0mm  33DIIsFK!8]]224FjUYY?  --$$CMM((q	++OO?? 
 22 q	33((;; 11 Fq	((EEF # ) & $  tzz599-4==0mm((,,!4#9#9G --$$88		""88&&	C MM((2**11':1=DImm  55dii@$$SAX.}}!!((-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(TZZ///@GGJJ.. 
 t---BII** 
 mm  44IIt}}))??S3
 	$$SAX.	}}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mm  11IIMM##MM**40I
 	$$SAX.r]   c                    | j                   S )N)r   )rF   s    rS   r9   z_CipherContext.tag  s    yy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]   