a
    kÄ#dQ  ã                   @   sÂ   d Z ddlmZ ddlmZ ddlmZ ddlm  m	Z	 ej
r\ddlmZmZ ddl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dS )z
Stream ciphers.
é    )Úabsolute_import)Úconf)ÚCipherErrorN)ÚCipherÚ
algorithms)Údefault_backendc                       s    e Zd ZdZ‡ fdd„Z‡  ZS )Ú_StreamCipherMetaclassz—
    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Ú_StreamCipheré   Úname)Úsuperr   Ú__new__Ú_tls_stream_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_stream.pyr      s    ÿz_StreamCipherMetaclass.__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	   ÚstreamNc                    sŽ   ddi| _ |du r<d| j d< t| dƒr.| j}n| j}d| }tt| ƒ d|¡ t|  |¡dt	ƒ d�| _
| j
 ¡ | _| j
 ¡ | _d| _d| _dS )	a€  
        Note that we have to keep the encryption/decryption state in unique
        encryptor and decryptor objects. This differs from _BlockCipher.

        In order to do connection state snapshots, we need to be able to
        recreate past cipher contexts. This is why we feed _enc_updated_with
        and _dec_updated_with every time encrypt() or decrypt() is called.
        ÚkeyTNFÚexpanded_key_lenó    )ÚmodeÚbackendó    )ÚreadyÚhasattrr   Úkey_lenr   r	   Ú__setattr__r   Úpc_clsr   Ú_cipherÚ	encryptorÚ	decryptorÚ_enc_updated_withÚ_dec_updated_with)Úselfr   Ztmp_lenr   r   r   Ú__init__*   s     	



þz_StreamCipher.__init__c                    sT   |dkr>| j dur4|| j j_| j  ¡ | _| j  ¡ | _d| jd< tt| ƒ ||¡ dS )z‘
        We have to keep the encryptor/decryptor for a long time,
        however they have to be updated every time the key is changed.
        r   NT)	r'   Ú	algorithmr   r(   r)   r"   r   r	   r%   )r,   r   Úvalr   r   r   r%   G   s    


z_StreamCipher.__setattr__c                 C   s2   dt  | j¡v rt|ƒ‚|  j|7  _| j |¡S ©NF)ÚsixÚ
itervaluesr"   r   r*   r(   Úupdate©r,   Údatar   r   r   ÚencryptT   s    z_StreamCipher.encryptc                 C   s2   dt  | j¡v rt|ƒ‚|  j|7  _| j |¡S r0   )r1   r2   r"   r   r+   r)   r3   r4   r   r   r   ÚdecryptZ   s    z_StreamCipher.decryptc                 C   sH   |   | j¡}| j ¡ |_|j | j¡ |j | j¡ | j|_| j|_|S ©N)	r   r   r"   Úcopyr(   r3   r*   r)   r+   ©r,   Úcr   r   r   Úsnapshot`   s    z_StreamCipher.snapshot)N)
r   r   r   Útyper-   r%   r6   r7   r<   r   r   r   r   r   r	   '   s   r	   c                   @   s   e Zd ZejZdZdS )ÚCipher_RC4_128é   N)r   r   r   r   ZARC4r&   r$   r   r   r   r   r>   k   s   r>   c                   @   s   e Zd ZdZdZdS )ÚCipher_RC4_40r?   é   N)r   r   r   r   r$   r   r   r   r   r@   o   s   r@   c                       s:   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚCipher_NULLr   Nc                    s&   ddi| _ d | _tt| ƒ d|¡ d S )Nr   T)r"   r'   r   rB   r%   )r,   r   r   r   r   r-   w   s    
zCipher_NULL.__init__c                 C   s   |   | j¡}| j ¡ |_|S r8   )r   r   r"   r9   r:   r   r   r   r<   }   s    zCipher_NULL.snapshotc                 C   s   |S r8   r   r4   r   r   r   r6   ‚   s    zCipher_NULL.encryptc                 C   s   |S r8   r   r4   r   r   r   r7   …   s    zCipher_NULL.decrypt)N)	r   r   r   r$   r-   r<   r6   r7   r   r   r   r   r   rB   t   s
   rB   )r   Ú
__future__r   Zscapy.configr   Zscapy.layers.tls.crypto.commonr   Zscapy.libs.sixZlibsr1   Zcrypto_validZ&cryptography.hazmat.primitives.ciphersr   r   Zcryptography.hazmat.backendsr   r   r=   r   Úwith_metaclassÚobjectr	   r>   r@   rB   r   r   r   r   Ú<module>   s   C