o
    )%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 dejf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   ECDSAr   r    UNSUPPORTED_PUBLIC_KEY_ALGORITHM)r    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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_name	NID_undefNotImplementedErrorCRYPTOGRAPHY_IS_LIBRESSLEC_GROUP_get_asn1_flag
OBJ_nid2snstringdecode)backendec_keygroupnid
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   EC_KEY_set_asn1_flagOPENSSL_EC_NAMED_CURVE)r#   ec_cdatar   r   r   _mark_asn1_named_ec_curveA   s   r-   c                 C   s0   zt j|  W S  ty   td|tjw )Nz${} is not a supported elliptic curve)r   _CURVE_TYPESKeyErrorr   formatr   UNSUPPORTED_ELLIPTIC_CURVE)r#   r(   r   r   r   _sn_to_elliptic_curveM   s   r2   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   
ECDSA_size_ec_keyr   r   new
ECDSA_signlenbuffer)r#   private_keydatamax_sizesigbuf
siglen_ptrresr   r   r   _ecdsa_sig_signW   s   r@   c                 C   s8   | j d|t||t||j}|dkr|   td S )Nr   r3   )r   ECDSA_verifyr8   r5   _consume_errorsr   )r#   
public_key	signaturer;   r?   r   r   r   _ecdsa_sig_verifyd   s   rE   c                   @   sB   e Zd ZdejdejfddZdeddfdd	Z	defd
dZ
dS )_ECDSASignatureContextr:   	algorithmc                 C   s   || _ || _t||| _d S N)_backend_private_keyr	   Hash_digest)selfr#   r:   rG   r   r   r   __init__n   s   z_ECDSASignatureContext.__init__r;   returnNc                 C      | j | d S rH   rL   updaterM   r;   r   r   r   rR   x      z_ECDSASignatureContext.updatec                 C   s   | j  }t| j| j|S rH   )rL   finalizer@   rI   rJ   rM   digestr   r   r   rU   {   s   
z_ECDSASignatureContext.finalize)__name__
__module____qualname__r   EllipticCurvePrivateKeyr	   HashAlgorithmrN   bytesrR   rU   r   r   r   r   rF   m   s    

rF   c                   @   sB   e Zd ZdejdedejfddZdeddfd	d
Z	dddZ
dS )_ECDSAVerificationContextrC   rD   rG   c                 C   s$   || _ || _|| _t||| _d S rH   )rI   _public_key
_signaturer	   rK   rL   )rM   r#   rC   rD   rG   r   r   r   rN      s   z"_ECDSAVerificationContext.__init__r;   rO   Nc                 C   rP   rH   rQ   rS   r   r   r   rR      rT   z _ECDSAVerificationContext.updatec                 C   s"   | j  }t| j| j| j| d S rH   )rL   rU   rE   rI   r_   r`   rV   r   r   r   verify   s   
z _ECDSAVerificationContext.verify)rO   N)rX   rY   rZ   r   EllipticCurvePublicKeyr]   r	   r\   rN   rR   ra   r   r   r   r   r^      s    
r^   c                   @   s   e Zd Zdd ZedZede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
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 )_EllipticCurvePrivateKeyc                 C   6   || _ || _|| _t||}t||| _t|| d S rH   rI   r5   	_evp_pkeyr)   r2   _curver-   rM   r#   ec_key_cdataevp_pkeyr(   r   r   r   rN         
z!_EllipticCurvePrivateKey.__init__rg   rO   c                 C      | j jS rH   curvekey_sizerM   r   r   r   ro         z!_EllipticCurvePrivateKey.key_sizer   c                 C   s:   t   t| t|j t|jtjsJ t| j| |jS rH   )	r   r   r   rG   r   r	   r\   rF   rI   )rM   r   r   r   r   signer   s   

