o
    )%a                     @   sJ  d dl Z d dlZd dlmZ d dlmZ G dd de jdZG dd de jdZG d	d
 d
e jdZ	G dd de jdZ
G dd de jdZdd Zdd ZdedefddZdd ZG dd deeZG dd dee	ZG dd deZG dd  d eeZG d!d" d"eeZG d#d$ d$eeZG d%d& d&ee
ZG d'd( d(eeeZdS ))    N)utils)CipherAlgorithmc                   @   s8   e Zd ZejdefddZejdeddfddZ	dS )Modereturnc                 C      dS )z@
        A string naming this mode (e.g. "ECB", "CBC").
        N selfr   r   N/usr/lib/python3/dist-packages/cryptography/hazmat/primitives/ciphers/modes.pyname       z	Mode.name	algorithmNc                 C   r   )zq
        Checks that all the necessary invariants of this (mode, algorithm)
        combination are met.
        Nr   r	   r   r   r   r
   validate_for_algorithm   r   zMode.validate_for_algorithm)
__name__
__module____qualname__abcabstractpropertystrr   abstractmethodr   r   r   r   r   r
   r      s
    r   )	metaclassc                   @       e Zd ZejdefddZdS )ModeWithInitializationVectorr   c                 C   r   )zP
        The value of the initialization vector for this mode as bytes.
        Nr   r   r   r   r
   initialization_vector   r   z2ModeWithInitializationVector.initialization_vectorN)r   r   r   r   r   bytesr   r   r   r   r
   r          r   c                   @   r   )ModeWithTweakr   c                 C   r   )z@
        The value of the tweak for this mode as bytes.
        Nr   r   r   r   r
   tweak%   r   zModeWithTweak.tweakN)r   r   r   r   r   r   r   r   r   r   r
   r   $   r   r   c                   @   r   )ModeWithNoncer   c                 C   r   )z@
        The value of the nonce for this mode as bytes.
        Nr   r   r   r   r
   nonce-   r   zModeWithNonce.nonceN)r   r   r   r   r   r   r    r   r   r   r
   r   ,   r   r   c                   @   r   )ModeWithAuthenticationTagr   c                 C   r   )zP
        The value of the tag supplied to the constructor of this mode.
        Nr   r   r   r   r
   tag5   r   zModeWithAuthenticationTag.tagN)r   r   r   r   r   r   r"   r   r   r   r
   r!   4   r   r!   c                 C   s$   |j dkr|jdkrtdd S d S )N   AESz=Only 128, 192, and 256 bit keys are allowed for this AES mode)key_sizer   
ValueErrorr   r   r   r
   _check_aes_key_length<   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_lengthC   s   r,   r    r   c                 C   s*   t | d |jkrtdt | |d S )Nr(   zInvalid nonce size ({}) for {}.)r)   r*   r&   r+   )r    r   r   r   r   r
   _check_nonce_lengthL   s
   r-   c                 C   s   t | | t| | d S N)r'   r,   r   r   r   r
   _check_iv_and_key_lengthS   s   
r/   c                   @   ,   e Zd Zd ZdefddZedZe	Z
dS )CBCr   c                 C      t d| || _d S Nr   r   _check_byteslike_initialization_vectorr	   r   r   r   r
   __init__[      
zCBC.__init__r6   Nr   r   r   r   r   r8   r   read_only_propertyr   r/   r   r   r   r   r
   r1   X   
    
r1   c                   @   6   e Zd Zd ZdefddZedZde	fddZ
dS )	XTSr   c                 C   s*   t d| t|dkrtd|| _d S )Nr      z!tweak must be 128-bits (16 bytes))r   r5   r)   r&   _tweak)r	   r   r   r   r
   r8   f   s   
zXTS.__init__r@   r   c                 C   s   |j dvr	tdd S )N)r#   i   z\The XTS specification requires a 256-bit key for AES-128-XTS and 512-bit key for AES-256-XTS)r%   r&   r   r   r   r
   r   p   s
   
zXTS.validate_for_algorithmN)r   r   r   r   r   r8   r   r;   r   r   r   r   r   r   r
   r>   c   s
    
r>   c                   @   s   e Zd Zd ZeZdS )ECBN)r   r   r   r   r'   r   r   r   r   r
   rA   x   s    rA   c                   @   r0   )OFBr   c                 C   r2   r3   r4   r7   r   r   r
   r8      r9   zOFB.__init__r6   Nr:   r   r   r   r
   rB   ~   r<   rB   c                   @   r0   )CFBr   c                 C   r2   r3   r4   r7   r   r   r
   r8      r9   zCFB.__init__r6   Nr:   r   r   r   r
   rC      r<   rC   c                   @   r0   )CFB8r   c                 C   r2   r3   r4   r7   r   r   r
   r8      r9   zCFB8.__init__r6   Nr:   r   r   r   r
   rD      r<   rD   c                   @   r=   )	CTRr    c                 C   r2   )Nr    )r   r5   _nonce)r	   r    r   r   r
   r8      r9   zCTR.__init__rF   r   c                 C   s   t | | t| j| j| d S r.   )r'   r-   r    r   r   r   r   r
   r      s   
zCTR.validate_for_algorithmN)r   r   r   r   r   r8   r   r;   r    r   r   r   r   r   r
   rE      s
    
rE   c                   @   s\   e Zd Zd ZdZdZ		ddedeje de	fdd	Z
ed
ZedZdefddZdS )GCMl   ? l            Nr?   r   r"   min_tag_lengthc                 C   s   t d| t|dk st|dkrtd|| _|d ur8t d| |dk r+tdt||k r8t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   r5   r)   r&   r6   _check_bytesr+   _tag_min_tag_length)r	   r   r"   rH   r   r   r
   r8      s$   
zGCM.__init__rL   r6   r   c                 C   s   t | | d S r.   )r'   r   r   r   r
   r      s   zGCM.validate_for_algorithm)Nr?   )r   r   r   r   _MAX_ENCRYPTED_BYTES_MAX_AAD_BYTESr   typingOptionalintr8   r   r;   r"   r   r   r   r   r   r   r
   rG      s     


rG   )r   rP   cryptographyr   /cryptography.hazmat.primitives._cipheralgorithmr   ABCMetar   r   r   r   r!   r'   r,   r   r   r-   r/   r1   r>   rA   rB   rC   rD   rE   rG   r   r   r   r
   <module>   s*   	