o
    Þý°j¼‘  ã                   @   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 ] \ZZe ee!ƒrž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 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   ú–/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/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 )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   )ÚCryptodome.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 )Ú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ª   Ú 58e2fccefa7e3061367f1d57a4e7455aÚ 00000000000000000000000000000000Ú000000000000000000000000)rª   r¬   Ú 0388dace60b6a392f328c2b971b2fe78Ú ab6e47d42cec13bdf53a67b21257bddfr¬   r­   )rª   Ú€d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255Ú€42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985Ú 4d5c2af327cd64a62cf35abd2ba6fab4Ú feffe9928665731c6d6a8f9467308308Úcafebabefacedbaddecaf888)Ú(feedfacedeadbeeffeedfacedeadbeefabaddad2Úxd9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39Úx42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091Ú 5bc94fbc3221a5db94fae95ae7121a47r³   r´   )rµ   r¶   Úx61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598Ú 3612d2e79e3b0785561be14aaca2fccbr³   Úcafebabefacedbad)rµ   r¶   Úx8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5Ú 619cc5aefffe0bfa462af43c1699d050r³   Úx9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b)rª   rª   rª   Ú cd33b28ac773f74ba00ed1f312572435Ú0000000000000000000000000000000000000000000000000r­   )rª   r¬   Ú 98e7247c07f0fe411c267e4384b0f600Ú 2ff58d80033927ab8ef4d4587514f0fbrÀ   r­   )rª   r°   Ú€3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256Ú 9924a7c8587336bfb118024db8674a14Ú0feffe9928665731c6d6a8f9467308308feffe9928665731cr´   )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 )Ú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 )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)ÚCryptodome.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   ÚCryptodome.SelfTest.st_commonr   ÚCryptodome.SelfTest.loaderr   r   ÚCryptodome.Util.py3compatr   r	   ÚCryptodome.Cipherr
   ÚCryptodome.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ý