o
    Þý°jE  ã                   @   sÈ   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZ G d	d
„ d
ejƒZG dd„ dejƒZi fdd„Zedkrbdd„ Zejdd� dS dS )é    N)Ú	unhexlify)ÚHPKE)ÚDeserializeError)ÚECC)Úlist_test_cases)ÚDH)ÚSHA256ÚSHA384ÚSHA512c                   @   s¬   e Zd Zejdd�Zejdd�Zdddd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 )(Ú
HPKE_TestsÚp256©ÚcurveéA   éa   é…   é    é8   )r   Úp384Úp521Ú
curve25519Úcurve448c           
      C   s˜   t j|d�}|}tj| ¡ |d�}|  t|jƒ| j| ¡ |j	ddd�}tj|||jd�}|j
|dd�}|  d|¡ | 	d¡}| 
|¡}	|  d|	¡ d S )Nr   ©Úreceiver_keyÚaead_idó   ABCó   DEF©Ú	auth_data©r   r   Úencs   GHI)r   Úgenerater   ÚnewÚ
public_keyÚassertEqualÚlenr    ÚcurvesÚsealÚunseal)
Úselfr   r   Úkey1Ú	encryptorÚctÚ	decryptorÚptÚct2Úpt2© r1   ú™/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/SelfTest/Protocol/test_HPKE.pyÚ
round_trip   s    
ÿþ

zHPKE_Tests.round_tripc                 C   s,   | j  ¡ D ]}tjD ]}|  ||¡ q
qd S ©N)r&   Úkeysr   ÚAEADr3   )r)   r   r   r1   r1   r2   Útest_round_trip5   s
   
ÿÿzHPKE_Tests.test_round_tripc                 C   ó"   t jj}t j| j ¡ |dd� d S )N)ó   as    cccccccccccccccccccccccccccccccc)r   r   Úpsk©r   r6   Ú
AES128_GCMr"   r*   r#   ©r)   r   r1   r1   r2   Útest_psk:   ó
   
