o
    Þý°jþN  ã                   @   sl  d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZmZ d dlmZ 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ƒZdZdZeD ]Zefdd„Zeede eƒ qZeD ]Zefdd„Zeede eƒ qm[[dZeD ]Zefdd„Zeede eƒ q„G dd„ de jƒZi fdd„Zedkr´d d!„ Ze j d"d#� dS dS )$é    N)Ú	unhexlify)Úload_test_vectors)Úlist_test_cases)ÚtobytesÚ	is_string)ÚAESÚDES3ÚDES)ÚSHAKE128c                 C   s   t jt| ƒd� |¡S )N)Údata)r
   Únewr   Úread)ÚtagÚlength© r   ú–/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/SelfTest/Cipher/test_CBC.pyÚget_tag_random)   s   r   c                   @   sæ   e Zd ZeddƒZeddƒZeddƒZeddƒZeddƒZd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3S )4ÚBlockChainingTestsÚkey_128é   Úkey_192é   Úiv_128Úiv_64é   Údata_128c                 C   óV   t  | j| j| j¡}tddƒ}| |¡}t  | j| j| j¡}| |¡}|  ||¡ d S )NÚ	plaintexté@  )	r   r   r   Úaes_moder   r   ÚencryptÚdecryptÚassertEqual©ÚselfÚcipherÚptÚctÚpt2r   r   r   Útest_loopback_1284   ó   


