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