o
    
c                      @   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dede	ddfddZdededdfddZdedede	ddfddZdede	ddf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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   Y/opt/certbot/lib/python3.10/site-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__propertyabcabstractmethodstrr   r   r   r   r   r   r   r      s    r   )	metaclassc                   @   $   e Zd Ze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   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    r!   c                   @   r   )ModeWithNoncer	   c                 C   r
   )z@
        The value of the nonce for this mode as bytes.
        Nr   r   r   r   r   nonce5   r   zModeWithNonce.nonceN)r   r   r   r   r   r   r   r$   r   r   r   r   r#   4   r    r#   c                   @   s*   e Zd Zeejdeje fddZ	dS )ModeWithAuthenticationTagr	   c                 C   r
   )zP
        The value of the tag supplied to the constructor of this mode.
        Nr   r   r   r   r   tag>   r   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 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_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   r2   r$   r   c                 C   sF   t |tst| dtjt| d |jkr!tdt| |d S )N" requires a block cipher algorithmr.   zInvalid nonce size ({}) for {}.)	
isinstancer   r   r   UNSUPPORTED_CIPHERr/   r0   r,   r1   )r$   r   r   r   r   r   _check_nonce_lengthX   s   
r6   c                 C   s4   t |tst|  dtjt| | t| | d S )Nr3   )r4   r   r   r   r5   r-   r2   r   r   r   r   _check_iv_and_key_lengthf   s   

r7   c                   @   4   e Zd Zd ZdefddZedefd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__u      
zCBC.__init__r	   c                 C      | j S Nr>   r   r   r   r   r   y      zCBC.initialization_vectorN
r   r   r   r   r   r@   r   r   r7   r   r   r   r   r   r9   r       r9   c                   @   B   e Zd Zd ZdefddZedefddZdedd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   r=   r/   r,   _tweak)r   r"   r   r   r   r@      s   
zXTS.__init__r	   c                 C   rB   rC   )rK   r   r   r   r   r"      rE   z	XTS.tweakr   Nc                 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)r4   r   AES128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   rI      s    rI   c                   @   s   e Zd Zd ZeZdS )ECBN)r   r   r   r   r-   r   r   r   r   r   rO      s    rO   c                   @   r8   )OFBr   c                 C   r:   r;   r<   r?   r   r   r   r@      rA   zOFB.__init__r	   c                 C   rB   rC   rD   r   r   r   r   r      rE   zOFB.initialization_vectorNrF   r   r   r   r   rP      rG   rP   c                   @   r8   )CFBr   c                 C   r:   r;   r<   r?   r   r   r   r@      rA   zCFB.__init__r	   c                 C   rB   rC   rD   r   r   r   r   r      rE   zCFB.initialization_vectorNrF   r   r   r   r   rQ      rG   rQ   c                   @   r8   )CFB8r   c                 C   r:   r;   r<   r?   r   r   r   r@      rA   zCFB8.__init__r	   c                 C   rB   rC   rD   r   r   r   r   r      rE   zCFB8.initialization_vectorNrF   r   r   r   r   rR      rG   rR   c                   @   rH   )CTRr$   c                 C   r:   )Nr$   )r   r=   _nonce)r   r$   r   r   r   r@      rA   zCTR.__init__r	   c                 C   rB   rC   )rT   r   r   r   r   r$      rE   z	CTR.noncer   Nc                 C   s   t | | t| j| j| d S rC   )r-   r6   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   rS      s    rS   c                   @   sv   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
eje fddZed
efddZded
dfddZdS )GCMl   ? l            NrJ   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   r=   r/   r,   r>   _check_bytesr1   _tag_min_tag_length)r   r   r&   rV   r   r   r   r@      s$   
zGCM.__init__r	   c                 C   rB   rC   )rZ   r   r   r   r   r&      rE   zGCM.tagc                 C   rB   rC   rD   r   r   r   r   r     rE   zGCM.initialization_vectorr   c                 C   sX   t | | t|tstdtj|jd }| jd ur(t| j|kr*t	d
|d S d S )Nz%GCM requires a block cipher algorithmr.   z0Authentication tag cannot be more than {} bytes.)r-   r4   r   r   r   r5   r0   rZ   r/   r,   r1   )r   r   block_size_bytesr   r   r   r     s   


zGCM.validate_for_algorithm)NrJ   )r   r   r   r   _MAX_ENCRYPTED_BYTES_MAX_AAD_BYTESr   r'   r(   intr@   r   r&   r   r   r   r   r   r   r   rU      s$    
rU   ) r   r'   cryptographyr   cryptography.exceptionsr   r   /cryptography.hazmat.primitives._cipheralgorithmr   r   &cryptography.hazmat.primitives.ciphersr   ABCMetar   r   r!   r#   r%   r-   r2   r   r   r6   r7   r9   rI   rO   rP   rQ   rR   rS   rU   r   r   r   r   <module>   sV   				


