U
    Š¾úg%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edkr¨e ¡  i fdd„ZedkrÐdd„ Zejdd 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Úp521Z
curve25519Z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©Z	auth_data©r   r   Úencs   GHI)r   Úgenerater   ÚnewÚ
public_keyÚassertEqualÚlenr   ÚcurvesÚsealÚunseal)
Úselfr   r   Úkey1Ú	encryptorÚctÚ	decryptorÚptZct2Zpt2© r,   úJ/tmp/pip-unpacked-wheel-_q8s9isk/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   ÚAEADr.   )r&   r   r   r,   r,   r-   Útest_round_trip5   s    
zHPKE_Tests.test_round_tripc                 C   s"   t jj}t j| j ¡ |dd d S )N)ó   as    cccccccccccccccccccccccccccccccc)r   r   Úpsk©r   r1   Ú
AES128_GCMr   r'   r    ©r&   r   r,   r,   r-   Útest_psk:   s
    þzHPKE_Tests.test_pskc                 C   s"   t jj}t j| j ¡ |dd d S )Ns   baba)r   r   Úinfor5   r7   r,   r,   r-   Ú	test_info@   s
    þzHPKE_Tests.test_infoc              	   C   sN   t jdd}|  t¡}tj| ¡ tjjd W 5 Q R X |  	dt
