U
    gC                     @   s   d Z ddlZddlmZmZmZ ddlmZ ddlm	Z	 G dd dZ
e
fdd	ZG d
d dejZG dd deZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZG dd dejZe fddZdd ZdS )z*Self-testing for PyCryptodome hash modules    N)a2b_hexb2a_hexhexlify)b)strxor_cc                   @   s   e Zd ZdS )
_NoDefaultN)__name__
__module____qualname__ r   r   E/tmp/pip-unpacked-wheel-_q8s9isk/Cryptodome/SelfTest/Cipher/common.pyr   !   s    r   c                 C   s:   z| | }W n" t k
r.   |tkr& | Y S X | |= |S )zAGet an item from a dictionary, and remove it from the dictionary.)KeyErrorr   )dkdefaultretvalr   r   r   _extract"   s    
r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )CipherSelfTestc                 C   s:  t j|  || _| }t|d| _tt|d| _tt|d| _	tt|d| _
t|dd | _t|dd | _t|dd | _| jrt| j| _t|dd }t|| _|d k	rt| jd	| | _t|d
d | _| jd krt|dd | _| jd k	r0t| j| _n,d | _t|d
d | _| jd k	r0t| j| _|| _d S Ndescriptionkey	plaintext
ciphertextmodule_name
assoc_datamacmodeMODE_ivnonceunittestTestCase__init__modulecopyr   r   r   r   r   r   r   r   r   str	mode_namegetattrr   r   extra_paramsselfr$   paramsr   r   r   r   r#   0   s4    


zCipherSelfTest.__init__c                 C   s   | j S N)r   r+   r   r   r   shortDescriptionV   s    zCipherSelfTest.shortDescriptionc                 C   sX   | j  }t| j}g }| jd k	r*| jg}| jd k	rD|t| jg7 }| jj|f||S r-   r)   r%   r   r   r   r   r$   newr+   r,   r   Z	old_styler   r   r   _newY   s    



zCipherSelfTest._newc                 C   s*   t | jd| sdS | jt| jd| kS )Nr   F)hasattrr$   r   r(   )r+   namer   r   r   isModee   s    zCipherSelfTest.isModec                 C   s  t | j}t | j}g }| jr.dd | jD }d }d }tdD ]t}|  }|  }|D ]}	||	 ||	 qVt||}
t|	|}|r| 
||
 | 
|| |
| }}q>| 
| j| | 
| j| | jrt| }| 
| j| |t | j d S )Nc                 S   s   g | ]}t t|qS r   )r   r   .0xr   r   r   
<listcomp>o   s     z*CipherSelfTest.runTest.<locals>.<listcomp>   )r   r   r   r   ranger3   updater   encryptdecryptassertEqualr   digestverify)r+   r   r   r   ctpticipherdeciphercompZctXZptXr   r   r   r   runTestj   s2    


zCipherSelfTest.runTestN)r   r	   r
   r#   r/   r3   r6   rI   r   r   r   r   r   .   s
   &r   c                   @   s   e Zd Zdd Zdd ZdS )CipherStreamingSelfTestc                 C   s*   | j }| jd k	r |d| jf 7 }d|f S )Nz in %s modez%%s should behave like a stream cipher)r   r   r'   )r+   descr   r   r   r/      s    
z(CipherStreamingSelfTest.shortDescriptionc              	   C   s   t | j}t | j}g }|  }tdt|dD ] }|||||d   q0tt	d
|}| | j| g }|  }tdt|dD ] }|||||d   qtt	d
|}| | j| d S )Nr       )r   r   r   r3   r<   lenappendr>   r   r   joinr@   )r+   r   r   Zct3rF   rE   Zpt3r   r   r   rI      s    

zCipherStreamingSelfTest.runTestN)r   r	   r
   r/   rI   r   r   r   r   rJ      s   rJ   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )RoundtripTestc                 C   s^   ddl m} tj|  || _||j| _t	|d | _
