o
    b                     @   sb  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	 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dd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)UnsupportedAlgorithm_Reasons)BlockCipherAlgorithm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
   k/var/www/secure340b-portal/env/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__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   nonce1   r   zModeWithNonce.nonceN)r   r   r   r   r   r   r#   r
   r
   r
   r   r"   0   r   r"   c                   @   s&   e Zd Z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   tag9   r   zModeWithAuthenticationTag.tagN)	r   r   r   r   r   typingOptionalr   r%   r
   r
   r
   r   r$   8   s    r$   c                 C   s$   |j dkr|jdkrtdd S 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_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_lengthG   s   r0   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_lengthP   s
   r1   c                 C   s   t | | t| | d S N)r+   r0   r   r
   r
   r   _check_iv_and_key_lengthW   s   
r3   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___      
zCBC.__init__r   c                 C      | j S r2   r:   r   r
   r
   r   r   c      zCBC.initialization_vectorN
r   r   r   r   r   r<   propertyr   r3   r   r
   r
   r
   r   r5   \       r5   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   r9   r-   r*   _tweak)r   r!   r
   r
   r   r<   m   s   
zXTS.__init__r   c                 C   r>   r2   )rG   r   r
   r
   r   r!   u   r@   z	XTS.tweakr   Nc                 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   y   s
   
zXTS.validate_for_algorithm)
r   r   r   r   r   r<   rB   r!   r   r   r
   r
   r
   r   rE   j   s    rE   c                   @   s   e Zd Zd ZeZdS )ECBN)r   r   r   r   r+   r   r
   r
   r
   r   rH      s    rH   c                   @   r4   )OFBr   c                 C   r6   r7   r8   r;   r
   r
   r   r<      r=   zOFB.__init__r   c                 C   r>   r2   r?   r   r
   r
   r   r      r@   zOFB.initialization_vectorNrA   r
   r
   r
   r   rI      rC   rI   c                   @   r4   )CFBr   c                 C   r6   r7   r8   r;   r
   r
   r   r<      r=   zCFB.__init__r   c                 C   r>   r2   r?   r   r
   r
   r   r      r@   zCFB.initialization_vectorNrA   r
   r
   r
   r   rJ      rC   rJ   c                   @   r4   )CFB8r   c                 C   r6   r7   r8   r;   r
   r
   r   r<      r=   zCFB8.__init__r   c                 C   r>   r2   r?   r   r
   r
   r   r      r@   zCFB8.initialization_vectorNrA   r
   r
   r
   r   rK      rC   rK   c                   @   rD   )CTRr#   c                 C   r6   )Nr#   )r   r9   _nonce)r   r#   r
   r
   r   r<      r=   zCTR.__init__r   c                 C   r>   r2   )rM   r   r
   r
   r   r#      r@   z	CTR.noncer   Nc                 C   s   t | | t| j| j| d S r2   )r+   r1   r#   r   r   r
   r
   r   r      s   
zCTR.validate_for_algorithm)
r   r   r   r   r   r<   rB   r#   r   r   r
   r
   r
   r   rL      s    rL   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            NrF   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   r9   r-   r*   r:   _check_bytesr/   _tagZ_min_tag_length)r   r   r%   rO   r
   r
   r   r<      s$   
zGCM.__init__r   c                 C   r>   r2   )rS   r   r
   r
   r   r%      r@   zGCM.tagc                 C   r>   r2   r?   r   r
   r
   r   r      r@   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+   
isinstancer   r   r   ZUNSUPPORTED_CIPHERr.   rS   r-   r*   r/   )r   r   Zblock_size_bytesr
   r
   r   r      s   


zGCM.validate_for_algorithm)NrF   )r   r   r   r   Z_MAX_ENCRYPTED_BYTESZ_MAX_AAD_BYTESr   r&   r'   intr<   rB   r%   r   r   r   r
   r
   r
   r   rN      s$    
rN   )r   r&   Zcryptographyr   Zcryptography.exceptionsr   r   Z/cryptography.hazmat.primitives._cipheralgorithmr   r   ABCMetar   r   r    r"   r$   r+   r0   r   r   r1   r3   r5   rE   rH   rI   rJ   rK   rL   rN   r
   r
   r
   r   <module>   s,   	