U
    EZh                      @   s  d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZ G dd de jdZG d	d
 d
ee jdZG dd dee jdZG dd dee jdZG dd dee jdZee	ddddZeeddddZeee	ddddZee	ddddZG dd deZG dd deZG dd  d eZG d!d" d"eZG d#d$ d$eZG d%d& d&eZG d'd( d(eZG d)d* d*eeZdS )+    N)utils)UnsupportedAlgorithm_Reasons)BlockCipherAlgorithmCipherAlgorithm)
algorithmsc                   @   s:   e Zd ZeejedddZejeddddZ	dS )Modereturnc                 C   s   dS )z@
        A string naming this mode (e.g. "ECB", "CBC").
        N selfr   r   s/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/cryptography/hazmat/primitives/ciphers/modes.pyname   s    z	Mode.nameN	algorithmr
   c                 C   s   dS )zq
        Checks that all the necessary invariants of this (mode, algorithm)
        combination are met.
        Nr   r   r   r   r   r   validate_for_algorithm   s    zMode.validate_for_algorithm)
__name__
__module____qualname__propertyabcabstractmethodstrr   r   r   r   r   r   r   r      s
   r   )	metaclassc                   @   s$   e Zd ZeejedddZdS )ModeWithInitializationVectorr	   c                 C   s   dS )zP
        The value of the initialization vector for this mode as bytes.
        Nr   r   r   r   r   initialization_vector#   s    z2ModeWithInitializationVector.initialization_vectorN)r   r   r   r   r   r   bytesr   r   r   r   r   r   "   s   r   c                   @   s$   e Zd ZeejedddZdS )ModeWithTweakr	   c                 C   s   dS )z@
        The value of the tweak for this mode as bytes.
        Nr   r   r   r   r   tweak,   s    zModeWithTweak.tweakN)r   r   r   r   r   r   r   r    r   r   r   r   r   +   s   r   c                   @   s$   e Zd ZeejedddZdS )ModeWithNoncer	   c                 C   s   dS )z@
        The value of the nonce for this mode as bytes.
        Nr   r   r   r   r   nonce5   s    zModeWithNonce.nonceN)r   r   r   r   r   r   r   r"   r   r   r   r   r!   4   s   r!   c                   @   s*   e Zd Zeejeje dddZ	dS )ModeWithAuthenticationTagr	   c                 C   s   dS )zP
        The value of the tag supplied to the constructor of this mode.
        Nr   r   r   r   r   tag>   s    zModeWithAuthenticationTag.tagN)
r   r   r   r   r   r   typingOptionalr   r$   r   r   r   r   r#   =   s   r#   )r   r   r
   c                 C   s    |j dkr|jdkrtdd S )N   ZAESz=Only 128, 192, and 256 bit keys are allowed for this AES mode)key_sizer   
ValueErrorr   r   r   r   _check_aes_key_lengthF   s    r*   c                 C   s0   t | jd |jkr,tdt | j| jd S )N   zInvalid IV size ({}) for {}.)lenr   
block_sizer)   formatr   r   r   r   r   _check_iv_lengthM   s     r/   )r"   r   r   r
   c                 C   sL   t |tst| dtjt| d |jkrHtdt|  d| dd S )N" requires a block cipher algorithmr+   zInvalid nonce size (z) for .)
isinstancer   r   r   UNSUPPORTED_CIPHERr,   r-   r)   )r"   r   r   r   r   r   _check_nonce_lengthX   s    
r4   c                 C   s4   t |tst|  dtjt| | t| | d S )Nr0   )r2   r   r   r   r3   r*   r/   r   r   r   r   _check_iv_and_key_lengthd   s    

r5   c                   @   s4   e Zd Zd ZedddZeedddZeZ	dS )CBCr   c                 C   s   t d| || _d S Nr   r   _check_byteslike_initialization_vectorr   r   r   r   r   __init__s   s    zCBC.__init__r	   c                 C   s   | j S Nr;   r   r   r   r   r   w   s    zCBC.initialization_vectorN
r   r   r   r   r   r=   r   r   r5   r   r   r   r   r   r6   p   s
   r6   c                   @   s@   e Zd Zd ZedddZeedddZeddd	d
