o
    e,                     @  s   d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	 d dl
mZ d dlmZ ejr1d dlmZ d(ddZd)ddZd*ddZd+ddZd,ddZd-dd Zd.d$d%ZG d&d dejZG d'd" d"ejZdS )/    )annotationsN)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_evp_pkey_derive)serialization)ec)Backendsignature_algorithm"ec.EllipticCurveSignatureAlgorithmreturnNonec                 C  s   t | tjstdtjd S )Nz/Unsupported elliptic curve signature algorithm.)
isinstancer	   ZECDSAr   r   Z UNSUPPORTED_PUBLIC_KEY_ALGORITHM)r    r   WD:\Projects\ConvertPro\env\Lib\site-packages\cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithm   s   r   backendr
   strc                 C  s   | j |}| || jjk | j |}|| j jkrtd| j js/| j 	|dkr/td| j 
|}| || jjk | j|d}|S )Nz@ECDSA keys with explicit parameters are unsupported at this timer   ascii)_libEC_KEY_get0_groupopenssl_assert_ffiNULLEC_GROUP_get_curve_nameZ	NID_undef
ValueErrorZCRYPTOGRAPHY_IS_LIBRESSLZEC_GROUP_get_asn1_flagZ
OBJ_nid2snstringdecode)r   Zec_keygroupnidZ
curve_namesnr   r   r   _ec_key_curve_sn#   s"   r"   c                 C  s   | j || j j dS )z
    Set the named curve flag on the EC_KEY. This causes OpenSSL to
    serialize EC keys along with their curve OID which makes
    deserialization easier.
    N)r   ZEC_KEY_set_asn1_flagZOPENSSL_EC_NAMED_CURVE)r   ec_cdatar   r   r   _mark_asn1_named_ec_curveA   s   r$   c                 C  sV   | j |}| || jjk | j |}| || jjk | j ||r)tdd S )Nz;Cannot load an EC public key where the point is at infinity)r   EC_KEY_get0_public_keyr   r   r   r   ZEC_POINT_is_at_infinityr   )r   r#   pointr   r   r   r   _check_key_infinityM   s   r'   r!   ec.EllipticCurvec                 C  s0   zt j|  W S  ty   t| dtjw )Nz" is not a supported elliptic curve)r	   Z_CURVE_TYPESKeyErrorr   r   ZUNSUPPORTED_ELLIPTIC_CURVE)r   r!   r   r   r   _sn_to_elliptic_curveX   s   r*   private_key_EllipticCurvePrivateKeydatabytesc                 C  sz   | j |j}| |dk | jd|}| jdd}| j d|t||||j}| |dk | j|d |d  S )Nr   zunsigned char[]zunsigned int[]   )	r   Z
ECDSA_size_ec_keyr   r   newZ
ECDSA_signlenbuffer)r   r+   r-   max_sizeZsigbufZ
siglen_ptrresr   r   r   _ecdsa_sig_signb   s   r6   
public_key_EllipticCurvePublicKey	signaturec                 C  s8   | j d|t||t||j}|dkr|   td S )Nr   r/   )r   ZECDSA_verifyr2   r0   Z_consume_errorsr   )r   r7   r9   r-   r5   r   r   r   _ecdsa_sig_verifyq   s   r:   c                   @  sd   e Zd Zd&ddZed'ddZed(d
dZd)ddZd*ddZd+ddZ	d,ddZ
d-d#d$Zd%S ).r,   r   r
   c                 C  @   || _ || _|| _t||}t||| _t|| t|| d S N_backendr0   	_evp_pkeyr"   r*   _curver$   r'   selfr   Zec_key_cdataevp_pkeyr!   r   r   r   __init__      

z!_EllipticCurvePrivateKey.__init__r   r(   c                 C     | j S r<   r@   rB   r   r   r   curve      z_EllipticCurvePrivateKey.curveintc                 C     | j jS r<   rI   key_sizerH   r   r   r   rN         z!_EllipticCurvePrivateKey.key_size	algorithmec.ECDHpeer_public_keyec.EllipticCurvePublicKeyr.   c                 C  sD   | j || jstdtj|jj| jjkrtdt| j | j	|S )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve)
r>   Z+elliptic_curve_exchange_algorithm_supportedrI   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMnamer   r   r?   )rB   rP   rR   r   r   r   exchange   s   z!_EllipticCurvePrivateKey.exchangec                 C  s   | j j| j}| j || j jjk | j j|}| j |}| j j	| j}| j || j jjk | j j
||}| j |dk | j |}t| j ||S Nr/   )r>   r   r   r0   r   r   r   r   Z_ec_key_new_by_curve_nidr%   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkeyr8   )rB   r   Z	curve_nidZpublic_ec_keyr&   r5   rC   r   r   r   r7      s   z#_EllipticCurvePrivateKey.public_keyec.EllipticCurvePrivateNumbersc                 C  s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r>   r   ZEC_KEY_get0_private_keyr0   
_bn_to_intr	   ZEllipticCurvePrivateNumbersr7   rY   )rB   ZbnrX   r   r   r   private_numbers   s   
z(_EllipticCurvePrivateKey.private_numbersencodingserialization.Encodingformatserialization.PrivateFormatencryption_algorithm(serialization.KeySerializationEncryptionc                 C  s   | j |||| | j| jS r<   )r>   Z_private_key_bytesr?   r0   )rB   r\   r^   r`   r   r   r   private_bytes   s   z&_EllipticCurvePrivateKey.private_bytesr-   r   r   c                 C  s&   t | t||j\}}t| j| |S r<   )r   r   rP   r6   r>   )rB   r-   r   _r   r   r   sign   s   z_EllipticCurvePrivateKey.signNr   r
   r   r(   r   rK   )rP   rQ   rR   rS   r   r.   )r   rS   )r   rW   )r\   r]   r^   r_   r`   ra   r   r.   )r-   r.   r   r   r   r.   )__name__
