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	   ECDSAr   r    UNSUPPORTED_PUBLIC_KEY_ALGORITHM)r    r   Z/var/www/html/venv/lib/python3.10/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_name	NID_undef
ValueErrorCRYPTOGRAPHY_IS_LIBRESSLEC_GROUP_get_asn1_flag
OBJ_nid2snstringdecode)r   ec_keygroupnid
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   EC_KEY_set_asn1_flag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   EC_POINT_is_at_infinityr   )r   r-   pointr&   r   r   r   _check_key_infinityM   s   r2   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	   _CURVE_TYPESKeyErrorr   r   UNSUPPORTED_ELLIPTIC_CURVE)r   r)   r   r   r   _sn_to_elliptic_curveX   s   r7   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   
ECDSA_size_ec_keyr   r   new
ECDSA_signlenbuffer)r   r8   r:   max_sizesigbuf
siglen_ptrresr   r   r   _ecdsa_sig_signb   s   rG   
public_key_EllipticCurvePublicKey	signaturec                 C  s8   | j d|t||t||j}|dkr|   td S )Nr   r<   )r   ECDSA_verifyrA   r>   _consume_errorsr   )r   rH   rJ   r:   rF   r   r   r   _ecdsa_sig_verifyq   s   rM   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 ).r9   r   r
   c                 C  @   || _ || _|| _t||}t||| _t|| t|| d S N_backendr>   	_evp_pkeyr*   r7   _curver.   r2   selfr   ec_key_cdataevp_pkeyr)   r   r   r   __init__      

z!_EllipticCurvePrivateKey.__init__r   r3   c                 C     | j S rO   rS   rU   r   r   r   curve      z_EllipticCurvePrivateKey.curveintc                 C     | j jS rO   r]   key_sizer\   r   r   r   rb         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)
rQ   +elliptic_curve_exchange_algorithm_supportedr]   r   r   UNSUPPORTED_EXCHANGE_ALGORITHMnamer   r   rR   )rU   rd   rf   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<   )rQ   r   r   r>   r   r   r   r   _ec_key_new_by_curve_nidr/   EC_KEY_set_public_key_ec_cdata_to_evp_pkeyrI   )rU   r&   	curve_nidpublic_ec_keyr1   rF   rW   r   r   r   rH      s   z#_EllipticCurvePrivateKey.public_keyec.EllipticCurvePrivateNumbersc                 C  s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	rQ   r   EC_KEY_get0_private_keyr>   
_bn_to_intr	   EllipticCurvePrivateNumbersrH   rt   )rU   bnrs   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 rO   )rQ   _private_key_bytesrR   r>   )rU   rz   r|   r~   r   r   r   private_bytes   s   z&_EllipticCurvePrivateKey.private_bytesr:   r   r   c                 C  s&   t | t||j\}}t| j| |S rO   )r   r   rd   rG   rQ   )rU   r:   r   _r   r   r   sign   s   z_EllipticCurvePrivateKey.signNr   r
   r   r3   r   r_   )rd   re   rf   rg   r   r;   )r   rg   )r   rr   )rz   r{   r|   r}   r~   r   r   r;   )r:   r;   r   r   r   r;   )__name__
__module____qualname__rX   propertyr]   rb   rk   rH   ry   r   r   r   r   r   r   r9      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 )-rI   r   r
   c                 C  rN   rO   rP   rT   r   r   r   rX      rY   z _EllipticCurvePublicKey.__init__r   r3   c                 C  rZ   rO   r[   r\   r   r   r   r]      r^   z_EllipticCurvePublicKey.curver_   c                 C  r`   rO   ra   r\   r   r   r   rb      rc   z _EllipticCurvePublicKey.key_sizeotherobjectboolc                 C  s&   t |tstS | jj| j|jdkS rl   )r   rI   NotImplementedrQ   r   EVP_PKEY_cmprR   )rU   r   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yr]   )rQ   r   r   r>   r   r   r   r/   _tmp_bn_ctx
BN_CTX_getEC_POINT_get_affine_coordinatesrv   r	   EllipticCurvePublicNumbersrS   )	rU   r&   r1   bn_ctxbn_xbn_yrF   r   r   r   r   r   rt      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CompressedPointrQ   r   POINT_CONVERSION_COMPRESSEDUncompressedPointPOINT_CONVERSION_UNCOMPRESSEDr   r>   r   r   r   r/   r   EC_POINT_point2octr?   rB   )	rU   r|   
conversionr&   r1   r   buflenbufrF   r   r   r   _encode_point  s(   
z%_EllipticCurvePublicKey._encode_pointrz   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   EncodingX962r   r   r   r   r   rQ   _public_key_bytesrR   )rU   rz   r|   r   r   r   public_bytes$  s   
z$_EllipticCurvePublicKey.public_bytesrJ   r:   r   r   r   c                 C  s,   t | t||j\}}t| j| || d S rO   )r   r   rd   rM   rQ   )rU   rJ   r:   r   r   r   r   r   verify=  s   z_EllipticCurvePublicKey.verifyNr   r   r   )r   r   r   r   )r   r   )r|   r   r   r;   )rz   r{   r|   r   r   r;   )rJ   r;   r:   r;   r   r   r   r   )r   r   r   rX   r   r]   rb   r   rt   r   r   r   r   r   r   r   rI      s    



	

)r   r   r   r   )r   r
   r   r   r   )r   r
   r   r   )r   r
   r)   r   r   r3   )r   r
   r8   r9   r:   r;   r   r;   )
r   r
   rH   rI   rJ   r;   r:   r;   r   r   )
__future__r   typingcryptography.exceptionsr   r   r   *cryptography.hazmat.backends.openssl.utilsr   r   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr	   TYPE_CHECKING,cryptography.hazmat.backends.openssl.backendr
   r   r*   r.   r2   r7   rG   rM   EllipticCurvePrivateKeyr9   EllipticCurvePublicKeyrI   r   r   r   r   <module>   s"   








\