U
    gM                     @   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rdd Zejdd 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   G/tmp/pip-unpacked-wheel-_q8s9isk/Cryptodome/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@   Z	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&   Zct1Ztag1ct2Ztag2r   r   r   
test_nonceC   s    zSivTests.test_noncec                 C   s   | j ttj| jtjdd d S )NZ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      )	r/   
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   Z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   Z	use_aesni)r/   r0   r   r   r   r   r    r1   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   r/   r0   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    r/   r0   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   s    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   r4   )Cryptodome.Util.strxorrJ   r   r   r   r   r    r!   r   r/   r6   r"   )r$   rJ   r&   r(   r)   Z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   Z	hexverify)r$   r&   Z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   headerZcipher1r(   r   Zcipher2Zct_testZtag_testZct_baZtag_baZcipher3Z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 rP   )
memoryviewrR   r   r    r   r   r   r   rS   r!   r#   r   r"   rT   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!   rR   r#   r"   )r$   r'   r&   r(   r   r[   resZ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 rY   )
r   r   r   r   r    r!   rW   rR   r#   r"   )r$   r'   r&   r(   r   r[   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      0rZ   r4   )r   r   r   r   r    r!   r/   r0   r"   rR   r6   )r$   ZLEN_PTr'   r&   r(   r   Z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+   r.   r2   r9   r<   r>   rA   rC   rE   rI   rL   rO   rV   rX   r]   r^   ra   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   s*   t j| jt j| jd}| t|jd d S Nr   s   xxx)r   r   r   r   r    r/   r0   rD   r;   r   r   r   test_invalid_init_encrypt0  s    z%SivFSMTests.test_invalid_init_encryptc                 C   s*   t j| jt j| jd}| t|jd d S rf   )r   r   r   r   r    r/   r0   rB   r;   r   r   r   test_invalid_init_decrypt6  s    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    rS   r   rN   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    rN   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    rN   ri   rj   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 ]}| 	||  q2t j| jt j| jd}|| j tdD ]}|
| qrd S )Nr         )r   r   r   r   r    rS   r   rN   r7   r#   ri   )r$   r&   Z	first_macr8   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    rS   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   r3   )	r   r   r   r   r    r!   r   r/   r0   r$   r&   r(   r   r   r   r   (test_invalid_multiple_encrypt_and_digestq  s    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"   r/   r0   rr   r   r   r   (test_invalid_multiple_decrypt_and_verifyv  s
    z4SivFSMTests.test_invalid_multiple_decrypt_and_verifyN)rb   rc   rd   r   r   r    r   rg   rh   rk   rl   rm   rp   rq   rs   rt   r   r   r   r   re   *  s   


re   c                 C   s\   dd | d  dD g}|dd | dd D 7 }| d rJt| d }nd }||g7 }|S )Nc                 S   s   g | ]}t |qS r   r   .0r8   r   r   r   
<listcomp>  s     ztransform.<locals>.<listcomp>r   -c                 S   s   g | ]}t |qS r   r   ru   r   r   r   rw     s     r4   ro   )splitr   )tvZ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)Z0101112131415161718191a1b1c1d1e1f2021222324252627Z112233445566778899aabbccddeeZ40c02b9690c4dc04daef7f6afe5cZ 85632d07c6e8f37f950acd320a2ecc93Z@fffefdfcfbfaf9f8f7f6f5f4f3f2f1f0f0f1f2f3f4f5f6f7f8f9fafbfcfdfeffN)ze00112233445566778899aabbccddeeffdeaddadadeaddadaffeeddccbbaa99887766554433221100-102030405060708090a0Z^7468697320697320736f6d6520706c61696e7465787420746f20656e6372797074207573696e67205349562d414553Z^cb900f2fddbe404326601965c889bf17dba77ceb094fa663b7a3f748ba8af829ea64ad544a272e9c485b62a3fd5c0dZ 7bdb6e3b432667eb06f4d14bff2fbd0fZ@7f7e7d7c7b7a79787776757473727170404142434445464748494a4b4c4d4e4fZ 09f911029d74e35bd84156c5635688c0c                 C   s   g | ]}t |qS r   )r{   )rv   rz   r   r   r   rw     s     zTestVectors.<listcomp>c                 C   s   | j D ]\}}}}}}tj|tj|d}|D ]}|| q,||\}	}
| ||	 | ||
 tj|tj|d}|D ]}|| qx|||}| || qd S r,   )test_vectorsr   r   r   rS   r!   r#   r"   )r$   Z
