U
    çe¨]è  ã                   @   s‚  d dl mZmZmZ 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 e ej¡G dd„ deƒƒZe ej¡G d	d
„ d
eƒƒZe ej¡G dd„ deƒƒZe ej¡G dd„ deƒƒZe ej¡G dd„ deƒƒZe ej¡G dd„ deƒƒ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 )é    )Úabsolute_importÚdivisionÚprint_functionN)Úutils)ÚAlreadyFinalizedÚAlreadyUpdatedÚNotYetFinalizedÚUnsupportedAlgorithmÚ_Reasons)ÚCipherBackend)Úmodesc                   @   s(   e Zd Zejdd„ ƒZejdd„ ƒZdS )ÚCipherAlgorithmc                 C   s   dS )zE
        A string naming this mode (e.g. "AES", "Camellia").
        N© ©Úselfr   r   úM/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/base.pyÚname   s    zCipherAlgorithm.namec                 C   s   dS )zW
        The size of the key being used as an integer in bits (e.g. 128, 256).
        Nr   r   r   r   r   Úkey_size   s    zCipherAlgorithm.key_sizeN)Ú__name__Ú
__module__Ú__qualname__ÚabcÚabstractpropertyr   r   r   r   r   r   r      s   
r   c                   @   s   e Zd Zejdd„ ƒZdS )ÚBlockCipherAlgorithmc                 C   s   dS )zK
        The size of a block as an integer in bits (e.g. 64, 128).
        Nr   r   r   r   r   Ú
block_size%   s    zBlockCipherAlgorithm.block_sizeN)r   r   r   r   r   r   r   r   r   r   r   #   s   r   c                   @   s6   e Zd Zejdd„ ƒZejdd„ ƒZejdd„ ƒZdS )ÚCipherContextc                 C   s   dS )zk
        Processes the provided bytes through the cipher and returns the results
        as bytes.
        Nr   ©r   Údatar   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   Zbufr   r   r   Úupdate_into5   s    zCipherContext.update_intoc                 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   Úabstractmethodr   r    r!   r   r   r   r   r   ,   s   

r   c                   @   s   e Zd Zejdd„ ƒZdS )ÚAEADCipherContextc                 C   s   dS )z3
        Authenticates the provided bytes.
        Nr   r   r   r   r   Úauthenticate_additional_dataE   s    z.AEADCipherContext.authenticate_additional_dataN)r   r   r   r   r"   r$   r   r   r   r   r#   C   s   r#   c                   @   s   e Zd Zejdd„ ƒZdS )ÚAEADDecryptionContextc                 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   Útagr   r   r   Úfinalize_with_tagN   s    z'AEADDecryptionContext.finalize_with_tagN)r   r   r   r   r"   r'   r   r   r   r   r%   L   s   r%   c                   @   s   e Zd Zejdd„ ƒZdS )ÚAEADEncryptionContextc                 C   s   dS )zb
        Returns tag bytes. This is only available after encryption is
        finalized.
        Nr   r   r   r   r   r&   X   s    zAEADEncryptionContext.tagN)r   r   r   r   r   r&   r   r   r   r   r(   V   s   r(   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚCipherc                 C   sP   t |tƒstdtjƒ‚t |tƒs(tdƒ‚|d k	r:| |¡ || _|| _	|| _
d S )Nz0Backend object does not implement CipherBackend.z&Expected interface of CipherAlgorithm.)Ú
isinstancer   r	   r
   ZBACKEND_MISSING_INTERFACEr   Ú	TypeErrorZvalidate_for_algorithmÚ	algorithmÚmodeÚ_backend)r   r,   r-   Zbackendr   r   r   Ú__init__a   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)
