U
    ςd,                     @  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rbd dlmZ dd	d
ddZdddddZddddZdd	dddZddddddZdddddddZdd ddd	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"ec.EllipticCurveSignatureAlgorithmNone)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   d/var/www/html/myproject/myenv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithm   s
    r   r
   str)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"   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 ||rRt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(   ec.EllipticCurve)r   r!   r   c                 C  s:   zt j|  W S  tk
r4   t| dtjY nX d S )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+   _EllipticCurvePrivateKeybytes)r   private_keydatar   c                 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         r7   _EllipticCurvePublicKey)r   
public_key	signaturer/   r   c                 C  s8   | j d|t||t||j}|dkr4|   td S )Nr   r0   )r   ZECDSA_verifyr3   r1   Z_consume_errorsr   )r   r9   r:   r/   r6   r   r   r   _ecdsa_sig_verifyq   s         r;   c                   @  s   e Zd ZddddZeddddZed	dd
dZddddddZddddZddddZ	dddddddZ
dddddd Zd!S )"r,   r
   r#   c                 C  s@   || _ || _|| _t||}t||| _t|| t|| d S N_backendr1   	_evp_pkeyr"   r+   _curver%   r(   selfr   Zec_key_cdataevp_pkeyr!   r   r   r   __init__   s    

z!_EllipticCurvePrivateKey.__init__r)   r   c                 C  s   | j S r<   r@   rB   r   r   r   curve   s    z_EllipticCurvePrivateKey.curveintc                 C  s   | j jS r<   rH   key_sizerG   r   r   r   rK      s    z!_EllipticCurvePrivateKey.key_sizezec.ECDHzec.EllipticCurvePublicKeyr-   )	algorithmpeer_public_keyr   c                 C  sD   | j || jstdtj|jj| jjkr4t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_supportedrH   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMnamer   r   r?   )rB   rL   rM   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 Nr0   )r>   r   r   r1   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'   r6   rC   r   r   r   r9      s    z#_EllipticCurvePrivateKey.public_keyzec.EllipticCurvePrivateNumbersc                 C  s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r>   r   ZEC_KEY_get0_private_keyr1   
_bn_to_intr	   ZEllipticCurvePrivateNumbersr9   rR   )rB   ZbnrQ   r   r   r   private_numbers   s    
z(_EllipticCurvePrivateKey.private_numbersserialization.Encodingzserialization.PrivateFormatz(serialization.KeySerializationEncryption)encodingformatencryption_algorithmr   c                 C  s   | j |||| | j| jS r<   )r>   Z_private_key_bytesr?   r1   )rB   rV   rW   rX   r   r   r   private_bytes   s    z&_EllipticCurvePrivateKey.private_bytesr   )r/   r   r   c                 C  s&   t | t||j\}}t| j| |S r<   )r   r   rL   r7   r>   )rB   r/   r   _r   r   r   sign   s    z_EllipticCurvePrivateKey.signN)__name__
__module____qualname__rD   propertyrH   rK   rO   r9   rT   rY   r[   r   r   r   r   r,      s   
c                   @  s   e Zd ZddddZeddddZed	dd
dZdddddZddddZdddddZ	ddddddZ
dddddd d!Zd"S )#r8   r
   r#   c                 C  s@   || _ || _|| _t||}t||| _t|| t|| d S r<   r=   rA   r   r   r   rD      s    

z _EllipticCurvePublicKey.__init__r)   rE   c                 C  s   | j S r<   rF   rG   r   r   r   rH      s    z_EllipticCurvePublicKey.curverI   c                 C  s   | j jS r<   rJ   rG   r   r   r   rK      s    z _EllipticCurvePublicKey.key_sizeobjectbool)otherr   c                 C  s&   t |tstS | jj| j|jdkS rP   )r   r8   NotImplementedr>   r   ZEVP_PKEY_cmpr?   )rB   rb   r   r   r   __eq__   s    
z_EllipticCurvePublicKey.__eq__zec.EllipticCurvePublicNumbersc           	   	   C  s   | j j| j}| j || j jjk | j j| j}| j || j jjk | j  `}| j j	|}| j j	|}| j j
|||||}| j |dk | j |}| j |}W 5 Q R X tj||| jdS )Nr0   )xyrH   )r>   r   r   r1   r   r   r   r&   _tmp_bn_ctxZ
BN_CTX_getZEC_POINT_get_affine_coordinatesrS   r	   ZEllipticCurvePublicNumbersr@   )	rB   r   r'   bn_ctxZbn_xZbn_yr6   re   rf   r   r   r   rR      s$        z&_EllipticCurvePublicKey.public_numberszserialization.PublicFormatr-   )rW   r   c           	   	   C  s  |t jjkr| jjj}n|t jjks(t| jjj}| jj	| j
}| j|| jjjk | jj| j
}| j|| jjjk | j l}| jj|||| jjjd|}| j|dk | jjd|}| jj||||||}| j||k W 5 Q R X | jj|d d  S )Nr   zchar[])r   PublicFormatCompressedPointr>   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointAssertionErrorZPOINT_CONVERSION_UNCOMPRESSEDr   r1   r   r   r   r&   rg   ZEC_POINT_point2octr2   r4   )	rB   rW   
conversionr   r'   rh   buflenbufr6   r   r   r   _encode_point  s:    
          z%_EllipticCurvePublicKey._encode_pointrU   )rV   rW   r   c                 C  sp   |t jjks$|t jjks$|t jjkrV|t jjk	sD|t jjt jjfkrLtd| |S | j	||| | j
d S d S )NzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r   ZEncodingZX962ri   rj   rk   r   rp   r>   Z_public_key_bytesr?   )rB   rV   rW   r   r   r   public_bytes$  s*    



    z$_EllipticCurvePublicKey.public_bytesr   r   )r:   r/   r   r   c                 C  s,   t | t||j\}}t| j| || d S r<   )r   r   rL   r;   r>   )rB   r:   r/   r   rZ   r   r   r   verify=  s    z_EllipticCurvePublicKey.verifyN)r\   r]   r^   rD   r_   rH   rK   rd   rR   rp   rq   rr   r   r   r   r   r8      s   
	)
__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+   r7   r;   ZEllipticCurvePrivateKeyr,   ZEllipticCurvePublicKeyr8   r   r   r   r   <module>   s    

\