o
    5hM                     @   s  d dl Z 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 d dlmZ d dlmZ d	d
 ZG dd dejZG dd dejZdd ZG dd dejZG dd dejZ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)list_test_cases)load_test_vectors_wycheproof)tobytesbchr)AES)SHAKE128)strxorc                 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_SIV.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-S ).SivTestskey_256    key_3840   key_512@   	nonce_128   r      c                 C   sr   | j | j| jfD ].}tj|tj| jd}tdd}||\}}tj|tj| jd}|	||}| 
|| qd S )Nnonce	plaintexti@  )r   r   r   r   r   MODE_SIVnonce_96r   encrypt_and_digestdecrypt_and_verifyassertEqual)selfkeycipherptctmacpt2r   r   r   test_loopback_1289   s   
zSivTests.test_loopback_128c                 C   sr   t | jt j t | jt j| j}|| j\}}t j| jt j| jd}|| j\}}| || ||  d S Nr   )r   r   r   r    r!   r"   r   r$   )r%   r'   ct1tag1ct2tag2r   r   r   
test_nonceC   s   zSivTests.test_noncec                 C   s   | j ttj| jtjdd d S )Ntest12345678r   )assertRaises	TypeErrorr   r   r   r    r%   r   r   r   test_nonce_must_be_bytesN   s   
z!SivTests.test_nonce_must_be_bytesc                 C   sT   | j ttj| jtjdd tddD ]}tj| jtjtd| d}|d qd S )N    r      r      )	r4   
ValueErrorr   r   r   r    ranger   r"   )r%   xr'   r   r   r   test_nonce_lengthR   s   zSivTests.test_nonce_lengthc                 C   s*   t j| jt j| jd}| |jt j d S r-   )r   r   r   r    r!   r$   
block_sizer%   r'   r   r   r   test_block_size_128[   s   zSivTests.test_block_size_128c                 C   sF   t j| jt j| jd}| |j| j | tt | jt jd d S )Nr   r   )	r   r   r   r    r!   r$   r   assertFalsehasattrr@   r   r   r   test_nonce_attribute_   s    zSivTests.test_nonce_attributec                 C   sV   |  ttj| jtj| jd | j ttj| jtj| jdd tj| jtj| jdd d S )N   )r   unknownF)r   	use_aesni)r4   r5   r   r   r   r    r!   r6   r   r   r   test_unknown_parametersf   s   
z SivTests.test_unknown_parametersc                 C   sp   t j| jt j| jd}|| j | t|j	| j t j| jt j| jd}|| j | t|j
| j| j d S r-   )r   r   r   r    r!   r"   r   r4   r5   decryptr#   r@   r   r   r   test_encrypt_excludes_decryptq   s   
z&SivTests.test_encrypt_excludes_decryptc                 C   sR   t j| jt j| jd}| t|jd t j| jt j| jd}| t|jdd d S )Nr   ztest1234567890-*s   xxxx)	r   r   r   r    r!   r4   r5   encryptr#   r@   r   r   r   test_data_must_be_bytes{   s   
z SivTests.test_data_must_be_bytesc                 C   s:   t j| jt j| jd}|| j\}}| t|d d S )Nr      )	r   r   r   r    r!   r"   r   r$   len)r%   r'   _r*   r   r   r   test_mac_len      zSivTests.test_mac_lenc                 C   sh   ddl m} tj| jtj| jd}|| j\}}||d}tj| jtj| jd}| 	t
|j|| d S )Nr   )strxor_cr   r9   )Crypto.Util.strxorrR   r   r   r   r    r!   r"   r   r4   r;   r#   )r%   rR   r'   r)   r*   invalid_macr   r   r   test_invalid_mac   s   
zSivTests.test_invalid_macc                 C   sV   t j| jt j| jd}| }| | t| t j| jt j| jd}|	| d S r-   )
r   r   r   r    r!   	hexdigestr$   digestr   	hexverify)r%   r'   mac_hexr   r   r   test_hex_mac   s
   zSivTests.test_hex_macc                 C   s\  t | j}t | j}t | j}t | j}tj| jtj| jd}|| j || j\}}tj|tj|d}d|d d< d|d d< || d|d d< ||\}	}
| 	||	 | 	||
 | 	|j
|j
 t | j}t | j}t | j}t |}t |}tj|tj|d}d|d d< d|d d< || d|d d< |||}| 	| j| d S Nr   s      )	bytearrayr   r!   r   r   r   r    updater"   r$   r   r#   r%   r&   r   r   headercipher1r)   r   cipher2ct_testtag_testct_batag_bacipher3pt_testr   r   r   test_bytearray   sJ   








zSivTests.test_bytearrayc                 C   s  t t| j}t t| j}t t| j}t t| j}tj| jtj| jd}|| j |	| j\}}tj|tj|d}d|d d< d|d d< || d|d d< |	|\}	}
| 
||	 | 
||
 | 
|j|j t t| j}t t| j}t t| j}t t|}t t|}tj|tj|d}d|d d< d|d d< || d|d d< |||}| 
| j| d S r[   )
memoryviewr]   r   r!   r   r   r   r    r^   r"   r$   r   r#   r_   r   r   r   test_memoryview   sJ   

