U
    e].1                     @   s  d dl mZmZmZ d dlmZ d dlmZmZm	Z	 d dl
mZmZmZ d dlmZmZ d dlmZmZmZ dd Zd	d
 Zdd Zdd Zdd Zdd ZeeG dd deZeeG dd deZeejG dd deZ eej!G dd deZ"dS )    )absolute_importdivisionprint_function)utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashesserialization)AsymmetricSignatureContextAsymmetricVerificationContextecc                 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)signature_algorithm r   I/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/ec.py_check_signature_algorithm   s
    r   c                 C   s   | j |}| || jjk | j |}|| j jkr>td| j jr^| j 	|dkr^td| j 
|}| || jjk | j|d}|S )Nz;ECDSA keys with unnamed curves are unsupported at this timer   ascii)_libEC_KEY_get0_groupopenssl_assert_ffiNULLEC_GROUP_get_curve_nameZ	NID_undefNotImplementedErrorZ#CRYPTOGRAPHY_OPENSSL_110_OR_GREATERZEC_GROUP_get_asn1_flagZ
OBJ_nid2snstringdecode)backendZec_keygroupZ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    Zec_cdatar   r   r   _mark_asn1_named_ec_curve<   s     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   formatr   ZUNSUPPORTED_ELLIPTIC_CURVE)r    r"   r   r   r   _sn_to_elliptic_curveH   s    r'   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    private_keydataZmax_sizeZsigbufZ
siglen_ptrresr   r   r   _ecdsa_sig_signR   s         r0   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    
public_key	signaturer.   r/   r   r   r   _ecdsa_sig_verify_   s         r3   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_ECDSASignatureContextc                 C   s   || _ || _t||| _d S N)_backend_private_keyr   Hash_digest)selfr    r-   	algorithmr   r   r   __init__j   s    z_ECDSASignatureContext.__init__c                 C   s   | j | d S r5   r9   updater:   r.   r   r   r   r>   o   s    z_ECDSASignatureContext.updatec                 C   s   | j  }t| j| j|S r5   )r9   finalizer0   r6   r7   r:   Zdigestr   r   r   r@   r   s    
z_ECDSASignatureContext.finalizeN)__name__
__module____qualname__r<   r>   r@   r   r   r   r   r4   h   s   r4   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_ECDSAVerificationContextc                 C   s$   || _ || _|| _t||| _d S r5   )r6   _public_key
_signaturer   r8   r9   )r:   r    r1   r2   r;   r   r   r   r<   z   s    z"_ECDSAVerificationContext.__init__c                 C   s   | j | d S r5   r=   r?   r   r   r   r>      s    z _ECDSAVerificationContext.updatec                 C   s"   | j  }t| j| j| j| d S r5   )r9   r@   r3   r6   rF   rG   rA   r   r   r   verify   s    
   z _ECDSAVerificationContext.verifyN)rB   rC   rD   r<   r>   rH   r   r   r   r   rE   x   s   rE   c                   @   sZ   e Zd Zdd ZedZedd Zdd Z	dd	 Z