Z	dS )XTS)r    c                 C   s*   t d| t|dkr td|| _d S )Nr       z!tweak must be 128-bits (16 bytes))r   r:   r,   r)   _tweak)r   r    r   r   r   r=      s    zXTS.__init__r	   c                 C   s   | j S r>   )rC   r   r   r   r   r       s    z	XTS.tweakNr   c                 C   s0   t |tjtjfrtd|jdkr,tdd S )Nz\The AES128 and AES256 classes do not support XTS, please use the standard AES class instead.)r'   i   z\The XTS specification requires a 256-bit key for AES-128-XTS and 512-bit key for AES-256-XTS)r2   r   ZAES128ZAES256	TypeErrorr(   r)   r   r   r   r   r      s    
zXTS.validate_for_algorithm)
r   r   r   r   r   r=   r   r    r   r   r   r   r   r   rA   ~   s
   rA   c                   @   s   e Zd Zd ZeZdS )ECBN)r   r   r   r   r*   r   r   r   r   r   rE      s   rE   c                   @   s4   e Zd Zd ZedddZeedddZeZ	dS )OFBr7   c                 C   s   t d| || _d S r8   r9   r<   r   r   r   r=      s    zOFB.__init__r	   c                 C   s   | j S r>   r?   r   r   r   r   r      s    zOFB.initialization_vectorNr@   r   r   r   r   rF      s
   rF   c                   @   s4   e Zd Zd ZedddZeedddZeZ	dS )CFBr7   c                 C   s   t d| || _d S r8   r9   r<   r   r   r   r=      s    zCFB.__init__r	   c                 C   s   | j S r>   r?   r   r   r   r   r      s    zCFB.initialization_vectorNr@   r   r   r   r   rG      s
   rG   c                   @   s4   e Zd Zd ZedddZeedddZeZ	dS )CFB8r7   c                 C   s   t d| || _d S r8   r9   r<   r   r   r   r=      s    zCFB8.__init__r	   c                 C   s   | j S r>   r?   r   r   r   r   r      s    zCFB8.initialization_vectorNr@   r   r   r   r   rH      s
   rH   c                   @   s@   e Zd Zd ZedddZeedddZeddd	d
Z	dS )CTR)r"   c                 C   s   t d| || _d S )Nr"   )r   r:   _nonce)r   r"   r   r   r   r=      s    zCTR.__init__r	   c                 C   s   | j S r>   )rJ   r   r   r   r   r"      s    z	CTR.nonceNr   c                 C   s   t | | t| j| j| d S r>   )r*   r4   r"   r   r   r   r   r   r      s    
zCTR.validate_for_algorithm)
r   r   r   r   r   r=   r   r"   r   r   r   r   r   r   rI      s
   rI   c                   @   sl   e Zd Zd ZdZdZdeeje e	dddZ
eeje dd	d
ZeedddZeddddZdS )GCMl   ? l            NrB   )r   r$   min_tag_lengthc                 C   s   t d| t|dk s$t|dkr,td|| _|d k	rpt d| |dk rVtdt||k rptd||| _|| _d S )	Nr   r+      zIinitialization_vector must be between 8 and 128 bytes (64 and 1024 bits).r$      zmin_tag_length must be >= 4z.Authentication tag must be {} bytes or longer.)	r   r:   r,   r)   r;   _check_bytesr.   _tagZ_min_tag_length)r   r   r$   rL   r   r   r   r=      s$    zGCM.__init__r	   c                 C   s   | j S r>   )rP   r   r   r   r   r$      s    zGCM.tagc                 C   s   | j S r>   r?   r   r   r   r   r      s    zGCM.initialization_vectorr   c                 C   sT   t | | t|ts tdtj|jd }| jd k	rPt| j|krPt	d
|d S )Nz%GCM requires a block cipher algorithmr+   z0Authentication tag cannot be more than {} bytes.)r*   r2   r   r   r   r3   r-   rP   r,   r)   r.   )r   r   Zblock_size_bytesr   r   r   r     s    


zGCM.validate_for_algorithm)NrB   )r   r   r   r   Z_MAX_ENCRYPTED_BYTESZ_MAX_AAD_BYTESr   r%   r&   intr=   r   r$   r   r   r   r   r   r   r   rK      s     rK   ) r   r%   Zcryptographyr   Zcryptography.exceptionsr   r   Z/cryptography.hazmat.primitives._cipheralgorithmr   r   Z&cryptography.hazmat.primitives.ciphersr   ABCMetar   r   r   r!   r#   r*   r/   r   r   r4   r5   r6   rA   rE   rF   rG   rH   rI   rK   r   r   r   r   <module>   s@   				    