U
    Mf)                  
   @   s  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mZ d dlmZ G d	d
 d
ejZeddddd dd dd dd dd dpg ZeeD ]\ZZeeere deZestedZqe	jeejej dZ!e	jeej"dZ#ej$Z%e!e#e%fddZ&e!e#e%fddZ'e(ede e& edkre(ede e' qG dd  d ejZ)G d!d" d"ejZ*i fd#d$Z+e,d%krd&d' Z-ej.d'd( dS ))    N)hexlify)bord)SHA256)ECC)list_test_cases)load_test_vectorsload_test_vectors_wycheproof)key_agreementc                   @   s   e Zd ZdS )FIPS_ECDH_Tests_KATN)__name__
__module____qualname__ r   r   J/tmp/pip-unpacked-wheel-l_0d1exj/Cryptodome/SelfTest/Protocol/test_ecdh.pyr
      s   r
   )ProtocolzKAS_ECC_CDH_PrimitiveTest.txtz-ECC CDH Primitive (SP800-56A Section 5.7.1.2)c                 C   s
   t | dS N   intxr   r   r   <lambda>       r   c                 C   s
   t | dS r   r   r   r   r   r   r      r   c                 C   s
   t | dS r   r   r   r   r   r   r      r   c                 C   s
   t | dS r   r   r   r   r   r   r      r   c                 C   s
   t | dS r   r   r   r   r   r   r      r   )qcavsxqcavsydiutZqiutxZqiutyz\[([A-Za-z0-9-]+)\]   )curveZpoint_xZpoint_yr   dc                 C   s"   t ||dd d}| || d S )Nc                 S   s   | S Nr   r   r   r   r   r   7   r   zecdh_test.<locals>.<lambda>
static_pubstatic_privkdfr	   assertEqualself
public_keyprivate_keyexp_responsezr   r   r   	ecdh_test0   s    r-   c                 C   s"   t ||dd d}| || d S )Nc                 S   s   | S r    r   r   r   r   r   r   A   r   zecdh_test_rev.<locals>.<lambda>r!   r%   r'   r   r   r   ecdh_test_rev:   s    r.   ztest_verify_positive_%dztest_verify_positive_rev_%dc                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TestVectorsECDHWycheproofzWycheproof ECDH testsc                 C   s@   dd }dd }t d|d| d|id|id	}|  j|7  _d S )
Nc                 S   s   | d S )Nr   r   )gr   r   r   r   O   s    z2TestVectorsECDHWycheproof.add_tests.<locals>.curvec                 S   s   t | d dS )Nprivater   r   )ur   r   r   r1   R   s    z4TestVectorsECDHWycheproof.add_tests.<locals>.private)r   Z
wycheproofzWycheproof ECDH (%s)r   r1   )Z	group_tagZunit_tag)r   tv)r(   filenamer   r1   resultr   r   r   	add_testsM   s    z#TestVectorsECDHWycheproof.add_testsc                 C   s`   g | _ d | _| d | d | d | d | d | d | d | d d S )	Nz ecdh_secp224r1_ecpoint_test.jsonz ecdh_secp256r1_ecpoint_test.jsonz ecdh_secp384r1_ecpoint_test.jsonz ecdh_secp521r1_ecpoint_test.jsonzecdh_secp224r1_test.jsonzecdh_secp256r1_test.jsonzecdh_secp384r1_test.jsonzecdh_secp521r1_test.json)r3   descr6   r(   r   r   r   setUp^   s    






zTestVectorsECDHWycheproof.setUpc                 C   s   | j S r    )r7   r8   r   r   r   shortDescriptionl   s    z*TestVectorsECDHWycheproof.shortDescriptionc              
   C   s  t |jdkrd S z6t|jd dkr:tj|j|jd}nt|j}W n& tk
