o
    Œõ±jþ  ã                   @   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   ú£/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/unicrypto/backends/pure/external/AES/blockfeeder.pyÚ_block_can_consume8   s   r   c                 C   sr   |t kr	t|ƒ}n|tkrt|ƒdkrtdƒ‚ntdƒ‚t|ƒdkr4|  |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   sD   |t krt|  |¡ƒS |tkrt|ƒdkrtdƒ‚|  |¡S tdƒ‚)Nr
   r   r   )r   r   Údecryptr   r   r   r   r   r   r   Ú_block_final_decryptM   s   
r   c                 C   s   | j t|| j  ƒ S ©N)Úsegment_bytesÚintr   r   r   r   Ú_segment_can_consume`   s   r#   c                 C   óN   |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   Úfaux_paddingÚpaddedr   r   r   Ú_segment_final_encryptd   ó
   r*   c                 C   r$   r%   )r   r   r&   r!   r   r   r   r'   r   r   r   Ú_segment_final_decryptm   r+   r,   c                 C   s   |S r    r   r   r   r   r   Ú_stream_can_consume}   s   r-   c                 C   ó   |t tfvr
tdƒ‚|  |¡S ©Nr   )r   r   r   r   r   r   r   r   Ú_stream_final_encrypt€   ó   
r0   c                 C   r.   r/   )r   r   r   r   r   r   r   r   Ú_stream_final_decrypt†   r1   r2   c                   @   s&   e Zd ZdZefdd„Zddd„ZdS )ÚBlockFeederzÆThe 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u r	tdƒ‚|du r|  | j | j¡}d| _ |S |  j t|ƒ7  _ tdƒ}t| j ƒdkrZ| j t| j ƒd ¡}|dkr?|S ||  | j d|… ¡7 }| j |d… | _ t| j ƒdks.|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 feederr4   r
   r   )	r8   Ú
ValueErrorr7   r9   r   r   r5   Ú_can_consumer6   )r   r   ÚresultÚcan_consumer   r   r   r;   ž   s    
ýüzBlockFeeder.feedr    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r=   r;   r   r   r   r   r3   ’   s    r3   c                   @   ó   e Zd ZdZefdd„ZdS )Ú	Encrypterz<Accepts bytes of plaintext and returns encrypted ciphertext.c                 C   ó   t  | ||j|j|¡ d S r    )r3   r=   r   Ú_final_encrypt©r   r:   r   r   r   r   r=   ¿   ó   zEncrypter.__init__N©rB   rC   rD   rE   r   r=   r   r   r   r   rG   ¼   ó    rG   c                   @   rF   )Ú	Decrypterz<Accepts bytes of ciphertext and returns decrypted plaintext.c                 C   rH   r    )r3   r=   r   Ú_final_decryptrJ   r   r   r   r=   Æ   rK   zDecrypter.__init__NrL   r   r   r   r   rN   Ã   rM   rN   i    c                 C   s>   	 |  |¡}|s	n|  |¡}| |¡ q|  ¡ }| |¡ dS )zGUses feeder to read and convert from in_stream and write to out_stream.TN)Úreadr;   Úwrite)ÚfeederÚ	in_streamÚ
out_streamÚ
block_sizeÚchunkÚ	convertedr   r   r   Ú_feed_streamÍ   s   


ûrX   c                 C   ó   t | |d�}t||||ƒ dS )zCEncrypts a stream of bytes from in_stream to out_stream using mode.©r   N)rG   rX   )r:   rS   rT   rU   r   Ú	encrypterr   r   r   Úencrypt_streamÚ   ó   r\   c                 C   rY   )zCDecrypts a stream of bytes from in_stream to out_stream using mode.rZ   N)rN   rX   )r:   rS   rT   rU   r   Ú	decrypterr   r   r   Údecrypt_streamá   r]   r_   N)ÚAESr   r   r   Úutilr   r   r   r   r   r   r   r   r?   rI   rO   r#   r*   r,   r-   r0   r2   Úobjectr3   rG   rN   Ú
BLOCK_SIZErX   r\   r_   r   r   r   r   Ú<module>   s:   	*