a
    p]a;4                     @   s   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 ejdddZd	d
 Zdd Zdd Zdd Zdd ZG dd deZG dd deZG dd dejZG dd dejZdS )    )utils)InvalidSignatureUnsupportedAlgorithm_Reasons)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashesserialization)AsymmetricSignatureContextAsymmetricVerificationContextecsignature_algorithmc                 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_ALGORITHMr    r   Flib/python3.9/site-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s^| 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_IS_LIBRESSLZ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_curveA   s    r"   c                 C   s8   zt j|  W S  ty2   td|tjY n0 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_curveM   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_signW   s    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   
public_key	signaturer,   r-   r   r   r   _ecdsa_sig_verifyd   s    r1   c                   @   s>   e Zd ZejejdddZeddddZ	edd	d
Z
dS )_ECDSASignatureContext)r+   	algorithmc                 C   s   || _ || _t||| _d S N)_backend_private_keyr	   Hash_digest)selfr   r+   r3   r   r   r   __init__n   s    z_ECDSASignatureContext.__init__Nr,   returnc                 C   s   | j | d S r4   r8   updater9   r,   r   r   r   r>   x   s    z_ECDSASignatureContext.updater<   c                 C   s   | j  }t| j| j|S r4   )r8   finalizer.   r5   r6   r9   Zdigestr   r   r   rA   {   s    
z_ECDSASignatureContext.finalize)__name__
__module____qualname__r   EllipticCurvePrivateKeyr	   HashAlgorithmr:   bytesr>   rA   r   r   r   r   r2   m   s
   
r2   c                   @   s@   e Zd ZejeejdddZeddddZ	ddd	d
Z
dS )_ECDSAVerificationContext)r/   r0   r3   c                 C   s$   || _ || _|| _t||| _d S r4   )r5   _public_key
_signaturer	   r7   r8   )r9   r   r/   r0   r3   r   r   r   r:      s    z"_ECDSAVerificationContext.__init__Nr;   c                 C   s   | j | d S r4   r=   r?   r   r   r   r>      s    z _ECDSAVerificationContext.updater@   c                 C   s"   | j  }t| j| j| j| d S r4   )r8   rA   r1   r5   rJ   rK   rB   r   r   r   verify   s    
z _ECDSAVerificationContext.verify)rC   rD   rE   r   EllipticCurvePublicKeyrH   r	   rG   r:   r>   rL   r   r   r   r   rI      s   rI   c                   @   s   e Zd Zdd ZedZeedddZ	e
j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 )_EllipticCurvePrivateKeyc                 C   s6   || _ || _|| _t||}t||| _t|| d S r4   r5   r'   	_evp_pkeyr!   r%   _curver"   r9   r   Zec_key_cdataevp_pkeyr    r   r   r   r:      s    
z!_EllipticCurvePrivateKey.__init__rQ   r@   c                 C   s   | j jS r4   curvekey_sizer9   r   r   r   rV      s    z!_EllipticCurvePrivateKey.key_size)r   r<   c                 C   s:   t   t| t|j t|jtjs*J t| j| |jS r4   )	r   r   r   r3   r   r	   rG   r2   r5   )r9   r   r   r   r   signer   s    