__module____qualname__rD   propertyrI   rN   rU   r7   r[   rb   rd   r   r   r   r   r,      s    





c                   @  sd   e Zd Zd%ddZed&ddZed'd
dZd(ddZd)ddZd*ddZ	d+ddZ
d,d"d#Zd$S )-r8   r   r
   c                 C  r;   r<   r=   rA   r   r   r   rD      rE   z _EllipticCurvePublicKey.__init__r   r(   c                 C  rF   r<   rG   rH   r   r   r   rI      rJ   z_EllipticCurvePublicKey.curverK   c                 C  rL   r<   rM   rH   r   r   r   rN      rO   z _EllipticCurvePublicKey.key_sizeotherobjectboolc                 C  s&   t |tstS | jj| j|jdkS rV   )r   r8   NotImplementedr>   r   ZEVP_PKEY_cmpr?   )rB   rl   r   r   r   __eq__   s   
z_EllipticCurvePublicKey.__eq__ec.EllipticCurvePublicNumbersc           	      C  s   | j j| j}| j || j jjk | j j| j}| j || j jjk | j  5}| j j	|}| j j	|}| j j
|||||}| j |dk | j |}| j |}W d    n1 scw   Y  tj||| jdS )Nr/   )xyrI   )r>   r   r   r0   r   r   r   r%   _tmp_bn_ctxZ
BN_CTX_getZEC_POINT_get_affine_coordinatesrZ   r	   ZEllipticCurvePublicNumbersr@   )	rB   r   r&   bn_ctxZbn_xZbn_yr5   rr   rs   r   r   r   rY      s   
z&_EllipticCurvePublicKey.public_numbersr^   serialization.PublicFormatr.   c           	   	   C  s$  |t jju r| jjj}n|t jju sJ | jjj}| jj| j	}| j
|| jjjk | jj| j	}| j
|| jjjk | j ;}| jj|||| jjjd|}| j
|dk | jjd|}| jj||||||}| j
||k W d    n1 sw   Y  | jj|d d  S )Nr   zchar[])r   PublicFormatCompressedPointr>   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointZPOINT_CONVERSION_UNCOMPRESSEDr   r0   r   r   r   r%   rt   ZEC_POINT_point2octr1   r3   )	rB   r^   
conversionr   r&   ru   buflenbufr5   r   r   r   _encode_point  s(   
z%_EllipticCurvePublicKey._encode_pointr\   r]   c                 C  sl   |t jju s|t jju s|t jju r+|t jjus"|t jjt jjfvr&td| |S | j	||| | j
d S )NzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r   ZEncodingZX962rw   rx   ry   r   r}   r>   Z_public_key_bytesr?   )rB   r\   r^   r   r   r   public_bytes$  s   
z$_EllipticCurvePublicKey.public_bytesr9   r-   r   r   r   c                 C  s,   t | t||j\}}t| j| || d S r<   )r   r   rP   r:   r>   )rB   r9   r-   r   rc   r   r   r   verify=  s   z_EllipticCurvePublicKey.verifyNre   rf   rg   )rl   rm   r   rn   )r   rq   )r^   rv   r   r.   )r\   r]   r^   rv   r   r.   )r9   r.   r-   r.   r   r   r   r   )rh   ri   rj   rD   rk   rI   rN   rp   rY   r}   r~   r   r   r   r   r   r8      s    



	

)r   r   r   r   )r   r
   r   r   re   )r   r
   r   r   )r   r
   r!   r   r   r(   )r   r
   r+   r,   r-   r.   r   r.   )
r   r
   r7   r8   r9   r.   r-   r.   r   r   )
__future__r   typingZcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr	   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr
   r   r"   r$   r'   r*   r6   r:   ZEllipticCurvePrivateKeyr,   ZEllipticCurvePublicKeyr8   r   r   r   r   <module>   s"   








\