o
    5h                     @   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pg Zeeddddd d ipg 7 ZeeD ] \ZZe ee!rqefd!d"Z"e#ed#e e" e#ed#e e" qG 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 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   s/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/Crypto/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 )N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   lenassertNotEqual)r$   r%   nonce1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   	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 ]}t j| jt j| jd}t||d}| |d qd S )Nr!   r"   r   r1   )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   r1   )	r
   r   r   r   r    r!   r-   r.   r"   r8   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"   r8   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|| q#tj| jtj| jd}|| j	\}}| 
t|d d S )N   )r   mac_len      r   r   )r-   r3   r
   r   r   r   r    r4   encrypt_and_digestr   r#   r:   )r$   rK   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   r2   )Crypto.Util.strxorrR   r
   r   r   r   r    rN   r   r-   r3   decrypt_and_verify)r$   rR   r%   r'   rP   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   	hexverify)r$   r%   mac_hexr   r   r   test_hex_mac   s
   zGcmTests.test_hex_macc                 C   s8  t dd}t dd}tj| jtj| jd}|| ||\}}dd }dD ]6}tj| jtj| jd}|||D ]}|| q9d}	|||D ]	}|	||7 }	qH| 	||	 |
| q'dD ]9}tj| jtj| jd}|||D ]}|| qrd}
|||D ]	}|
||7 }
q| 	||
 | 	| | q`d 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   )r4   r:   )r   r`   r   r_   r   break_up   s   z.GcmTests.test_message_chunks.<locals>.break_up)
r2      rJ   r?   
      r   (   P   r   r1   )r   r
   r   r   r   r    updaterN   r"   r#   verifyr!   rX   )r$   	auth_datar   r%   
ciphertextref_macrb   r`   chunkr(   ct2r   r   r   test_message_chunks   s2   


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   rJ   )	bytearrayr   r    r   r
   r   r   rh   r!   rX   r#   r   rT   )r$   key_banonce_ba	header_ba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 rp   )
memoryviewrq   r   r    r   r
   r   r   rh   r!   rX   r#   r   rT   )r$   key_mvnonce_mv	header_mvdata_mvrv   r'   r   rw   rx   ry   rz   r{   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!   rX   rq   r#   r"   rN   rT   )r$   r&   r%   r'   r   r   res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 r   )
r
   r   r   r   r    r!   r}   rq   r#   r"   )r$   r&   r%   r'   r   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      0r   r2   )r
   r   r   r   r    r!   r-   r.   r"   rq   r3   )r$   LEN_PTr&   r%   r'   shorter_outputr   r   r   test_output_param_neg`  s   
zGcmTests.test_output_param_negN)__name__
__module____qualname__r   r   r    r   r)   r+   r0   r6   r9   r>   rB   rG   rH   rI   rQ   rV   r[   ro   r|   r   r   r   r   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   rX   r"   ri   r$   r%   r'   rP   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    rh   r   rX   ri   r$   r%   rP   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    rh   r   r!   rX   r"   ri   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    rX   r8   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    rX   ri   r   r   r   r   test_valid_init_verify  s   z"GcmFSMTests.test_valid_init_verifyc                 C   s   dD ]G}d d| j | j d fD ]:}|d u rd }nt|}tj| jtj| jd}|d ur/|| t||}|| j  || j  || j  || j  qqd S )NrC   s   333   3r   )	r   r:   r
   r   r   r   r    rh   rD   )r$   method_namerj   	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 ]
}| 	||  qt j| jt j| jd}|| j tdD ]}|
| q9d S )Nr      rM   )r
   r   r   r   r    rh   r   rX   r4   r#   ri   )r$   r%   	first_macr5   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    rh   r   rN   rT   r#   )r$   r%   r'   rP   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 ](}t j| jt j| jd}|r|| j t||| j | t	t||| j qqd S )N)rC   )r"   r!   )TFr   )
r
   r   r   r   r    rh   r   rD   r-   r.   )r$   method1_namemethod2_nameassoc_data_presentr%   r   r   r   #test_invalid_mixing_encrypt_decrypt  s   z/GcmFSMTests.test_invalid_mixing_encrypt_decryptc                 C   sp   dD ]3}t j| jt j| jd}|| j |  | t	t
