o
    Œõ±jˆ  ã                   @   sD   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 )é    )Úcipher)Ú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 )ÚAESNé€   c                 C   s0   d | _ d | _d | _d | _tj| ||||d� d S )N)Úsegment_size)ÚctrintÚctrlenÚ_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/mbedtls/AES.pyr      s
   zAES.__init__c                 C   sä  | j tjkrtj | jtjd¡| _d S | j tj	kr'tj | jtj
| j¡| _d S | j tjkrKt| jƒ| _tj| jddd�| _tj | jtj| j¡| _d S | j tjkr_tj | jtj| j¡| _d S | j tjkrstj | 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|ƒ| _tj|ddd�| _tj | jtj|¡| _tj | jtj
d¡| _d S | j tjkrîd | _d S tdƒ‚)Nó    ÚbigF©Ú	byteorderÚsigned)é   é   é   é
   é   é   é   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   ó                   zUnknown cipher mode!) r   r   ÚECBÚ
mbedcipherr   Únewr   ÚMODE_ECBÚ_cipherÚCBCÚMODE_CBCr   ÚCTRÚlenr
   ÚintÚ
from_bytesr	   ÚMODE_CTRÚOFBÚMODE_OFBÚCFBÚMODE_CFBÚCCMr   Ú
ValueErrorÚstructÚpackr   r   ÚGCMÚ	Exception)r   ÚqÚt_nonceÚ
t_noncepadr   r   r   Úsetup_cipher   s>   
ÿ

zAES.setup_cipherc                 C   sZ   | j tjkr|  ||¡S | j tjkr%tj | jtj	| j
|¡| _| j |¡S | j |¡}|S ©N)r   r   r7   Ú_AES__ccm_encryptr;   r(   r   r)   r   ÚMODE_GCMr   r+   Úencrypt)r   ÚdataÚaadÚresr   r   r   rD   5   s   zAES.encryptc                 C   sh   | j tjkr|  |||¡S | j tjkr,| jd u r%tj | j	tj
| j|¡| _| j ||¡S | j |¡}|S rA   )r   r   r7   Ú_AES__ccm_decryptr;   r+   r(   r   r)   r   rC   r   Údecrypt)r   rE   rF   ÚmacrG   r   r   r   rI   ?   s   
zAES.decryptc              	   C   s¨  dt | jƒ }d}| j d¡}|  jd7  _tj | jtj	| jj
| jddd�¡| _| j |¡}t |ƒ}t |ƒ}d|d	k d
| jd d   |d  }	t d|	¡| j | 
|d¡ }
d}|d	kr{|dk rfd}n|dk rod}d}nd}d
}|| 
|d¡7 }|| }d}t |ƒ| d	kr“d|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   Fr   é@   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   rD   r	   r(   r   r)   r   r2   Úto_bytesr
   r   r9   r:   r   ÚbytesÚzip)r   Ú	plaintextrF   r=   Ú	blockSizeÚs0ÚcÚpLenÚaadLenÚflagsÚb0ÚassocLenEncodedÚencSizeÚ	aadPaddedÚaadPadÚ
ptxtPaddedÚptxtPadÚmacDataÚtÚtagr   r   r   Ú__ccm_encryptJ   sF   &&"zAES.__ccm_encryptc              	   C   s
  dt | jƒ }| j d¡}|  jd7  _tj | jtj	| jj
| jddd�¡| _| j |¡}t |ƒ}t |ƒ}d|dk d	| jd
 d
   |d  }	t d|	¡| j | 
|d¡ }
d}|dkry|dk rdd
}n|dk rmd}d}nd}d	}|| 
|d¡7 }|| }d}t |ƒd dkr‘d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&   r$   r   Fr   rK   r   r   rL   r#   r   rM   rN   rO   r   rP   r   r%   rQ   c                 S   rR   r   r   rS   r   r   r   rW   ¬   rX   z%AES.__ccm_decrypt.<locals>.<listcomp>zIncorrect MAC)r/   r   r   rD   r	   r(   r   r)   r   r2   rY   r
   r   r9   r:   r   rZ   r[   r   Úsha256ÚupdateÚdigestr8   )r   Ú
ciphertextrF   Úmacvaluer=   r^   r\   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   Úh1Údigest1Úh2Údigest2ÚresultÚxÚyr   r   r   Ú__ccm_decrypt   sZ   &&"


zAES.__ccm_decryptrA   )NN)Ú__name__Ú
__module__Ú__qualname__r   r'   r   r@   rD   rI   rB   rH   r   r   r   r   r      s    
%

5r   )
Úmbedtlsr   r(   Úunicrypto.symmetricr   r   r9   Ú	unicryptor   r   r   r   r   r   Ú<module>   s
   