U
    EZh+                     @   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rVd dlmZ ejdddd	Zd
edddZd
dddZd
ddddZd
eejdddZd
deedddZd
deedd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   n/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithm   s
    r   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   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 ||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_infinityK   s    r$   )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_curveV   s    r&   _EllipticCurvePrivateKey)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_sign`   s         r1   _EllipticCurvePublicKey)r   
public_key	signaturer)   r   c                 C   s8   | j d|t||t||j}|dkr4|   td S )Nr   r*   )r   ZECDSA_verifyr-   r+   Z_consume_errorsr   )r   r3   r4   r)   r0   r   r   r   _ecdsa_sig_verifyo   s         r5   c                   @   s   e Zd ZddddZeejdddZeeddd	Z	ej
ejed
ddZejdddZejdddZejejejedddZeejedddZdS )r'   r	   r   c                 C   s@   || _ || _|| _t||}t||| _t|| t|| d S N_backendr+   	_evp_pkeyr   r&   _curver!   r$   selfr   Zec_key_cdataevp_pkeyr   r   r   r   __init__~   s    

z!_EllipticCurvePrivateKey.__init__r   c                 C   s   | j S r6   r:   r<   r   r   r   curve   s    z_EllipticCurvePrivateKey.curvec                 C   s   | j jS r6   rB   key_sizerA   r   r   r   rD      s    z!_EllipticCurvePrivateKey.key_size)	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)
r8   Z+elliptic_curve_exchange_algorithm_supportedrB   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMnamer   r   r9   )r<   rE   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*   )r8   r   r   r+   r   r   r   r   Z_ec_key_new_by_curve_nidr"   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkeyr2   )r<   r   Z	curve_nidZpublic_ec_keyr#   r0   r=   r   r   r   r3      s    z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r8   r   ZEC_KEY_get0_private_keyr+   
_bn_to_intr   EllipticCurvePrivateNumbersr3   rJ   )r<   ZbnrI   r   r   r   private_numbers   s    
z(_EllipticCurvePrivateKey.private_numbers)encodingformatencryption_algorithmr   c                 C   s   | j |||| | j| jS r6   )r8   Z_private_key_bytesr9   r+   )r<   rN   rO   rP   r   r   r   private_bytes   s    z&_EllipticCurvePrivateKey.private_bytes)r)   r
   r   c                 C   s&   t | t||j\}}t| j| |S r6   )r   r   rE   r1   r8   )r<   r)   r
   _r   r   r   sign   s    z_EllipticCurvePrivateKey.signN)__name__
__module____qualname__r>   propertyr   EllipticCurverB   intrD   ZECDHEllipticCurvePublicKeybytesrH   r3   rL   rM   r   EncodingZPrivateFormatZKeySerializationEncryptionrQ   EllipticCurveSignatureAlgorithmrS   r   r   r   r   r'   }   s(   
 
c                   @   s   e Zd ZddddZeejdddZeeddd	Z	ej
dd
dZejedddZejejedddZeeejddddZdS )r2   r	   r   c                 C   s@   || _ || _|| _t||}t||| _t|| t|| d S r6   r7   r;   r   r   r   r>      s    

z _EllipticCurvePublicKey.__init__r?   c                 C   s   | j S r6   r@   rA   r   r   r   rB      s    z_EllipticCurvePublicKey.curvec                 C   s   | j jS r6   rC   rA   r   r   r   rD      s    z _EllipticCurvePublicKey.key_sizec           	   	   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 )Nr*   )xyrB   )r8   r   r   r+   r   r   r   r"   _tmp_bn_ctxZ
BN_CTX_getZEC_POINT_get_affine_coordinatesrK   r   EllipticCurvePublicNumbersr:   )	r<   r   r#   bn_ctxZbn_xZbn_yr0   r^   r_   r   r   r   rJ      s$        z&_EllipticCurvePublicKey.public_numbers)rO   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CompressedPointr8   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointAssertionErrorZPOINT_CONVERSION_UNCOMPRESSEDr   r+   r   r   r   r"   r`   ZEC_POINT_point2octr,   r.   )	r<   rO   
conversionr   r#   rb   buflenbufr0   r   r   r   _encode_point  s:    
          z%_EllipticCurvePublicKey._encode_point)rN   rO   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   r\   ZX962rc   rd   re   r   rj   r8   Z_public_key_bytesr9   )r<   rN   rO   r   r   r   public_bytes  s*    



    z$_EllipticCurvePublicKey.public_bytesN)r4   r)   r
   r   c                 C   s,   t | t||j\}}t| j| || d S r6   )r   r   rE   r5   r8   )r<   r4   r)   r
   rR   r   r   r   verify2  s    z_EllipticCurvePublicKey.verify)rT   rU   rV   r>   rW   r   rX   rB   rY   rD   ra   rJ   r   rc   r[   rj   r\   rk   r]   rl   r   r   r   r   r2      s    
)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   strr   r!   r$   rX   r&   r[   r1   r5   ZEllipticCurvePrivateKeyr'   rZ   r2   r   r   r   r   <module>   s4   
  \