
    1xhE                        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
ej                  Z G d dej                  Zi fdZedk    rd Z ej        d           dS dS )    N)	unhexlify)HPKE)DeserializeError)ECC)list_test_cases)DH)SHA256SHA384SHA512c                       e Zd Z ej        d          Z ej        d          ZddddddZd	 Zd
 Z	d Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )
HPKE_Testsp256curveA   a          8   )r   p384p521
curve25519curve448c                 *   t          j        |          }|}t          j        |                                |          }|                     t          |j                  | j        |                    |	                    dd          }t          j        |||j                  }|
                    |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pt2s
             b/home/visionen/capture/venv/lib/python3.11/site-packages/Cryptodome/SelfTest/Protocol/test_HPKE.py
round_tripzHPKE_Tests.round_trip   s   |%(((H$//*;*;%,. . .	Y]++T[-?@@@ ^^Ff^55H$%,!*0 0 0	 bF33$$$ nnV$$s##%%%%%    c                     | j                                         D ]'}t          j        D ]}|                     ||           (d S N)r)   keysr   AEADr5   )r,   r   r   s      r4   test_round_tripzHPKE_Tests.test_round_trip5   sV    [%%'' 	0 	0E9 0 0w////0	0 	0r6   c                     t           j        j        }t          j        | j                                        |d           d S )N)   as    cccccccccccccccccccccccccccccccc)r   r   pskr   r:   
AES128_GCMr%   r-   r&   r,   r   s     r4   test_pskzHPKE_Tests.test_psk:   sE    )&di2244 &	( 	( 	( 	( 	( 	(r6   c                     t           j        j        }t          j        | j                                        |d           d S )Ns   baba)r   r   infor?   rA   s     r4   	test_infozHPKE_Tests.test_info@   sE    )&di2244 	 	 	 	 	 	r6   c                 R   t          j        d          }|                     t                    5 }t	          j        |                                t          j        j                   d d d            n# 1 swxY w Y   | 	                    dt          |j                             d S )Np224r   r   zUnsupported curve)r   r$   assertRaises
ValueErrorr   r%   r&   r:   r@   assertInstr	exceptionr,   key3cms      r4   test_neg_unsupported_curvez%HPKE_Tests.test_neg_unsupported_curveF   s    |&)))z** 	3bH$//"3"3!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	)3r|+<+<=====s   8A44A8;A8c                    |                      t                    5 }t          j        | j        | j        t          j        j                   d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )Nr   
sender_keyr   zExactly 1 private key)rH   rI   r   r%   r-   key2r:   r@   rJ   rK   rL   r,   rO   s     r4   test_neg_too_many_private_keysz)HPKE_Tests.test_neg_too_many_private_keysM   s    z** 	3bH$) $	!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	-s2</@/@AAAAAs   1AAAc                 ^   t          j        d          }|                     t                    5 }t	          j        | j                                        |t          j        j	                   d d d            n# 1 swxY w Y   | 
                    dt          |j                             d S )Nr   r   rR   zbut recipient key)r   r$   rH   rI   r   r%   r-   r&   r:   r@   rJ   rK   rL   rM   s      r4   test_neg_curve_mismatchz"HPKE_Tests.test_neg_curve_mismatchT   s    |&)))z** 	3bH$)"6"6"8"8 $!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	)3r|+<+<=====s   >A::A>A>c                    |                      t                    5 }t          j        | j                                        dt          j        j                   d d d            n# 1 swxY w Y   |                      t                    5 }t          j        | j                                        dt          j        j                   d d d            n# 1 swxY w Y   |                      t                    5 }t          j        | j                                        dt          j        j                   d d d            n# 1 swxY w Y   |                     dt          |j
                             d S )N)r6   s    GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG)r   r>   r   )   JJJr6   )rZ   s   YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYzat least 32)rH   rI   r   r%   r-   r&   r:   r@   rJ   rK   rL   rU   s     r4   test_neg_pskzHPKE_Tests.test_neg_psk\   s   z** 	3bH$)"6"6"8"8)!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3
 z** 	3bH$)"6"6"8"8&!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3
 z** 	3bH$)"6"6"8"8,!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	mS%6%677777s5   >A%%A),A)
>CCC9>EE
Ec                 P   d}|                      t                    5  t          j        | j        t          j        j        |           d d d            n# 1 swxY w Y   |                      t                    5 }t          j        | j                                        | j                                        	                    d          t          j        j                   d d d            n# 1 swxY w Y   | 
                    dt          |j                             |                      t                    5 }t          j        | j        t          j        j                   d d d            n# 1 swxY w Y   | 
                    dt          |j                             d S )	NsA   8888888888888888888888888888888888888888888888888888888888888888r"   rawformat)r   r#   r   z'enc' cannot be an inputr   z'enc' required)rH   r   r   r%   r-   r:   r@   rI   r&   