d
d Zdd Zdd Zdd ZdS )_EllipticCurvePrivateKeyc                 C   s6   || _ || _|| _t||}t||| _t|| d S r5   r6   r)   	_evp_pkeyr#   r'   _curver$   r:   r    Zec_key_cdataevp_pkeyr"   r   r   r   r<      s    
z!_EllipticCurvePrivateKey.__init__rL   c                 C   s   | j jS r5   curvekey_sizer:   r   r   r   rQ      s    z!_EllipticCurvePrivateKey.key_sizec                 C   s(   t   t| t|j t| j| |jS r5   )r   r   r
   r;   r4   r6   )r:   r   r   r   r   signer   s    
  z_EllipticCurvePrivateKey.signerc                 C   s   | j || jstdtj|jj| jjkr4td| j j	| j
}| j j|d d }| j |dk | j jd|}| j j|j
}| j j|||| j
| j jj}| j |dk | j j|d | S )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve      r   z	uint8_t[])r6   Z+elliptic_curve_exchange_algorithm_supportedrP   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMname
ValueErrorr   r   r)   ZEC_GROUP_get_degreer   r   r*   EC_KEY_get0_public_keyZECDH_compute_keyr   r,   )r:   r;   Zpeer_public_keyr!   Zz_lenZz_bufZpeer_keyrr   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k | j j	|| j jj
}| j j| j}| j || j jjk | j j||}| j |dk | j |}t| j ||S )Nr(   )r6   r   r   r)   r   r   r   r   ZEC_KEY_new_by_curve_namegcZEC_KEY_freerX   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)r:   r!   Z	curve_nidZpublic_ec_keypointr/   rN   r   r   r   r1      s     z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r6   r   ZEC_KEY_get0_private_keyr)   
_bn_to_intr   ZEllipticCurvePrivateNumbersr1   r_   )r:   Zbnr^   r   r   r   private_numbers   s    
z(_EllipticCurvePrivateKey.private_numbersc                 C   s   | j |||| j| jS r5   )r6   Z_private_key_bytesrK   r)   )r:   encodingr&   Zencryption_algorithmr   r   r   private_bytes   s    z&_EllipticCurvePrivateKey.private_bytesc                 C   s*   t | t| j||j\}}t| j| |S r5   )r   r	   r6   
_algorithmr0   )r:   r.   r   r;   r   r   r   sign   s      z_EllipticCurvePrivateKey.signN)rB   rC   rD   r<   r   read_only_propertyrP   propertyrQ   rS   rZ   r1   ra   rc   re   r   r   r   r   rI      s   	

	rI   c                   @   sR   e Zd Zdd ZedZedd Zdd Z	dd	 Z
d
d Zdd Zdd ZdS )r\   c                 C   s6   || _ || _|| _t||}t||| _t|| d S r5   rJ   rM   r   r   r   r<      s    
z _EllipticCurvePublicKey.__init__rL   c                 C   s   | j jS r5   rO   rR   r   r   r   rQ      s    z _EllipticCurvePublicKey.key_sizec                 C   s6   t   td| t| t|j t| j| ||jS )Nr2   )r   r   _check_bytesr   r
   r;   rE   r6   )r:   r2   r   r   r   r   verifier  s    
   z _EllipticCurvePublicKey.verifierc           
   	   C   s   | j | j\}}| j j| j}| j || j jjk | j  Z}| j j	|}| j j	|}||||||}| j |dk | j 
|}| j 
|}	W 5 Q R X tj||	| jdS )Nr(   )xyrP   )r6   Z _ec_key_determine_group_get_funcr)   r   rX   r   r   r   _tmp_bn_ctxZ
BN_CTX_getr`   r   ZEllipticCurvePublicNumbersrL   )
r:   Zget_funcr!   r]   bn_ctxZbn_xZbn_yr/   rj   rk   r   r   r   r_     s     z&_EllipticCurvePublicKey.public_numbersc           	   	   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CompressedPointr6   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointAssertionErrorZPOINT_CONVERSION_UNCOMPRESSEDr   r)   r   r   r   rX   rl   ZEC_POINT_point2octr*   r,   )	r:   r&   Z
conversionr!   r]   rm   ZbuflenZbufr/   r   r   r   _encode_point"  s:    
          z%_EllipticCurvePublicKey._encode_pointc                 C   s   |t jjkrtd|t jjks8|t jjks8|t jjkrj|t jjk	sX|t jjt jjfkr`td| |S | j	
||| | jd S d S )Nz1EC public keys do not support PKCS1 serializationzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r   rn   ZPKCS1rW   ZEncodingZX962ro   rp   rr   r6   Z_public_key_bytesrK   )r:   rb   r&   r   r   r   public_bytes:  s8    




z$_EllipticCurvePublicKey.public_bytesc                 C   s0   t | t| j||j\}}t| j| || d S r5   )r   r	   r6   rd   r3   )r:   r2   r.   r   r;   r   r   r   rH   [  s      z_EllipticCurvePublicKey.verifyN)rB   rC   rD   r<   r   rf   rP   rg   rQ   ri   r_   rr   rs   rH   r   r   r   r   r\      s   	


!r\   N)#Z
__future__r   r   r   Zcryptographyr   Zcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr	   r
   r   Zcryptography.hazmat.primitivesr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r#   r$   r'   r0   r3   Zregister_interfaceobjectr4   rE   Z(EllipticCurvePrivateKeyWithSerializationrI   Z'EllipticCurvePublicKeyWithSerializationr\   r   r   r   r   <module>   s&    
	
e