zSivTests.test_memoryviewc                 C   s   d}t j| jt j| jd}||\}}td}t j| jt j| jd}|j||d\}}| || | |d  | || t j| jt j| jd}|j|||d}| || | |d  d S Ns   55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555r   r   output)	r   r   r   r    r!   r"   r]   r$   r#   )r%   r(   r'   r)   r   rn   restag_outr   r   r   test_output_param   s   zSivTests.test_output_paramc                 C   s   d}t j| jt j| jd}||\}}ttd}t j| jt j| jd}|j||d | || t j| jt j| jd}|j	|||d | || d S rl   )
r   r   r   r    r!   r"   rj   r]   r$   r#   )r%   r(   r'   r)   r   rn   r   r   r   test_output_param_memoryview  s   z%SivTests.test_output_param_memoryviewc                 C   s   d}d| }t j| jt j| jd}||\}}t j| jt j| jd}| jt|j|d| d t j| jt j| jd}| jt|j||d| d t	|d }t j| jt j| jd}| jt
|j||d t j| jt j| jd}| jt
|j|||d d S )Nr      5r      0rm   r9   )r   r   r   r    r!   r"   r4   r5   r#   r]   r;   )r%   LEN_PTr(   r'   r)   r   shorter_outputr   r   r   test_output_param_neg  s   zSivTests.test_output_param_negN)__name__
__module____qualname__r   r   r   r   r!   r   r,   r2   r7   r>   rA   rD   rH   rJ   rL   rP   rU   rZ   ri   rk   rq   rr   rw   r   r   r   r   r   1   s.    





	
--r   c                   @   sr   e Z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S )SivFSMTestsr   r   r!   r   r   r   c                 C   *   t j| jt j| jd}| t|jd d S Nr   s   xxx)r   r   r   r    r!   r4   r5   rK   r@   r   r   r   test_invalid_init_encrypt0     z%SivFSMTests.test_invalid_init_encryptc                 C   r|   r}   )r   r   r   r    r!   r4   r5   rI   r@   r   r   r   test_invalid_init_decrypt6  r   z%SivFSMTests.test_invalid_init_decryptc                 C   sZ   t j| jt j| jd}|| j | }t j| jt j| jd}|| j || d S r-   )	r   r   r   r    r!   r^   r   rW   verifyr%   r'   r*   r   r   r   $test_valid_init_update_digest_verify<  s   z0SivFSMTests.test_valid_init_update_digest_verifyc                 C   s"   t j| jt j| jd}|  d S r-   )r   r   r   r    r!   rW   r@   r   r   r   test_valid_init_digestJ  s   z"SivFSMTests.test_valid_init_digestc                 C   sB   t j| jt j| jd}| }t j| jt j| jd}|| d S r-   )r   r   r   r    r!   rW   r   r   r   r   r   test_valid_init_verifyO  s   z"SivFSMTests.test_valid_init_verifyc                 C   s   t j| jt j| jd}|| j | }tdD ]
}| 	||  qt j| jt j| jd}|| j tdD ]}|
| q9d S )Nr         )r   r   r   r    r!   r^   r   rW   r<   r$   r   )r%   r'   	first_macr=   r   r   r   $test_valid_multiple_digest_or_verifyW  s   z0SivFSMTests.test_valid_multiple_digest_or_verifyc                 C   sr   t j| jt j| jd}|| j || j\}}t j| jt j| jd}|| j |||}| 	| j| d S r-   )
r   r   r   r    r!   r^   r   r"   r#   r$   )r%   r'   r)   r*   r(   r   r   r   0test_valid_encrypt_and_digest_decrypt_and_verifye  s   z<SivFSMTests.test_valid_encrypt_and_digest_decrypt_and_verifyc                 C   s:   t j| jt j| jd}|| j\}}| t|jd d S )Nr   r8   )	r   r   r   r    r!   r"   r   r4   r5   r%   r'   r)   r   r   r   r   (test_invalid_multiple_encrypt_and_digestq  rQ   z4SivFSMTests.test_invalid_multiple_encrypt_and_digestc                 C   s^   t j| jt j| jd}|| j\}}t j| jt j| jd}||| | t	|j|| d S r-   )
r   r   r   r    r!   r"   r   r#   r4   r5   r   r   r   r   (test_invalid_multiple_decrypt_and_verifyv  s
   z4SivFSMTests.test_invalid_multiple_decrypt_and_verifyN)rx   ry   rz   r   r   r!   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r{   *  s    


r{   c                 C   s\   dd | d  dD g}|dd | dd D 7 }| d r%t| d }nd }||g7 }|S )Nc                 S      g | ]}t |qS r   r   .0r=   r   r   r   
<listcomp>      ztransform.<locals>.<listcomp>r   -c                 S   r   r   r   r   r   r   r   r     r   r9   r   )splitr   )tvnew_tvr   r   r   r   	transform  s   
r   c                   @   s.   e Zd ZdZddgZdd eD Zdd ZdS )	TestVectorsz6Class exercising the SIV test vectors found in RFC5297)0101112131415161718191a1b1c1d1e1f2021222324252627112233445566778899aabbccddee40c02b9690c4dc04daef7f6afe5c 85632d07c6e8f37f950acd320a2ecc93@fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0f0f1f2f3f4f5f6f7f8f9fafbfcfdfeffN)ze00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddccbbaa99887766554433221100-102030405060708090a0^7468697320697320736f6d6520706c61696e7465787420746f20656e6372797074207573696e67205349562d414553^cb900f2fddbe404326601965c889bf17dba77ceb094fa663b7a3f748ba8af829ea64ad544a272e9c485b62a3fd5c0d 7bdb6e3b432667eb06f4d14bff2fbd0f@7f7e7d7c7b7a79787776757473727170404142434445464748494a4b4c4d4e4f 09f911029d74e35bd84156c5635688c0c                 C   r   r   )r   )r   r   r   r   r   r     r   zTestVectors.<listcomp>c                 C   s   | j D ]M\}}}}}}tj|tj|d}|D ]}|| q||\}	}
| ||	 | ||
 tj|tj|d}|D ]}|| q<|||}| || qd S r-   )test_vectorsr   r   r    r^   r"   r$   r#   )r%   
