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rtd| j | jrdt| j  krdkst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rd | _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rd|t ||   }||7 }|}d}|| d	krd|||   }||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rddt |d   }||7 }|}d}|d dkrd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
   