þzHPKE_Tests.test_pskc                 C   r8   )Ns   baba)r   r   Úinfor;   r=   r1   r1   r2   Ú	test_info@   r?   zHPKE_Tests.test_infoc                 C   sb   t jdd�}|  t¡�}tj| ¡ tjjd� W d   ƒ n1 s!w   Y  |  	dt
|jƒ¡ d S )NÚp224r   r   zUnsupported curve)r   r!   ÚassertRaisesÚ
ValueErrorr   r"   r#   r6   r<   ÚassertInÚstrÚ	exception©r)   Úkey3Úcmr1   r1   r2   Útest_neg_unsupported_curveF   s   
ÿÿz%HPKE_Tests.test_neg_unsupported_curvec                 C   sX   |   t¡�}tj| j| jtjjd� W d   ƒ n1 sw   Y  |  dt	|j
ƒ¡ d S )N©r   Ú
sender_keyr   zExactly 1 private key)rC   rD   r   r"   r*   Úkey2r6   r<   rE   rF   rG   ©r)   rJ   r1   r1   r2   Útest_neg_too_many_private_keysM   s   þÿz)HPKE_Tests.test_neg_too_many_private_keysc                 C   sf   t jdd�}|  t¡�}tj| j ¡ |tjj	d� W d   ƒ n1 s#w   Y  |  
dt|jƒ¡ d S )Nr   r   rL   zbut recipient key)r   r!   rC   rD   r   r"   r*   r#   r6   r<   rE   rF   rG   rH   r1   r1   r2   Útest_neg_curve_mismatchT   s   þÿz"HPKE_Tests.test_neg_curve_mismatchc                 C   sâ   |   t¡�}tj| j ¡ dtjjd� W d   ƒ n1 sw   Y  |   t¡�}tj| j ¡ dtjjd� W d   ƒ n1 s?w   Y  |   t¡�}tj| j ¡ dtjjd� W d   ƒ n1 saw   Y  |  dt	|j
ƒ¡ d S )N)ó    s    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG)r   r:   r   )ó   JJJrR   )rS   s   YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYzat least 32)rC   rD   r   r"   r*   r#   r6   r<   rE   rF   rG   rO   r1   r1   r2   Útest_neg_psk\   s&   þÿþÿþÿzHPKE_Tests.test_neg_pskc                 C   sü   d}|   t¡� tj| jtjj|d� W d   ƒ n1 sw   Y  |   t¡�}tj| j ¡ | j ¡ j	dd�tjjd� W d   ƒ n1 sFw   Y  |  
dt|jƒ¡ |   t¡�}tj| jtjjd� W d   ƒ n1 snw   Y  |  
dt|jƒ¡ d S )	NsA   ÿ8888888888888888888888888888888888888888888888888888888888888888r   Úraw©Úformat)r   r    r   z'enc' cannot be an inputr   z'enc' required)rC   r   r   r"   r*   r6   r<   rD   r#   Ú
export_keyrE   rF   rG   )r)   Ú	wrong_encrJ   r1   r1   r2   Útest_neg_wrong_encm   s(   þÿþÿÿÿzHPKE_Tests.test_neg_wrong_encc                 C   s^   t j| jt jj| j ¡ jdd�d�}|  t	¡� | 
d¡ W d   ƒ d S 1 s(w   Y  d S )NrU   rV   r   s<   XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZ)r   r"   r*   r6   ÚCHACHA20_POLY1305rN   r#   rX   rC   rD   r(   )r)   r-   r1   r1   r2   Útest_neg_unseal_wrong_ct   s   þ"ÿz#HPKE_Tests.test_neg_unseal_wrong_ctc                 C   sx   t jj}t j| j ¡ |d�}|jddd�}t j| j||jd�}|  t	¡� | 
|¡ W d   ƒ d S 1 s5w   Y  d S )Nr   r   r   r   r   )r   r6   r[   r"   r*   r#   r'   r    rC   rD   r(   )r)   r   r+   r,   r-   r1   r1   r2   Útest_neg_unseal_no_auth_data‡   s   ÿþ"ÿz'HPKE_Tests.test_neg_unseal_no_auth_datac                 C   sÄ   d}t  t |¡¡}d}t |¡}d}t |¡}d}t |¡}d}	t |	¡}
d}t |¡}d}t |¡}d}t |¡}tjj}tj||||d	�}| ||
¡}|  	||¡ | ||¡}|  	||¡ d S )
NÚ@4612c550263fc8ad58375df3f557aac531d26850903e55a9f23f21d8534e8ac8Ú:4265617574792069732074727574682c20747275746820626561757479ÚZf938558b5d72f1a23810b4be2ab4f84331acc02fc97babc53a52ae8218a355a96d8770ac83d07bea87e13c512aÚ@37fda3567bdbd628e88668c3c8d7e97d1d1253b6d4ea6d44c150f741f1bf4431Ú436f756e742d30Ú436f756e742d31Ú(4f6465206f6e2061204772656369616e2055726eÚZaf2d7e9ac9ae7e270f46ba1f975be53c09f8d875bdc8535458c2494e8a6eab251c03d0c22a56b8ca42c2063b84)r   r   r@   r    ©
r   Úimport_x25519_private_keyÚbytesÚfromhexr   r6   r<   r"   r(   r$   )r)   ÚkeyR_hexÚkeyRÚpt_hexr.   Úct0_hexÚct0Úenc_hexr    Úaad0_hexÚaad0Úaad1_hexÚaad1Úinfo_hexr@   Úct1_hexÚct1r   r-   Úpt_X0Úpt_X1r1   r1   r2   Útest_x25519_mode_0–   s4   






ýzHPKE_Tests.test_x25519_mode_0c                 C   sæ   d}t  t |¡¡}d}t |¡}d}t |¡}d}t |¡}d}	t |	¡}
d}t |¡}d}t |¡}d}t |¡}d	}t |¡}d
}t |¡}tjj}tj|||||f|d�}| |
|¡}|  	||¡ | ||¡}|  	||¡ d S )NÚ@c5eb01eb457fe6c6f57577c5413b931550a162c71a03ac8d196babbd4e5ce0fdÚ,456e6e796e20447572696e206172616e204d6f726961Ú@0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82r_   ÚZe52c6fed7f758d0cf7145689f21bc1be6ec9ea097fef4e959440012f4feb73fb611b946199e681f4cfc34db8eaÚ@0ad0950d9fb9588e59690b74f1237ecdf1d775cd60be2eca57af5a4b0471c91brb   rc   rd   ÚZ49f3b19b28a9ea9f43e8c71204c00d4a490ee7f61387b6719db765e948123b45b61633ef059ba22cd62437c8ba)r   r   r@   r:   r    rf   )r)   rj   rk   Ú
psk_id_hexÚpsk_idÚpsk_hexr:   rl   r.   rm   rn   ro   r    rp   rq   rr   rs   rt   r@   ru   rv   r   r-   rw   rx   r1   r1   r2   Útest_x25519_mode_1¾   s>   








