o
    5hN                     @   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 qG dd de jZi fddZedkrd 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   s/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/Crypto/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   )N08e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7br   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   Crypto.SelfTest.loaderr   Crypto.SelfTest.st_commonr   Crypto.Util.py3compatr   r   Crypto.Cipherr   r   r	   Crypto.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	