o
    Œõ±jÕ  ã                   @   sp   d dl Z d dlZd dlmZmZ d dlmZmZmZm	Z	m
Z
mZmZmZmZmZ d dlmZ G dd„ deƒZdS )é    N)ÚsymmetricBASEÚ
cipherMODE)
ÚAESModeOfOperationCBCÚAESModeOfOperationECBÚAESModeOfOperationCTRÚAESModeOfOperationCFBÚAESModeOfOperationOFBÚencrypt_streamÚdecrypt_streamÚPADDING_NONEÚCounterÚ	Encrypter)Úhashlibc                   @   sJ   e Zd Zejddfdd„Zdd„ Zddd„Zdd	d
„Zdd„ Z	dd„ Z
dS )ÚAESNé   c                 C   s$   d | _ d | _tj| ||||d� d S )N)Úsegment_size)Ú_ccm_cipher_ctrÚ_ccm_cipher_cbcr   Ú__init__)ÚselfÚkeyÚmodeÚIVr   © r   úŽ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/unicrypto/backends/pure/AES.pyr      s   zAES.__init__c                 C   s¾  | j tjkrt| jƒ| _d S | j tjkrt| j| jd�| _d S | j tj	kr8t
| jttj| jddd�ƒd�| _d S | j tjkrMt| j| j| jd d�| _d S | j tjkr^t| j| jd�| _d S | j tjkrÇ| jdvrptd	| j ƒ‚| jr„d
t| jƒ  krƒdksˆtdƒ‚ tdƒ‚dt| jƒ }t d|d ¡| j }ddt|ƒd   }||7 }ttj|ddd�ƒ}t
| j|ƒ| _tt| jdd�td�| _d S | j tjkrÛddlm} || jƒ| _d S tdƒ‚)N)ÚivÚbigF)Ú	byteorderÚsigned)Úcounterr   )r   r   )é   é   r   é
   é   é   é   z@Parameter 'mac_len' must be even and in the range 4..16 (not %d)é   é   z<Length of parameter 'nonce' must be in the range 7..13 bytesé   ÚBé   ó    r%   ó                   ©Úpaddingr   )ÚAES_GCMzUnknown cipher mode!) r   r   ÚECBr   r   Ú_cipherÚCBCr   r   ÚCTRr   r   ÚintÚ
from_bytesÚCFBr   r   ÚOFBr   ÚCCMÚ
ValueErrorÚlenÚstructÚpackr   r   r   r   ÚGCMÚ+unicrypto.backends.pure.external.AES.AESGCMr/   Ú	Exception)r   ÚqÚt_nonceÚ
t_noncepadÚ	ctr_startr/   r   r   r   Úsetup_cipher   s8   &
ÿzAES.setup_cipherc                 C   s„   | j tjkr|  ||¡S | j tjkr| j | j||¡S | j tjkr<t	 
|¡}t	 
¡ }t| j||td� | d¡ | ¡ S | j |¡S ©Nr-   r   )r   r   r8   Ú_AES__ccm_encryptr=   r1   Úencryptr   r6   ÚioÚBytesIOr	   r   ÚseekÚread)r   ÚdataÚaadÚin_buffÚout_buffr   r   r   rG   0   s   

zAES.encryptc                 C   sˆ   | j tjkr|  |||¡S | j tjkr| j | j|||¡S | j tjkr>t	 
|¡}t	 
¡ }t| j||td� | d¡ | ¡ S | j |¡S rE   )r   r   r8   Ú_AES__ccm_decryptr=   r1   Údecryptr   r6   rH   rI   r
   r   rJ   rK   )r   rL   rM   ÚmacrN   rO   r   r   r   rQ   @   s   

zAES.decryptc                 C   s‚  dt | jƒ }d}| j d¡}| j |¡}t |ƒ}t |ƒ}d|dk d| jd d   |d  }	t d	|	¡| j | |d
¡ }
d}|dkra|dk rLd}n|dk rUd}d}nd}d}|| |d
¡7 }|| }d}t |ƒ| dkryd|t |ƒ|   }||7 }|}d}|| dkr�d|||   }||7 }|
| | }| j 	|¡}|| j 	¡ 7 }|dd … }t
dd„ t||ƒD ƒƒd | j… }||fS )Nr(   r%   r,   é@   r   r   é   r*   r)   r   ó    é ÿ  ì        ó   ÿþr    ó   ÿÿr+   éðÿÿÿc                 S   ó   g | ]\}}||A ‘qS r   r   ©Ú.0ÚaÚbr   r   r   Ú
<listcomp>�   ó    z%AES.__ccm_encrypt.<locals>.<listcomp>)r:   r   r   rG   r   r;   r<   Úto_bytesr   ÚfeedÚbytesÚzip)r   Ú	plaintextrM   r@   Ú	blockSizeÚs0ÚcÚpLenÚaadLenÚflagsÚb0ÚassocLenEncodedÚencSizeÚ	aadPaddedÚaadPadÚ
ptxtPaddedÚptxtPadÚmacDataÚtÚtagr   r   r   Ú__ccm_encryptP   sD   &"zAES.__ccm_encryptc                 C   sâ  dt | jƒ }| j d¡}| j |¡}t |ƒ}t |ƒ}d|dk d| jd d   |d  }	t d|	¡| j | |d	¡ }
d
}|dkr_|dk rJd}n|dk rSd}d}nd}d}|| |d	¡7 }|| }d
}t |ƒd dkrwddt |ƒd   }||7 }|}d
}|d dkr�dd|d   }||7 }|
| | }| j 	|¡}|| j 	¡ 7 }|dd … }t
dd„ t||ƒD ƒƒd | j… }t ¡ }| |¡ | ¡ }t ¡ }| |¡ | ¡ }d}t||ƒD ]
\}}|||A O }qÜ|dkrïtdƒ‚|S )Nr(   r,   rS   r   r   rT   r*   r)   r   rU   rV   rW   rX   r    rY   r%   r+   rZ   c                 S   r[   r   r   r\   r   r   r   r`   ¹   ra   z%AES.__ccm_decrypt.<locals>.<listcomp>zIncorrect MAC)r:   r   r   rG   r   r;   r<   rb   r   rc   rd   re   r   Úsha256ÚupdateÚdigestr9   )r   Ú
ciphertextrM   Úmacvaluer@   rh   rf   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   Úh1Údigest1Úh2Údigest2ÚresultÚxÚyr   r   r   Ú__ccm_decrypt„   sX   &"

zAES.__ccm_decrypt)N)NN)Ú__name__Ú
__module__Ú__qualname__r   r0   r   rD   rG   rQ   rF   rP   r   r   r   r   r   
   s    

4r   )rH   r;   Úunicrypto.symmetricr   r   Ú$unicrypto.backends.pure.external.AESr   r   r   r   r   r	   r
   r   r   r   Ú	unicryptor   r   r   r   r   r   Ú<module>   s    0