dt	|d  | _|dd | _d S )Nr   )Randomr   d   r   r   )Z
CryptodomerR   r!   r"   r#   r$   Zget_random_bytes
block_sizer   r   r   r   getr   )r+   r$   r,   rR   r   r   r   r#      s    zRoundtripTest.__init__c                 C   s   d| j f S )Nz8%s .decrypt() output of .encrypt() should not be garbled)r   r.   r   r   r   r/      s    zRoundtripTest.shortDescriptionc                 C   sX   | j j}| j t| j|}|| j}| j t| j|}||}| | j| d S r-   )	r$   MODE_ECBr1   r   r   r>   r   r?   r@   )r+   r   Zencryption_cipherr   Zdecryption_cipherZdecrypted_plaintextr   r   r   rI      s    
zRoundtripTest.runTestN)r   r	   r
   r#   r/   rI   r   r   r   r   rQ      s   	rQ   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
IVLengthTestc                 C   s$   t j|  || _t|d | _d S Nr   r!   r"   r#   r$   r   r   r+   r$   r,   r   r   r   r#      s    zIVLengthTest.__init__c                 C   s   dS )NzTCheck that all modes except MODE_ECB and MODE_CTR require an IV of the proper lengthr   r.   r   r   r   r/      s    zIVLengthTest.shortDescriptionc                 C   s(   |  t| jjt| j| jjtd d S )NrM   )assertRaises	TypeErrorr$   r1   r   r   rV   r   r.   r   r   r   rI      s     zIVLengthTest.runTestc                 C   s   d| j j S )N )r$   rT   r.   r   r   r   _dummy_counter   s    zIVLengthTest._dummy_counterN)r   r	   r
   r#   r/   rI   r^   r   r   r   r   rW      s   rW   c                   @   s   e Zd Zdd Zdd ZdS )NoDefaultECBTestc                 C   s$   t j|  || _t|d | _d S rX   rY   rZ   r   r   r   r#      s    zNoDefaultECBTest.__init__c                 C   s   |  t| jjt| j d S r-   )r[   r\   r$   r1   r   r   r.   r   r   r   rI      s    zNoDefaultECBTest.runTestNr   r	   r
   r#   rI   r   r   r   r   r_      s   r_   c                   @   s   e Zd Zdd Zdd ZdS )BlockSizeTestc                 C   s(   t j|  || _tt|d | _d S rX   )r!   r"   r#   r$   r   r   r   rZ   r   r   r   r#      s    zBlockSizeTest.__init__c                 C   s*   | j | j| j j}| |j| j j d S r-   )r$   r1   r   rV   r@   rT   )r+   rF   r   r   r   rI      s    zBlockSizeTest.runTestNr`   r   r   r   r   ra      s   ra   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ByteArrayTestz;Verify we can use bytearray's for encrypting and decryptingc                 C   s:  t j|  || _| }t|d| _tt|d| _tt|d| _	tt|d| _
t|dd | _t|dd | _t|dd | _| jrt| j| _t|dd }t|| _|d k	rt| jd	| | _t|d
d | _| jd krt|dd | _| jd k	r0t| j| _n,d | _t|d
d | _| jd k	r0t| j| _|| _d S r   r    r*   r   r   r   r#      s4    


zByteArrayTest.__init__c                 C   sX   | j  }t| j}g }| jd k	r*| jg}| jd k	rD|t| jg7 }| jj|f||S r-   r0   r2   r   r   r   r3     s    



zByteArrayTest._newc           
      C   s   t | j}t | j}g }| jr.dd | jD }|  }|  }|D ]}|| || qBt|t|}t|	t|}| 
| j| | 
| j| | jrt| }	| 
| j|	 |tt | j d S )Nc                 S   s   g | ]}t tt|qS r   )	bytearrayr   r   r7   r   r   r   r:   )  s     z)ByteArrayTest.runTest.<locals>.<listcomp>)r   r   r   r   r3   r=   r   r>   rc   r?   r@   r   rA   rB   
r+   r   r   r   rF   rG   rH   rC   rD   r   r   r   r   rI   #  s$    


