o
    Œõ±j²  ã                   @   sP   d dl mZ d dlmZ d dlmZmZ d dlZd dl	m
Z
 G dd„ deƒZdS )é    )ÚAES)ÚCounter)ÚsymmetricBASEÚ
cipherMODEN)Ú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 )r   Né   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/pycrypto/AES.pyr   	   s   zAES.__init__c                 C   sè  | j tjkrt | jtj¡| _d S | j tjkr$t | jtj	| j
¡| _d S | j tjkrEtj| jtj| j
tjdtj| j
ddd�d�d�| _d S | j tjkr[tj| jtj| j
| jd�| _d S | j tjkrnt | jtj| j
¡| _d S | j tjkrÜ| jdvr€t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j| jtj| j
tjdtj|ddd�d�d�| _t | jtj	d¡| _d S | j tjkrðddlm} || jƒ| _d S tdƒ‚)Né€   ÚbigF)Ú	byteorderÚsigned)Úinitial_value)Úcounterr   )é   é   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   ó                   r   )ÚAES_GCMzUnknown cipher mode!) r   r   ÚECBÚ_pyCryptoAESÚnewr   ÚMODE_ECBÚ_cipherÚCBCÚMODE_CBCr   ÚCTRÚMODE_CTRr   ÚintÚ
from_bytesÚCFBÚMODE_CFBr	   ÚOFBÚMODE_OFBÚCCMÚ
ValueErrorÚlenÚstructÚpackr
   r   ÚGCMÚ&unicrypto.backends.crypto.extra.AESGCMr&   Ú	Exception)r   ÚqÚt_nonceÚ
t_noncepadr&   r   r   r   Úsetup_cipher   s6   6 
ÿ0zAES.setup_cipherc                 C   sÆ   | j tjkr|  ||¡S | j tjkr| j | j||¡S | j tjks'| j tj	kr]| jj
t|ƒ| jj
  | jj
 dkr]| jj
t|ƒ| jj
  | jj
 }|d|  }| j |¡}|d t|ƒ… S | j |¡S ©Nr   r$   )r   r   r6   Ú_AES__ccm_encryptr;   r+   Úencryptr   r2   r4   Ú
block_sizer8   )r   ÚdataÚaadÚpadding_lengthÚpadded_dataÚenc_datar   r   r   rD   ,   s   < zAES.encryptc                 C   sÊ   | j tjkr|  |||¡S | j tjkr| j | j|||¡S | j tjks)| j tj	kr_| jj
t|ƒ| jj
  | jj
 dkr_| jj
t|ƒ| jj
  | jj
 }|d|  }| j |¡}|d t|ƒ… S | j |¡S rB   )r   r   r6   Ú_AES__ccm_decryptr;   r+   Údecryptr   r2   r4   rE   r8   )r   rF   rG   ÚmacrH   rI   rJ   r   r   r   rL   :   s   < zAES.decryptc                 C   st  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 |¡}|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   ó    z%AES.__ccm_encrypt.<locals>.<listcomp>)r8   r   r
   rD   r	   r9   r:   Úto_bytesr   ÚbytesÚzip)r   Ú	plaintextrG   r>   Ú	blockSizeÚs0ÚcÚpLenÚaadLenÚflagsÚb0ÚassocLenEncodedÚencSizeÚ	aadPaddedÚaadPadÚ
ptxtPaddedÚptxtPadÚmacDataÚtÚtagr   r   r   Ú__ccm_encryptJ   sB   &"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 |¡}|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%   rN   r   r   rO   r#   r"   r   rP   rQ   rR   rS   r   rT   r   r$   rU   c                 S   rV   r   r   rW   r   r   r   r[   ±   r\   z%AES.__ccm_decrypt.<locals>.<listcomp>zIncorrect MAC)r8   r   r
   rD   r	   r9   r:   r]   r   r^   r_   r   Úsha256ÚupdateÚdigestr7   )r   Ú
ciphertextrG   Úmacvaluer>   rb   r`   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   Úh1Údigest1Úh2Údigest2ÚresultÚxÚyr   r   r   Ú__ccm_decrypt}   sV   &"

zAES.__ccm_decrypt)N)NN)Ú__name__Ú
__module__Ú__qualname__r   r'   r   rA   rD   rL   rC   rK   r   r   r   r   r      s    

3r   )ÚCrypto.Cipherr   r(   ÚCrypto.Utilr   Úunicrypto.symmetricr   r   r9   Ú	unicryptor   r   r   r   r   Ú<module>   s   