U
    Mf                     @   s  d dl mZ d dl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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G dd dejZedddddd ipg Zeeddddd d ip g 7 ZeeD ]F\ZZe ee!rDq,efd!d"Z"e#ed#e e" e#ed#e e" q,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 ).    )print_functionN	unhexlify)list_test_cases)load_test_vectorsload_test_vectors_wycheproof)tobytesbchr)AES)SHAKE128SHA256)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_GCM.pyget_tag_random.   s    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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 ).GcmTestskey_128   	nonce_128   r      c                 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_GCMnonce_96r   encryptdecryptassertEqual)selfcipherptctpt2r   r   r   test_loopback_1288   s    


zGcmTests.test_loopback_128c                 C   s^   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%   r'   r   r   r   
test_nonceA   s
    zGcmTests.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_bytesK   s    z!GcmTests.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      r   )	r,   
ValueErrorr
   r   r   r   ranger	   r!   )r$   xr%   r   r   r   test_nonce_lengthO   s    zGcmTests.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_128X   s    zGcmTests.test_block_size_128c                 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   lenZassertNotEqual)r$   r%   Znonce1Znonce2r   r   r   test_nonce_attribute\   s    zGcmTests.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    r.   r   r   r   test_unknown_parametersf   s      z GcmTests.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   r0   )r
   r   r   r   r    getattrr#   )r$   funcr%   resultr   r   r   test_null_encryption_decryptionq   s    z(GcmTests.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   r0   )	r
   r   r   r   r    r!   r,   r-   r"   r7   r   r   r   test_either_encrypt_or_decryptw   s    

z'GcmTests.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    r,   r-   r!   r"   r7   r   r   r   test_data_must_be_bytes   s    z GcmTests.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 )N   )r   mac_len      r   r   )r,   r2   r
   r   r   r   r    r3   encrypt_and_digestr   r#   r9   )r$   rF   r%   _macr   r   r   test_mac_len   s"      zGcmTests.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   r1   )Cryptodome.Util.strxorrM   r
   r   r   r   r    rI   r   r,   r2   decrypt_and_verify)r$   rM   r%   r'   rK   Zinvalid_macr   r   r   test_invalid_mac   s    
zGcmTests.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GcmTests.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     zBGcmTests.test_message_chunks.<locals>.break_up.<locals>.<listcomp>r   )r3   r9   )r   rX   r   rW   r   break_up   s    z.GcmTests.test_message_chunks.<locals>.break_up)
r1      rE   r;   
      r   (   P   r   r0   )r   r
   r   r   r   r    updaterI   r"   r#   verifyr!   rR   )r$   	auth_datar   r%   Z
ciphertextZref_macrZ   rX   chunkr(   ct2r   r   r   test_message_chunks   s0    


zGcmTests.test_message_chunksc                 C   sj  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j|tj|d}d|d d< d|d d< || d|d d< |t |	t |
}| 
| j| d S Nr   s   rE   )	bytearrayr   r    r   r
   r   r   r`   r!   rR   r#   r   rO   )r$   Zkey_baZnonce_baZ	header_baZdata_bacipher1r'   r   cipher2ct_testtag_testcipher4pt_testr   r   r   test_bytearray   sN    









zGcmTests.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j|tj|d}d|d d< d|d d< || d|d d< |t |	t |
}| | j| d S rf   )
memoryviewrg   r   r    r   r
   r   r   r`   r!   rR   r#   r   rO   )r$   Zkey_mvZnonce_mvZ	header_mvZdata_mvrh   r'   r   ri   rj   rk   rl   rm   r   r   r   test_memoryview  sN    


zGcmTests.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   r   output)r
   r   r   r   r    r!   rR   rg   r#   r"   rI   rO   )r$   r&   r%   r'   r   rs   resZtag_outr   r   r   test_output_param4  s,    
zGcmTests.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 rq   )
r
   r   r   r   r    r!   ro   rg   r#   r"   )r$   r&   r%   r'   rs   r   r   r   test_output_param_memoryviewQ  s    
z%GcmTests.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      0rr   r1   )r
   r   r   r   r    r!   r,   r-   r"   rg   r2   )r$   ZLEN_PTr&   r%   r'   Zshorter_outputr   r   r   test_output_param_neg`  s    
