U
    ;g                     @   s&  d dl mZmZmZ d dlmZmZmZ dZdZ	dd Z
e	fddZe	fd	d
Ze
e_ee_ee_dd Ze	fddZe	fddZee_ee_ee_dd Ze	fddZe	fddZee_ee_ee_G dd deZG dd deZG dd deZdZefddZee	fd d!Zee	fd"d#Zd$S )%   )AESBlockModeOfOperationAESSegmentModeOfOperationAESStreamModeOfOperation)append_PKCS7_paddingstrip_PKCS7_paddingto_bufferablenonedefaultc                 C   s   |dkrdS dS )N        selfsizer   r   Q/opt/bot/vods_filmes/script/venv/lib/python3.8/site-packages/pyaes/blockfeeder.py_block_can_consume6   s     r   c                 C   sr   |t krt|}n&|tkr0t|dkr8tdntdt|dkrh| |d d | |dd   S | |S )Nr
   #invalid data length for final blockinvalid padding option    )PADDING_DEFAULTr   PADDING_NONElen	Exceptionencryptr   datapaddingr   r   r   _block_final_encrypt;   s    

$r   c                 C   sH   |t krt| |S |tkr<t|dkr2td| |S tdd S )Nr
   r   r   )r   r   decryptr   r   r   r   r   r   r   _block_final_decryptK   s    
r   c                 C   s   | j t|| j   S N)segment_bytesintr   r   r   r   _segment_can_consume^   s    r#   c                 C   sN   |t krtdtd| jt|| j   }|t| }| |d t| S Nr   r   )r   r   chrr!   r   r   r   r   r   r   Zfaux_paddingpaddedr   r   r   _segment_final_encryptb   s
    r(   c                 C   sN   |t krtdtd| jt|| j   }|t| }| |d t| S r$   )r   r   r%   r!   r   r   r   r&   r   r   r   _segment_final_decryptk   s
    r)   c                 C   s   |S r    r   r   r   r   r   _stream_can_consume{   s    r*   c                 C   s   |t tfkrtd| |S Nr   )r   r   r   r   r   r   r   r   _stream_final_encrypt~   s    r,   c                 C   s   |t tfkrtd| |S r+   )r   r   r   r   r   r   r   r   _stream_final_decrypt   s    r-   c                   @   s&   e Zd ZdZefddZdddZdS )BlockFeederzThe super-class for objects to handle chunking a stream of bytes
       into the appropriate block size for the underlying mode of operation
       and applying (or stripping) padding, as necessary.c                 C   s&   || _ || _|| _td| _|| _d S )N )_mode_feed_finalr   _buffer_padding)r   modefeedfinalr   r   r   r   __init__   s
    
zBlockFeeder.__init__Nc                 C   s   | j dkrtd|dkr4| | j | j}d| _ |S |  j t|7  _ td}t| j dkr| jt| j d }|dkr|q|| | j d| 7 }| j |d | _ qN|S )a  Provide bytes to encrypt (or decrypt), returning any bytes
           possible from this or any previous calls to feed.

           Call with None or an empty string to flush the mode of
           operation and return any final bytes; no further calls to
           feed may be made.Nzalready finished feederr/   r
   r   )	r3   
ValueErrorr2   r4   r   r   r0   _can_consumer1   )r   r   resultZcan_consumer   r   r   r6      s    
 zBlockFeeder.feed)N)__name__
__module____qualname____doc__r   r8   r6   r   r   r   r   r.      s   r.   c                   @   s   e Zd ZdZefddZdS )	Encrypterz<Accepts bytes of plaintext and returns encrypted ciphertext.c                 C   s   t | ||j|j| d S r    )r.   r8   r   _final_encryptr   r5   r   r   r   r   r8      s    zEncrypter.__init__Nr<   r=   r>   r?   r   r8   r   r   r   r   r@      s   r@   c                   @   s   e Zd ZdZefddZdS )	Decrypterz<Accepts bytes of ciphertext and returns decrypted plaintext.c                 C   s   t | ||j|j| d S r    )r.   r8   r   _final_decryptrB   r   r   r   r8      s    zDecrypter.__init__NrC   r   r   r   r   rD      s   rD   i    c                 C   s<   | |}|sq&| |}|| q |  }|| dS )zGUses feeder to read and convert from in_stream and write to out_stream.N)readr6   write)Zfeeder	in_stream
out_stream
block_sizechunkZ	convertedr   r   r   _feed_stream   s    

rL   c                 C   s   t | |d}t|||| dS )zCEncrypts a stream of bytes from in_stream to out_stream using mode.r   N)r@   rL   )r5   rH   rI   rJ   r   Z	encrypterr   r   r   encrypt_stream   s    rN   c                 C   s   t | |d}t|||| dS )zCDecrypts a stream of bytes from in_stream to out_stream using mode.rM   N)rD   rL   )r5   rH   rI   rJ   r   	decrypterr   r   r   decrypt_stream   s    rP   N)Zaesr   r   r   utilr   r   r   r   r   r   r   r   r:   rA   rE   r#   r(   r)   r*   r,   r-   objectr.   r@   rD   Z
BLOCK_SIZErL   rN   rP   r   r   r   r   <module>   s8   	*