||| j t j| jt j| jd}|| j qd S )N)r!   rh   r   )r
   r   r   r   r    r!   r   rX   r-   r.   rD   rN   )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"   rh   )r
   r   r   r   r    r!   r   rX   r"   ri   r-   r.   rD   rT   )r$   r%   r'   rP   r   r   r   r   +test_invalid_decrypt_or_update_after_verify  s    

z7GcmFSMTests.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   t  s    


r   c                   @   s.   e Zd ZdZg d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    58e2fccefa7e3061367f1d57a4e7455a 00000000000000000000000000000000000000000000000000000000)r   r    0388dace60b6a392f328c2b971b2fe78 ab6e47d42cec13bdf53a67b21257bddfr   r   )r   ڀd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255ڀ42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985 4d5c2af327cd64a62cf35abd2ba6fab4 feffe9928665731c6d6a8f9467308308cafebabefacedbaddecaf888)(feedfacedeadbeeffeedfacedeadbeefabaddad2xd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39x42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091 5bc94fbc3221a5db94fae95ae7121a47r   r   )r   r   x61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598 3612d2e79e3b0785561be14aaca2fccbr   cafebabefacedbad)r   r   x8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5 619cc5aefffe0bfa462af43c1699d050r   x9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b)r   r   r    cd33b28ac773f74ba00ed1f3125724350000000000000000000000000000000000000000000000000r   )r   r    98e7247c07f0fe411c267e4384b0f600 2ff58d80033927ab8ef4d4587514f0fbr   r   )r   r   ڀ3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256 9924a7c8587336bfb118024db8674a140feffe9928665731c6d6a8f9467308308feffe9928665731cr   )r   r   x3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710 2519498e80f1478f37ba55bd6d27618cr   r   )r   r   x0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7 65dcc57fcf623a24094fcca40d3533f8r   r   )r   r   xd27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b dcf566ff291c25bbb8568fc3d376a6d9r   r   )r   r   r    530f8afbc74536b9a963b4f1c4cb738b@0000000000000000000000000000000000000000000000000000000000000000r   )r   r    cea7403d4d606b6e074ec5d3baf39d18 d0d1c8a799996bf0265b98b5d48ab919r   r   )r   r   ڀ522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad b094dac5d93471bdec1a502270e3cc6c@feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308r   )r   r   x522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662 76fc6ece0f4e1768cddf8853bb2d551br   r   )r   r   xc3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f 3a337dbf46a792c45e454913fe2ea8f2r   r   )r   r   x5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f a44a8266ee1c8eb0c8b5d4cf5ae9f19ar   r   c                 C   s   g | ]	}d d |D qS )c                 S   s   g | ]}t |qS r   r   )r]   r5   r   r   r   ra     s    z!TestVectors.<listcomp>.<listcomp>r   )r]   tvr   r   r   ra     s    zTestVectors.<listcomp>c                 C   s   | j D ]I\}}}}}}tj|tj|t|d}|| ||\}}	| || | ||	 tj|tj|t|d}|| |||}
| ||
 qd S )N)rK   )	test_vectorsr
   r   r   r:   rh   rN   r#   rT   )r$   
assoc_datar&   r'   rP   keyr   r%   rn   mac2r(   r   r   r   runTest  s   

zTestVectors.runTestN)r   r   r   __doc__test_vectors_hexr   r   r   r   r   r   r   	  s    
 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 )N 3da6c536d6295579c0959a7043efb5032b926197d34e091ef722db94ڠ00000000000000000000000000000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f 69dd586555ce3fcc89663801a71d957b)r   r
   r   r   rh   r#   rX   )r$   r   ivaadrX   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 )N 843ffcf5d2b72694d19ed01d01249412dbcca32ebf9b804617c3aa9e@00000000000000000000000000000000101112131415161718191a1b1c1d1e1fڠ000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4fڠ6268c6fa2a80b2d137467f092f657ac04d89be2beaa623d61b5a868c8f03ff95d3dcee23ad2f1ab3a6c80eaf4b140eb05de3457f0fbc111a6b43d0763aa422a3013cf1dc37fe417d1fbfc449b75d4cc5 3b629ccfbc1119b7319e1dce2cd6fd6d)r   r
   r   r   rh   rN   r#   )
