U
    ʹh<                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZ zd dlZW n e	k
r\   d dlZY nX ddl
mZmZmZmZmZmZmZmZ ddl
m
Z
 ddlmZmZmZmZmZ ddlmZmZ ddlmZ d	ejkreegZ
ejj d
e
dd e
D ddd Z!dd Z"dd Z#G dd dej$Z%dd Z&dd Z'ej dej(edddddej(ed d!d"d#dej(ed$d%d&d'dej(ed(d)d*d+dej(ed,d-d.d/dej(ed0d1d2d3dej(ed4d5d6d7dej(ed8d9d:d;dej(ed<d=d>d?dej(ed@dAdBdCdej(edDdEdFdGdej(edHdIdJdKdej(edLdMdNdOdej(edPdQdRdSdej(edTdUdVdWdgdXdY Z)dZZ*d[Z+d\Z,d]Z-d^Z.d_d` Z/dadb Z0G dcdd dde1Z2dedf Z3e4dgdh e3di5djD Z6ejj7ejj d
e
dkd e
D ddldm Z8dS )n    N)	unhexlify   )NIST192pNIST224pNIST256pNIST384pNIST521pBRAINPOOLP160r1	SECP112r2	SECP128r1)curves)ECDHInvalidCurveErrorInvalidSharedSecretError
NoKeyErrorNoCurveError)
SigningKeyVerifyingKey)	CurveEdTwz--fastvcurvec                 C   s   g | ]
}|j qS  name.0curver   r   5./venv/lib/python3.8/site-packages/ecdsa/test_ecdh.py
<listcomp>*   s     r   )Zidsc                 C   sn   t | jtrtd t| d}t| d}|  ||  ||  |	 }|	 }||ksjt
d S )Nz(ECDH is not supported for Edwards curvesr   )
isinstancer   r   pytestskipr   generate_private_keyload_received_public_keyget_public_keygenerate_sharedsecret_bytesAssertionError)r   ecdh1ecdh2secret1secret2r   r   r   test_ecdh_each'   s    


r+   c                  C   sP   t t} t t}tt| |j}t|| jd}| }| }||ksLtd S )N)private_key
public_key)r   generater	   r   verifying_keyr%   r&   )key1Zkey2r'   r(   r)   r*   r   r   r   test_ecdh_both_keys_present;   s    

r1   c               	   C   sR   t td} tt |   W 5 Q R X |   tt |   W 5 Q R X d S Nr   )r   r   r    raisesr   r%   r"   r'   r   r   r   test_ecdh_no_public_keyH   s    
r5   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestECDHc              	   C   sP   t  }|t tt}| t}|| W 5 Q R X | 	dt
|j d S )NzCurve mismatch)r   Z	set_curver   r   r.   r	   assertRaisesr   Zload_private_keyassertInstr	exception)selfr'   r0   er   r   r   test_load_key_from_wrong_curveU   s    

