B
    ó±ô`±  ã               @   sl   d dl 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 )é    N)Ú
exceptionsÚutils)Úaead)Úbackendc               @   sx   e Zd ZdZedœdd„Zeedœdd„ƒZeeej	e edœd	d
„Z
eeej	e edœdd„Zeeeddœdd„ZdS )ÚChaCha20Poly1305l        )Úkeyc             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 OpenSSLr   é    z&ChaCha20Poly1305 key must be 32 bytes.)r   Zaead_cipher_supportedr   ZUnsupportedAlgorithmZ_ReasonsZUNSUPPORTED_CIPHERr   Ú_check_byteslikeÚlenÚ
ValueErrorÚ_key)Úselfr   © r   úZ/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/hazmat/primitives/ciphers/aead.pyÚ__init__   s    

zChaCha20Poly1305.__init__)Úreturnc             C   s
   t  d¡S )Nr   )ÚosÚurandom)Úclsr   r   r   Úgenerate_key   s    zChaCha20Poly1305.generate_key)ÚnonceÚdataÚassociated_datar   c             C   sR   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ t t| |||d¡S )Nó    z1Data or associated data too long. Max 2**32 bytesé   )r
   Ú	_MAX_SIZEÚOverflowErrorÚ_check_paramsr   Ú_encryptr   )r   r   r   r   r   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   r   r   r   Údecrypt4   s    zChaCha20Poly1305.decryptNc             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   r   r   r   @   s
    zChaCha20Poly1305._check_params)Ú__name__Ú
__module__Ú__qualname__r   Úbytesr   Úclassmethodr   ÚtypingÚOptionalr   r!   r   r   r   r   r   r      s    	r   c               @   sŒ   e Zd ZdZdeedœdd„Zeeedœdd„ƒZeee	j
e ed	œd
d„Zeee	j
e ed	œdd„Zeedœdd„Zeeedœdd„ZdS )ÚAESCCMl        r   )r   Ú
tag_lengthc             C   sR   t  d|¡ t|ƒdkr tdƒ‚|| _t|tƒs8tdƒ‚|dkrHtdƒ‚|| _d S )Nr   )r   é   r   z)AESCCM key must be 128, 192, or 256 bits.ztag_length must be an integer)é   é   é   é
   r"   é   r   zInvalid tag_length)	r   r	   r
   r   r   Ú
isinstanceÚintÚ	TypeErrorÚ_tag_length)r   r   r,   r   r   r   r   P   s    
zAESCCM.__init__)Ú
bit_lengthr   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 256r0   )r3   r4   r5   r   r   r   )r   r7   r   r   r   r   ^   s
    
zAESCCM.generate_key)r   r   r   r   c             C   sd   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ |  |t |ƒ¡ t t| |||| j¡S )Nr   z1Data or associated data too long. Max 2**32 bytes)	r
   r   r   r   Ú_validate_lengthsr   r   r   r6   )r   r   r   r   r   r   r   r   h   s    zAESCCM.encryptc             C   s0   |d krd}|   |||¡ t t| |||| j¡S )Nr   )r   r   r    r   r6   )r   r   r   r   r   r   r   r!   }   s
    zAESCCM.decrypt)r   Údata_lenc             C   s(   dt |ƒ }dd|  |k r$tdƒ‚d S )Né   é   r0   zData too long for nonce)r
   r   )r   r   r<   Zl_valr   r   r   r;   ‹   s    zAESCCM._validate_lengths)r   r   r   c             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 bytes)r   r	   r#   r
   r   )r   r   r   r   r   r   r   r   ’   s
    zAESCCM._check_paramsN)r   )r$   r%   r&   r   r'   r4   r   r(   r   r)   r*   r   r!   r;   r   r   r   r   r   r+   M   s   	r+   c               @   sz   e Zd ZdZedœdd„Zeeedœdd„ƒZeee	j
e edœd	d
„Zeee	j
e edœdd„Zeeeddœdd„ZdS )ÚAESGCMl        )r   c             C   s*   t  d|¡ t|ƒdkr tdƒ‚|| _d S )Nr   )r   r-   r   z)AESGCM key must be 128, 192, or 256 bits.)r   r	   r
   r   r   )r   r   r   r   r   r      s    zAESGCM.__init__)r7   r   c             C   s0   t |tƒstdƒ‚|dkr"tdƒ‚t |d ¡S )Nzbit_length must be an integer)r8   r9   r:   z#bit_length must be 128, 192, or 256r0   )r3   r4   r5   r   r   r   )r   r7   r   r   r   r   ¤   s
    
zAESGCM.generate_key)r   r   r   r   c             C   sR   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ t t| |||d¡S )Nr   z1Data or associated data too long. Max 2**32 bytesr   )r
   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   ®   s    zAESGCM.encryptc             C   s.   |d krd}|   |||¡ t t| |||d¡S )Nr   r   )r   r   r    r   )r   r   r   r   r   r   r   r!   À   s    zAESGCM.decryptNc             C   sH   t  d|¡ t  d|¡ t  d|¡ t|ƒdk s<t|ƒdkrDtdƒ‚d S )Nr   r   r   r0   r8   z%Nonce must be between 8 and 128 bytes)r   r	   r#   r
   r   )r   r   r   r   r   r   r   r   Ì   s
    zAESGCM._check_params)r$   r%   r&   r   r'   r   r(   r4   r   r)   r*   r   r!   r   r   r   r   r   rA   š   s    	rA   )r   r)   Zcryptographyr   r   Z$cryptography.hazmat.backends.opensslr   Z,cryptography.hazmat.backends.openssl.backendr   Úobjectr   r+   rA   r   r   r   r   Ú<module>   s   ?M