U
    Mfp                     @   s  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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G dd de jZG dd de jZG dd de jZd dl
mZmZmZmZmZ edeej eej ejD ]Zedee ee qejD ]Zedee ee q&ejD ]Zedee ee qJejD ]Zedee ee qni 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DES3)SHAKE128)strxorc                 C   s   t jt| d|S )N)data)r
   newr   read)taglength r   G/tmp/pip-unpacked-wheel-l_0d1exj/Cryptodome/SelfTest/Cipher/test_EAX.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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+d, Zd-d. Zd/d0 Zd1S )2EaxTestskey_128   key_192	nonce_128   data_128c                 C   sZ   t j| jt j| jd}tdd}||}t j| jt j| jd}||}| || d S )Nnonce	plaintexti@  )	r   r   r   MODE_EAXnonce_96r   encryptdecryptassertEqualselfcipherptctpt2r   r   r   test_loopback_1286   s    


zEaxTests.test_loopback_128c                 C   sZ   t j| jt j| jd}tdd}||}t j| jt j| jd}||}| || d S )Nr   r   i   )	r	   r   r   r   r   r   r    r!   r"   r#   r   r   r   test_loopback_64?   s    


zEaxTests.test_loopback_64c                 C   s   t | jt j}|j}t | jt j}|j}| t|d | || t | jt j| j}|	| j
}t j| jt j| jd}| ||	| j
 d S )Nr   r   )r   r   r   r   r   r"   lenassertNotEqualr   r    r   )r$   r%   nonce1nonce2r'   r   r   r   
test_nonceH   s    zEaxTests.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_bytesW   s    z!EaxTests.test_nonce_must_be_bytesc                 C   sX   | j ttj| jtjdd tddD ].}tj| jtjtd| d}|td q$d S )N    r         )	r0   
ValueErrorr   r   r   r   ranger   r    )r$   xr%   r   r   r   test_nonce_length[   s    zEaxTests.test_nonce_lengthc                 C   s*   t j| jt j| jd}| |jt j d S Nr   )r   r   r   r   r   r"   
block_sizer$   r%   r   r   r   test_block_size_128d   s    zEaxTests.test_block_size_128c                 C   s*   t j| jtj| jd}| |jt j d S r;   )r	   r   r   r   r   r   r"   r<   r=   r   r   r   test_block_size_64h   s    zEaxTests.test_block_size_64c                 C   sj   t j| jt j| jd}| |j| j t | jt jj}t | jt jj}| t|d | || d S )Nr   r   )	r   r   r   r   r   r"   r   r+   r,   )r$   r%   r-   r.   r   r   r   test_nonce_attributel   s    zEaxTests.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)r0   r1   r   r   r   r   r   r2   r   r   r   test_unknown_parametersv   s      z EaxTests.test_unknown_parametersc                 C   s>   dD ]4}t j| jt j| jd}t||d}| |d qd S )Nr    r!   r   r4   )r   r   r   r   r   getattrr"   )r$   funcr%   resultr   r   r   test_null_encryption_decryption   s    z(EaxTests.test_null_encryption_decryptionc                 C   sd   t j| jt j| jd}|d | t|jd t j| jt j| jd}|d | t|jd d S )Nr   r4   )	r   r   r   r   r   r    r0   r1   r!   r=   r   r   r   test_either_encrypt_or_decrypt   s    

z'EaxTests.test_either_encrypt_or_decryptc                 C   sP   t j| jt j| jd}| t|jd t j| jt j| jd}| t|jd d S )Nr   ztest1234567890-*)	r   r   r   r   r   r0   r1   r    r!   r=   r   r   r   test_data_must_be_bytes   s    z EaxTests.test_data_must_be_bytesc                 C   s   | j ttj| jtj| jdd | j ttj| jtj| jdd tddD ]<}tj| jtj| j|d}|| j	\}}| 
t|| qFtj| jtj| jd}|| j	\}}| 
t|d d S )Nr5   )r   mac_len      r   r   )r0   r7   r   r   r   r   r   r8   encrypt_and_digestr   r"   r+   )r$   rK   r%   _macr   r   r   test_mac_len   s"      zEaxTests.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   r5   )Cryptodome.Util.strxorrR   r   r   r   r   r   rN   r   r0   r7   decrypt_and_verify)r$   rR   r%   r'   rP   Zinvalid_macr   r   r   test_invalid_mac   s    
zEaxTests.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EaxTests.test_hex_macc                 C   s:  t dd}t dd}tj| jtj| jd}|| ||\}}dd }dD ]l}tj| jtj| jd}|||D ]}|| qrd}	|||D ]}|	||7 }	q| 	||	 |
| qNdD ]t}tj| jtj| jd}|||D ]}|| qd}
|||D ]}|
||7 }
q| 	||
 | 	| | qd S )	Nzauthenticated data   r   r   c                    s     fddt dt D S )Nc                    s   g | ]}||   qS r   r   ).0ichunk_lengthr   r   r   
