U
    MfN                     @   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 qeD ] ZefddZeede e q[[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rhd d! Ze j d"d# 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   G/tmp/pip-unpacked-wheel-l_0d1exj/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   sV   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ctZpt2r   r   r   test_loopback_1284   s    


z$BlockChainingTests.test_loopback_128c                 C   sV   t | j| j| j}tdd}||}t | j| j| j}||}| || d S )Nr   i   )	r   r   r   	des3_moder   r   r   r    r!   r"   r   r   r   test_loopback_64=   s    


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+   ZassertNotEqualr!   lenr   r   r   )r#   r$   Ziv1Z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,   r0   r1   r   r   r   r   r   r2   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)r0   
ValueErrorr   r   r   r   r   r2   r   r   r   test_iv_with_matching_lengthb   s    z/BlockChainingTests.test_iv_with_matching_lengthc                 C   s(   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   s    z&BlockChainingTests.test_block_size_128c                 C   s(   t | j| j| j}| |jt j d S r;   )r   r   r   r(   r   r!   r<   r=   r   r   r   test_block_size_64n   s    z%BlockChainingTests.test_block_size_64c                 C   st   t | j| j| j}tddD ]}| t|jd|  qt | j| j| j}tddD ]}| t|j	d|  qVd S )N   r      5)
r   r   r   r   r   ranger0   r9   r   r    r#   r$   Zwrong_lengthr   r   r   test_unaligned_data_128r   s    z*BlockChainingTests.test_unaligned_data_128c                 C   st   t | j| j| j}tddD ]}| t|jd|  qt | j| j| j}tddD ]}| t|j	d|  qVd S )Nr@   r   rA   )
r   r   r   r(   r   rB   r0   r9   r   r    rC   r   r   r   test_unaligned_data_64{   s    z)BlockChainingTests.test_unaligned_data_64c                 C   sZ   t dd}dD ]F}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+   Z	use_aesnir4   r2   r   r   r   test_unknown_parameters   s      z*BlockChainingTests.test_unknown_parametersc                 C   s<   dD ]2}t | j| j| j}t||d}| |d qd S )NrF   r6   )r   r   r   r   r   rG   r!   )r#   rH   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 )Nr6   )	r   r   r   r   r   r   r0   r1   r    r=   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 )Nr/   )	r   r   r   r   r   r0   r1   r   r    r=   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   Zdata_baZkey_baZ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 rQ   )
memoryviewrS   r   r   r   r   r   r   r!   r+   r    )r#   r   Zdata_mvZkey_mvZiv_mvrT   rU   rV   rW   rX   rY   rZ   r[   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   rS   r!   r    )r#   r%   r$   r&   rd   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 )Nr`   ra   r*   rc   re   )r#   r%   r$   r&   Zpt_barf   Z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 r_   )	r   r   r   r   r   r]   rS   r!   r    )r#   r%   r$   r&   rd   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 )Nrb   rA   ra   r*   r8   rc   r@   )
r   r   r   r   r   r0   r1   r    rS   r9   )r#   ZLEN_PTr%   r$   r&   Z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)   r.   r3   r5   r:   r>   r?   rD   rE   rI   rL   rN   rO   rP   r\   r^   rg   rh   ri   rj   r   r   r   r   r   ,   s4   




					!!r   c                   @   s   e Zd ZejZejZdS )CbcTestsN)rk   rl   rm   r   MODE_CBCr   r   r(   r   r   r   r   rn   4  s   rn   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 kr"d S d }|D ]v}t|r<|}q*|j| _t|j| j|j}|dkrx| 	|
|j|j q*|dkr| 	||j|j q*ds*tq*d S )	NCipherr   zAES CBC KATcountc                 S   s   t | S r;   intxr   r   r   <lambda>@  r6   z;NistBlockChainingVectors._do_kat_aes_test.<locals>.<lambda>	[ENCRYPT]	[DECRYPT]F)r   r   descdescriptionr   r   keyr   r+   r!   r   r   
ciphertextr    AssertionError)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 kr"d S d }|D ]}t|r<|}q*|j| _t|j| j|j}|dkr|jg}t	dD ] }|
||j |d |_qp| |d	 |j q*|d
kr|jg}t	dD ] }|
||j |d |_q| |d	 |j q*ds*tq*d S )Nrq   zAES CBC Montecarlors   c                 S   s   t | S r;   rt   rv   r   r   r   rx   \  r6   z;NistBlockChainingVectors._do_mct_aes_test.<locals>.<lambda>ry   i  rz   F)r   r   r{   r|   r   r   r}   r   r+   rB   appendr   r   r!   r~   r    r   )	r#   r   r   r   r   r$   Zctsrs   Zptsr   r   r   _do_mct_aes_testW  s6    
z)NistBlockChainingVectors._do_mct_aes_testc                 C   s   t d|dddd i}|d kr"d S d }|D ]}t|r<|}q*|j| _t|drdt|j| j|j	}n>|j
|jkr|j
|j |j }n|j
|j }t|| j|j	}|dkr| ||j|j q*|dkr| ||j|j q*d	s*tq*d S )
N)rr   ZTDESzTDES CBC KATrs   c                 S   s   t | S r;   rt   rv   r   r   r   rx     r6   z8NistBlockChainingVectors._do_tdes_test.<locals>.<lambda>keysry   rz   F)r   r   r{   r|   hasattrr	   r   r   des_moder+   key1Zkey3key2r   r(   r!   r   r   r~   r    r   )r#   r   r   r   r   r$   r}   r   r   r   _do_tdes_testz  s0    

z&NistBlockChainingVectors._do_tdes_testN)rk   rl   rm   r   r   r   r   r   r   r   rp   9  s   #rp   c                   @   s   e Zd ZejZejZejZ	dS )NistCbcVectorsN)
rk   rl   rm   r   ro   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   s   |  | d S r;   )r   r#   r   r   r   r   new_func  s    r   Z	test_AES_c                 C   s   |  | d S r;   )r   r   r   r   r   r     s    )zTCBCMMT2.rspzTCBCMMT3.rspzTCBCinvperm.rspzTCBCpermop.rspzTCBCsubtab.rspzTCBCvarkey.rspzTCBCvartext.rspc                 C   s   |  | d S r;   )r   r   r   r   r   r     s    Z
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   sx   d}d}d}d}t |}t |}t |}t |}t|tj|}| ||| t|tj|}| ||| d S )NZ 2b7e151628aed2a6abf7158809cf4f3c 000102030405060708090a0b0c0d0e0fڀ6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e5130c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710Z7649abac8119b246cee98e9b12e9197d5086cb9b507219ee95db113a917678b273bed6b8e3c1743b7116e69e222295163ff1caa1681fac09120eca307586e1a7r   r   r   ro   r!   r   r    r#   r}   r+   r   r~   r$   r   r   r   test_aes_128  s    zSP800TestVectors.test_aes_128c                 C   sx   d}d}d}d}t |}t |}t |}t |}t|tj|}| ||| t|tj|}| ||| d S )NZ08e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7br   r   Z4f021db243bc633d7178183a9fa071e8b4d9ada9ad7dedf4e5e738763f69145a571b242012fb7ae07fa9baac3df102e008b0e27988598881d920a9e64f5615cdr   r   r   r   r   test_aes_192  s    zSP800TestVectors.test_aes_192c                 C   sx   d}d}d}d}t |}t |}t |}t |}t|tj|}| ||| t|tj|}| ||| d S )NZ@603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4r   r   Zf58c4c04d6e5f1ba779eabfb5f7bfbd69cfc4e967edb808d679f777bc6702c7d39f23369a9d9bacfa530e26304231461b2eb05e2c39be9fcda6c19078c6a9d1br   r   r   r   r   test_aes_256
  s    zSP800TestVectors.test_aes_256N)rk   rl   rm   __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 )NZ
slow_tests)r   rn   getr   r   )configtestsr   r   r   	get_tests!  s    
r   __main__c                   C   s   t t S r;   )unittestZ	TestSuiter   r   r   r   r   rx   +  r6   rx   suite)ZdefaultTest)!r   binasciir   ZCryptodome.SelfTest.loaderr   ZCryptodome.SelfTest.st_commonr   ZCryptodome.Util.py3compatr   r   ZCryptodome.Cipherr   r   r	   ZCryptodome.Hashr
   r   ZTestCaser   rn   rp   r   Znist_aes_kat_mmt_filesZnist_aes_mct_filesr   r   setattrZnist_tdes_filesr   r   rk   r   mainr   r   r   r   <module>   s>     
d
G	
