o
    eP                     @   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   OD:\Projects\ConvertPro\env\Lib\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@   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nonceZ	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.   r/   r   r   r   r   r   r0   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.   r/   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.   r/   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   r3   )Crypto.Util.strxorrJ   r   r   r   r   r   r    r   r.   r5   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   r3   )r   r   r   r   r   r    r.   r/   r!   rR   r5   )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-   r1   r8   r;   r=   r@   rB   rD   rH   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   *   t j| jt j| jd}| t|jd d S Nr   s   xxx)r   r   r   r   r   r.   r/   rC   r:   r   r   r   test_invalid_init_encrypt0     z%SivFSMTests.test_invalid_init_encryptc                 C   rf   rg   )r   r   r   r   r   r.   r/   rA   r:   r   r   r   test_invalid_init_decrypt6  ri   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   rk   rl   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   rS   r   rN   r6   r"   rk   )r#   r%   Z	first_macr7   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   r2   )	r   r   r   r   r   r    r   r.   r/   r#   r%   r'   r   r   r   r   (test_invalid_multiple_encrypt_and_digestq  rI   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.   r/   rt   r   r   r   (test_invalid_multiple_decrypt_and_verifyv  s
   z4SivFSMTests.test_invalid_multiple_decrypt_and_verifyN)rb   rc   rd   r   r   r   r   rh   rj   rm   rn   ro   rr   rs   ru   rv   r   r   r   r   re   *  s    


re   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   .0r7   r   r   r   
<listcomp>      ztransform.<locals>.<listcomp>r   -c                 S   rw   r   r   rx   r   r   r   rz     r{   r3   rq   )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   rw   r   )r   )ry   r~   r   r   r   rz     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   rS   r    r"   r!   )r#   Z
assoc_datar&   r'   r(   r$   r   r%   r7   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                   @   <   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___idr0   r   r   r   r        
zTestVectorsWycheproof.__init__c                 C      t ddd| _d S )NZCipherZ
wycheproofzaes_siv_cmac_test.jsonzWycheproof AES SIVr   r~   r0   r   r   r   setUp     
zTestVectorsWycheproof.setUpc                 C      | j S Nr   r0   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   rS   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 #rE   )r   r   r   r   r   r$   r   rS   r   r!   r'   r5   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	rb   rc   rd   r   r   r   r   r   r   r   r   r   r   r     s    	r   c                   @   r   )TestVectorsWycheproof2c                 C   r   r   r   r0   r   r   r   r     r   zTestVectorsWycheproof2.__init__c                 C   r   )Nr   zaead_aes_siv_cmac_test.jsonzWycheproof AEAD SIVr   r0   r   r   r   r     r   zTestVectorsWycheproof2.setUpc                 C   r   r   r   r0   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   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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   rS   r   r!   r'   r   r5   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   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>'  s    r   suite)ZdefaultTest)jsonr   binasciir   ZCrypto.SelfTest.st_commonr   ZCrypto.SelfTest.loaderr   ZCrypto.Util.py3compatr   r   ZCrypto.Cipherr   ZCrypto.Hashr	   rK   r
   r   r   r   re   r   r   r   r   r   rb   r   mainr   r   r   r   <module>   s,    zU9+,