o
    c_+                  
   @   s  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r+d dlmZ dejddfd	d
ZdddefddZd"ddZd#ddZdddedejfddZdddddedefddZdddddededdf
ddZG d d dejZG d!d dejZdS )$    N)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_evp_pkey_derive)serialization)ec)Backendsignature_algorithmreturnc                 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   Kusr/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithm   s   r   backendr	   c                 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_curve?   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_infinityK   s   r#   r   c                 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   formatr   ZUNSUPPORTED_ELLIPTIC_CURVE)r   r   r   r   r   _sn_to_elliptic_curveV   s   r&   private_key_EllipticCurvePrivateKeydatac                 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_sign`   s   r1   
public_key_EllipticCurvePublicKey	signaturec                 C   s8   | j d|t||t||j}|dkr|   td S )Nr   r*   )r   ZECDSA_verifyr-   r+   Z_consume_errorsr   )r   r2   r4   r)   r0   r   r   r   _ecdsa_sig_verifyo   s   r5   c                   @   s   e Zd ZdddZedejfddZedefdd	Z	d
ej
dejdefddZdejfddZdejfddZdejdejdejdefddZdedejdefddZdS )r(   r   r	   c                 C   @   || _ || _|| _t||}t||| _t|| t|| d S N_backendr+   	_evp_pkeyr   r&   _curver    r#   selfr   Zec_key_cdataevp_pkeyr   r   r   r   __init__~      

z!_EllipticCurvePrivateKey.__init__r   c                 C      | j S r7   r;   r=   r   r   r   curve      z_EllipticCurvePrivateKey.curvec                 C      | j jS r7   rD   key_sizerC   r   r   r   rH         z!_EllipticCurvePrivateKey.key_size	algorithmpeer_public_keyc                 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)
r9   Z+elliptic_curve_exchange_algorithm_supportedrD   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMnamer   r   r:   )r=   rJ   rK   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*   )r9   r   r   r+   r   r   r   r   Z_ec_key_new_by_curve_nidr!   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkeyr3   )r=   r   Z	curve_nidZpublic_ec_keyr"   r0   r>   r   r   r   r2      s   z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r9   r   ZEC_KEY_get0_private_keyr+   
_bn_to_intr   EllipticCurvePrivateNumbersr2   rO   )r=   ZbnrN   r   r   r   private_numbers   s   
z(_EllipticCurvePrivateKey.private_numbersencodingr%   encryption_algorithmc                 C   s   | j |||| | j| jS r7   )r9   Z_private_key_bytesr:   r+   )r=   rS   r%   rT   r   r   r   private_bytes   s   z&_EllipticCurvePrivateKey.private_bytesr)   r
   c                 C   s&   t | t||j\}}t| j| |S r7   )r   r   rJ   r1   r9   )r=   r)   r
   _r   r   r   sign   s   z_EllipticCurvePrivateKey.signNr   r	   )__name__
__module____qualname__r?   propertyr   EllipticCurverD   intrH   ZECDHEllipticCurvePublicKeybytesrM   r2   rQ   rR   r   EncodingZPrivateFormatZKeySerializationEncryptionrU   EllipticCurveSignatureAlgorithmrW   r   r   r   r   r(   }   s>    



c                   @   s   e Zd ZdddZedejfddZedefdd	Z	dej
fd
dZdejdefddZdejdejdefddZdededejddfddZdS )r3   r   r	   c                 C   r6   r7   r8   r<   r   r   r   r?      r@   z _EllipticCurvePublicKey.__init__r   c                 C   rA   r7   rB   rC   r   r   r   rD      rE   z_EllipticCurvePublicKey.curvec                 C   rF   r7   rG   rC   r   r   r   rH      rI   z _EllipticCurvePublicKey.key_sizec           
      C   s   | j | j\}}| j j| j}| j || j jjk | j  2}| j j	|}| j j	|}||||||}| j |dk | j 
|}| j 
|}	W d    n1 sVw   Y  tj||	| jdS )Nr*   )xyrD   )r9   Z _ec_key_determine_group_get_funcr+   r   r!   r   r   r   _tmp_bn_ctxZ
BN_CTX_getrP   r   EllipticCurvePublicNumbersr;   )
r=   Zget_funcr   r"   bn_ctxZbn_xZbn_yr0   rc   rd   r   r   r   rO      s   
z&_EllipticCurvePublicKey.public_numbersr%   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CompressedPointr9   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointZPOINT_CONVERSION_UNCOMPRESSEDr   r+   r   r   r   r!   re   ZEC_POINT_point2octr,   r.   )	r=   r%   
conversionr   r"   rg   buflenbufr0   r   r   r   _encode_point   s(   
z%_EllipticCurvePublicKey._encode_pointrS   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   ra   ZX962rh   ri   rj   r   rn   r9   Z_public_key_bytesr:   )r=   rS   r%   r   r   r   public_bytes  s   
z$_EllipticCurvePublicKey.public_bytesr4   r)   r
   Nc                 C   s,   t | t||j\}}t| j| || d S r7   )r   r   rJ   r5   r9   )r=   r4   r)   r
   rV   r   r   r   verify0  s   z_EllipticCurvePublicKey.verifyrX   )rY   rZ   r[   r?   r\   r   r]   rD   r^   rH   rf   rO   r   rh   r`   rn   ra   ro   rb   rp   r   r   r   r   r3      s0    


rX   )r   r	   r   N)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	   rb   r   strr   r    r#   r]   r&   r`   r1   r5   ZEllipticCurvePrivateKeyr(   r_   r3   r   r   r   r   <module>   sL   






\