U
    [e                     @   sB  d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ G dd	 d	e jd
ZG dd de jd
ZG dd de jd
ZG dd de jd
ZG dd de jd
ZG dd deZeeG dd deZeeeeeeG dd deZeeG dd deZdS )    N)utils)AlreadyFinalizedAlreadyUpdatedNotYetFinalizedUnsupportedAlgorithm_Reasons)_get_backend)CipherBackend)CipherAlgorithm)modesc                   @   s    e Zd ZejedddZdS )BlockCipherAlgorithmreturnc                 C   s   dS )zK
        The size of a block as an integer in bits (e.g. 64, 128).
        N selfr   r   m/var/www/html/services/stratfitenv/lib/python3.8/site-packages/cryptography/hazmat/primitives/ciphers/base.py
block_size   s    zBlockCipherAlgorithm.block_sizeN)__name__
__module____qualname__abcabstractpropertyintr   r   r   r   r   r      s   r   )	metaclassc                   @   sL   e Zd ZejeedddZejeedddZejedddZ	d	S )
CipherContextdatar   c                 C   s   dS )zk
        Processes the provided bytes through the cipher and returns the results
        as bytes.
        Nr   r   r   r   r   r   update    s    zCipherContext.updatec                 C   s   dS )z
        Processes the provided bytes and writes the resulting data into the
        provided buffer. Returns the number of bytes written.
        Nr   r   r   bufr   r   r   update_into'   s    zCipherContext.update_intor   c                 C   s   dS )zM
        Returns the results of processing the final block as bytes.
        Nr   r   r   r   r   finalize.   s    zCipherContext.finalizeN)
r   r   r   r   abstractmethodbytesr   r   r"   r#   r   r   r   r   r      s   r   c                   @   s"   e Zd ZejeddddZdS )AEADCipherContextNr   c                 C   s   dS )z3
        Authenticates the provided bytes.
        Nr   r   r   r   r   authenticate_additional_data6   s    z.AEADCipherContext.authenticate_additional_data)r   r   r   r   r$   r%   r'   r   r   r   r   r&   5   s   r&   c                   @   s"   e Zd ZejeedddZdS )AEADDecryptionContexttagr   c                 C   s   dS )z
        Returns the results of processing the final block as bytes and allows
        delayed passing of the authentication tag.
        Nr   )r   r*   r   r   r   finalize_with_tag>   s    z'AEADDecryptionContext.finalize_with_tagN)r   r   r   r   r$   r%   r+   r   r   r   r   r(   =   s   r(   c                   @   s    e Zd ZejedddZdS )AEADEncryptionContextr   c                 C   s   dS )zb
        Returns tag bytes. This is only available after encryption is
        finalized.
        Nr   r   r   r   r   r*   G   s    zAEADEncryptionContext.tagN)r   r   r   r   r   r%   r*   r   r   r   r   r,   F   s   r,   c                   @   s>   e Zd Zdeejej dddZdd Z	dd Z
d	d
 ZdS )CipherN)	algorithmmodec                 C   sX   t |}t|tstdtjt|ts0td|d k	rB|| || _	|| _
|| _d S )Nz0Backend object does not implement CipherBackend.z&Expected interface of CipherAlgorithm.)r   
isinstancer	   r   r   ZBACKEND_MISSING_INTERFACEr
   	TypeErrorZvalidate_for_algorithmr.   r/   _backend)r   r.   r/   backendr   r   r   __init__P   s    


zCipher.__init__c                 C   sB   t | jtjr"| jjd k	r"td| j| j| j}| j	|ddS )Nz0Authentication tag must be None when encrypting.Tencrypt)
r0   r/   r   ModeWithAuthenticationTagr*   
ValueErrorr2   Zcreate_symmetric_encryption_ctxr.   	_wrap_ctxr   ctxr   r   r   	encryptorg   s     zCipher.encryptorc                 C   s    | j | j| j}| j|ddS )NFr5   )r2   Zcreate_symmetric_decryption_ctxr.   r/   r9   r:   r   r   r   	decryptorr   s
     zCipher.decryptorc                 C   s0   t | jtjr$|rt|S t|S nt|S d S N)r0   r/   r   r7   _AEADEncryptionContext_AEADCipherContext_CipherContext)r   r;   r6   r   r   r   r9   x   s
    