z$BlockChainingTests.test_loopback_128c                 C   r   )Nr   i   )	r   r   r   Ú	des3_moder   r   r    r!   r"   r#   r   r   r   Útest_loopback_64=   r*   z#BlockChainingTests.test_loopback_64c                 C   sÀ   t  | j| j¡}|j}t  | j| j¡}|j}|  ||¡ |  t|ƒd¡ t  | j| j| j¡}| 	| j
¡}t j| j| j| jd�}|  || 	| j
¡¡ t j| j| j| jd�}|  || 	| j
¡¡ d S )Nr   ©Úiv)ÚIV)r   r   r   r   r.   ÚassertNotEqualr"   Úlenr   r    r   )r$   r%   Úiv1Úiv2r'   r   r   r   Útest_ivF   s   zBlockChainingTests.test_ivc                 C   s   | j ttj| j| jdd� d S )Nútest1234567890-*r-   )ÚassertRaisesÚ	TypeErrorr   r   r   r   ©r$   r   r   r   Útest_iv_must_be_bytesY   s   
ÿz(BlockChainingTests.test_iv_must_be_bytesc                 C   s$   | j ttj| j| j| j| jd� d S )N)r.   r/   ©r6   r7   r   r   r   r   r   r8   r   r   r   Útest_only_one_iv]   s   
ÿz#BlockChainingTests.test_only_one_ivc              	   C   s\   |   ttj| j| jd¡ |   ttj| j| j| jd d… ¡ |   ttj| j| j| jd ¡ d S )Nó    é   ó   0)r6   Ú
ValueErrorr   r   r   r   r   r8   r   r   r   Útest_iv_with_matching_lengthb   s   ÿÿÿz/BlockChainingTests.test_iv_with_matching_lengthc                 C   ó(   t  | j| j| j¡}|  |jt j¡ d S ©N)r   r   r   r   r   r"   Ú
block_size©r$   r%   r   r   r   Útest_block_size_128j   ó   z&BlockChainingTests.test_block_size_128c                 C   rA   rB   )r   r   r   r+   r   r"   rC   rD   r   r   r   Útest_block_size_64n   rF   z%BlockChainingTests.test_block_size_64c                 C   ót   t  | j| j| j¡}tddƒD ]}|  t|jd| ¡ qt  | j| j| j¡}tddƒD ]}|  t|j	d| ¡ q+d S )Né   r   ó   5)
r   r   r   r   r   Úranger6   r?   r    r!   ©r$   r%   Úwrong_lengthr   r   r   Útest_unaligned_data_128r   ó   ÿz*BlockChainingTests.test_unaligned_data_128c                 C   rH   )NrI   r   rJ   )
r   r   r   r+   r   rK   r6   r?   r    r!   rL   r   r   r   Útest_unaligned_data_64{   rO   z)BlockChainingTests.test_unaligned_data_64c                 C   sZ   t ddƒ}dD ]#}t | j| j| j¡}t||ƒ|ƒ |  |j| j¡ |  |j	| j¡ qd S )Nr   r   ©r    r!   )
r   r   r   r   r   r   Úgetattrr"   r.   r/   )r$   r   Úfuncr%   r   r   r   Útest_IV_iv_attributes„   s   
üz(BlockChainingTests.test_IV_iv_attributesc                 C   sV   |   ttj| j| j| jd¡ | j ttj| j| j| jdd� tj| j| j| jdd� d S )Né   )r.   ÚunknownF)r.   Ú	use_aesnir:   r8   r   r   r   Útest_unknown_parametersŒ   s   ÿÿz*BlockChainingTests.test_unknown_parametersc                 C   s<   dD ]}t  | j| j| j¡}t||ƒdƒ}|  |d¡ qd S )NrQ   r<   )r   r   r   r   r   rR   r"   )r$   rS   r%   Úresultr   r   r   Útest_null_encryption_decryption”   s
   ýz2BlockChainingTests.test_null_encryption_decryptionc                 C   s`   t  | j| j| j¡}| d¡ |  t|jd¡ t  | j| j| j¡}| d¡ |  t|jd¡ d S )Nr<   )	r   r   r   r   r   r    r6   r7   r!   rD   r   r   r   Útest_either_encrypt_or_decryptš   s   

z1BlockChainingTests.test_either_encrypt_or_decryptc                 C   sL   t  | j| j| j¡}|  t|jd¡ t  | j| j| j¡}|  t|jd¡ d S )Nr5   )	r   r   r   r   r   r6   r7   r    r!   rD   r   r   r   Útest_data_must_be_bytes£   s   z*BlockChainingTests.test_data_must_be_bytesc                 C   s   d}t |ƒ}t | jƒ}t | jƒ}t | j| j| j¡}| |¡}t || j|¡}d|d d…< d|d d…< | |¡}|  ||¡ |  |j|j¡ t | jƒ}t | jƒ}t | j| j| j¡}	|	 	|¡}
t || j|¡}d|d d…< d|d d…< | 	|¡}|  |
|¡ d S ©Ns€   11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111s   ÿÿÿé   )
Ú	bytearrayr   r   r   r   r   r    r"   r.   r!   )r$   r   Údata_baÚkey_baÚiv_baÚcipher1Úref1Úcipher2Úref2Úcipher3Úref3Úcipher4Úref4r   r   r   Útest_bytearrayª   s*   







z!BlockChainingTests.test_bytearrayc                 C   s  d}t t|ƒƒ}t t| jƒƒ}t t| jƒƒ}t | j| j| j¡}| |¡}t || j|¡}d|d d…< d|d d…< | |¡}|  ||¡ |  |j	|j	¡ t t| jƒƒ}t t| jƒƒ}t | j| j| j¡}	|	 
|¡}
t || j|¡}d|d d…< d|d d…< | 
|¡}|  |
|¡ d S r]   )Ú
memoryviewr_   r   r   r   r   r   r    r"   r.   r!   )r$   r   Údata_mvÚkey_mvÚiv_mvrc   rd   re   rf   rg   rh   ri   rj   r   r   r   Útest_memoryviewË   s*   



z"BlockChainingTests.test_memoryviewc                 C   s¢   d}t jd| j| jd�}| |¡}tdƒ}t jd| j| jd�}|j||d�}|  ||¡ |  |d ¡ t jd| j| jd�}|j||d�}|  ||¡ |  |d ¡ d S ©Nó€   55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555ó   4444444444444444r-   é€   ©Úoutput©r   r   r   r   r    r_   r"   r!   )r$   r&   r%   r'   rv   Úresr   r   r   Útest_output_paramì   s   
z$BlockChainingTests.test_output_paramc                 C   sª   d}t jd| j| jd�}| |¡}t|ƒ}t jd| j| jd�}|j||d�}|  ||¡ |  |d ¡ t|ƒ}t jd| j| jd�}|j||d�}|  ||¡ |  |d ¡ d S )Nrr   rs   r-   ru   rw   )r$   r&   r%   r'   Úpt_barx   Úct_bar   r   r   Útest_output_param_same_bufferþ   s   
z0BlockChainingTests.test_output_param_same_bufferc                 C   sŽ   d}t jd| j| jd�}| |¡}ttdƒƒ}t jd| j| jd�}|j||d� |  ||¡ t jd| j| jd�}|j||d� |  ||¡ d S rq   )	r   r   r   r   r    rl   r_   r"   r!   )r$   r&   r%   r'   rv   r   r   r   Útest_output_param_memoryview  s   
z/BlockChainingTests.test_output_param_memoryviewc                 C   sâ   d}d| }t jd| j| jd�}| |¡}t jd| j| jd�}| jt|j|d| d� t jd| j| jd�}| jt|j|d| d� t|d ƒ}t jd| j| jd�}| jt	|j||d� t jd| j| jd�}| jt	|j||d� d S )Nrt   rJ   rs   r-   r>   ru   rI   )
r   r   r   r   r    r6   r7   r!   r_   r?   )r$   ÚLEN_PTr&   r%   r'   Úshorter_outputr   r   r   Útest_output_param_neg   s   
z(BlockChainingTests.test_output_param_negN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r)   r,   r4   r9   r;   r@   rE   rG   rN   rP   rT   rX   rZ   r[   r\   rk   rp   ry   r|   r}   r€   r   r   r   r   r   ,   s6    




					!!r   c                   @   s   e Zd ZejZejZdS )ÚCbcTestsN)r�   r‚   rƒ   r   ÚMODE_CBCr   r   r+   r   r   r   r   r„   4  s    
r„   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚNistBlockChainingVectorsc                 C   s    t d|dddd„ iƒ}|d u rd S d }|D ]8}t|ƒr|}q|j| _t |j| j|j¡}|dkr<|  	| 
|j¡|j¡ q|dkrL|  	| |j¡|j¡ qJ ‚d S )N©ÚCipherr   zAES CBC KATÚcountc                 S   ó   t | ƒS rB   ©Úint©Úxr   r   r   Ú<lambda>@  ó    z;NistBlockChainingVectors._do_kat_aes_test.<locals>.<lambda>ú	[ENCRYPT]ú	[DECRYPT])r   r   ÚdescÚdescriptionr   r   Úkeyr   r.   r"   r    r   Ú
ciphertextr!   )r$   Ú	file_nameÚtest_vectorsÚ	directionÚtvr%   r   r   r   Ú_do_kat_aes_test;  s(   
ýñz)NistBlockChainingVectors._do_kat_aes_testc           	      C   sü   t d|dddd„ iƒ}|d u rd S d }|D ]f}t|ƒr|}q|j| _t |j| j|j¡}|dkrS|jg}t	dƒD ]}| 
| |j¡¡ |d |_q8|  |d	 |j¡ q|d
krz|jg}t	dƒD ]}| 
| |j¡¡ |d |_q_|  |d	 |j¡ qJ ‚d S )Nr‡   zAES CBC Montecarlor‰   c                 S   rŠ   rB   r‹   r�   r   r   r   r�   \  r�   z;NistBlockChainingVectors._do_mct_aes_test.<locals>.<lambda>r‘   iè  éþÿÿÿéÿÿÿÿr’   )r   r   r“   r”   r   r   r•   r   r.   rK   Úappendr    r   r"   r–   r!   )	r$   r—   r˜   r™   rš   r%   Úctsr‰   Úptsr   r   r   Ú_do_mct_aes_testW  s8   
ýéz)NistBlockChainingVectors._do_mct_aes_testc                 C   sê   t d|dddd„ iƒ}|d u rd S d }|D ]]}t|ƒr|}q|j| _t|dƒr2t |j| j|j	¡}n|j
|jkrB|j
|j |j }n|j
|j }t || j|j	¡}|dkra|  | |j¡|j¡ q|dkrq|  | |j¡|j¡ qJ ‚d S )	N)rˆ   ÚTDESzTDES CBC KATr‰   c                 S   rŠ   rB   r‹   r�   r   r   r   r�     r�   z8NistBlockChainingVectors._do_tdes_test.<locals>.<lambda>Úkeysr‘   r’   )r   r   r“   r”   Úhasattrr	   r   r£   Údes_moder.   Úkey1Úkey3Úkey2r   r+   r"   r    r   r–   r!   )r$   r—   r˜   r™   rš   r%   r•   r   r   r   Ú_do_tdes_testz  s2   
ý
êz&NistBlockChainingVectors._do_tdes_testN)r�   r‚   rƒ   r›   r¡   r©   r   r   r   r   r†   9  s    #r†   c                   @   s   e Zd ZejZejZejZ	dS )ÚNistCbcVectorsN)
r�   r‚   rƒ   r   r…   r   r	   r¥   r   r+   r   r   r   r   rª   �  s    
rª   )zCBCGFSbox128.rspzCBCGFSbox192.rspzCBCGFSbox256.rspzCBCKeySbox128.rspzCBCKeySbox192.rspzCBCKeySbox256.rspzCBCVarKey128.rspzCBCVarKey192.rspzCBCVarKey256.rspzCBCVarTxt128.rspzCBCVarTxt192.rspzCBCVarTxt256.rspzCBCMMT128.rspzCBCMMT192.rspzCBCMMT256.rsp)zCBCMCT128.rspzCBCMCT192.rspzCBCMCT256.rspc                 C   ó   |   |¡ d S rB   )r›   ©r$   r—   r   r   r   Únew_func¾  ó   r­   Ú	test_AES_c                 C   r«   rB   )r¡   r¬   r   r   r   r­   Ã  r®   )zTCBCMMT2.rspzTCBCMMT3.rspzTCBCinvperm.rspzTCBCpermop.rspzTCBCsubtab.rspzTCBCvarkey.rspzTCBCvartext.rspc                 C   r«   rB   )r©   r¬   r   r   r   r­   Ó  r®   Ú
test_TDES_c                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚSP800TestVectorszPClass exercising the CBC test vectors found in Section F.2
    of NIST SP 800-3Ac                 C   óx   d}d}d}d}t |ƒ}t |ƒ}t |ƒ}t |ƒ}t |tj|¡}|  | |¡|¡ t |tj|¡}|  | |¡|¡ d S )NÚ 2b7e151628aed2a6abf7158809cf4f3cÚ 000102030405060708090a0b0c0d0e0fÚ€6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710Ú€7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a7©r   r   r   r…   r"   r    r!   ©r$   r•   r.   r   r–   r%   r   r   r   Útest_aes_128Þ  ó   zSP800TestVectors.test_aes_128c                 C   r²   )NÚ08e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7br´   rµ   Ú€4f021db243bc633d7178183a9fa071e8b4d9ada9ad7dedf4e5e738763f69145a571b242012fb7ae07fa9baac3df102e008b0e27988598881d920a9e64f5615cdr·   r¸   r   r   r   Útest_aes_192ô  rº   zSP800TestVectors.test_aes_192c                 C   r²   )NÚ@603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4r´   rµ   Ú€f58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1br·   r¸   r   r   r   Útest_aes_256
  rº   zSP800TestVectors.test_aes_256N)r�   r‚   rƒ   Ú__doc__r¹   r½   rÀ   r   r   r   r   r±   Ú  s
    r±   c                 C   s6   g }|t tƒ7 }|  d¡r|t tƒ7 }|t tƒ7 }|S )NÚ
slow_tests)r   r„   Úgetrª   r±   )ÚconfigÚtestsr   r   r   Ú	get_tests!  s   
rÆ   Ú__main__c                   C   s   t  tƒ ¡S rB   )ÚunittestÚ	TestSuiterÆ   r   r   r   r   r�   +  s    r�   Úsuite)ÚdefaultTest)!rÈ   Úbinasciir   ÚCryptodome.SelfTest.loaderr   ÚCryptodome.SelfTest.st_commonr   ÚCryptodome.Util.py3compatr   r   ÚCryptodome.Cipherr   r   r	   ÚCryptodome.Hashr
   r   ÚTestCaser   r„   r†   rª   Únist_aes_kat_mmt_filesÚnist_aes_mct_filesr—   r­   ÚsetattrÚnist_tdes_filesr±   rÆ   r�   rÊ   Úmainr   r   r   r   Ú<module>   sB     
d
G	þ