U
    çe¨]%  ã                   @   sx   d dl mZmZmZ d dlZd dlmZmZ d dlm	Z	 d dl
mZ G dd„ deƒZG dd	„ d	eƒZG d
d„ deƒZdS )é    )Úabsolute_importÚdivisionÚprint_functionN)Ú
exceptionsÚutils)Úaead)Úbackendc                   @   s<   e Zd ZdZdd„ Zedd„ ƒZdd„ Zdd	„ Zd
d„ Z	dS )ÚChaCha20Poly1305ì        c                 C   sD   t  | ¡st dtjj¡‚t d|¡ t|ƒdkr:t	dƒ‚|| _
d S )Nz<ChaCha20Poly1305 is not supported by this version of OpenSSLÚkeyé    z&ChaCha20Poly1305 key must be 32 bytes.)r   Úaead_cipher_supportedr   ÚUnsupportedAlgorithmÚ_ReasonsÚUNSUPPORTED_CIPHERr   Ú_check_byteslikeÚlenÚ
ValueErrorÚ_key©Úselfr   © r   úM/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/aead.pyÚ__init__   s    
þzChaCha20Poly1305.__init__c                 C   s
   t  d¡S )Nr   )ÚosÚurandom)Úclsr   r   r   Úgenerate_key   s    zChaCha20Poly1305.generate_keyc                 C   sR   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ t t| |||d¡S ©Nó    ú1Data or associated data too long. Max 2**32 bytesé   ©r   Ú	_MAX_SIZEÚOverflowErrorÚ_check_paramsr   Ú_encryptr   ©r   ÚnonceÚdataÚassociated_datar   r   r   Úencrypt"   s    ÿ     ÿzChaCha20Poly1305.encryptc                 C   s.   |d krd}|   |||¡ t t| |||d¡S ©Nr   r!   ©r%   r   Ú_decryptr   r'   r   r   r   Údecrypt1   s         ÿzChaCha20Poly1305.decryptc                 C   s<   t  d|¡ t  d|¡ t  d|¡ t|ƒdkr8tdƒ‚d S )Nr(   r)   r*   é   zNonce must be 12 bytes©r   r   Ú_check_bytesr   r   r'   r   r   r   r%   :   s
    zChaCha20Poly1305._check_paramsN©
Ú__name__Ú
__module__Ú__qualname__r#   r   Úclassmethodr   r+   r/   r%   r   r   r   r   r	      s   
	r	   c                   @   sF   e Zd ZdZddd„Zedd„ ƒZdd„ Zd	d
„ Zdd„ Z	dd„ Z
dS )ÚAESCCMr
   r!   c                 C   sl   t  d|¡ t|ƒdkr tdƒ‚|| _t|tƒs8tdƒ‚|dkrHtdƒ‚|| _t	 
| ¡sht dtjj¡‚d S )Nr   ©r!   é   r   z)AESCCM key must be 128, 192, or 256 bits.ztag_length must be an integer)é   é   é   é
   r0   é   r!   zInvalid tag_lengthz2AESCCM is not supported by this version of OpenSSL)r   r   r   r   r   Ú
isinstanceÚintÚ	TypeErrorÚ_tag_lengthr   r   r   r   r   r   )r   r   Z
tag_lengthr   r   r   r   E   s    

þzAESCCM.__init__c                 C   s0   t |tƒstdƒ‚|dkr"tdƒ‚t |d ¡S ©Nzbit_length must be an integer)é€   éÀ   é   z#bit_length must be 128, 192, or 256r=   ©r@   rA   rB   r   r   r   ©r   Ú
bit_lengthr   r   r   r   Y   s
    
zAESCCM.generate_keyc                 C   sd   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ |  |t |ƒ¡ t t| |||| j¡S )Nr   r    )	r   r#   r$   r%   Ú_validate_lengthsr   r&   r   rC   r'   r   r   r   r+   c   s     ÿ     ÿzAESCCM.encryptc                 C   s0   |d krd}|   |||¡ t t| |||| j¡S )Nr   )r%   r   r.   r   rC   r'   r   r   r   r/   s   s         ÿzAESCCM.decryptc                 C   s(   dt |ƒ }dd|  |k r$tdƒ‚d S )Né   é   r=   zNonce too long for data)r   r   )r   r(   Zdata_lenZl_valr   r   r   rK   |   s    zAESCCM._validate_lengthsc                 C   sJ   t  d|¡ t  d|¡ t  d|¡ dt|ƒ  kr<dksFn tdƒ‚d S )Nr(   r)   r*   é   é   z$Nonce must be between 7 and 13 bytesr1   r'   r   r   r   r%   ƒ   s
    zAESCCM._check_paramsN)r!   )r4   r5   r6   r#   r   r7   r   r+   r/   rK   r%   r   r   r   r   r8   B   s   

		r8   c                   @   s<   e Zd ZdZdd„ Zedd„ ƒZdd„ Zdd	„ Zd
d„ Z	dS )ÚAESGCMr
   c                 C   s*   t  d|¡ t|ƒdkr tdƒ‚|| _d S )Nr   r9   z)AESGCM key must be 128, 192, or 256 bits.)r   r   r   r   r   r   r   r   r   r   Ž   s    zAESGCM.__init__c                 C   s0   t |tƒstdƒ‚|dkr"tdƒ‚t |d ¡S rD   rH   rI   r   r   r   r   •   s
    
zAESGCM.generate_keyc                 C   sR   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ t t| |||d¡S r   r"   r'   r   r   r   r+   Ÿ   s    ÿ     ÿzAESGCM.encryptc                 C   s.   |d krd}|   |||¡ t t| |||d¡S r,   r-   r'   r   r   r   r/   ®   s         ÿzAESGCM.decryptc                 C   s<   t  d|¡ t  d|¡ t  d|¡ t|ƒdkr8tdƒ‚d S )Nr(   r)   r*   r   zNonce must be at least 1 byter1   r'   r   r   r   r%   ·   s
    zAESGCM._check_paramsNr3   r   r   r   r   rP   ‹   s   
		rP   )Z
__future__r   r   r   r   Zcryptographyr   r   Z$cryptography.hazmat.backends.opensslr   Z,cryptography.hazmat.backends.openssl.backendr   Úobjectr	   r8   rP   r   r   r   r   Ú<module>   s   4I