z'TestECDH.test_load_key_from_wrong_curvec              	   C   s:   t  }| t}|  W 5 Q R X | dt|j d S )NCurve must be set)r   r7   r   r"   r8   r9   r:   r;   r'   r<   r   r   r   test_generate_without_curve`   s    z$TestECDH.test_generate_without_curvec              	   C   s<   t  }| t}|d W 5 Q R X | dt|j d S )Ns    r>   )r   r7   r   load_private_key_bytesr8   r9   r:   r?   r   r   r   !test_load_bytes_without_curve_seth   s    z*TestECDH.test_load_bytes_without_curve_setc                 C   s.   t  }tt}||j | |jt d S N)r   r   r.   r	   r#   r/   ZassertEqualr   )r;   r'   r0   r   r   r   'test_set_curve_from_received_public_keyp   s    
z0TestECDH.test_set_curve_from_received_public_keyN)__name__
__module____qualname__r=   r@   rB   rD   r   r   r   r   r6   T   s   r6   c               	   C   s   t td} |   t td}|  tt | |  W 5 Q R X tt ||   W 5 Q R X | | _	|  |_	tt | 
  W 5 Q R X tt |
  W 5 Q R X d S r2   )r   r   r"   r   r    r3   r   r#   r$   r-   r%   )r'   r(   r   r   r    test_ecdh_wrong_public_key_curvez   s    



rH   c               	   C   sX   t td} |   | tt  | jjj	| jj
_tt |   W 5 Q R X d S r2   )r   r   r"   r#   r   r.   Zget_verifying_keyr,   r   orderZprivkeyZsecret_multiplierr    r3   r   r%   r4   r   r   r   %test_ecdh_invalid_shared_secret_curve   s    
rJ   zcurve,privatekey,pubkey,secretZ0f17d3fea367b74d340851ca4270dcb24c271f445bed9d527Z`42ea6dd9969dd2a61fea1aac7f8e98edcc896c6e55857cc0dfbe5d7c61fac88b11811bde328e8a0d12bf01a9d204b523Z0803d8ab2e5b6e6fca715737c3a82f7ce3c783124f6d51cd0z
NIST192p-1)idZ056e853349d96fe4c442448dacb7cf92bb7a95dcf574a9bd5Z`deb5712fa027ac8d2f22c455ccb73a91e17b6512b5e030e77e2690a02cc9b28708431a29fb54b87b1f0c14e011ac2125Z0c208847568b98835d7312cef1f97f7aa298283152313c29dz
NIST192p-2Z0c6ef61fe12e80bf56f2d3f7d0bb757394519906d55500949Z`4edaa8efc5a0f40f843663ec5815e7762dddc008e663c20f0a9f8dc67a3e60ef6d64b522185d03df1fc0adfd42478279Z087229107047a3b611920d6e3b2c0c89bea4f49412260b8ddz
NIST192p-3Z0e6747b9c23ba7044f38ff7e62c35e4038920f5a0163d3cdaZ`8887c276edeed3e9e866b46d58d895c73fbd80b63e382e8804c5097ba6645e16206cfb70f7052655947dd44a17f1f9d5Z0eec0bed8fc55e1feddc82158fd6dc0d48a4d796aaf47d46cz
NIST192p-4Z0beabedd0154a1afcfc85d52181c10f5eb47adc51f655047dZ`0d045f30254adc1fcefa8a5b1f31bf4e739dd327cd18d594542c314e41427c08278a08ce8d7305f3b5b849c72d8aff73Z0716e743b1b37a2cd8479f0a3d5a74c10ba2599be18d7e2f4z
NIST192p-5Z0cf70354226667321d6e2baf40999e2fd74c7a0f793fa8699Z`fb35ca20d2e96665c51b98e8f6eb3d79113508d8bccd4516368eec0d5bfb847721df6aaff0e5d48c444f74bf9cd8a5a7Z0f67053b934459985a315cb017bf0302891798d45d0e19508z
NIST192p-6Z88346a60fc6f293ca5a0d2af68ba71d1dd389e5e40837942df3e43cbdZpaf33cd0629bc7e996320a3f40368f74de8704fa37b8fab69abaae280882092ccbba7930f419a8a4f9bb16978bbc3838729992559a6f2e2d7Z87d96f9a3bd3c05cf5cc37feb8b9d5209d5c2597464dec3e9983743e8r   Z@7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534Z700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4acZ@46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7bz
NIST256p-1Z@38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5Z809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7aeb29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3Z@057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67z
NIST256p-2Z@1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8Za2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536Z@2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ecz
NIST256p-3Z@207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932dZdf3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4Z@96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024z
NIST256p-4Z@59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bfZ41192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb9221af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328Z@19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62z
NIST256p-5Z@f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132efZ33e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2fZ@664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3z
NIST256p-6Z`3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1Za7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437aZ`5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1r   Z017eecc07ab4b329068fba65e56a1f8890aa935e57134ae0ffcce802735151f4eac6564f6ee9974c5e6887a1fefee5743ae2241bfeb95d5ce31ddcb6f9edb4d6fc47A  00685a48e86c79f0f0875f7bc18d25eb5fc8c0b07e5da4f4370f3a9490340854334b1e1b87fa395464c60626124a4e70d0f785601d37c09870ebf176666877a2046d01ba52c56fc8776d9e8f5db4f0cc27636d0b741bbe05400697942e80b739884a83bde99e0f6716939e632bc8986fa18dccd443a348b6c3e522497955a4f3c302f676Z005fc70477c3e63bc3954bd0df3ea0d1f41ee21746ed95fc5e1fdf90930d5e136672d72cc770742d1711c3c3a4c334a0ad9759436a4d3c5bf6e74b9578fac148c831r   c                 C   sB   t | d}|t| |t| | }|t|ks>td S r2   )r   rA   r   Zload_received_public_key_bytesr%   r&   )r   Z
privatekeyZpubkeyZsecretecdhsharedsecretr   r   r   test_ecdh_NIST   s     
rN   z-----BEGIN EC PRIVATE KEY-----
MF8CAQEEGF7IQgvW75JSqULpiQQ8op9WH6Uldw6xxaAKBggqhkjOPQMBAaE0AzIA
BLiBd9CE7xf15FY5QIAoNg+fWbSk1yZOYtoGUdzkejWkxbRc9RWTQjqLVXucIJnz
bA==
-----END EC PRIVATE KEY-----
Z305f02010104185ec8420bd6ef9252a942e989043ca29f561fa525770eb1c5a00a06082a8648ce3d030101a13403320004b88177d084ef17f5e45639408028360f9f59b4a4d7264e62da0651dce47a35a4c5b45cf51593423a8b557b9c2099f36cz-----BEGIN PUBLIC KEY-----
MEkwEwYHKoZIzj0CAQYIKoZIzj0DAQEDMgAEuIF30ITvF/XkVjlAgCg2D59ZtKTX
Jk5i2gZR3OR6NaTFtFz1FZNCOotVe5wgmfNs
-----END PUBLIC KEY-----
Z3049301306072a8648ce3d020106082a8648ce3d03010103320004b88177d084ef17f5e45639408028360f9f59b4a4d7264e62da0651dce47a35a4c5b45cf51593423a8b557b9c2099f36cZ08f457e34982478d1c34b9cd2d0c15911b72dd60d869e2ceac                  C   s6   t  } | t | t |  }|ttks2td S rC   )	r   load_private_key_pempem_local_private_keyZload_received_public_key_pempem_remote_public_keyr%   r   gshared_secretr&   rL   rM   r   r   r   test_ecdh_pemI  s
    

rT   c                  C   s>   t  } | tt | tt |  }|ttks:td S rC   )	r   Zload_private_key_derr   der_local_private_keyZload_received_public_key_derder_remote_public_keyr%   rR   r&   rS   r   r   r   test_ecdh_derS  s
    rW   c                   @   s   e Zd ZdS )RunOpenSslErrorN)rE   rF   rG   r   r   r   r   rX   ^  s   rX   c                 C   sV   d}t j|g|   t jt jd}| \}}|jdkrNtd|| |j|f | S )NZopenssl)stdoutstderrr   z,cmd '%s %s' failed: rc=%s, stdout/err was %s)	
subprocessPopensplitPIPEZSTDOUTZcommunicate
returncoderX   decode)cmdZOPENSSLprY   Zignoredr   r   r   run_opensslb  s    
rc   c                 c   s    | ]}| d d  V  qdS ):r   N)r]   strip)r   cr   r   r   	<genexpr>r  s   rg   zecparam -list_curves
c                 C   s   g | ]
}|j qS r   r   r   r   r   r   r   |  s     c              	   C   s`  t | jtrtd | js t| jtkr:td| j  z$td}|	ddkr\td W n t
k
r|   td Y nX tjdrtd td td	| j  td
| j  td t| d}t| d}td}| }W 5 Q R X || td}| }W 5 Q R X || td}| }W 5 Q R X t|}| |  ksbt| }tdd}||  W 5 Q R X || || | }| }	||	ksttd td tdd}| }
W 5 Q R X tdd}| }W 5 Q R X t|
|jjd ks&tt||jjd ks@t|
|ksNt||
ks\td S )Nz)Edwards curves are not supported for ECDHz system openssl does not support zpkeyutl -helpz-deriver   z1system openssl does not support `pkeyutl -derive`z$system openssl could not be executedtz,ecparam -name %s -genkey -out t/privkey1.pemz,ecparam -name %s -genkey -out t/privkey2.pemz0ec -in t/privkey1.pem -pubout -out t/pubkey1.pemr   zt/privkey1.pemzt/privkey2.pemzt/pubkey1.pemzt/pubkey2.pemwbzKpkeyutl -derive -inkey t/privkey1.pem -peerkey t/pubkey2.pem -out t/secret1zKpkeyutl -derive -inkey t/privkey2.pem -peerkey t/pubkey1.pem -out t/secret2z	t/secret1rb   )r   r   r   r    r!   Zopenssl_namer&   OPENSSL_SUPPORTED_CURVESrc   findrX   ospathisdirshutilrmtreemkdirr   openreadrO   r   Zfrom_pemZ	to_stringr$   writeZto_pemr#   r%   lenZverifying_key_length)r   Zhlpr'   r(   r<   keyZvk1Zvk2r)   r*   Zssl_secret1Zssl_secret2r   r   r   test_ecdh_with_opensslx  sn    














rz   )9ro   sysrr   r[   r    Zbinasciir   Z	unittest2ZunittestImportErrorr   r   r   r   r   r   r	   r
   r   rL   r   r   r   r   r   keysr   r   Zellipticcurver   argvZmarkZparametrizer+   r1   r5   ZTestCaser6   rH   rJ   ZparamrN   rP   rU   rQ   rV   rR   rT   rW   	ExceptionrX   rc   setr]   rm   Zslowrz   r   r   r   r   <module>   sB  (


& 