r*   r-   r   ÚModeWithAuthenticationTagr&   Ú
ValueErrorr.   Zcreate_symmetric_encryption_ctxr,   Ú	_wrap_ctx©r   Úctxr   r   r   Ú	encryptorr   s    ÿ ÿzCipher.encryptorc                 C   s    | j  | j| j¡}| j|ddS )NFr0   )r.   Zcreate_symmetric_decryption_ctxr,   r-   r4   r5   r   r   r   Ú	decryptor}   s
     ÿzCipher.decryptorc                 C   s0   t | jtjƒr$|rt|ƒS t|ƒS nt|ƒS d S ©N)r*   r-   r   r2   Ú_AEADEncryptionContextÚ_AEADCipherContextÚ_CipherContext)r   r6   r1   r   r   r   r4   ƒ   s
    
zCipher._wrap_ctxN)r   r   r   r/   r7   r8   r4   r   r   r   r   r)   `   s   r)   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r<   c                 C   s
   || _ d S r9   )Ú_ctxr5   r   r   r   r/      s    z_CipherContext.__init__c                 C   s   | j d krtdƒ‚| j  |¡S ©NúContext was already finalized.)r=   r   r   r   r   r   r   r   ’   s    
z_CipherContext.updatec                 C   s    | j d krtdƒ‚| j  ||¡S r>   )r=   r   r    r   r   r   r   r    —   s    
z_CipherContext.update_intoc                 C   s&   | j d krtdƒ‚| j  ¡ }d | _ |S r>   )r=   r   r!   r   r   r   r   r!   œ   s
    

z_CipherContext.finalizeN)r   r   r   r/   r   r    r!   r   r   r   r   r<      s   r<   c                   @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )r;   c                 C   s"   || _ d| _d| _d | _d| _d S )Nr   F)r=   Ú_bytes_processedÚ_aad_bytes_processedÚ_tagÚ_updatedr5   r   r   r   r/   ¨   s
    z_AEADCipherContext.__init__c                 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 )Nr?   Tz+{} has a maximum encrypted byte limit of {})	r=   r   rC   r@   Ú_modeZ_MAX_ENCRYPTED_BYTESr3   Úformatr   )r   Ú	data_sizer   r   r   Ú_check_limit¯   s    
 ÿÿz_AEADCipherContext._check_limitc                 C   s   |   t|ƒ¡ | j |¡S r9   )rG   Úlenr=   r   r   r   r   r   r   »   s    z_AEADCipherContext.updatec                 C   s   |   t|ƒ¡ | j ||¡S r9   )rG   rH   r=   r    r   r   r   r   r    ¿   s    z_AEADCipherContext.update_intoc                 C   s0   | j d krtdƒ‚| j  ¡ }| j j| _d | _ |S r>   )r=   r   r!   r&   rB   r   r   r   r   r!   Ã   s    


z_AEADCipherContext.finalizec                 C   s2   | j d krtdƒ‚| j  |¡}| j j| _d | _ |S r>   )r=   r   r'   r&   rB   )r   r&   r   r   r   r   r'   Ë   s    

z$_AEADCipherContext.finalize_with_tagc                 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 )Nr?   z'Update has been called on this context.z%{} has a maximum AAD byte limit of {})r=   r   rC   r   rA   rH   rD   Z_MAX_AAD_BYTESr3   rE   r   r$   r   r   r   r   r$   Ó   s    
 ÿÿz/_AEADCipherContext.authenticate_additional_dataN)
r   r   r   r/   rG   r   r    r!   r'   r$   r   r   r   r   r;   ¤   s   r;   c                   @   s   e Zd Zedd„ ƒZdS )r:   c                 C   s   | j d k	rtdƒ‚| jS )Nz4You must finalize encryption before getting the tag.)r=   r   rB   r   r   r   r   r&   æ   s    
z_AEADEncryptionContext.tagN)r   r   r   Úpropertyr&   r   r   r   r   r:   ä   s   r:   ) Z
__future__r   r   r   r   ZsixZcryptographyr   Zcryptography.exceptionsr   r   r   r	   r
   Z'cryptography.hazmat.backends.interfacesr   Z&cryptography.hazmat.primitives.ciphersr   Zadd_metaclassÚABCMetaÚobjectr   r   r   r#   r%   r(   r)   Zregister_interfacer<   r;   r:   r   r   r   r   Ú<module>   s6   




	
	-=