U
    ÈZjãM  ã                   @   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 )é    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   úb/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/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_384é0   Ú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ƒ   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   r3   )ÚCrypto.Util.strxorrI   r   r   r   r   r   r    r   r.   r5   r!   )r#   rI   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 rO   )Ú
memoryviewrQ   r   r   r   r   r   r   rR   r    r"   r   r!   rS   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    rQ   r"   r!   )r#   r&   r%   r'   r   rZ   Ú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 rX   )
r   r   r   r   r   r    rV   rQ   r"   r!   )r#   r&   r%   r'   r   rZ   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   ó   0rY   r3   )r   r   r   r   r   r    r.   r/   r!   rQ   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   rK   rN   rU   rW   r\   r]   r`   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.   r/   rC   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 re   )r   r   r   r   r   r.   r/   rA   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   rR   r   rM   Ú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   rM   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   rM   rh   ri   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   rR   r   rM   r6   r"   rh   )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   rR   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  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.   r/   rq   r   r   r   Ú(test_invalid_multiple_decrypt_and_verifyv  s
    z4SivFSMTests.test_invalid_multiple_decrypt_and_verifyN)ra   rb   rc   r   r   r   r   rf   rg   rj   rk   rl   ro   rp   rr   rs   r   r   r   r   rd   *  s   


rd   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   ©Ú.0r7   r   r   r   Ú
<listcomp>€  s     ztransform.<locals>.<listcomp>r   ú-c                 S   s   g | ]}t |ƒ‘qS r   r   rt   r   r   r   rv   �  s     r3   rn   )Úsplitr   )ÚtvZnew_tvr   r   r   r   Ú	transform  s    
rz   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   )rz   )ru   ry   r   r   r   rv   ®  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   rR   r    r"   r!   )r#   Z
assoc_datar&   r'   r(   r$   r   r%   r7   r,   Zmac2r)   r   r   r   ÚrunTest°  s    zTestVectors.runTestN)ra   rb   rc   Ú__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__Ú_idr0   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   ry   r0   r   r   r   ÚsetUpÉ  s    þzTestVectorsWycheproof.setUpc                 C   s   | j S ©N©r†   r0   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   rR   Úaadr    ÚmsgÚvalidr"   r'   ©r#   ry   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 #rE   )r�   rŽ   r†   r   r   r$   r   rR   r�   r!   r'   r5   r‘   ÚAssertionErrorr"   r�   ©r#   ry   r%   r&   r   r   r   Útest_decryptÚ  s    $
z"TestVectorsWycheproof.test_decryptc                 C   s$   | j D ]}|  |¡ |  |¡ qd S rŠ   ©ry   r“   r–   ©r#   ry   r   r   r   r}   ç  s    

zTestVectorsWycheproof.runTestN©	ra   rb   rc   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‚   r0   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ˆ   r0   r   r   r   r‰   ô  s    þzTestVectorsWycheproof2.setUpc                 C   s   | j S rŠ   r‹   r0   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   ÚivrR   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›   rR   r�   r!   r'   r   r5   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   rd   r{   r   rš   )Úconfigrœ   Ztestsr   r   r   Ú	get_tests  s    
rŸ   Ú__main__c                   C   s   t  tƒ ¡S rŠ   )rƒ   Z	TestSuiterŸ   r   r   r   r   Ú<lambda>'  r2   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	   rJ   r
   r   r„   r   rd   rz   r{   r   rš   rŸ   ra   r¢   Úmainr   r   r   r   Ú<module>   s(    zU9+,