a
    kÄ#dÈ  ã                   @   s2  d Z ddlZddlmZ ddlmZ ddlm  mZ ej	rtddl
mZ ddlmZmZmZmZmZ ddlmZmZ i ZG dd	„ d	eƒZG d
d„ de ee¡ƒZej	ræG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZi Zej	�r¬G dd„ deƒZ G dd„ de ƒZ!G dd„ deƒZ"e"ed< zle #¡ �N ej$ded� G dd„ deƒZ%G dd „ d eƒZ&e 'e%e d!œ¡ W d  ƒ n1 �sŠ0    Y  W n e(�yª   Y n0 ej	�r$G d"d#„ d#eeƒZ)d$Z*ee*ƒee)ej+ƒej,j-k�r$G d%d&„ d&eƒZ.G d'd(„ d(e.ƒZ/e 0e.j1e.j2ee*ƒ¡ e.ed)< e 'e¡ dS )*z
Block ciphers.
é    N)Úconf)ÚCipherError)ÚCryptographyDeprecationWarning)ÚCipherÚ
algorithmsÚmodesÚBlockCipherAlgorithmÚCipherAlgorithm)ÚbackendÚGetCipherByNamec                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú_BlockCipherMetaclassz—
    Cipher classes are automatically registered through this metaclass.
    Furthermore, their name attribute is extracted from their class name.
    c                    sJ   |dkr|dd … |d< t t| ƒ | |||¡}|dkrF|t|dd … < |S )NÚ_BlockCipheré   Úname)Úsuperr   Ú__new__Ú_tls_block_cipher_algs)ÚclsZ	ciph_nameÚbasesÚdctZ	the_class©Ú	__class__© ú[/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/tls/crypto/cipher_block.pyr   $   s    ÿz_BlockCipherMetaclass.__new__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__r   r   r   r   r      s   r   c                       sF   e Zd ZdZd‡ fdd„	Z‡ fdd„Zdd„ Zd	d
„ Zdd„ Z‡  Z	S )r   ÚblockNc                    sš   dddœ| _ |d u r>d| j d< t| dƒr0| j}n| j}d| }|sVd| j d< d| j }tt| ƒ d|¡ tt| ƒ d|¡ t|  	|¡|  
|¡td�| _d S )	NT)ÚkeyÚivFr    Úexpanded_key_lenó    r!   )r
   )ÚreadyÚhasattrr"   Úkey_lenÚ
block_sizer   r   Ú__setattr__r   Úpc_clsÚpc_cls_moder
   Ú_cipher)Úselfr    r!   r&   r   r   r   Ú__init__1   s     




þz_BlockCipher.__init__c                    sd   |dkr(| j d ur|| j j_d| jd< n&|dkrN| j d urD|| j j_d| jd< tt| ƒ ||¡ d S )Nr    Tr!   )	r+   Ú	algorithmr    r$   ÚmodeZ_initialization_vectorr   r   r(   )r,   r   Úvalr   r   r   r(   F   s    




z_BlockCipher.__setattr__c                 C   sJ   dt  | j¡v rt|ƒ‚| j ¡ }| |¡| ¡  }|| j d… | _	|S )z¥
        Encrypt the data. Also, update the cipher iv. This is needed for SSLv3
        and TLS 1.0. For TLS 1.1/1.2, it is overwritten in TLS.post_build().
        FN)
ÚsixÚ
itervaluesr$   r   r+   Ú	encryptorÚupdateÚfinalizer'   r!   )r,   Údatar3   Útmpr   r   r   ÚencryptQ   s    
z_BlockCipher.encryptc                 C   sJ   dt  | j¡v rt|ƒ‚| j ¡ }| |¡| ¡  }|| j d… | _	|S )zó
        Decrypt the data. Also, update the cipher iv. This is needed for SSLv3
        and TLS 1.0. For TLS 1.1/1.2, it is overwritten in TLS.pre_dissect().
        If we lack the key, we raise a CipherError which contains the input.
        FN)