export_keyrJ   rK   rL   )r,   	wrong_encrO   s      r4   test_neg_wrong_enczHPKE_Tests.test_neg_wrong_encm   s'   '	/00 	$ 	$H$)!Y1"$ $ $ $	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$
 z** 	3bH$)"6"6"8"8--//::%:HH!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	0#bl2C2CDDDz** 	3bH$)!Y13 3 3 3	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	&BL(9(9:::::s6   ,AAA:A)C//C36C3<+E33E7:E7c                 B   t          j        | j        t           j        j        | j                                                            d                    }|                     t                    5  |
                    d           d d d            d S # 1 swxY w Y   d S )Nr]   r^   r"   s<   XYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZXYZ)r   r%   r-   r:   CHACHA20_POLY1305rT   r&   r`   rH   rI   r+   )r,   r0   s     r4   test_neg_unseal_wrong_ctz#HPKE_Tests.test_neg_unseal_wrong_ct   s    H$)%)Y%@!%!5!5!7!7!B!B%!B!P!PR R R	 z** 	* 	*[)))	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   1BBBc                    t           j        j        }t          j        | j                                        |          }|                    dd          }t          j        | j        ||j                  }|                     t                    5  |
                    |           d d d            d S # 1 swxY w Y   d S )Nr   r   r   r    r"   )r   r:   rd   r%   r-   r&   r*   r#   rH   rI   r+   )r,   r   r.   r/   r0   s        r4   test_neg_unseal_no_auth_dataz'HPKE_Tests.test_neg_unseal_no_auth_data   s    )-H$)*>*>*@*@%,. . .	 ^^Ff^55H$)%,!*0 0 0	 z** 	! 	!R   	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!s   B44B8;B8c                    d}t          j        t                              |                    }d}t                              |          }d}t                              |          }d}t                              |          }d}	t                              |	          }
d}t                              |          }d}t                              |          }d}t                              |          }t          j        j        }t	          j        ||||	          }|                    ||
          }| 	                    ||           |                    ||          }| 	                    ||           d S )
N@4612c550263fc8ad58375df3f557aac531d26850903e55a9f23f21d8534e8ac8:4265617574792069732074727574682c20747275746820626561757479Zf938558b5d72f1a23810b4be2ab4f84331acc02fc97babc53a52ae8218a355a96d8770ac83d07bea87e13c512a@37fda3567bdbd628e88668c3c8d7e97d1d1253b6d4ea6d44c150f741f1bf4431436f756e742d30436f756e742d31(4f6465206f6e2061204772656369616e2055726eZaf2d7e9ac9ae7e270f46ba1f975be53c09f8d875bdc8535458c2494e8a6eab251c03d0c22a56b8ca42c2063b84)r   r   rD   r#   
r   import_x25519_private_keybytesfromhexr   r:   r@   r%   r+   r'   )r,   keyR_hexkeyRpt_hexr1   ct0_hexct0enc_hexr#   aad0_hexaad0aad1_hexaad1info_hexrD   ct1_hexct1r   r0   pt_X0pt_X1s                        r4   test_x25519_mode_0zHPKE_Tests.test_x25519_mode_0   sI    V+EMM(,C,CDDM]]6""nmmG$$TmmG$$#}}X&&#}}X&&=}}X&&nmmG$$)&H$%,"&!$& & &	
   d++###  d++#####r6   c                 b   d}t          j        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 S )N@c5eb01eb457fe6c6f57577c5413b931550a162c71a03ac8d196babbd4e5ce0fd,456e6e796e20447572696e206172616e204d6f726961@0247fd33b913760fa1fa51e1892d9f307fbe65eb171e8132c2af18555a738b82rj   Ze52c6fed7f758d0cf7145689f21bc1be6ec9ea097fef4e959440012f4feb73fb611b946199e681f4cfc34db8ea@0ad0950d9fb9588e59690b74f1237ecdf1d775cd60be2eca57af5a4b0471c91brm   rn   ro   Z49f3b19b28a9ea9f43e8c71204c00d4a490ee7f61387b6719db765e948123b45b61633ef059ba22cd62437c8ba)r   r   rD   r>   r#   rq   )r,   ru   rv   
