o
    Þý°jÿ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 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   ú–/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/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_384é0   Ú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   )ÚCryptodome.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   ÚCryptodome.SelfTest.st_commonr   ÚCryptodome.SelfTest.loaderr   ÚCryptodome.Util.py3compatr   r   ÚCryptodome.Cipherr   ÚCryptodome.Hashr	   rS   r
   r   r°   r   r{   r—   r˜   rª   rÎ   rÔ   rx   rØ   Úmainr   r   r   r   Ú<module>   s,    zU9+,þ