a
    còf    ã                   @  sˆ  d dl m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ddddœdd„Zddddœdd„Zdddddœdd„Zdd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/d0„ d0eeƒZdS )1é    )ÚannotationsN)Úutils)ÚUnsupportedAlgorithmÚ_Reasons)ÚBlockCipherAlgorithmÚCipherAlgorithm)Ú
algorithmsc                   @  s:   e Zd Zeejddœdd„ƒƒZejdddœdd	„ƒZd
S )ÚModeÚstr©Úreturnc                 C  s   dS )z@
        A string naming this mode (e.g. "ECB", "CBC").
        N© ©Úselfr   r   úi/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/cryptography/hazmat/primitives/ciphers/modes.pyÚname   s    z	Mode.namer   ÚNone©Ú	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_algorithmN)Ú__name__Ú
__module__Ú__qualname__ÚpropertyÚabcÚabstractmethodr   r   r   r   r   r   r	      s
   r	   )Ú	metaclassc                   @  s$   e Zd Zeejddœdd„ƒƒZdS )ÚModeWithInitializationVectorÚbytesr   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   r    r   r   r   r   r   "   s   r   c                   @  s$   e Zd Zeejddœdd„ƒƒZdS )ÚModeWithTweakr   r   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!   +   s   r!   c                   @  s$   e Zd Zeejddœdd„ƒƒZdS )ÚModeWithNoncer   r   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#   4   s   r#   c                   @  s$   e Zd Zeejddœdd„ƒƒZdS )ÚModeWithAuthenticationTagúbytes | Noner   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   r'   r   r   r   r   r%   =   s   r%   r   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+   r   c                 C  s4   t | jƒ}|d |jkr0td|› d| j› d�ƒ‚d S )Né   zInvalid IV size (ú) for Ú.)Úlenr    Ú
block_sizer*   r   )r   r   Ziv_lenr   r   r   Ú_check_iv_lengthM   s    
r1   r   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 (r-   r.   )Ú
isinstancer   r   r   ÚUNSUPPORTED_CIPHERr/   r0   r*   )r$   r   r   r   r   r   Ú_check_nonce_lengthU   s    
þr5   c                 C  s4   t |tƒst| › d�tjƒ‚t| |ƒ t| |ƒ d S )Nr2   )r3   r   r   r   r4   r+   r1   r   r   r   r   Ú_check_iv_and_key_lengtha   s    
þ
r6   c                   @  s4   e Zd Zd Zddœdd„Zeddœdd„ƒZeZdS )	ÚCBCr   ©r    c                 C  s   t  d|¡ || _d S ©Nr    ©r   Ú_check_byteslikeÚ_initialization_vector©r   r    r   r   r   Ú__init__p   s    zCBC.__init__r   c                 C  s   | j S ©N©r<   r   r   r   r   r    t   s    zCBC.initialization_vectorN©	r   r   r   r   r>   r   r    r6   r   r   r   r   r   r7   m   s
   r7   c                   @  s@   e Zd Zd Zddœdd„Zeddœdd„ƒZdd	d
œdd„ZdS )ÚXTSr   )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?   )rD   r   r   r   r   r"   †   s    z	XTS.tweakr   r   r   c                 C  s0   t |tjtjfƒrtdƒ‚|jdv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)r3   r   ZAES128ZAES256Ú	TypeErrorr)   r*   r   r   r   r   r   Š   s    ÿ
ÿzXTS.validate_for_algorithmN)r   r   r   r   r>   r   r"   r   r   r   r   r   rB   {   s
   rB   c                   @  s   e Zd Zd ZeZdS )ÚECBN)r   r   r   r   r+   r   r   r   r   r   rF   ˜   s   rF   c                   @  s4   e Zd Zd Zddœdd„Zeddœdd„ƒZeZdS )	ÚOFBr   r8   c                 C  s   t  d|¡ || _d S r9   r:   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_vectorNrA   r   r   r   r   rG   ž   s
   rG   c                   @  s4   e Zd Zd Zddœdd„Zeddœdd„ƒZeZdS )	ÚCFBr   r8   c                 C  s   t  d|¡ || _d S r9   r:   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_vectorNrA   r   r   r   r   rH   ¬   s
   rH   c                   @  s4   e Zd Zd Zddœdd„Zeddœdd„ƒZeZdS )	ÚCFB8r   r8   c                 C  s   t  d|¡ || _d S r9   r:   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_vectorNrA   r   r   r   r   rI   º   s
   rI   c                   @  s@   e Zd Zd Zddœdd„Zeddœdd„ƒZdd	d
œdd„ZdS )ÚCTRr   )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?   )rK   r   r   r   r   r$   Ï   s    z	CTR.noncer   r   r   c                 C  s   t | |ƒ t| j| j|ƒ d S r?   )r+   r5   r$   r   r   r   r   r   r   Ó   s    
zCTR.validate_for_algorithmN)r   r   r   r   r>   r   r$   r   r   r   r   r   rJ   È   s
   rJ   c                   @  s`   e Zd Zd ZdZdZdddddœd	d
„Zeddœdd„ƒZeddœdd„ƒZ	dddœdd„Z
dS )ÚGCMl   àÿ? l            NrC   r   r&   Úint)r    r'   Úmin_tag_lengthc                 C  s‚   t  d|¡ t|ƒdk s$t|ƒdkr,tdƒ‚|| _|d urrt  d|¡ |dk rVtdƒ‚t|ƒ|k rrtd|› 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 z bytes or longer.)r   r;   r/   r*   r<   Ú_check_bytesÚ_tagZ_min_tag_length)r   r    r'   rN   r   r   r   r>   Ý   s     ÿ
ÿzGCM.__init__r   c                 C  s   | j S r?   )rR   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   r   r   c                 C  sV   t | |ƒ t|tƒs tdtjƒ‚|jd }| jd urRt| jƒ|krRt	d|› d�ƒ‚d S )Nz%GCM requires a block cipher algorithmr,   z'Authentication tag cannot be more than z bytes.)
r+   r3   r   r   r   r4   r0   rR   r/   r*   )r   r   Zblock_size_bytesr   r   r   r      s    

þ

ÿzGCM.validate_for_algorithm)NrC   )r   r   r   r   Z_MAX_ENCRYPTED_BYTESZ_MAX_AAD_BYTESr>   r   r'   r    r   r   r   r   r   rL   Ø   s     ürL   )Ú
__future__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+   r1   r5   r6   r7   rB   rF   rG   rH   rI   rJ   rL   r   r   r   r   Ú<module>   s,   				