zCipher._wrap_ctx)N)r   r   r   r
   typingOptionalr   ZModer4   r<   r=   r9   r   r   r   r   r-   O   s    
r-   c                   @   sB   e Zd Zdd ZeedddZeedddZedd	d
ZdS )rA   c                 C   s
   || _ d S r>   )_ctxr:   r   r   r   r4      s    z_CipherContext.__init__r   c                 C   s   | j d krtd| j |S NContext was already finalized.)rD   r   r   r   r   r   r   r      s    
z_CipherContext.updatec                 C   s    | j d krtd| j ||S rE   )rD   r   r"   r    r   r   r   r"      s    
z_CipherContext.update_intor   c                 C   s&   | j d krtd| j  }d | _ |S rE   )rD   r   r#   r   r   r   r   r#      s
    

z_CipherContext.finalizeN)	r   r   r   r4   r%   r   r   r"   r#   r   r   r   r   rA      s   rA   c                   @   sp   e Zd Zdd ZedddZeedddZeedd	d
ZedddZ	eedddZ
eddddZdS )r@   c                 C   s"   || _ d| _d| _d | _d| _d S )Nr   F)rD   _bytes_processed_aad_bytes_processed_tag_updatedr:   r   r   r   r4      s
    z_AEADCipherContext.__init__)	data_sizec                 C   sV   | j d krtdd| _|  j|7  _| j| j jjkrRtd| j jj| j jjd S )NrF   Tz+{} has a maximum encrypted byte limit of {})	rD   r   rJ   rG   _modeZ_MAX_ENCRYPTED_BYTESr8   formatname)r   rK   r   r   r   _check_limit   s    
 z_AEADCipherContext._check_limitr   c                 C   s   |  t| | j|S r>   )rO   lenrD   r   r   r   r   r   r      s    z_AEADCipherContext.updatec                 C   s   |  t| | j||S r>   )rO   rP   rD   r"   r    r   r   r   r"      s    z_AEADCipherContext.update_intor   c                 C   s0   | j d krtd| j  }| j j| _d | _ |S rE   )rD   r   r#   r*   rI   r   r   r   r   r#      s    


z_AEADCipherContext.finalizer)   c                 C   s2   | j d krtd| j |}| j j| _d | _ |S rE   )rD   r   r+   r*   rI   )r   r*   r   r   r   r   r+      s    

z$_AEADCipherContext.finalize_with_tagNc                 C   sn   | j d krtd| jr td|  jt|7  _| j| j jjkr^td	| j jj
| j jj| j | d S )NrF   z'Update has been called on this context.z%{} has a maximum AAD byte limit of {})rD   r   rJ   r   rH   rP   rL   Z_MAX_AAD_BYTESr8   rM   rN   r'   r   r   r   r   r'      s    
 z/_AEADCipherContext.authenticate_additional_data)r   r   r   r4   r   rO   r%   r   r"   r#   r+   r'   r   r   r   r   r@      s   r@   c                   @   s   e Zd ZeedddZdS )r?   r   c                 C   s&   | j d k	rtd| jd k	s t| jS )Nz4You must finalize encryption before getting the tag.)rD   r   rI   AssertionErrorr   r   r   r   r*      s    
z_AEADEncryptionContext.tagN)r   r   r   propertyr%   r*   r   r   r   r   r?      s   r?   )r   rB   Zcryptographyr   Zcryptography.exceptionsr   r   r   r   r   Zcryptography.hazmat.backendsr   Z'cryptography.hazmat.backends.interfacesr	   Z/cryptography.hazmat.primitives._cipheralgorithmr
   Z&cryptography.hazmat.primitives.ciphersr   ABCMetar   r   r&   r(   r,   objectr-   Zregister_interfacerA   r@   r?   r   r   r   r   <module>   s*   		3=