r1   r2   r$   r   r+   Ú	decryptorr4   r5   r'   r!   )r,   r6   r9   r7   r   r   r   Údecrypt]   s    
z_BlockCipher.decryptc                 C   s    |   | j| j¡}| j ¡ |_|S ©N)r   r    r!   r$   Úcopy)r,   Úcr   r   r   Úsnapshotj   s    z_BlockCipher.snapshot)NN)
r   r   r   Útyper-   r(   r8   r:   r>   r   r   r   r   r   r   .   s   r   c                   @   s    e Zd ZejZejZdZ	dZ
dS )ÚCipher_AES_128_CBCé   N)r   r   r   r   ZAESr)   r   ÚCBCr*   r'   r&   r   r   r   r   r@   q   s   r@   c                   @   s   e Zd ZdZdS )ÚCipher_AES_256_CBCé    N©r   r   r   r&   r   r   r   r   rC   w   s   rC   c                   @   s    e Zd ZejZejZdZ	dZ
dS )ÚCipher_CAMELLIA_128_CBCrA   N)r   r   r   r   ZCamelliar)   r   rB   r*   r'   r&   r   r   r   r   rF   z   s   rF   c                   @   s   e Zd ZdZdS )ÚCipher_CAMELLIA_256_CBCrD   NrE   r   r   r   r   rG   €   s   rG   c                   @   s    e Zd ZejZejZdZ	dZ
dS )ÚCipher_DES_CBCé   N©r   r   r   r   Z	TripleDESr)   r   rB   r*   r'   r&   r   r   r   r   rH   ‰   s   rH   c                   @   s   e Zd ZdZdZdZdS )ÚCipher_DES40_CBCaÄ  
        This is an export cipher example. The key length has been weakened to 5
        random bytes (i.e. 5 bytes will be extracted from the master_secret).
        Yet, we still need to know the original length which will actually be
        fed into the encryption algorithm. This is what expanded_key_len
        is for, and it gets used in PRF.postprocess_key_for_export().
        We never define this attribute with non-export ciphers.
        rI   é   N)r   r   r   r   r"   r&   r   r   r   r   rK   �   s   rK   c                   @   s    e Zd ZejZejZdZ	dZ
dS )ÚCipher_3DES_EDE_CBCrI   é   NrJ   r   r   r   r   rM   ›   s   rM   ZDES_192_EDE3_CBCÚignore)Úcategoryc                   @   s    e Zd ZejZejZdZ	dZ
dS )ÚCipher_IDEA_CBCrI   rA   N)r   r   r   r   ZIDEAr)   r   rB   r*   r'   r&   r   r   r   r   rQ   ©   s   rQ   c                   @   s    e Zd ZejZejZdZ	dZ
dS )ÚCipher_SEED_CBCrA   N)r   r   r   r   ZSEEDr)   r   rB   r*   r'   r&   r   r   r   r   rR   ¯   s   rR   )ZIDEA_128_CBCZ
DES_64_CBCc                   @   s2   e Zd ZdZdZedgƒZdd„ Zedd„ ƒZ	dS )	Ú_ARC2ZRC2é@   é€   c                 C   s   t  | |¡| _d S r;   )r   Z_verify_key_sizer    )r,   r    r   r   r   r-   È   s    z_ARC2.__init__c                 C   s   t | jƒd S )NrI   )Úlenr    )r,   r   r   r   Úkey_sizeË   s    z_ARC2.key_sizeN)
r   r   r   r   r'   Ú	frozensetZ	key_sizesr-   ÚpropertyrW   r   r   r   r   rS   Ã   s   
rS   z{cipher.name}-{mode.name}c                   @   s   e Zd ZeZejZdZdZ	dS )ÚCipher_RC2_CBCrI   rA   N)
r   r   r   rS   r)   r   rB   r*   r'   r&   r   r   r   r   rZ   Ó   s   rZ   c                   @   s   e Zd ZdZdZdS )ÚCipher_RC2_CBC_40rA   rL   N)r   r   r   r"   r&   r   r   r   r   r[   Ù   s   r[   ZRC2_128_CBC)3r   ÚwarningsZscapy.configr   Zscapy.layers.tls.crypto.commonr   Zscapy.libs.sixZlibsr1   Zcrypto_validZcryptography.utilsr   Z&cryptography.hazmat.primitives.ciphersr   r   r   r   r	   Z,cryptography.hazmat.backends.openssl.backendr
   r   r   r?   r   Úwith_metaclassÚobjectr   r@   rC   rF   rG   Z_sslv2_block_cipher_algsrH   rK   rM   Úcatch_warningsÚfilterwarningsrQ   rR   r4   ÚAttributeErrorrS   Z_gcbn_formatrB   Z_ffiZNULLrZ   r[   Zregister_cipher_adapterr)   r*   r   r   r   r   Ú<module>   sb   B
ÿþ,ÿþ