U
    ÈZjœ‘  ã                   @   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�rÂd+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   úb/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/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 )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   )ÚCrypto.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 ]}| |¡ qäd}
|||ƒ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   )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 )ÚTestVectorsz‘Class 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�   Ú€d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255Z€42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985Z 4d5c2af327cd64a62cf35abd2ba6fab4Ú feffe9928665731c6d6a8f9467308308Úcafebabefacedbaddecaf888)Ú(feedfacedeadbeeffeedfacedeadbeefabaddad2Úxd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39Zx42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091Z 5bc94fbc3221a5db94fae95ae7121a47r”   r•   )r–   r—   Zx61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598Z 3612d2e79e3b0785561be14aaca2fccbr”   Úcafebabefacedbad)r–   r—   Zx8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5Z 619cc5aefffe0bfa462af43c1699d050r”   Úx9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b)r�   r�   r�   Z cd33b28ac773f74ba00ed1f312572435Ú0000000000000000000000000000000000000000000000000r’   )r�   r‘   Z 98e7247c07f0fe411c267e4384b0f600Z 2ff58d80033927ab8ef4d4587514f0fbrš   r’   )r�   r“   Z€3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256Z 9924a7c8587336bfb118024db8674a14Ú0feffe9928665731c6d6a8f9467308308feffe9928665731cr•   )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“   Z€522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015adZ 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 )ÚTestVectorsGueronKrasnovz¦Class 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2b926197d34e091ef722db94Z 00000000000000000000000000000000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3fZ 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@00000000000000000000000000000000101112131415161718191a1b1c1d1e1fZ 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4fZ 6268c6fa2a80b2d137467f092f657ac04d89be2beaa623d61b5a868c8f03ff95d3dcee23ad2f1ab3a6c80eaf4b140eb05de3457f0fbc111a6b43d0763aa422a3013cf1dc37fe417d1fbfc449b75d4cc5Z 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ª   Z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r¾t‚Y n$X |jsÎt‚|  ||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Crypto.UtilrÞ   Úgetr   r   r}   r�   r¼   r£   rÙ   r¨   Z
have_clmulr±   Úprint)ÚconfigrÞ   rÁ   Z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Crypto.SelfTest.st_commonr   ZCrypto.SelfTest.loaderr   r   ZCrypto.Util.py3compatr   r	   ZCrypto.Cipherr
   ZCrypto.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