rn   |jsh|jrht	Y d S X tj
|j|jd}zt||dd d}W nX tk
r   |jrt	Y nV tk
r } z|jrt	dt|kst	W 5 d }~X Y nX | ||j |jst	d S )	Nr      )
curve_namer   c                 S   s   | S r    r   r   r   r   r   r      r   z7TestVectorsECDHWycheproof.test_verify.<locals>.<lambda>r!   zincompatible curve)lenpublicr   r   
import_keyr   
ValueErrorwarningZvalidAssertionError	constructr1   r	   	TypeErrorstrr&   Zshared)r(   r3   r)   r*   r,   er   r   r   test_verifyo   s,    

"z%TestVectorsECDHWycheproof.test_verifyc                 C   s0   | j D ]$}d|j|j|jf | _| | qd S )Nz(Wycheproof ECDH Verify Test #%d (%s, %s))r3   idcommentr4   r7   rG   )r(   r3   r   r   r   runTest   s    
z!TestVectorsECDHWycheproof.runTestN)	r   r   r   r7   r6   r9   r:   rG   rJ   r   r   r   r   r/   I   s   r/   c                   @   s   e Zd ZedZed ZedZe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 )
ECDH_Testsz-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg9VHFVKh2a1aVFifH
+BiyNaRa2kttEg3165Ye/dJxJ7KhRANCAARImIEXro5ZOcyWU2mq/+d79FEZXtTA
bKkz1aICQXihQdCMzRNbeNtC9LFLzhu1slRKJ2xsDAlw9r6w6vwtkRzr
-----END PRIVATE KEY-----z-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgHhmv8zmZ+Nw8fsZd
s8tlZflyfw2NE1CRS9DWr3Y3O46hRANCAAS3hZVUCbk+uk3w4S/YOraEVGG+WYpk
NO/vrwzufUUks2GV2OnBQESe0EBk4Jq8gn4ij8Lvs3rZX2yT+XfeATYd
-----END PRIVATE KEY-----z-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgGPdJmFFFKzLPspIr
E1T2cEjeIf4ajS9CpneP0e2b3AyhRANCAAQBexAA5BYDcXHs2KOksTYUsst4HhPt
kp0zkgI2virc3OGJFNGPaCCPfFCQJHwLRaEpiq3SoQlgoBwSc8ZPsl3y
-----END PRIVATE KEY-----z-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQghaVZXElSEGEojFKF
OU0JCpxWUWHvWQUR81gwWrOp76ShRANCAATi1Ib2K+YR3AckD8wxypWef7pw5PRw
tBaB3RDPyE7IjHZC6yu1DbcXoCdtaw+F5DM+4zpl59n5ZaIy/Yl1BdIy
-----END PRIVATE KEY-----c                 C   s.   dd }t || j| jd}| t|d d S )Nc                 S   s   t |  S r    r   newdigestr   r   r   r   r      r   z#ECDH_Tests.test_1.<locals>.<lambda>)r$   r"   r#   s@   3960a1101d1193cbaffef4cc7202ebff783c22c6d2e0d5d530ffc66dc197ea9c)r	   r"   r#   r&   r   r(   r$   r,   r   r   r   test_1   s    
zECDH_Tests.test_1c                 C   s6   dd }t || j| j| j| jd}| t|d d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_2.<locals>.<lambda>)r$   r"   r#   eph_pubeph_privs@   7447b733d40c8fab2c633b3dc61e4a8c742f3a6af7e16fb0cc486f5bdb5d6ba2)r	   r"   r#   rQ   rR   r&   r   rO   r   r   r   test_2   s    
zECDH_Tests.test_2c                 C   s2   dd }t || j| j| jd}| t|d d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_3.<locals>.<lambda>)r$   r"   r#   rR   s@   9e977ae45f33bf67f285d064d83e6632bcafe3a7d33fe571233bab4794ace759)r	   r"   r#   rR   r&   r   rO   r   r   r   test_3   s    
zECDH_Tests.test_3c                 C   s2   dd }t || j| j| jd}| t|d d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_4.<locals>.<lambda>)r$   r"   r#   rQ   s@   c9532df6aa7e9dbe5fe85da31ee25ff19c179c88691ec4b8328cc2036dcdadf2)r	   r"   r#   rQ   r&   r   rO   r   r   r   test_4   s    
zECDH_Tests.test_4c                 C   s(   dd }| j tt|| j| j| jd d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_5.<locals>.<lambda>)r$   r#   rQ   rR   )assertRaisesr@   r	   r#   rQ   rR   r(   r$   r   r   r   test_5   s    zECDH_Tests.test_5c                 C   s(   dd }| j tt|| j| j| jd d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_6.<locals>.<lambda>)r$   r"   rQ   rR   )rV   r@   r	   r"   rQ   rR   rW   r   r   r   test_6   s    zECDH_Tests.test_6c                 C   s.   dd }t || j| jd}| t|d d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_7.<locals>.<lambda>)r$   rQ   rR   s@   feb257ebe063078b1391aac07913283d7b642ad7df61b46dfc9cd6f420bb896a)r	   rQ   rR   r&   r   rO   r   r   r   test_7   s    
zECDH_Tests.test_7c                 C   s.   dd }t || j| jd}| t|d d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_8.<locals>.<lambda>)r$   r#   rQ   s@   ee4dc995117476ed57fd17ff0ed44e9f0466d46b929443bc0db9380317583b04)r	   r#   rQ   r&   r   rO   r   r   r   test_8   s    
zECDH_Tests.test_8c                 C   s.   dd }t || j| jd}| t|d d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z#ECDH_Tests.test_9.<locals>.<lambda>)r$   r"   rR   s@   2351cc2014f7c40468fa072b5d30f706eeaeef7507311cd8e59bab3b43f03c51)r	   r"   rR   r&   r   rO   r   r   r   test_9   s    
zECDH_Tests.test_9c                 C   s$   dd }| j tt|| j| jd d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r      r   z$ECDH_Tests.test_10.<locals>.<lambda>)r$   r"   rQ   )rV   r@   r	   r"   rQ   rW   r   r   r   test_10   s    zECDH_Tests.test_10c                 C   s$   dd }| j tt|| j| jd d S )Nc                 S   s   t |  S r    rL   r   r   r   r   r     r   z$ECDH_Tests.test_11.<locals>.<lambda>)r$   r#   rR   )rV   r@   r	   r#   rR   rW   r   r   r   test_11  s    zECDH_Tests.test_11c                 C   s   | j tt| j| jd d S )N)r"   r#   )rV   r@   r	   r"   r#   r8   r   r   r   test_12  s
    zECDH_Tests.test_12N)r   r   r   r   r?   r#   r)   r"   rR   rQ   rP   rS   rT   rU   rX   rY   rZ   r[   r\   r]   r^   r_   r   r   r   r   rK      s    








		rK   c                 C   s:   g }|t t7 }|t g7 }|t t7 }| d}|r6|S )N
slow_tests)r   r
   r/   rK   get)configtestsr`   r   r   r   	get_tests  s    
rd   __main__c                   C   s   t t S r    )unittestZ	TestSuiterd   r   r   r   r   suite"  s    rg   )ZdefaultTest)/rerf   binasciir   ZCryptodome.Util.py3compatr   ZCryptodome.Hashr   ZCryptodome.PublicKeyr   ZCryptodome.SelfTest.st_commonr   ZCryptodome.SelfTest.loaderr   r   ZCryptodome.Protocol.DHr	   ZTestCaser
   Ztest_vectors_verify	enumerateidxr3   
isinstancerE   matchresrB   groupr<   rC   r   r   r)   r   r*   Zziutr+   r-   r.   setattrr/   rK   rd   r   rg   mainr   r   r   r   <module>   sj   	




I 