<listcomp>   s     zBEaxTests.test_message_chunks.<locals>.break_up.<locals>.<listcomp>r   )r8   r+   )r   r]   r   r\   r   break_up   s    z.EaxTests.test_message_chunks.<locals>.break_up)
r5   rM      rA   
      r   (   P   r6   r4   )r   r   r   r   r   r   updaterN   r!   r"   verifyr    rW   )r$   	auth_datar   r%   Z
ciphertextZref_macr_   r]   chunkr(   ct2r   r   r   test_message_chunks   s0    


zEaxTests.test_message_chunksc                 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< ||}	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< ||}d|d d< || | 
|| j d S Nr   s   r`   s   )	bytearrayr   r   r   r   r   r   re   r    rW   r"   r   r!   rf   )r$   Zkey_baZnonce_baZ	header_baZdata_bacipher1r'   r   cipher2ct_testtag_testZct_baZtag_bacipher3pt_testr   r   r   test_bytearray   sV    











zEaxTests.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< |	|}	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< ||}d|d d< || | || j d S rk   )
memoryviewrl   r   r   r   r   r   r   re   r    rW   r"   r   r!   rf   )r$   Zkey_mvZnonce_mvZ	header_mvZdata_mvrm   r'   r   rn   ro   rp   Zct_mvZtag_mvrq   rr   r   r   r   test_memoryview  sV    




zEaxTests.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  t j| jt j| jd}|j
||d\}}| || | |d  | || t j| jt j| jd}|j|||d}| || | |d  d S Ns   55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555r   r6   output)r   r   r   r   r   r    rW   rl   r"   r!   rN   rT   )r$   r&   r%   r'   r   rx   resZtag_outr   r   r   test_output_paramL  s,    
zEaxTests.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 rv   )
r   r   r   r   r   r    rt   rl   r"   r!   )r$   r&   r%   r'   rx   r   r   r   test_output_param_memoryviewi  s    
z%EaxTests.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      0rw   r5   )r   r   r   r   r   r    r0   r1   r!   rl   r7   )r$   ZLEN_PTr&   r%   r'   Zshorter_outputr   r   r   test_output_param_negx  s    
zEaxTests.test_output_param_negN)__name__
__module____qualname__r   r   r   r   r   r)   r*   r/   r3   r:   r>   r?   r@   rC   rH   rI   rJ   rQ   rU   rX   rj   rs   ru   rz   r{   r~   r   r   r   r   r   /   s2   



			
	)33r   c                   @   s   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d Zdd ZdS )EaxFSMTestsr   r   r   r   r   c                 C   sX   t j| jt j| jd}|| j}| }t j| jt j| jd}|| |	| d S r;   )
r   r   r   r   r   r    r   rW   r!   rf   r$   r%   r'   rP   r   r   r   -test_valid_init_encrypt_decrypt_digest_verify  s    
z9EaxFSMTests.test_valid_init_encrypt_decrypt_digest_verifyc                 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   re   r   rW   rf   r$   r%   rP   r   r   r   $test_valid_init_update_digest_verify  s    z0EaxFSMTests.test_valid_init_update_digest_verifyc                 C   sp   t j| jt j| jd}|| j || j}| }t j| jt j| jd}|| j |	| |
| d S r;   )r   r   r   r   r   re   r   r    rW   r!   rf   r   r   r   r   test_valid_full_path  s    
z EaxFSMTests.test_valid_full_pathc                 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_digest  s    z"EaxFSMTests.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   rf   r   r   r   r   test_valid_init_verify  s    z"EaxFSMTests.test_valid_init_verifyc                 C   s   dD ]}d d| j | j d fD ]t}|d kr.d }nt|}tj| jtj| jd}|d k	r^|| t||}|| j  || j  || j  || j  qqd S )NrD   s   333   3r   )	r   r+   r   r   r   r   r   re   rE   )r$   method_namerg   Z	assoc_lenr%   methodr   r   r   &test_valid_multiple_encrypt_or_decrypt  s"    




z2EaxFSMTests.test_valid_multiple_encrypt_or_decryptc                 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   re   r   rW   r8   r"   rf   )r$   r%   Z	first_macr9   r   r   r   $test_valid_multiple_digest_or_verify  s    z0EaxFSMTests.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   re   r   rN   rT   r"   )r$   r%   r'   rP   r&   r   r   r   0test_valid_encrypt_and_digest_decrypt_and_verify  s    z<EaxFSMTests.test_valid_encrypt_and_digest_decrypt_and_verifyc                 C   sh   dD ]^\}}dD ]P}t j| jt j| jd}|r:|| j t||| j | t	t||| j qqd S )N)rD   )r!   r    )TFr   )
r   r   r   r   r   re   r   rE   r0   r1   )r$   Zmethod1_nameZmethod2_nameZassoc_data_presentr%   r   r   r   #test_invalid_mixing_encrypt_decrypt  s    z/EaxFSMTests.test_invalid_mixing_encrypt_decryptc                 C   sp   dD ]f}t j| jt j| jd}|| j |  | t	t
||| j t j| jt j| jd}|| j qd S )N)r    re   r   )r   r   r   r   r   r    r   rW   r0   r1   rE   rN   )r$   r   r%   r   r   r   +test_invalid_encrypt_or_update_after_digest  s    z7EaxFSMTests.test_invalid_encrypt_or_update_after_digestc                 C   s   t j| jt j| jd}|| j}| }dD ]|}t j| jt j| jd}|| |	| | 
tt||| j t j| jt j| jd}||| | 
tt||| j q.d S )Nr   )r!   re   )r   r   r   r   r   r    r   rW   r!   rf   r0   r1   rE   rT   )r$   r%   r'   rP   r   r   r   r   +test_invalid_decrypt_or_update_after_verify  s    

z7EaxFSMTests.test_invalid_decrypt_or_update_after_verifyN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   


r   c                
   @   s>   e Zd ZdZdddddddd	d
dg
Zdd eD Zdd ZdS )TestVectorsPaperzgClass exercising the EAX test vectors found in
       http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf)Z6bfb914fd07eae6b r   Z e037830e8389f27b025a2d6527e79d01Z 233952dee4d5ed5f9b9c6d6ff80ff478Z 62EC67F9C3A4A407FCB2A8C49031A8B3)Zfa3bfd4806eb53faZf7fbZ19ddZ 5c4c9331049d0bdab0277408f67967e5Z 91945d3f4dcbee0bf45ef52255f095a4Z BECAF043B0A23D843194BA972C66DEBD)Z234a3463c1264ac6Z
1a47cb4933Z
d851d5bae0Z 3a59f238a23e39199dc9266626c40f80Z 01f74ad64077f2e704c0f60ada3dd523Z 70C3DB4F0D26368400A10ED05D2BFF5E)Z33cce2eabff5a79dZ
481c9e39b1Z
632a9d131aZ d4c168a4225d8e1ff755939974a7bedeZ d07cf6cbb7f313bdde66b727afd3c5e8Z 8408DFFF3C1A2B1292DC199E46B7D617)Zaeb96eaebe2970e9Z40d0c07da5e4Z071dfe16c675Z cb0677e536f73afe6a14b74ee49844ddZ 35b6d0580005bbc12b0587124557d2c2Z FDB6B06676EEDC5C61D74276E1F8E816)Zd4482d1ca78dce0fZ4de3b35c3fc039245bd1fb7dZ835bb4f15d743e350e728414Z abb8644fd6ccb86947c5e10590210a4fZ bd8e6e11475e60b268784c38c62feb22Z 6EAC5C93072D8E8513F750935E46DA1B)Z65d2017990d62528Z"8b0a79306c9ce7ed99dae4f87f8dd61636Z"02083e3979da014812f59f11d52630da30Z 137327d10649b0aa6e1c181db617d7f2Z 7c77d6e813bed5ac98baa417477a2e7dZ 1A8C98DCD73D38393B2BF1569DEEFC19)Z54b9f04e6a09189aZ$1bda122bce8a8dbaf1877d962b8592dd2d56Z$2ec47b2c4954a489afc7ba4897edcdae8cc3Z 3b60450599bd02c96382902aef7f832aZ 5fff20cafab119ca2fc73549e20f5b0dZ DDE59B97D722156D4D9AFF2BC7559826)Z899a175897561d7eZ$6cf36720872b8513f6eab1a8a44438d5ef11Z$0de18fd0fdd91e7af19f1d8ee8733938b1e8Z e7f6d2231618102fdb7fe55ff1991700Z a4a4782bcffd3ec5e7ef6d8c34a56123Z B781FCF2F75FA5A8DE97A9CA48E522EC)Z126735fcc320d25aZ*ca40d7446e545ffaed3bd12a740a659ffbbb3ceab7Z*cb8920f87a6c75cff39627b56e3ed197c552d295a7Z cfc46afc253b4652b1af3795b124ab6eZ 8395fcf1e95bebd697bd010bc766aac3Z 22E7ADD93CFC6393C57EC0B3C17D6B44c                 C   s   g | ]}d d |D qS )c                 S   s   g | ]}t |qS r   r   )rZ   r9   r   r   r   r^   v  s     z&TestVectorsPaper.<listcomp>.<listcomp>r   )rZ   tvr   r   r   r^   v  s     zTestVectorsPaper.<listcomp>c                 C   s   | j D ]\}}}}}}tj|tj|t|d}|| ||\}}	| || | ||	 tj|tj|t|d}|| |||}
| ||
 qd S )NrK   )	test_vectorsr   r   r   r+   re   rN   r"   rT   )r$   Z
assoc_datar&   r'   rP   keyr   r%   ri   Zmac2r(   r   r   r   runTestx  s    

zTestVectorsPaper.runTestN)r   r   r   __doc__Ztest_vectors_hexr   r   r   r   r   r   r   !  s   Qr   c                   @   sL   e Z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 )TestVectorsWycheproofc                 C   s   t j|  || _d| _d S )NNone)unittestTestCase__init___wycheproof_warnings_id)r$   wycheproof_warningsr   r   r   r     s    zTestVectorsWycheproof.__init__c                 C   s"   dd }t dddd|id| _d S )Nc                 S   s   | d d S )NZtagSize   r   )groupr   r   r   
filter_tag  s    z/TestVectorsWycheproof.setUp.<locals>.filter_tag)ZCipherZ
wycheproofzaes_eax_test.jsonzWycheproof EAXtag_size)Z	group_tag)r   r   )r$   r   r   r   r   setUp  s    zTestVectorsWycheproof.setUpc                 C   s   | j S N)r   r2   r   r   r   shortDescription  s    z&TestVectorsWycheproof.shortDescriptionc                 C   s.   |j r*| jr*dd l}|d| j|jf  d S )Nr   zWycheproof warning: %s (%s))warningr   warningswarnr   comment)r$   r   r   r   r   r   r     s    zTestVectorsWycheproof.warnc              
   C   s   dt |j | _ztj|jtj|j|jd}W nF t	k
rt } z(t
|jdkrZdt |ks^tW Y d S d }~X Y nX ||j ||j\}}|jr| ||j | ||j | | d S )NzWycheproof Encrypt EAX Test #r   r   Nonce cannot be empty)stridr   r   r   r   r   ivr   r7   r+   AssertionErrorre   aadrN   msgvalidr"   r'   r   r   )r$   r   r%   er'   r   r   r   r   test_encrypt  s    z"TestVectorsWycheproof.test_encryptc              
   C   s   dt |j | _ztj|jtj|j|jd}W nF t	k
rt } z(t
|jdkrZdt |ks^tW Y d S d }~X Y nX ||j z||j|j}W n t	k
r   |jrtY n$X |jst| ||j | | d S )NzWycheproof Decrypt EAX Test #r   r   r   )r   r   r   r   r   r   r   r   r   r7   r+   r   re   r   rT   r'   r   r   r"   r   r   )r$   r   r%   r   r&   r   r   r   test_decrypt  s    
z"TestVectorsWycheproof.test_decryptc                 C   s   dt |j | _t|jdks,t|jdk r0d S tj|jtj	|j|j
d}||j t|jdt|jd  d }| t|j||j d S )Nz%Wycheproof Corrupt Decrypt EAX Test #r   r5   r          )r   r   r   r+   r   r'   r   r   r   r   r   re   r   r   r0   r7   rT   r   )r$   r   r%   Z
ct_corruptr   r   r   test_corrupt_decrypt  s    z*TestVectorsWycheproof.test_corrupt_decryptc                 C   s.   | j D ]"}| | | | | | qd S r   )r   r   r   r   )r$   r   r   r   r   r     s    


zTestVectorsWycheproof.runTestN)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   
	r   c                   @   s   e Zd Zedd ZdS )TestOtherCiphersc                 C   s"   ||fdd}t | d| | d S )Nc                 S   sZ   |j td||jdd}|d\}}|j td||jdd}|||}| d| d S )Nr%   s   noncer   s	   plaintext)r   r   r   rN   rT   r"   )r$   factorykey_sizer%   r'   rP   r(   r   r   r   test_template  s    z3TestOtherCiphers.create_test.<locals>.test_templateZtest_)setattr)clsnamer   r   r   r   r   r   create_test  s    zTestOtherCiphers.create_testN)r   r   r   classmethodr   r   r   r   r   r     s   r   )DESr	   ARC2CASTBlowfishZDES_ZDES3_ZARC2_ZCAST_Z	Blowfish_c                 C   sP   |  d}g }|tt7 }|tt7 }|t g7 }|t|g7 }|tt7 }|S )Nr   )getr   r   r   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>  r4   r   suite)ZdefaultTest)$r   binasciir   ZCryptodome.SelfTest.st_commonr   ZCryptodome.SelfTest.loaderr   ZCryptodome.Util.py3compatr   r   ZCryptodome.Cipherr   r	   ZCryptodome.Hashr
   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ksr   r   r   mainr   r   r   r   <module>   s<     _ gM