psk_id_hexpsk_idpsk_hexr>   rw   r1   rx   ry   rz   r#   r{   r|   r}   r~   r   rD   r   r   r   r0   r   r   s                            r4   test_x25519_mode_1zHPKE_Tests.test_x25519_mode_1   s|    V+EMM(,C,CDDC
z**TmmG$$M]]6""nmmG$$TmmG$$#}}X&&#}}X&&=}}X&&nmmG$$)&H$%,"&"(#!$	& & &	   d++###  d++#####r6   c                 n   d}t          j        t                              |                    }d}t          j        t                              |                    }d}t                              |          }d}t                              |          }d}	t                              |	          }
d}t                              |          }d}t                              |          }d}t                              |          }d	}t                              |          }t          j        j        }t	          j        ||                                |||

          }|	                    ||          }| 
                    ||           |	                    ||          }| 
                    ||           d S )N@fdea67cf831f1ca98d8e27b1f6abeb5b7745e9d35348b80fa407ff6958f9137e@dc4a146313cce60a278a5323d321f051c5707e9c45ba21a3479fecdf76fc69ddrj   Z5fd92cc9d46dbf8943e72a07e42f363ed5f721212cd90bcfd072bfd9f44e06b80fd17824947496e21b680c141b@23fb952571a14a25e3d678140cd0e5eb47a0961bb18afcf85896e5453c312e76rm   rn   ro   Zd3736bb256c19bfa93d79e8f80b7971262cb7c887e35c26370cfed62254369a1b52e3d505b79dd699f002bc8ed)r   rS   r   rD   r#   r   rr   rs   rt   r   r:   r@   r%   r&   r+   r'   )r,   ru   rv   keyS_hexkeySrw   r1   rx   ry   rz   r#   r{   r|   r}   r~   r   rD   r   r   r   r0   r   r   s                          r4   test_x25519_mode_2zHPKE_Tests.test_x25519_mode_2   sw    V+EMM(,C,CDDU+EMM(,C,CDDM]]6""nmmG$$TmmG$$#}}X&&#}}X&&=}}X&&nmmG$$)&H$(,(9(9%,"&!$	& & &	   d++###  d++#####r6   c                    d}t          j        t                              |                    }d}t          j        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 S )N@cb29a95649dc5656c2d054c1aa0d3df0493155e9d5da6d7e344ed8b6a64a9423@fc1c87d2f3832adb178b431fce2ac77c7ca2fd680f3406c77b5ecdf818b119f4r   r   rj   Za84c64df1e11d8fd11450039d4fe64ff0c8a99fca0bd72c2d4c3e0400bc14a40f27e45e141a24001697737533e@820818d3c23993492cc5623ab437a48a0a7ca3e9639c140fe1e33811eb844b7crm   rn   ro   Z4d19303b848f424fc3c3beca249b2c6de0a34083b8e909b6aa4c3688505c05ffe0c8f57a0a4c5ab9da127435d9)r   rS   r   r>   rD   r#   r   )r,   ru   rv   r   r   r   r   r   r>   rw   r1   rx   ry   rz   r#   r{   r|   r}   r~   r   rD   r   r   r   r0   r   r   s                              r4   test_x25519_mode_3zHPKE_Tests.test_x25519_mode_3  s    V+EMM(,C,CDDU+EMM(,C,CDDC
