o
    Ìn~b¸C  ã                   @   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   úL/usr/local/lib/python3.10/dist-packages/Cryptodome/SelfTest/Cipher/common.pyr   !   s    r   c                 C   s8   z| | }W n t y   |tu r‚ | Y S w | |= |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   ó4  t j | ¡ || _| ¡ }t|dƒ| _tt|dƒƒ| _tt|dƒƒ| _	tt|dƒƒ| _
t|dd ƒ| _t|dd ƒ| _t|dd ƒ| _| jrIt| jƒ| _t|dd ƒ}t|ƒ| _|d ur€t| jd	| ƒ| _t|d
d ƒ| _| jd u rtt|dd ƒ| _| jd urt| jƒ| _nd | _t|d
d ƒ| _| jd ur•t| 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   s6   


€

zCipherSelfTest.__init__c                 C   s   | j S ©N)r   ©r,   r   r   r   ÚshortDescriptionV   s   zCipherSelfTest.shortDescriptionc                 C   ó^   | j  ¡ }t| jƒ}g }| jd ur| jg}| jd ur"|t| jƒg7 }| jj|g|¢R i |¤ŽS r.   ©r*   r&   r   r   r   r   r%   Únew©r,   r-   r   Z	old_styler   r   r   Ú_newY   ó   



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 ]:}|  ¡ }|  ¡ }|D ]}	| |	¡ | |	¡ q+t| |¡ƒ}
t| 	|¡ƒ}|rT|  
||
¡ |  
||¡ |
|}}q|  
| j|¡ |  
| j|¡ | jr‚t| ¡ ƒ}|  
| j|¡ | t | jƒ¡ d S 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   Úranger5   Úupdater   ÚencryptÚdecryptÚassertEqualr   ÚdigestÚverify)r,   r   r   r   ÚctÚptÚiÚcipherÚdecipherÚcompZctXZptXr   r   r   r   ÚrunTestj   s4   


ýzCipherSelfTest.runTestN)r   r	   r
   r$   r0   r5   r9   rL   r   r   r   r   r   .   s    &r   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )ÚCipherStreamingSelfTestc                 C   s*   | j }| jd u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   r0   “   s   

z(CipherStreamingSelfTest.shortDescriptionc              	   C   sÔ   t | jƒ}t | jƒ}g }|  ¡ }tdt|ƒdƒD ]}| | |||d … ¡¡ qtt	dƒ 
|¡ƒ}|  | j|¡ g }|  ¡ }tdt|ƒdƒD ]}| | |||d … ¡¡ qGtt	dƒ 
|¡ƒ}|  | j|¡ d S )Nr   é   Ú )r   r   r   r5   r?   ÚlenÚappendrA   r   r   ÚjoinrC   )r,   r   r   Zct3rI   rH   Zpt3r   r   r   rL   ™   s   

zCipherStreamingSelfTest.runTestN)r   r	   r
   r0   rL   r   r   r   r   rN   ‘   s    rN   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
CryptodomerV   r"   r#   r$   r%   Zget_random_bytesÚ
block_sizer   r   r   r   Úgetr   )r,   r%   r-   rV   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   r0   »   ó   zRoundtripTest.shortDescriptionc                 C   sX   | j j}| j  t| jƒ|¡}| | j¡}| j  t| jƒ|¡}| |¡}|  | j|¡ d S r.   )	r%   ÚMODE_ECBr3   r   r   rA   r   rB   rC   )r,   r   Zencryption_cipherr   Zdecryption_cipherZdecrypted_plaintextr   r   r   rL   ¾   s   
zRoundtripTest.runTestN)r   r	   r
   r$   r0   rL   r   r   r   r   rU   ±   s    	rU   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚIVLengthTestc                 C   ó$   t j | ¡ || _t|d ƒ| _d S ©Nr   ©r"   r#   r$   r%   r   r   ©r,   r%   r-   r   r   r   r$   Ê   ó   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   r0   Ï   s   zIVLengthTest.shortDescriptionc                 C   s(   |   t| jjt| jƒ| jjtdƒ¡ d S )NrQ   )ÚassertRaisesÚ	TypeErrorr%   r3   r   r   r[   r   r/   r   r   r   rL   Ò   s   ÿzIVLengthTest.runTestc                 C   s   d| j j S )Nú )r%   rX   r/   r   r   r   Ú_dummy_counterÖ   rZ   zIVLengthTest._dummy_counterN)r   r	   r
   r$   r0   rL   re   r   r   r   r   r\   É   s
    r\   c                   @   rM   )ÚNoDefaultECBTestc                 C   r]   r^   r_   r`   r   r   r   r$   Û   ra   zNoDefaultECBTest.__init__c                 C   s   |   t| jjt| jƒ¡ d S r.   )rb   rc   r%   r3   r   r   r/   r   r   r   rL   à   s   zNoDefaultECBTest.runTestN©r   r	   r
   r$   rL   r   r   r   r   rf   Ú   ó    rf   c                   @   rM   )ÚBlockSizeTestc                 C   s(   t j | ¡ || _tt|d ƒƒ| _d S r^   )r"   r#   r$   r%   r   r   r   r`   r   r   r   r$   å   s   zBlockSizeTest.__init__c                 C   s*   | j  | j| j j¡}|  |j| j j¡ d S r.   )r%   r3   r   r[   rC   rX   )r,   rI   r   r   r   rL   ê   s   zBlockSizeTest.runTestNrg   r   r   r   r   ri   ä   rh   ri   c                   @   ó(   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   r   r   r!   r+   r   r   r   r$   ò   ó6   


€

zByteArrayTest.__init__c                 C   r1   r.   r2   r4   r   r   r   r5     r6   zByteArrayTest._newc           
      C   óØ   t | jƒ}t | jƒ}g }| jrdd„ | jD ƒ}|  ¡ }|  ¡ }|D ]}| |¡ | |¡ q!t| t|ƒ¡ƒ}t| 	t|ƒ¡ƒ}|  