zByteArrayTest.runTestNr   r	   r
   __doc__r#   r3   rI   r   r   r   r   rb      s   %rb   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	MemoryviewTestz;Verify we can use memoryviews for encrypting and decryptingc                 C   s:  t j|  || _| }t|d| _tt|d| _tt|d| _	tt|d| _
t|dd | _t|dd | _t|dd | _| jrt| j| _t|dd }t|| _|d k	rt| jd	| | _t|d
d | _| jd krt|dd | _| jd k	r0t| j| _n,d | _t|d
d | _| jd k	r0t| j| _|| _d S r   r    r*   r   r   r   r#   B  s4    


zMemoryviewTest.__init__c                 C   sX   | j  }t| j}g }| jd k	r*| jg}| jd k	rD|t| jg7 }| jj|f||S r-   r0   r2   r   r   r   r3   g  s    



zMemoryviewTest._newc           
      C   s   t | j}t | j}g }| jr.dd | jD }|  }|  }|D ]}|| || qBt|t|}t|	t|}| 
| j| | 
| j| | jrt| }	| 
| j|	 |tt | j d S )Nc                 S   s   g | ]}t tt|qS r   )
memoryviewr   r   r7   r   r   r   r:   y  s     z*MemoryviewTest.runTest.<locals>.<listcomp>)r   r   r   r   r3   r=   r   r>   rh   r?   r@   r   rA   rB   rd   r   r   r   rI   s  s$    


zMemoryviewTest.runTestNre   r   r   r   r   rg   ?  s   %rg   c              	   C   s  g }d}t t|D ]}|| }i }t|dkrJ|\|d< |d< |d< nrt|dkrt|\|d< |d< |d< |d< nHt|dkr|\|d< |d< |d< |d< }	||	 ntd	t|f d
|krd|d
< | }
t|
d}t|
d}t|
d}t|
d
}t|
dd }|d k	r|}n,|dkr6|
s6d||f }nd|||
f }d||d |f }||d< ||d< || |s|t| |t| |t| |t	| |t
| |g7 }d}|t| | q|S )NFrL   r   r   r      r      Unsupported tuple size %dr   ZECB
p=%s, k=%sp=%s, k=%s, %r
%s #%d: %s   r   T)r<   rN   r=   AssertionErrorr%   r   rQ   rW   r_   rb   ra   rO   r   )r$   r   	test_dataZadditional_paramstestsextra_tests_addedrE   rowr,   r)   p2p_keyp_plaintextp_ciphertextZp_modep_descriptionr   r5   r   r   r   make_block_tests  sR    	





rz   c                 C   s  g }d}t t|D ]t}|| }i }t|dkrJ|\|d< |d< |d< nrt|dkrt|\|d< |d< |d< |d< nHt|dkr|\|d< |d< |d< |d< }|| ntd	t|f | }	t|	d}
t|	d}t|	d}t|	dd }|d k	r|}n"|	sd
||
f }nd||
|	f }d||d |f }||d< ||d< |sj|t| |g7 }|t| | d}|t	| | |t
| | q|S )NFrL   r   r   r   ri   r   rj   rk   rl   rm   rn   ro   r   T)r<   rN   r=   rp   r%   r   rb   rO   rg   r   rJ   )r$   r   rq   rr   rs   rE   rt   r,   r)   ru   rv   rw   rx   ry   r   r5   r   r   r   make_stream_tests  sF    


r{   )rf   r!   binasciir   r   r   ZCryptodome.Util.py3compatr   ZCryptodome.Util.strxorr   r   r   r"   r   rJ   rQ   rW   r_   ra   rb   rg   dictrz   r{   r   r   r   r   <module>   s    c 
PP>