|jƒ¡ d S )NZp224r   r   zUnsupported curve)r   r   ÚassertRaisesÚ
ValueErrorr   r   r    r1   r6   ÚassertInÚstrÚ	exception©r&   Zkey3Úcmr,   r,   r-   Útest_neg_unsupported_curveF   s    
ÿz%HPKE_Tests.test_neg_unsupported_curvec              	   C   sD   |   t¡}tj| j| jtjjd W 5 Q R X |  dt	|j
ƒ¡ d S )N©r   Ú
sender_keyr   zExactly 1 private key)r;   r<   r   r   r'   Úkey2r1   r6   r=   r>   r?   ©r&   rA   r,   r,   r-   Útest_neg_too_many_private_keysM   s    þz)HPKE_Tests.test_neg_too_many_private_keysc              	   C   sR   t jdd}|  t¡ }tj| j ¡ |tjj	d W 5 Q R X |  
dt|jƒ¡ d S )Nr   r   rC   zbut recipient key)r   r   r;   r<   r   r   r'   r    r1   r6   r=   r>   r?   r@   r,   r,   r-   Útest_neg_curve_mismatchT   s    þz"HPKE_Tests.test_neg_curve_mismatchc              	   C   s¦   |   t¡ }tj| j ¡ dtjjd W 5 Q R X |   t¡ }tj| j ¡ dtjjd W 5 Q R X |   t¡ }tj| j ¡ dtjjd W 5 Q R X |  dt	|j
ƒ¡ d S )N)ó    s    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG)r   r4   r   )ó   JJJrI   )rJ   s   YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYzat least 32)r;   r<   r   r   r'   r    r1   r6   r=   r>   r?   rF   r,   r,   r-   Útest_neg_psk\   s     þþþzHPKE_Tests.test_neg_pskc              	   C   sÀ   d}|   t¡ tj| jtjj|d W 5 Q R X |   t¡.}tj| j ¡ | j ¡ j	ddtjjd W 5 Q R X |  
dt|jƒ¡ |   t¡}tj| jtjjd W 5 Q R X |  
dt|jƒ¡ d S )	NsA   ÿ8888888888888888888888888888888888888888888888888888888888888888r   Úraw©Úformat)r   r   r   z'enc' cannot be an inputr   z'enc' required)r;   r   r   r   r'   r1   r6   r<   r    Ú
export_keyr=   r>   r?   )r&   Z	wrong_encrA   r,   r,   r-   Útest_neg_wrong_encm   s"    þþÿzHPKE_Tests.test_neg_wrong_encc              	   C   sH   t j| jt jj| j ¡ jddd}|  t	¡ | 
d¡ W 5 Q R X d S )NrL   rM   r   s<   XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZ)r   r   r'   r1   ÚCHACHA20_POLY1305rE   r    rO   r;   r<   r%   )r&   r*   r,   r,   r-   Útest_neg_unseal_wrong_ct   s    þz#HPKE_Tests.test_neg_unseal_wrong_ctc              	   C   sb   t jj}t j| j ¡ |d}|jddd}t j| j||jd}|  t	¡ | 
|¡ W 5 Q R X d S )Nr   r   r   r   r   )r   r1   rQ   r   r'   r    r$   r   r;   r<   r%   )r&   r   r(   r)   r*   r,   r,   r-   Ú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 )
NZ@4612c550263fc8ad58375df3f557aac531d26850903e55a9f23f21d8534e8ac8Ú:4265617574792069732074727574682c20747275746820626561757479ZZf938558b5d72f1a23810b4be2ab4f84331acc02fc97babc53a52ae8218a355a96d8770ac83d07bea87e13c512aZ@37fda3567bdbd628e88668c3c8d7e97d1d1253b6d4ea6d44c150f741f1bf4431Ú436f756e742d30Ú436f756e742d31Ú(4f6465206f6e2061204772656369616e2055726eZZaf2d7e9ac9ae7e270f46ba1f975be53c09f8d875bdc8535458c2494e8a6eab251c03d0c22a56b8ca42c2063b84)r   r   r9   r   ©
r   Úimport_x25519_private_keyÚbytesÚfromhexr   r1   r6   r   r%   r!   )r&   ÚkeyR_hexÚkeyRÚpt_hexr+   Úct0_hexÚct0Úenc_hexr   Úaad0_hexÚaad0Úaad1_hexÚaad1Úinfo_hexr9   Úct1_hexÚct1r   r*   Úpt_X0Úpt_X1r,   r,   r-   Ú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 )NZ@c5eb01eb457fe6c6f57577c5413b931550a162c71a03ac8d196babbd4e5ce0fdÚ,456e6e796e20447572696e206172616e204d6f726961Ú@0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82rT   ZZe52c6fed7f758d0cf7145689f21bc1be6ec9ea097fef4e959440012f4feb73fb611b946199e681f4cfc34db8eaZ@0ad0950d9fb9588e59690b74f1237ecdf1d775cd60be2eca57af5a4b0471c91brU   rV   rW   ZZ49f3b19b28a9ea9f43e8c71204c00d4a490ee7f61387b6719db765e948123b45b61633ef059ba22cd62437c8ba)r   r   r9   r4   r   rX   )r&   r\   r]   Ú
psk_id_hexÚpsk_idÚpsk_hexr4   r^   r+   r_   r`   ra   r   rb   rc   rd   re   rf   r9   rg   rh   r   r*   ri   rj   r,   r,   r-   Ú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 )NZ@fdea67cf831f1ca98d8e27b1f6abeb5b7745e9d35348b80fa407ff6958f9137eZ@dc4a146313cce60a278a5323d321f051c5707e9c45ba21a3479fecdf76fc69ddrT   ZZ5fd92cc9d46dbf8943e72a07e42f363ed5f721212cd90bcfd072bfd9f44e06b80fd17824947496e21b680c141bZ@23fb952571a14a25e3d678140cd0e5eb47a0961bb18afcf85896e5453c312e76rU   rV   rW   ZZd3736bb256c19bfa93d79e8f80b7971262cb7c887e35c26370cfed62254369a1b52e3d505b79dd699f002bc8ed)r   rD   r   r9   r   ©r   rY   rZ   r[   r   r1   r6   r   r    r%   r!   )r&   r\   r]   ÚkeyS_hexÚkeySr^   r+   r_   r`   ra   r   rb   rc   rd   re   rf   r9   rg   rh   r   r*   ri   rj   r,   r,   r-   Ú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 )NZ@cb29a95649dc5656c2d054c1aa0d3df0493155e9d5da6d7e344ed8b6a64a9423Z@fc1c87d2f3832adb178b431fce2ac77c7ca2fd680f3406c77b5ecdf818b119f4rl   rm   rT   ZZa84c64df1e11d8fd11450039d4fe64ff0c8a99fca0bd72c2d4c3e0400bc14a40f27e45e141a24001697737533eZ@820818d3c23993492cc5623ab437a48a0a7ca3e9639c140fe1e33811eb844b7crU   rV   rW   ZZ4d19303b848f424fc3c3beca249b2c6de0a34083b8e909b6aa4c3688505c05ffe0c8f57a0a4c5ab9da127435d9)r   rD   r   r4   r9   r   rr   )r&   r\   r]   rs   rt   rn   ro   rp   r4   r^   r+   r_   r`   ra   r   rb   rc   rd   re   rf   r9   rg   rh   r   r*   ri   rj   r,   r,   r-   Útest_x25519_mode_3  sD    








ûzHPKE_Tests.test_x25519_mode_3N)Ú__name__Ú
__module__Ú__qualname__r   r   r'   rE   r#   r.   r2   r8   r:   rB   rG   rH   rK   rP   rR   rS   rk   rq   ru   rv   r,   r,   r,   r-   r      s.   û(/,r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚHPKE_TestVectorsc              	   C   sx   g | _ zLdd l}tj |j¡}tj |dd¡}t|dƒ}t 	|¡| _ W 5 Q R X W n  t
tfk
rr   tdƒ Y nX d S )Nr   ÚProtocolz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~   Zinit_dirZfull_file_nameÚfr,   r,   r-   ÚsetUpO  s    zHPKE_TestVectors.setUpc                 C   s   t |ƒ}|dkr(tjdtj|dddS |dkrHtjdtj|dddS |dkrhtjd	tj|dddS |d
krzt |¡S |dkrŒt |¡S d S )Né   r   Úbig)Ú	byteorder)r   Údé   r   é   r   r   é!   )r   r   Z	constructÚintÚ
from_bytesr   rY   Zimport_x448_private_key)r&   Zkey_hexÚkem_idZkey_binr,   r,   r-   Úimport_private_keyZ  s"    ÿ
ÿ
ÿ

z#HPKE_TestVectors.import_private_keyc              
   C   s  | j s|  d¡ t| j ƒD ]ü\}}|d }|d }|d }|dkrDqtttttdœ}| ||f¡}|dkrlq| j|||d† |  |d	 |¡ 	¡ }d}	d
|kr®|  |d
 |¡}	|  |d |¡}
t
j ||||	|
¡\}}|  | ¡ |d ¡ |  |t|d ƒ¡ W 5 Q R X 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ÚskSmZskEmr   Úshared_secretÚ.Ú T©ÚendÚflush)r}   ÚskipTestÚ	enumerater   r	   r
   ÚgetÚsubTestr–   r    r   ZHPKE_CipherZ_encapr!   Úhexr   r‰   )r&   rŸ   Úvectorr•   r˜   r   Úsupported_combiZhashmodZreceiver_pubÚsender_privÚ	encap_keyr¢   r   r,   r,   r-   Útest_hpke_encapj  sL    
û
ÿ
ÿü
ÿz HPKE_TestVectors.test_hpke_encapc                 C   s\  | j s|  d¡ t| j ƒD ]:\}}|d }|d }|d }|dkrFqd}||f|krXq| j|||dÚ |  |d |¡}d	}d
|krž|  |d
 |¡}	|	 ¡ }t|d ƒ}
d	}d|krÎt|d ƒt|d ƒf}tj|t 	|¡|
||t|d ƒd}|d D ]B}t|d ƒ}t|d ƒ}t|d ƒ}| 
||¡}|  ||d¡ qúW 5 Q R X 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   ro   r4   r9   )r   r   r   rD   r4   r9   Zencryptionsr+   r)   ÚaadzDecryption failedr£   r¤   Tr¥   )r}   r¨   r©   r«   r–   r    r   r   r   r1   r%   r!   r‰   )r&   rŸ   r­   r•   r˜   r   r®   Zreceiver_privZ
sender_pubr¯   r°   r4   Zreceiver_hpkeZ
encryptionÚ	plaintextZ
ciphertextr²   Z	decryptedr,   r,   r-   Útest_hpke_unseal  sN    

ÿ
ÿ
ûz!HPKE_TestVectors.test_hpke_unsealN)rw   rx   ry   r‹   r–   r±   r´   r,   r,   r,   r-   rz   M  s   3rz   Ú__main__c                 C   s*   g }|t tƒ7 }|  d¡r&|t tƒ7 }|S )NZ
slow_tests)r   r   rª   rz   )ÚconfigÚtestsr,   r,   r-   Ú	get_testsá  s
    
r¸   c                   C   s   t  tƒ ¡S r/   )ÚunittestZ	TestSuiter¸   r,   r,   r,   r-   Úsuiteí  s    rº   )ZdefaultTest)r   r…   r¹   Úbinasciir   ZCryptodome.Protocolr   ZCryptodome.Protocol.HPKEr   ZCryptodome.PublicKeyr   ZCryptodome.SelfTest.st_commonr   r   ZCryptodome.Hashr   r	   r
   ZTestCaser   rz   rw   Úmainr¸   rº   r,   r,   r,   r-   Ú<module>   s(     ? 