| j|¡ |  
| j|¡ | jrjt| ¡ ƒ}	|  
| j|	¡ | tt | jƒƒ¡ d S d S )Nc                 S   ó   g | ]
}t tt|ƒƒƒ‘qS r   )Ú	bytearrayr   r   r:   r   r   r   r=   )  ó    z)ByteArrayTest.runTest.<locals>.<listcomp>)r   r   r   r   r5   r@   r   rA   ro   rB   rC   r   rD   rE   ©
r,   r   r   r   rI   rJ   rK   rF   rG   r   r   r   r   rL   #  ó&   


ýzByteArrayTest.runTestN©r   r	   r
   Ú__doc__r$   r5   rL   r   r   r   r   rk   ï   ó
    %rk   c                   @   rj   )	ÚMemoryviewTestz;Verify we can use memoryviews for encrypting and decryptingc                 C   r   r   r!   r+   r   r   r   r$   B  rl   zMemoryviewTest.__init__c                 C   r1   r.   r2   r4   r   r   r   r5   g  r6   zMemoryviewTest._newc           
      C   rm   )Nc                 S   rn   r   )Ú
memoryviewr   r   r:   r   r   r   r=   y  rp   z*MemoryviewTest.runTest.<locals>.<listcomp>)r   r   r   r   r5   r@   r   rA   rw   rB   rC   r   rD   rE   rq   r   r   r   rL   s  rr   zMemoryviewTest.runTestNrs   r   r   r   r   rv   ?  ru   rv   c              	   C   s¶  g }d}t t|ƒƒD ]Î}|| }i }t|ƒdkr$|\|d< |d< |d< n9t|ƒdkr9|\|d< |d< |d< |d< n$t|ƒdkrT|\|d< |d< |d< |d< }	| |	¡ n	td	t|ƒf ƒ‚d
|vred|d
< | ¡ }
t|
dƒ}t|
dƒ}t|
dƒ}t|
d
ƒ}t|
dd ƒ}|d urŠ|}n|dkr—|
s—d||f }nd|||
f }d||d |f }||d< ||d< | |¡ |sÐ|t| |ƒt| |ƒt| |ƒt	| |ƒt
| |ƒg7 }d}| t| |ƒ¡ q
|S )NFrP   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?   rR   r@   ÚAssertionErrorr&   r   rU   r\   rf   rk   ri   rS   r   )r%   r   Ú	test_dataZadditional_paramsÚtestsÚextra_tests_addedrH   Úrowr-   r*   Úp2Úp_keyÚp_plaintextÚp_ciphertextZp_modeÚp_descriptionr   r8   r   r   r   Úmake_block_tests  sR   	




ûr‰   c                 C   sŠ  g }d}t t|ƒƒD ]¸}|| }i }t|ƒdkr$|\|d< |d< |d< n9t|ƒdkr9|\|d< |d< |d< |d< n$t|ƒdkrT|\|d< |d< |d< |d< }| |¡ n	td	t|ƒf ƒ‚| ¡ }	t|	dƒ}
t|	dƒ}t|	dƒ}t|	dd ƒ}|d ur}|}n|	s†d
||
f }nd||
|	f }d||d |f }||d< ||d< |s²|t| |ƒg7 }| t| |ƒ¡ d}| t	| |ƒ¡ | t
| |ƒ¡ q
|S )NFrP   r   r   r   rx   r   ry   rz   r{   r|   r}   r~   r   T)r?   rR   r@   r   r&   r   rk   rS   rv   r   rN   )r%   r   r€   r   r‚   rH   rƒ   r-   r*   r„   r…   r†   r‡   rˆ   r   r8   r   r   r   Úmake_stream_testsÍ  sF   


ÿrŠ   )rt   r"   Úbinasciir   r   r   ZCryptodome.Util.py3compatr   ZCryptodome.Util.strxorr   r   r   r#   r   rN   rU   r\   rf   ri   rk   rv   Údictr‰   rŠ   r   r   r   r   Ú<module>   s"   c 
PP>