z**TmmG$$M]]6""nmmG$$TmmG$$#}}X&&#}}X&&=}}X&&nmmG$$)&H$(,(9(9%,"(#"&!$& & &	   d++###  d++#####r6   N)__name__
__module____qualname__r   r$   r-   rT   r)   r5   r;   rB   rE   rP   rV   rX   r[   rb   re   rg   r   r   r   r    r6   r4   r   r      s@       3<f%%%D3<f%%%D  F& & &.0 0 0
( ( (  > > >B B B> > >8 8 8"; ; ;$* * *! ! !&$ &$ &$P-$ -$ -$^*$ *$ *$X1$ 1$ 1$ 1$ 1$r6   r   c                   &    e Zd Zd Zd Zd Zd ZdS )HPKE_TestVectorsc                 |   g | _         	 dd l}t          j                            |j                  }t          j                            |ddd          }t          |d          5 }t          j	        |          | _         d d d            d S # 1 swxY w Y   d S # t          t          f$ r t          d           Y d S w xY 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fs        r4   setUpzHPKE_TestVectors.setUpO  s   	e,,,,w'@'IJJHW\\(JNfggNnc** ,a#y||, , , , , , , , , , , , , , , , , ,!;/ 	e 	e 	ecdddddd	es6   AB #B
=B 
BB BB  B;:B;c                    t          |          }|dk    r0t          j        dt                              |d                    S |dk    r0t          j        dt                              |d                    S |dk    r0t          j        d	t                              |d                    S |d
k    rt          j        |          S |dk    rt          j        |          S d S )N   r   big)	byteorder)r   d   r      r   r   !   )r   r   	constructint
from_bytesr   rr   import_x448_private_key)r,   key_hexkem_idkey_bins       r4   import_private_keyz#HPKE_TestVectors.import_private_keyZ  s$   G$$V=vJO 2@ 2Q 2Q R R R Rv=vJO 2@ 2Q 2Q R R R Rv=vJO 2@ 2Q 2Q R R R Rv/888v-g666 r6   c           	         | j         s|                     d           t          | j                   D ]\  }}|d         }|d         }|d         }|dk    r%t          t          t
          t          t
          d}|                    ||f          }|`|                     |||          5  |                     |d	         |          	                                }d}	d
|v r|                     |d
         |          }	|                     |d         |          }
t          j                            ||||	|
          \  }}|                     |                                |d                    |                     |t          |d                              ddd           n# 1 swxY w Y   t!          ddd           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#   s                r4   test_hpke_encapz HPKE_TestVectors.test_hpke_encapj  sC    | 	7MM5666$T\22 +	+ +	+KCH%FH%FY'G &   $#### O &))66*:;;G#fgFF E E#66vf~7= ?  ??Iz||  #V##"&"9"9&.:@#B #BK !33F6NFKK	%)%5%<%<\=C=D=H=F	&H &H"s
   F5M:::  !*6/+B!C!CE E E%E E E E E E E E E E E E E E E* #2T*****W+	+ +	+s   )C*FF#	&F#	c                    | j         s|                     d           t          | j                   D ]\  }}|d         }|d         }|d         }|dk    r%d}||f|vr.|                     |||          5  |                     |d         |          }d	}d
|v r0|                     |d
         |          }	|	                                }t          |d                   }
d	}d|v r*t          |d                   t          |d                   f}t          j        |t          j	        |          |
||t          |d                             }|d         D ]n}t          |d                   }t          |d                   }t          |d                   }|
                    ||          }|                     ||d           o	 d	d	d	           n# 1 swxY w Y   t          ddd           d	S )z7Test HPKE encryption and decryption using test vectors.r   r   r   r   r   r   r   r   Nr   r#   r   r>   rD   )r   r   r#   rS   r>   rD   encryptionsr1   r/   aadzDecryption failedr   r   Tr   )r   r   r   r   r   r&   r   r   r%   r:   r+   r'   r   )r,   r   r   r   r   r   r   receiver_priv
sender_pubr   r   r>   receiver_hpke
encryption	plaintext
ciphertextr   	decrypteds                     r4   test_hpke_unsealz!HPKE_TestVectors.test_hpke_unseal  s    | 	7MM5666$T\22 7	+ 7	+KCH%FH%FY'G &  O 66#fgFF  P  P $ 7 7v8>!@ !@ "
V##"&"9"9&.:@#B #BK!,!7!7!9!9J%fUm44	v%%#F8$455y7O7OOC $m1571C1C-64>-0.7v.G.G!I !I !I #)"7 P PJ )*T*: ; ;I!*:d+;!<!<J#Ju$566C !. 4 4Z E EI$$Y	;NOOOOP1 P  P  P  P  P  P  P  P  P  P  P  P  P  P  PD #2T*****o7	+ 7	+s   7EGG	G	N)r   r   r   r   r   r   r   r   r6   r4   r   r   M  sT        	e 	e 	e7 7 7 1+ 1+ 1+f=+ =+ =+ =+ =+r6   r   c                     g }|t          t                    z  }|                     d          r|t          t                    z  }|S )N
slow_tests)r   r   r   r   )configtestss     r4   	get_testsr     sE    E	_Z(((Ezz, 3!1222Lr6   __main__c                  B    t          j        t                                S r8   )unittest	TestSuiter   r   r6   r4   suiter    s    !)++...r6   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  mainr   r6   r4   <module>r     sn   				         $ $ $ $ $ $ 5 5 5 5 5 5 $ $ $ $ $ $ 9 9 9 9 9 9 " " " " " " 2 2 2 2 2 2 2 2 2 2z$ z$ z$ z$ z$" z$ z$ z$z	M+ M+ M+ M+ M+x( M+ M+ M+`      z/ / /HMg&&&&&& r6   