z_EllipticCurvePrivateKey.signerrG   peer_public_keyc                 C   s   | j || jstdtj|jj| jjkrt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[])rI   +elliptic_curve_exchange_algorithm_supportedrn   r   r   UNSUPPORTED_EXCHANGE_ALGORITHMname
ValueErrorr   r   r5   EC_GROUP_get_degreer   r   r6   EC_KEY_get0_public_keyECDH_compute_keyr   r9   )rM   rG   rs   r%   z_lenz_buf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 )Nr3   )rI   r   r   r5   r   r   r   r   _ec_key_new_by_curve_nidr{   EC_KEY_set_public_key_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)rM   r%   	curve_nidpublic_ec_keypointr?   rj   r   r   r   rC      s   z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	rI   r   EC_KEY_get0_private_keyr5   
_bn_to_intr   EllipticCurvePrivateNumbersrC   r   )rM   bnr   r   r   r   private_numbers   s   
z(_EllipticCurvePrivateKey.private_numbersencodingr0   encryption_algorithmc                 C   s   | j |||| | j| jS rH   )rI   _private_key_bytesrf   r5   )rM   r   r0   r   r   r   r   private_bytes   s   z&_EllipticCurvePrivateKey.private_bytesr;   c                 C   s*   t | t| j||j\}}t| j| |S rH   )r   r   rI   
_algorithmr@   )rM   r;   r   rG   r   r   r   sign   s   z_EllipticCurvePrivateKey.signN)rX   rY   rZ   rN   r   read_only_propertyrn   propertyintro   r   EllipticCurveSignatureAlgorithmr   rr   ECDHrb   r]   r   rC   r   r   r
   EncodingPrivateFormatKeySerializationEncryptionr   r   r   r   r   r   rc      sF    
	

 
rc   c                   @   s   e Zd Zdd ZedZedefddZ	de
dej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 )r   c                 C   rd   rH   re   rh   r   r   r   rN     rk   z _EllipticCurvePublicKey.__init__rg   rO   c                 C   rl   rH   rm   rp   r   r   r   ro     rq   z _EllipticCurvePublicKey.key_sizerD   r   c                 C   sH   t   td| t| t|j t|jtjsJ t	| j
| ||jS )NrD   )r   r   _check_bytesr   r   rG   r   r	   r\   r^   rI   )rM   rD   r   r   r   r   verifier  s   
z _EllipticCurvePublicKey.verifierc           
      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 )Nr3   )xyrn   )rI    _ec_key_determine_group_get_funcr5   r   r{   r   r   r   _tmp_bn_ctx
BN_CTX_getr   r   EllipticCurvePublicNumbersrg   )
rM   get_funcr%   r   bn_ctxbn_xbn_yr?   r   r   r   r   r   r   *  s   
z&_EllipticCurvePublicKey.public_numbersr0   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CompressedPointrI   r   POINT_CONVERSION_COMPRESSEDUncompressedPointPOINT_CONVERSION_UNCOMPRESSEDr   r5   r   r   r   r{   r   EC_POINT_point2octr6   r9   )	rM   r0   
conversionr%   r   r   buflenbufr?   r   r   r   _encode_point=  s(   
z%_EllipticCurvePublicKey._encode_pointr   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
   r   X962r   r   r   ry   r   rI   _public_key_bytesrf   )rM   r   r0   r   r   r   public_bytesU  s   
z$_EllipticCurvePublicKey.public_bytesr;   Nc                 C   s0   t | t| j||j\}}t| j| || d S rH   )r   r   rI   r   rE   )rM   rD   r;   r   rG   r   r   r   ra   n  s   z_EllipticCurvePublicKey.verify)rX   rY   rZ   rN   r   r   rn   r   r   ro   r]   r   r   r   r   r   r   r
   r   r   r   r   ra   r   r   r   r   r   
  s<    
	

r   N)cryptographyr   cryptography.exceptionsr   r   r   *cryptography.hazmat.backends.openssl.utilsr   r   r   cryptography.hazmat.primitivesr	   r
   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   r)   r-   r2   r@   rE   rF   r^   r[   rc   rb   r   r   r   r   r   <module>   s"   


	r