assoc_datar'   r(   r)   r%   r   r&   r8   r-   Zmac2r*   r   r   r   runTest  s    zTestVectors.runTestN)rb   rc   rd   __doc__Ztest_vectors_hexr}   r~   r   r   r   r   r|     s   r|   c                   @   s<   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   s   t j|  d| _d S NNoneunittestTestCase__init___idr1   r   r   r   r     s    zTestVectorsWycheproof.__init__c                 C   s   t ddd| _d S )NZCipherZ
wycheproofzaes_siv_cmac_test.jsonzWycheproof AES SIVr   rz   r1   r   r   r   setUp  s    zTestVectorsWycheproof.setUpc                 C   s   | j S Nr   r1   r   r   r   shortDescription  s    z&TestVectorsWycheproof.shortDescriptionc                 C   sX   dt |j | _t|jtj}||j |	|j
\}}|jrT| || |j d S )Nz!Wycheproof Encrypt AES-SIV Test #)stridr   r   r   r%   r   rS   aadr!   msgvalidr#   r(   r$   rz   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k
rn   |jrjtY nX |jszt| ||j d S )Nz!Wycheproof Decrypt AES_SIV Test #rF   )r   r   r   r   r   r%   r   rS   r   r"   r(   r6   r   AssertionErrorr#   r   r$   rz   r&   r'   r   r   r   test_decrypt  s    $
z"TestVectorsWycheproof.test_decryptc                 C   s$   | j D ]}| | | | qd S r   rz   r   r   r$   rz   r   r   r   r~     s    

zTestVectorsWycheproof.runTestN	rb   rc   rd   r   r   r   r   r   r~   r   r   r   r   r     s   	r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )TestVectorsWycheproof2c                 C   s   t j|  d| _d S r   r   r1   r   r   r   r     s    zTestVectorsWycheproof2.__init__c                 C   s   t ddd| _d S )Nr   zaead_aes_siv_cmac_test.jsonzWycheproof AEAD SIVr   r1   r   r   r   r     s    zTestVectorsWycheproof2.setUpc                 C   s   | j S r   r   r1   r   r   r   r     s    z'TestVectorsWycheproof2.shortDescriptionc                 C   sh   dt |j | _tj|jtj|jd}||j	 |
|j\}}|jrd| ||j | ||j d S )Nz&Wycheproof Encrypt AEAD-AES-SIV Test #r   )r   r   r   r   r   r%   r   ivrS   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k
rd   |jr`tY nX |jspt| ||j d S )Nz&Wycheproof Decrypt AEAD-AES-SIV Test #r   )r   r   r   r   r   r%   r   r   rS   r   r"   r(   r   r6   r   r   r#   r   r   r   r   r   r     s    
z#TestVectorsWycheproof2.test_decryptc                 C   s$   | j D ]}| | | | qd S r   r   r   r   r   r   r~     s    

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   re   r|   r   r   )configr   testsr   r   r   	get_tests  s    
r   __main__c                   C   s   t t S r   )r   Z	TestSuiter   r   r   r   r   <lambda>'  r3   r   suite)ZdefaultTest)jsonr   binasciir   ZCryptodome.SelfTest.st_commonr   ZCryptodome.SelfTest.loaderr   ZCryptodome.Util.py3compatr   r   ZCryptodome.Cipherr   ZCryptodome.Hashr	   rK   r
   r   r   r   re   r{   r|   r   r   r   rb   r   mainr   r   r   r   <module>   s(    zU9+,