assoc_datar(   r)   r*   r&   r   r'   r=   r0   mac2r+   r   r   r   runTest  s   zTestVectors.runTestN)rx   ry   rz   __doc__test_vectors_hexr   r   r   r   r   r   r     s    r   c                   @   <   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestVectorsWycheproofc                 C      t j|  d| _d S NNoneunittestTestCase__init___idr6   r   r   r   r        
zTestVectorsWycheproof.__init__c                 C      t ddd| _d S )NCipher
wycheproofzaes_siv_cmac_test.jsonzWycheproof AES SIVr   r   r6   r   r   r   setUp     
zTestVectorsWycheproof.setUpc                 C      | j S Nr   r6   r   r   r   shortDescription     z&TestVectorsWycheproof.shortDescriptionc                 C   s\   dt |j | _t|jtj}||j |	|j
\}}|jr,| || |j d S d S )Nz!Wycheproof Encrypt AES-SIV Test #)stridr   r   r   r&   r    r^   aadr"   msgvalidr$   r)   r%   r   r'   r)   r   r   r   r   test_encrypt  s   z"TestVectorsWycheproof.test_encryptc                 C   s   dt |j | _t|jtj}||j z|	|j
dd  |j
d d }W n ty7   |jr4J Y d S w |js=J | ||j d S )Nz!Wycheproof Decrypt AES_SIV Test #rM   )r   r   r   r   r   r&   r    r^   r   r#   r)   r;   r   r$   r   r%   r   r'   r(   r   r   r   test_decrypt  s   $
z"TestVectorsWycheproof.test_decryptc                 C   $   | j D ]}| | | | qd S r   r   r   r   r%   r   r   r   r   r        

zTestVectorsWycheproof.runTestN	rx   ry   rz   r   r   r   r   r   r   r   r   r   r   r     s    	r   c                   @   r   )TestVectorsWycheproof2c                 C   r   r   r   r6   r   r   r   r     r   zTestVectorsWycheproof2.__init__c                 C   r   )Nr   zaead_aes_siv_cmac_test.jsonzWycheproof AEAD SIVr   r6   r   r   r   r     r   zTestVectorsWycheproof2.setUpc                 C   r   r   r   r6   r   r   r   r     r   z'TestVectorsWycheproof2.shortDescriptionc                 C   sl   dt |j | _tj|jtj|jd}||j	 |
|j\}}|jr4| ||j | ||j d S d S )Nz&Wycheproof Encrypt AEAD-AES-SIV Test #r   )r   r   r   r   r   r&   r    ivr^   r   r"   r   r   r$   r)   r   r   r   r   r   r     s   z#TestVectorsWycheproof2.test_encryptc                 C   s   dt |j | _tj|jtj|jd}||j	 z
|
|j|j}W n ty2   |jr/J Y d S w |js8J | ||j d S )Nz&Wycheproof Decrypt AEAD-AES-SIV Test #r   )r   r   r   r   r   r&   r    r   r^   r   r#   r)   r   r;   r   r$   r   r   r   r   r   r     s   
z#TestVectorsWycheproof2.test_decryptc                 C   r   r   r   r   r   r   r   r     r   zTestVectorsWycheproof2.runTestNr   r   r   r   r   r     s    
r   c                 C   sN   |  d}g }|tt7 }|tt7 }|t g7 }|t g7 }|t g7 }|S )Nwycheproof_warnings)getr   r   r{   r   r   r   )configr   testsr   r   r   	get_tests  s   
r   __main__c                   C   s   t t S r   )r   	TestSuiter   r   r   r   r   <lambda>'  s    r   suite)defaultTest)jsonr   binasciir   Crypto.SelfTest.st_commonr   Crypto.SelfTest.loaderr   Crypto.Util.py3compatr   r   Crypto.Cipherr   Crypto.Hashr	   rS   r
   r   r   r   r{   r   r   r   r   r   rx   r   mainr   r   r   r   <module>   s,    zU9+,