üzHPKE_Tests.test_x25519_mode_1c                 C   sÞ   d}t  t |¡¡}d}t  t |¡¡}d}t |¡}d}t |¡}d}	t |	¡}
d}t |¡}d}t |¡}d}t |¡}d	}t |¡}tjj}tj|| ¡ |||
d
�}| 	||¡}|  
||¡ | 	||¡}|  
||¡ d S )NÚ@fdea67cf831f1ca98d8e27b1f6abeb5b7745e9d35348b80fa407ff6958f9137eÚ@dc4a146313cce60a278a5323d321f051c5707e9c45ba21a3479fecdf76fc69ddr_   ÚZ5fd92cc9d46dbf8943e72a07e42f363ed5f721212cd90bcfd072bfd9f44e06b80fd17824947496e21b680c141bÚ@23fb952571a14a25e3d678140cd0e5eb47a0961bb18afcf85896e5453c312e76rb   rc   rd   ÚZd3736bb256c19bfa93d79e8f80b7971262cb7c887e35c26370cfed62254369a1b52e3d505b79dd699f002bc8ed)r   rM   r   r@   r    ©r   rg   rh   ri   r   r6   r<   r"   r#   r(   r$   )r)   rj   rk   ÚkeyS_hexÚkeySrl   r.   rm   rn   ro   r    rp   rq   rr   rs   rt   r@   ru   rv   r   r-   rw   rx   r1   r1   r2   Útest_x25519_mode_2í   s:   






üzHPKE_Tests.test_x25519_mode_2c                 C   s   d}t  t |¡¡}d}t  t |¡¡}d}t |¡}d}t |¡}d}	t |	¡}
d}t |¡}d}t |¡}d}t |¡}d	}t |¡}d
}t |¡}d}t |¡}tjj}tj|| ¡ |||f||d�}| 	||¡}|  
||
¡ | 	||¡}|  
||
¡ d S )NÚ@cb29a95649dc5656c2d054c1aa0d3df0493155e9d5da6d7e344ed8b6a64a9423Ú@fc1c87d2f3832adb178b431fce2ac77c7ca2fd680f3406c77b5ecdf818b119f4r{   r|   r_   ÚZa84c64df1e11d8fd11450039d4fe64ff0c8a99fca0bd72c2d4c3e0400bc14a40f27e45e141a24001697737533eÚ@820818d3c23993492cc5623ab437a48a0a7ca3e9639c140fe1e33811eb844b7crb   rc   rd   ÚZ4d19303b848f424fc3c3beca249b2c6de0a34083b8e909b6aa4c3688505c05ffe0c8f57a0a4c5ab9da127435d9)r   rM   r   r:   r@   r    r‰   )r)   rj   rk   rŠ   r‹   r€   r�   r‚   r:   rl   r.   rm   rn   ro   r    rp   rq   rr   rs   rt   r@   ru   rv   r   r-   rw   rx   r1   r1   r2   Útest_x25519_mode_3  sD   








ûzHPKE_Tests.test_x25519_mode_3N)Ú__name__Ú
__module__Ú__qualname__r   r!   r*   rN   r&   r3   r7   r>   rA   rK   rP   rQ   rT   rZ   r\   r]   ry   rƒ   rŒ   r’   r1   r1   r1   r2   r      s0    û(/,r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚHPKE_TestVectorsc              	   C   s�   g | _ z4dd l}tj |j¡}tj |ddd¡}t|dƒ�}t 	|¡| _ W d   ƒ W d S 1 s0w   Y  W d S  t
tfyG   tdƒ Y d S w )Nr   ÚProtocolÚ
wycheproofzHPKE-test-vectors.jsonÚrzN
Warning: skipping extended tests for HPKE (install pycryptodome-test-vectors))ÚvectorsÚpycryptodome_test_vectorsÚosÚpathÚdirnameÚ__file__ÚjoinÚopenÚjsonÚloadÚFileNotFoundErrorÚImportErrorÚprint)r)   r›   Úinit_dirÚfull_file_nameÚfr1   r1   r2   ÚsetUpO  s   &ÿÿzHPKE_TestVectors.setUpc                 C   s�   t |ƒ}|dkrtjdtj|dd�d�S |dkr$tjdtj|dd�d�S |dkr4tjd	tj|dd�d�S |d
kr=t |¡S |dkrFt |¡S d S )Né   r   Úbig)Ú	byteorder)r   Údé   r   é   r   r   é!   )r   r   Ú	constructÚintÚ
from_bytesr   rg   Úimport_x448_private_key)r)   Úkey_hexÚkem_idÚkey_binr1   r1   r2   Úimport_private_keyZ  s$   
ÿ
ÿ
ÿ

