U
    ñN…f¤  ã                   @  s˜   d dl mZ d dlZd dlmZmZ d dlmZ d dlm	Z	 d dl
mZ ddd	d
ddgZejjZejjZejjZejjZG dd„ dƒZG dd	„ d	ƒZdS )é    )ÚannotationsN)Ú
exceptionsÚutils)Úaead)Úbackend)ÚopensslÚChaCha20Poly1305ÚAESCCMÚAESGCMÚ	AESGCMSIVÚAESOCB3ÚAESSIVc                   @  s„   e Zd ZdZddddœdd„Zedddœd	d
„ƒZdddddœdd„Zdddddœdd„Zddddœdd„Z	dddddœdd„Z
dS )r	   éÿÿÿé   ÚbytesÚint)ÚkeyÚ
tag_lengthc                 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   é   é    z)AESCCM key must be 128, 192, or 256 bits.ztag_length must be an integer)é   é   é   é
   é   é   r   zInvalid tag_lengthz2AESCCM is not supported by this version of OpenSSL)r   Ú_check_byteslikeÚlenÚ
ValueErrorÚ_keyÚ
isinstancer   Ú	TypeErrorÚ_tag_lengthr   Zaead_cipher_supportedr   ZUnsupportedAlgorithmZ_ReasonsZUNSUPPORTED_CIPHER)Úselfr   r   © r%   úO/tmp/pip-unpacked-wheel-bjwtc2fy/cryptography/hazmat/primitives/ciphers/aead.pyÚ__init__    s    

þzAESCCM.__init__©Ú
bit_lengthÚreturnc                 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!   r   r"   r   ÚosÚurandom©Úclsr)   r%   r%   r&   Úgenerate_key4   s
    
zAESCCM.generate_keyúbytes | None©ÚnonceÚdataÚassociated_datar*   c                 C  sf   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ |  |t |ƒ¡ t t| |||g| j¡S )Nó    ú5Data or associated data too long. Max 2**31 - 1 bytes)	r   Ú	_MAX_SIZEÚOverflowErrorÚ_check_paramsÚ_validate_lengthsr   Ú_encryptr   r#   ©r$   r7   r8   r9   r%   r%   r&   Úencrypt>   s     ÿ     ÿzAESCCM.encryptc                 C  s2   |d krd}|   |||¡ t t| |||g| j¡S )Nr:   )r>   r   Ú_decryptr   r#   rA   r%   r%   r&   ÚdecryptS   s         ÿzAESCCM.decryptÚNone)r7   Údata_lenr*   c                 C  s(   dt |ƒ }dd|  |k r$tdƒ‚d S )Né   é   r   zData too long for nonce)r   r   )r$   r7   rF   Zl_valr%   r%   r&   r?   a   s    zAESCCM._validate_lengthsc                 C  sJ   t  d|¡ t  d|¡ t  d|¡ dt|ƒ  kr<dksFn tdƒ‚d S )Nr7   r8   r9   é   é   z$Nonce must be between 7 and 13 bytes©r   r   r   r   rA   r%   r%   r&   r>   h   s
    zAESCCM._check_paramsN)r   )Ú__name__Ú
__module__Ú__qualname__r<   r'   Úclassmethodr4   rB   rD   r?   r>   r%   r%   r%   r&   r	      s   	c                   @  sn   e Zd ZdZddœdd„Zedddœdd	„ƒZddd
ddœdd„Zddd
ddœdd„Zdddddœdd„Z	dS )r
   r   r   )r   c                 C  s*   t  d|¡ t|ƒdkr tdƒ‚|| _d S )Nr   r   z)AESGCM key must be 128, 192, or 256 bits.)r   r   r   r   r    )r$   r   r%   r%   r&   r'   u   s    zAESGCM.__init__r   r(   c                 C  s0   t |tƒstdƒ‚|dkr"tdƒ‚t |d ¡S r+   r/   r2   r%   r%   r&   r4   |   s
    
zAESGCM.generate_keyr5   r6   c                 C  sT   |d krd}t |ƒ| jks(t |ƒ| jkr0tdƒ‚|  |||¡ t t| |||gd¡S )Nr:   r;   r   )r   r<   r=   r>   r   r@   r   rA   r%   r%   r&   rB   †   s    ÿzAESGCM.encryptc                 C  s0   |d krd}|   |||¡ t t| |||gd¡S )Nr:   r   )r>   r   rC   r   rA   r%   r%   r&   rD   ˜   s    zAESGCM.decryptrE   c                 C  sH   t  d|¡ t  d|¡ t  d|¡ t|ƒdk s<t|ƒdkrDtdƒ‚d S )Nr7   r8   r9   r   r,   z%Nonce must be between 8 and 128 bytesrK   rA   r%   r%   r&   r>   ¤   s
    zAESGCM._check_paramsN)
rL   rM   rN   r<   r'   rO   r4   rB   rD   r>   r%   r%   r%   r&   r
   r   s   	)Ú
__future__r   r0   Zcryptographyr   r   Z$cryptography.hazmat.backends.opensslr   Z,cryptography.hazmat.backends.openssl.backendr   Z"cryptography.hazmat.bindings._rustr   Zrust_opensslÚ__all__r   r   r   r   r	   r
   r%   r%   r%   r&   Ú<module>   s$   ú	U