z_EllipticCurvePrivateKey.signer)r3   peer_public_keyr<   c                 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[])r5   Z+elliptic_curve_exchange_algorithm_supportedrU   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*   )r9   r3   rY   r   Zz_lenZz_bufZpeer_keyrr   r   r   exchange   s0    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&   )r5   r   r   r'   r   r   r   r   Z_ec_key_new_by_curve_nidr^   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)r9   r   Z	curve_nidZpublic_ec_keypointr-   rS   r   r   r   r/      s    z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r5   r   ZEC_KEY_get0_private_keyr'   
_bn_to_intr   EllipticCurvePrivateNumbersr/   rd   )r9   Zbnrc   r   r   r   private_numbers   s    
z(_EllipticCurvePrivateKey.private_numbers)encodingr$   encryption_algorithmr<   c                 C   s   | j |||| | j| jS r4   )r5   Z_private_key_bytesrP   r'   )r9   rh   r$   ri   r   r   r   private_bytes   s    z&_EllipticCurvePrivateKey.private_bytes)r,   r   r<   c                 C   s*   t | t| j||j\}}t| j| |S r4   )r   r   r5   
_algorithmr.   )r9   r,   r   r3   r   r   r   sign   s    z_EllipticCurvePrivateKey.signN)rC   rD   rE   r:   r   read_only_propertyrU   propertyintrV   r   EllipticCurveSignatureAlgorithmr   rX   ZECDHrM   rH   r`   r/   rf   rg   r
   EncodingZPrivateFormatZKeySerializationEncryptionrj   rl   r   r   r   r   rN      s*   	
 
rN   c                   @   s   e Zd Zdd ZedZeedddZ	e
ej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 )ra   c                 C   s6   || _ || _|| _t||}t||| _t|| d S r4   rO   rR   r   r   r   r:     s    
z _EllipticCurvePublicKey.__init__rQ   r@   c                 C   s   | j jS r4   rT   rW   r   r   r   rV     s    z _EllipticCurvePublicKey.key_size)r0   r   r<   c                 C   sH   t   td| t| t|j t|jtjs6J t	| j
| ||jS )Nr0   )r   r   _check_bytesr   r   r3   r   r	   rG   rI   r5   )r9   r0   r   r   r   r   verifier  s    
z _EllipticCurvePublicKey.verifierc           
      C   s   | j | j\}}| j j| j}| j || j jjk | j  d}| j j	|}| j j	|}||||||}| j |dk | j 
|}| j 
|}	W d    n1 s0    Y  tj||	| jdS )Nr&   )xyrU   )r5   Z _ec_key_determine_group_get_funcr'   r   r^   r   r   r   _tmp_bn_ctxZ
BN_CTX_getre   r   EllipticCurvePublicNumbersrQ   )
r9   Zget_funcr   rb   bn_ctxZbn_xZbn_yr-   rt   ru   r   r   r   rd   *  s    *z&_EllipticCurvePublicKey.public_numbers)r$   r<   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 v}| jj|||| jjjd|}| j
|dk | jjd|}| jj||||||}| j
||k W d    n1 s0    Y  | jj|d d  S )Nr   zchar[])r
   PublicFormatCompressedPointr5   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointZPOINT_CONVERSION_UNCOMPRESSEDr   r'   r   r   r   r^   rv   ZEC_POINT_point2octr(   r*   )	r9   r$   
conversionr   rb   rx   ZbuflenZbufr-   r   r   r   _encode_point=  s&    
0z%_EllipticCurvePublicKey._encode_point)rh   r$   r<   c                 C   sp   |t jju s$|t jju s$|t jju rV|t jjusD|t jjt jjfvrLtd| |S | j	||| | j
d S d S )NzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r
   rq   ZX962ry   rz   r{   r]   r}   r5   Z_public_key_bytesrP   )r9   rh   r$   r   r   r   public_bytesU  s"    



z$_EllipticCurvePublicKey.public_bytesN)r0   r,   r   r<   c                 C   s0   t | t| j||j\}}t| j| || d S r4   )r   r   r5   rk   r1   )r9   r0   r,   r   r3   r   r   r   rL   n  s    z_EllipticCurvePublicKey.verify)rC   rD   rE   r:   r   rm   rU   rn   ro   rV   rH   r   rp   r   rs   rw   rd   r
   ry   r}   rq   r~   rL   r   r   r   r   ra   
  s&   	
ra   N)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   rp   r   r!   r"   r%   r.   r1   r2   rI   rF   rN   rM   ra   r   r   r   r   <module>   s   

	r