ÿz#HPKE_TestVectors.import_private_keyc              	   C   s0  | j s|  d¡ t| j ƒD ]ˆ\}}|d }|d }|d }|dkr"qtttttdœ}| ||f¡}|du r6q| j|||d��H |  |d	 |¡ 	¡ }d}	d
|v rW|  |d
 |¡}	|  |d |¡}
t
j ||||	|
¡\}}|  | ¡ |d ¡ |  |t|d ƒ¡ W d  ƒ n1 s‰w   Y  tdddd� qdS )z+Test HPKE encapsulation using test vectors.úNo test vectors availabler·   Úkdf_idr   éÿÿ  ©)r«   é   )r¯   é   )r°   é   )r   r¾   )r±   rÀ   N©Úidxr·   r   ÚskRmÚskSmÚskEmr    Úshared_secretÚ.Ú T©ÚendÚflush)rš   ÚskipTestÚ	enumerater   r	   r
   ÚgetÚsubTestr¹   r#   r   ÚHPKE_CipherÚ_encapr$   Úhexr   r¦   )r)   rÂ   Úvectorr·   r»   r   Úsupported_combiÚhashmodÚreceiver_pubÚsender_privÚ	encap_keyrÆ   r    r1   r1   r2   Útest_hpke_encapj  sT   
û
ÿÿ
ÿü
ÿîÕz HPKE_TestVectors.test_hpke_encapc                 C   sn  | j s|  d¡ t| j ƒD ]§\}}|d }|d }|d }|dkr"qd}||f|vr+q| j|||d��r |  |d |¡}d	}d
|v rN|  |d
 |¡}	|	 ¡ }t|d ƒ}
d	}d|v rft|d ƒt|d ƒf}tj|t 	|¡|
||t|d ƒd�}|d D ]!}t|d ƒ}t|d ƒ}t|d ƒ}| 
||¡}|  ||d¡ q|W d	  ƒ n1 s¨w   Y  tdddd� qd	S )z7Test HPKE encryption and decryption using test vectors.rº   r·   r»   r   r¼   r½   rÁ   rÃ   NrÄ   r    r�   r:   r@   )r   r   r    rM   r:   r@   Úencryptionsr.   r,   ÚaadzDecryption failedrÇ   rÈ   TrÉ   )rš   rÌ   rÍ   rÏ   r¹   r#   r   r   r"   r6   r(   r$   r¦   )r)   rÂ   rÓ   r·   r»   r   rÔ   Úreceiver_privÚ
sender_pubr×   rØ   r:   Úreceiver_hpkeÚ
encryptionÚ	plaintextÚ
ciphertextrÛ   Ú	decryptedr1   r1   r2   Útest_hpke_unseal�  sT   

ÿ
ÿ
ûøè"Éz!HPKE_TestVectors.test_hpke_unsealN)r“   r”   r•   rª   r¹   rÙ   rã   r1   r1   r1   r2   r–   M  s
    3r–   c                 C   s*   g }|t tƒ7 }|  d¡r|t tƒ7 }|S )NÚ
slow_tests)r   r   rÎ   r–   )ÚconfigÚtestsr1   r1   r2   Ú	get_testsÝ  s
   
rç   Ú__main__c                   C   s   t  tƒ ¡S r4   )ÚunittestÚ	TestSuiterç   r1   r1   r1   r2   Úsuiteé  s   rë   )ÚdefaultTest)rœ   r¢   ré   Úbinasciir   ÚCryptodome.Protocolr   ÚCryptodome.Protocol.HPKEr   ÚCryptodome.PublicKeyr   ÚCryptodome.SelfTest.st_commonr   r   ÚCryptodome.Hashr   r	   r
   ÚTestCaser   r–   rç   r“   rë   Úmainr1   r1   r1   r2   Ú<module>   s(      ? ý