zGcmTests.test_output_param_negN)__name__
__module____qualname__r   r   r    r   r)   r+   r/   r5   r8   r:   r=   rB   rC   rD   rL   rP   rS   re   rn   rp   ru   rv   ry   r   r   r   r   r   2   s,   


	
	
	)//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 )GcmFSMTestsr   r   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   rR   r"   ra   r$   r%   r'   rK   r   r   r   -test_valid_init_encrypt_decrypt_digest_verifyz  s    
z9GcmFSMTests.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    r`   r   rR   ra   r$   r%   rK   r   r   r   $test_valid_init_update_digest_verify  s    z0GcmFSMTests.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    r`   r   r!   rR   r"   ra   r~   r   r   r   test_valid_full_path  s    
z GcmFSMTests.test_valid_full_pathc                 C   s"   t j| jt j| jd}|  d S r*   )r
   r   r   r   r    rR   r7   r   r   r   test_valid_init_digest  s    z"GcmFSMTests.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    rR   ra   r   r   r   r   test_valid_init_verify  s    z"GcmFSMTests.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 )Nr>   s   333   3r   )	r   r9   r
   r   r   r   r    r`   r?   )r$   method_namerb   Z	assoc_lenr%   methodr   r   r   &test_valid_multiple_encrypt_or_decrypt  s"    




z2GcmFSMTests.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      rH   )r
   r   r   r   r    r`   r   rR   r3   r#   ra   )r$   r%   Z	first_macr4   r   r   r   $test_valid_multiple_digest_or_verify  s    z0GcmFSMTests.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   rI   rO   r#   )r$   r%   r'   rK   r&   r   r   r   0test_valid_encrypt_and_digest_decrypt_and_verify  s    z<GcmFSMTests.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)r>   )r"   r!   )TFr   )
r
   r   r   r   r    r`   r   r?   r,   r-   )r$   Zmethod1_nameZmethod2_nameZassoc_data_presentr%   r   r   r   #test_invalid_mixing_encrypt_decrypt  s    z/GcmFSMTests.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!   r`   r   )r
   r   r   r   r    r!   r   rR   r,   r-   r?   rI   )r$   r   r%   r   r   r   +test_invalid_encrypt_or_update_after_digest  s    z7GcmFSMTests.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"   r`   )r
   r   r   r   r    r!   r   rR   r"   ra   r,   r-   r?   rO   )r$   r%   r'   rK   r   r   r   r   +test_invalid_decrypt_or_update_after_verify  s    

z7GcmFSMTests.test_invalid_decrypt_or_update_after_verifyN)rz   r{   r|   r   r   r    r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r}   t  s   


r}   c                   @   sN   e Zd ZdZdddddddd	d
dddddddddgZdd eD Zdd ZdS )TestVectorszClass exercising the GCM test vectors found in
       http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-revised-spec.pdf) r   r   Z 58e2fccefa7e3061367f1d57a4e7455a 00000000000000000000000000000000000000000000000000000000)r   r   Z 0388dace60b6a392f328c2b971b2fe78Z ab6e47d42cec13bdf53a67b21257bddfr   r   )r   ڀd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255Z42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985Z 4d5c2af327cd64a62cf35abd2ba6fab4 feffe9928665731c6d6a8f9467308308cafebabefacedbaddecaf888)(feedfacedeadbeeffeedfacedeadbeefabaddad2xd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39Zx42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091Z 5bc94fbc3221a5db94fae95ae7121a47r   r   )r   r   Zx61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598Z 3612d2e79e3b0785561be14aaca2fccbr   cafebabefacedbad)r   r   Zx8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5Z 619cc5aefffe0bfa462af43c1699d050r   x9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b)r   r   r   Z cd33b28ac773f74ba00ed1f3125724350000000000000000000000000000000000000000000000000r   )r   r   Z 98e7247c07f0fe411c267e4384b0f600Z 2ff58d80033927ab8ef4d4587514f0fbr   r   )r   r   Z3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256Z 9924a7c8587336bfb118024db8674a140feffe9928665731c6d6a8f9467308308feffe9928665731cr   )r   r   Zx3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710Z 2519498e80f1478f37ba55bd6d27618cr   r   )r   r   Zx0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7Z 65dcc57fcf623a24094fcca40d3533f8r   r   )r   r   Zxd27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373bZ dcf566ff291c25bbb8568fc3d376a6d9r   r   )r   r   r   Z 530f8afbc74536b9a963b4f1c4cb738b@0000000000000000000000000000000000000000000000000000000000000000r   )r   r   Z cea7403d4d606b6e074ec5d3baf39d18Z d0d1c8a799996bf0265b98b5d48ab919r   r   )r   r   Z522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015adZ b094dac5d93471bdec1a502270e3cc6c@feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308r   )r   r   Zx522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662Z 76fc6ece0f4e1768cddf8853bb2d551br   r   )r   r   Zxc3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1fZ 3a337dbf46a792c45e454913fe2ea8f2r   r   )r   r   Zx5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3fZ a44a8266ee1c8eb0c8b5d4cf5ae9f19ar   r   c                 C   s   g | ]}d d |D qS )c                 S   s   g | ]}t |qS r   r   )rU   r4   r   r   r   rY     s     z!TestVectors.<listcomp>.<listcomp>r   )rU   tvr   r   r   rY     s     zTestVectors.<listcomp>c                 C   s   | j D ]\}}}}}}tj|tj|t|d}|| ||\}}	| || | ||	 tj|tj|t|d}|| |||}
