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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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rd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rd|||   }||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rdd|d   }||7 }|
| | }| j|}|dd  }t	dd t
||D d | j }t }|| | }t }|| | }d}t
||D ]
\}}|||A O }q|dkrt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   