o
     ÎjêD  ã                   @   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Ú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,   úc/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/Crypto/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   ó"   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:   ó
   
þzHPKE_Tests.test_pskc                 C   r3   )Ns   baba)r   r   Úinfor6   r8   r,   r,   r-   Ú	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 )NZp224r   r   zUnsupported curve)r   r   ÚassertRaisesÚ
ValueErrorr   r   r    r1   r7   ÚassertInÚstrÚ	exception©r&   Zkey3Úcmr,   r,   r-   Ú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)r=   r>   r   r   r'   Úkey2r1   r7   r?   r@   rA   ©r&   rC   r,   r,   r-   Ú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   rE   zbut recipient key)r   r   r=   r>   r   r   r'   r    r1   r7   r?   r@   rA   rB   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 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   r5   r   )ó   JJJrK   )rL   s   YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYzat least 32)r=   r>   r   r   r'   r    r1   r7   r?   r@   rA   rH   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 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)r=   r   r   r   r'   r1   r7   r>   r    Ú
export_keyr?   r@   rA   )r&   Z	wrong_encrC   r,   r,   r-   Ú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 )NrN   rO   r   s<   XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZ)r   r   r'   r1   ÚCHACHA20_POLY1305rG   r    rQ   r=   r>   r%   )r&   r*   r,   r,   r-   Ú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   r1   rS   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   r;   r   ©
r   Úimport_x25519_private_keyÚbytesÚfromhexr   r1   r7   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_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Ú@0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82rV   ZZe52c6fed7f758d0cf7145689f21bc1be6ec9ea097fef4e959440012f4feb73fb611b946199e681f4cfc34db8eaZ@0ad0950d9fb9588e59690b74f1237ecdf1d775cd60be2eca57af5a4b0471c91brW   rX   rY   ZZ49f3b19b28a9ea9f43e8c71204c00d4a490ee7f61387b6719db765e948123b45b61633ef059ba22cd62437c8ba)r   r   r;   r5   r   rZ   )r&   r^   r_   Ú
psk_id_hexÚpsk_idÚpsk_hexr5   r`   r+   ra   rb   rc   r   rd   re   rf   rg   rh   r;   ri   rj   r   r*   rk   rl   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@dc4a146313cce60a278a5323d321f051c5707e9c45ba21a3479fecdf76fc69ddrV   ZZ5fd92cc9d46dbf8943e72a07e42f363ed5f721212cd90bcfd072bfd9f44e06b80fd17824947496e21b680c141bZ@23fb952571a14a25e3d678140cd0e5eb47a0961bb18afcf85896e5453c312e76rW   rX   rY   ZZd3736bb256c19bfa93d79e8f80b7971262cb7c887e35c26370cfed62254369a1b52e3d505b79dd699f002bc8ed)r   rF   r   r;   r   ©r   r[   r\   r]   r   r1   r7   r   r    r%   r!   )r&   r^   r_   ÚkeyS_hexÚkeySr`   r+   ra   rb   rc   r   rd   re   rf   rg   rh   r;   ri   rj   r   r*   rk   rl   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@fc1c87d2f3832adb178b431fce2ac77c7ca2fd680f3406c77b5ecdf818b119f4rn   ro   rV   ZZa84c64df1e11d8fd11450039d4fe64ff0c8a99fca0bd72c2d4c3e0400bc14a40f27e45e141a24001697737533eZ@820818d3c23993492cc5623ab437a48a0a7ca3e9639c140fe1e33811eb844b7crW   rX   rY   ZZ4d19303b848f424fc3c3beca249b2c6de0a34083b8e909b6aa4c3688505c05ffe0c8f57a0a4c5ab9da127435d9)r   rF   r   r5   r;   r   rt   )r&   r^   r_   ru   rv   rp   rq   rr   r5   r`   r+   ra   rb   rc   r   rd   re   rf   rg   rh   r;   ri   rj   r   r*   rk   rl   r,   r,   r-   Útest_x25519_mode_3  sD   








ûzHPKE_Tests.test_x25519_mode_3N)Ú__name__Ú
__module__Ú__qualname__r   r   r'   rG   r#   r.   r2   r9   r<   rD   rI   rJ   rM   rR   rT   rU   rm   rs   rw   rx   r,   r,   r,   r-   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   ÚProtocolZ
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€   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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   Z	constructÚintÚ
from_bytesr   r[   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   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Ú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  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   rq   r5   r;   )r   r   r   rF   r5   r;   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²   r5   Zreceiver_hpkeZ
encryptionZ	plaintextZ
ciphertextr´   Z	decryptedr,   r,   r-   Útest_hpke_unseal  sT   

ÿ
ÿ
ûøè"Éz!HPKE_TestVectors.test_hpke_unsealN)ry   rz   r{   r   r˜   r³   rµ   r,   r,   r,   r-   r|   M  s
    3r|   c                 C   s*   g }|t tƒ7 }|  d¡r|t tƒ7 }|S )NZ
slow_tests)r   r   r¬   r|   )ÚconfigZtestsr,   r,   r-   Ú	get_testsÝ  s
   
r·   Ú__main__c                   C   s   t  tƒ ¡S r/   )ÚunittestZ	TestSuiter·   r,   r,   r,   r-   Úsuiteé  s   rº   )ZdefaultTest)r   r‡   r¹   Úbinasciir   ZCrypto.Protocolr   ZCrypto.Protocol.HPKEr   ZCrypto.PublicKeyr   ZCrypto.SelfTest.st_commonr   r   ZCrypto.Hashr   r	   r
   ZTestCaser   r|   r·   ry   rº   Úmainr,   r,   r,   r-   Ú<module>   s(      ? ý