r$   r   r   r   r&   r'   rX   r%   rn   digest2r   r   r   test_2  s   zTestVectorsGueronKrasnov.test_2N)r   r   r   r   r   r   r   r   r   r   r     s    r   c                   @      e Zd Zdd ZdS )NISTTestVectorsGCMc                 C      d| _ tj| | d S )NT	use_clmulunittestTestCase__init__r$   ar   r   r   r        zNISTTestVectorsGCM.__init__Nr   r   r   r   r   r   r   r   r         r   c                   @   r   )NISTTestVectorsGCM_no_clmulc                 C   r   )NFr   r   r   r   r   r   
  r   z$NISTTestVectorsGCM_no_clmul.__init__Nr   r   r   r   r   r     r   r   )Cipherr
   zgcmDecrypt128.rspzGCM decryptcountc                 C      t | S Nintr5   r   r   r   <lambda>      r  zgcmEncryptExtIV128.rspzGCM encryptc                 C   r  r  r  r  r   r   r   r    r  c                 C   s|   |j | _tj|jtj|jt|j| j	d}|
|j d|jv r-| t|j|j|j d S ||j|j}| ||j d S )N)r   rK   r   FAIL)descdescriptionr
   r   r   r   r   r:   r   r   rh   r   othersr-   r3   rT   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 )NtagSize   r   )groupr   r   r   
filter_tag<  s   z/TestVectorsWycheproof.setUp.<locals>.filter_tag)r   
wycheproofzaes_gcm_test.jsonzWycheproof GCMtag_size)	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   s6   |j r| jrdd l}|d| j|jf  d S d S 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 n" t
y> } zt|jdkr8dt |v r8W Y d }~d S |d }~ww ||j ||j\}}|jre| ||j | ||j | | d S d S )NzWycheproof Encrypt GCM Test #rK   r   Nonce cannot be empty)stridr  r
   r   r   r   r   r  r  r3   r:   rh   r   rN   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 n" t
y> } zt|jdkr8dt |v r8W Y d }~d S |d }~ww ||j z
||j|j}W n t
y^   |jr[J Y d S w |jsdJ | ||j | | d S )NzWycheproof Decrypt GCM Test #rK   r   r!  )r"  r#  r  r
   r   r   r   r   r  r  r3   r:   rh   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 rd 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   r2   rK          )r"  r#  r  r:   r   r'   r
   r   r   r   r  r  rh   r   r   r-   r3   rT   r   )r$   r   r%   
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)r   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   @7b7eb1ffbe67a2e53a912067c0ec8e62ebc7ce4d83490ea7426941349811bdf4)r   r   r4   formatencoder	   r
   r   r  rN   rh   r#   rW   )	r$   r   hr   r   r   r%   r'   r   r   r   r   r     s   
zTestVariableLength.runTestN)r   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r=|tt
7 }| r_|t|ddg7 }|t	ddg7 }| dr]|tt7 }|S td |S )Nr   )_cpu_featuresr  
slow_testsF)r   z%Skipping test of PCLMULDQD in AES GCM)Crypto.Utilr3  getr   r   r   r   r  r   r-  r   
have_clmulr   print)configr3  r  testsr   r   r   	get_tests  s&   


r;  __main__c                   C   s   t t  d S r  )r   	TestSuiter;  r   r   r   r   suite  s   r>  )defaultTest)*
__future__r   r   binasciir   Crypto.SelfTest.st_commonr   Crypto.SelfTest.loaderr   r   Crypto.Util.py3compatr   r	   Crypto.Cipherr
   Crypto.Hashr   r   rS   r   r   r   r   r   r   r   r   r   test_vectors_nist	enumerateidxr   
isinstancer"  r  setattrr  r-  r;  r   r>  mainr   r   r   r   <module>   sb     D  O*


S