| ||
 qd S )N)rF   )	test_vectorsr
   r   r   r9   r`   rI   r#   rO   )r$   Z
assoc_datar&   r'   rK   keyr   r%   rd   Zmac2r(   r   r   r   runTest  s    

zTestVectors.runTestN)rz   r{   r|   __doc__Ztest_vectors_hexr   r   r   r   r   r   r   	  s0   





	

  1r   c                   @   s    e Zd ZdZdd Zdd ZdS )TestVectorsGueronKrasnovzClass exercising the GCM test vectors found in
       'The fragility of AES-GCM authentication algorithm', Gueron, Krasnov
       https://eprint.iacr.org/2013/157.pdfc                 C   sJ   t d}t d}t d}t d}t|tj||}| ||  d S )NZ 3da6c536d6295579c0959a7043efb503Z2b926197d34e091ef722db94Z00000000000000000000000000000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3fZ 69dd586555ce3fcc89663801a71d957b)r   r
   r   r   r`   r#   rR   )r$   r   ivaadrR   r%   r   r   r   test_1  s    zTestVectorsGueronKrasnov.test_1c           
      C   sp   t d}t d}t d}t d}t d}t d}t|tj||}||\}}	| || | ||	 d S )NZ 843ffcf5d2b72694d19ed01d01249412Zdbcca32ebf9b804617c3aa9eZ@00000000000000000000000000000000101112131415161718191a1b1c1d1e1fZ000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4fZ6268c6fa2a80b2d137467f092f657ac04d89be2beaa623d61b5a868c8f03ff95d3dcee23ad2f1ab3a6c80eaf4b140eb05de3457f0fbc111a6b43d0763aa422a3013cf1dc37fe417d1fbfc449b75d4cc5Z 3b629ccfbc1119b7319e1dce2cd6fd6d)r   r
   r   r   r`   rI   r#   )
r$   r   r   r   r&   r'   rR   r%   rd   Zdigest2r   r   r   test_2  s    zTestVectorsGueronKrasnov.test_2N)rz   r{   r|   r   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )NISTTestVectorsGCMc                 C   s   d| _ tj| | d S )NT	use_clmulunittestTestCase__init__r$   ar   r   r   r     s    zNISTTestVectorsGCM.__init__Nrz   r{   r|   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )NISTTestVectorsGCM_no_clmulc                 C   s   d| _ tj| | d S )NFr   r   r   r   r   r   
  s    z$NISTTestVectorsGCM_no_clmul.__init__Nr   r   r   r   r   r     s   r   )Cipherr
   zgcmDecrypt128.rspzGCM decryptcountc                 C   s   t | S Nintr4   r   r   r   <lambda>  r0   r   zgcmEncryptExtIV128.rspzGCM encryptc                 C   s   t | S r   r   r   r   r   r   r     r0   c                 C   sz   |j | _tj|jtj|jt|j| j	d}|
|j d|jkrX| t|j|j|j n||j|j}| ||j d S )N)r   rF   r   FAIL)descdescriptionr
   r   r   r   r   r9   r   r   r`   r   Zothersr,   r2   rO   r'   r#   r&   )r$   r   r%   r&   r   r   r   single_test!  s     

 r   ztest_%dc                   @   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                 K   s"   t j|  || _|| _d| _d S )NNone)r   r   r   _wycheproof_warnings_extra_params_id)r$   wycheproof_warningsextra_paramsr   r   r   r   4  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)r   Z
wycheproofzaes_gcm_test.jsonzWycheproof GCMtag_size)Z	group_tag)r   r   )r$   r   r   r   r   setUp:  s    zTestVectorsWycheproof.setUpc                 C   s   | j S r   )r   r.   r   r   r   shortDescriptionD  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   G  s    zTestVectorsWycheproof.warnc              
   C   s   dt |j | _z(tj|jtj|jfd|ji| j	}W nJ t
k
r } z,t|jdkrndt |krnW Y d S |W 5 d }~X Y nX ||j ||j\}}|jr| ||j | ||j | | d S )NzWycheproof Encrypt GCM Test #rF   r   Nonce cannot be empty)stridr   r
   r   r   r   r   r   r   r2   r9   r`   r   rI   msgvalidr#   r'   r   r   )r$   r   r%   er'   r   r   r   r   test_encryptL  s    

z"TestVectorsWycheproof.test_encryptc              
   C   s   dt |j | _z(tj|jtj|jfd|ji| j	}W nJ t
k
r } z,t|jdkrndt |krnW Y d S |W 5 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 GCM Test #rF   r   r   )r   r   r   r
   r   r   r   r   r   r   r2   r9   r`   r   rO   r'   r   r   AssertionErrorr#   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fd|j
i| j}||j t|jdt|jd  d }| t|j||j d S )Nz%Wycheproof Corrupt Decrypt GCM Test #r   r1   rF          )r   r   r   r9   r   r'   r
   r   r   r   r   r   r`   r   r   r,   r2   rO   r   )r$   r   r%   Z
ct_corruptr   r   r   test_corrupt_decrypts  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)rz   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   2  s   

r   c                   @   s   e Zd Zdd Zdd ZdS )TestVariableLengthc                 K   s   t j|  || _d S r   )r   r   r   r   )r$   r   r   r   r   r     s    zTestVariableLength.__init__c           	      C   s   d}t  }tdD ]^}d|d}t|| }tj|tjfd|i| j}|	|\}}|
| |
| q| | d d S )Ns   0000000000000000   z{0:04d}zutf-8r   Z@7b7eb1ffbe67a2e53a912067c0ec8e62ebc7ce4d83490ea7426941349811bdf4)r   r   r3   formatencoder	   r
   r   r   rI   r`   r#   rQ   )	r$   r   hr   r   r   r%   r'   r   r   r   r   r     s    
zTestVariableLength.runTestN)rz   r{   r|   r   r   r   r   r   r   r     s   r   c                 C   s   ddl m} | d}g }|tt7 }|tt7 }|t g7 }|t|g7 }|tt7 }|t	 g7 }| drz|tt
7 }| r|t|ddg7 }|t	ddg7 }| dr|tt7 }ntd |S )Nr   )_cpu_featuresr   Z
slow_testsF)r   z%Skipping test of PCLMULDQD in AES GCM)ZCryptodome.Utilr   getr   r   r}   r   r   r   r   r   Z
have_clmulr   print)configr   r   testsr   r   r   	get_tests  s$    


r   __main__c                   C   s   t t  d S r   )r   Z	TestSuiter   r   r   r   r   suite  s    r   )ZdefaultTest)*
__future__r   r   binasciir   ZCryptodome.SelfTest.st_commonr   ZCryptodome.SelfTest.loaderr   r   ZCryptodome.Util.py3compatr   r	   ZCryptodome.Cipherr
   ZCryptodome.Hashr   r   rN   r   r   r   r   r}   r   r   r   r   Ztest_vectors_nist	enumerateidxr   
isinstancer   r   setattrr   r   r   rz   r   mainr   r   r   r   <module>   s^     D  O*

S
