U
    [e;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   i/var/www/html/services/stratfitenv/lib/python3.8/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group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   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_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datamax_sizeZsigbufZ
siglen_ptrresr   r   r   _ecdsa_sig_signW   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_verifyd   s         r3   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,   r5   r   r   r   __init__n   s    z_ECDSASignatureContext.__init__Nr-   returnc                 C   s   | j | d S r6   r:   updater;   r-   r   r   r   r@   x   s    z_ECDSASignatureContext.updater>   c                 C   s   | j  }t| j| j|S r6   )r:   finalizer0   r7   r8   r;   digestr   r   r   rC   {   s    
z_ECDSASignatureContext.finalize)__name__
__module____qualname__r   EllipticCurvePrivateKeyr	   HashAlgorithmr<   bytesr@   rC   r   r   r   r   r4   m   s
   
r4   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)r1   r2   r5   c                 C   s$   || _ || _|| _t||| _d S r6   )r7   _public_key
_signaturer	   r9   r:   )r;   r   r1   r2   r5   r   r   r   r<      s    z"_ECDSAVerificationContext.__init__Nr=   c                 C   s   | j | d S r6   r?   rA   r   r   r   r@      s    z _ECDSAVerificationContext.updaterB   c                 C   s"   | j  }t| j| j| j| d S r6   )r:   rC   r3   r7   rM   rN   rD   r   r   r   verify   s    
   z _ECDSAVerificationContext.verify)rF   rG   rH   r   EllipticCurvePublicKeyrK   r	   rJ   r<   r@   rO   r   r   r   r   rL      s   rL   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 r6   r7   r(   	_evp_pkeyr"   r&   _curver#   r;   r   Zec_key_cdataevp_pkeyr!   r   r   r   r<      s    
z!_EllipticCurvePrivateKey.__init__rT   rB   c                 C   s   | j jS r6   curvekey_sizer;   r   r   r   rY      s    z!_EllipticCurvePrivateKey.key_size)r   r>   c                 C   s:   t   t| t|j t|jtjs*tt| j	| |jS r6   )
r   r   r   r5   r   r	   rJ   AssertionErrorr4   r7   )r;   r   r   r   r   signer   s    
  z_EllipticCurvePrivateKey.signer)r5   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[])r7   Z+elliptic_curve_exchange_algorithm_supportedrX   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;   r5   r]   r   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 jjk | j j
||}| j |dk | j |}t| j ||S )Nr'   )r7   r   r   r(   r   r   r   r   Z_ec_key_new_by_curve_nidrb   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)r;   r   Z	curve_nidZpublic_ec_keypointr/   rV   r   r   r   r1      s    z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j| j}| j |}tj||   dS )N)private_valuepublic_numbers)	r7   r   ZEC_KEY_get0_private_keyr(   
_bn_to_intr   EllipticCurvePrivateNumbersr1   rh   )r;   Zbnrg   r   r   r   private_numbers   s    
z(_EllipticCurvePrivateKey.private_numbers)encodingr%   encryption_algorithmr>   c                 C   s   | j |||| | j| jS r6   )r7   Z_private_key_bytesrS   r(   )r;   rl   r%   rm   r   r   r   private_bytes   s    z&_EllipticCurvePrivateKey.private_bytes)r-   r   r>   c                 C   s*   t | t| j||j\}}t| j| |S r6   )r   r   r7   
_algorithmr0   )r;   r-   r   r5   r   r   r   sign   s    z_EllipticCurvePrivateKey.signN)rF   rG   rH   r<   r   read_only_propertyrX   propertyintrY   r   EllipticCurveSignatureAlgorithmr   r\   ZECDHrP   rK   rd   r1   rj   rk   r
   EncodingZPrivateFormatZKeySerializationEncryptionrn   rp   r   r   r   r   rQ      s,   	
  
rQ   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 )re   c                 C   s6   || _ || _|| _t||}t||| _t|| d S r6   rR   rU   r   r   r   r<     s    
z _EllipticCurvePublicKey.__init__rT   rB   c                 C   s   | j jS r6   rW   rZ   r   r   r   rY     s    z _EllipticCurvePublicKey.key_size)r2   r   r>   c                 C   sH   t   td| t| t|j t|jtjs6t	t
| j| ||jS )Nr2   )r   r   _check_bytesr   r   r5   r   r	   rJ   r[   rL   r7   )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yrX   )r7   Z _ec_key_determine_group_get_funcr(   r   rb   r   r   r   _tmp_bn_ctxZ
BN_CTX_getri   r   EllipticCurvePublicNumbersrT   )
r;   Zget_funcr   rf   bn_ctxZbn_xZbn_yr/   rx   ry   r   r   r   rh   *  s    z&_EllipticCurvePublicKey.public_numbers)r%   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CompressedPointr7   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointr[   ZPOINT_CONVERSION_UNCOMPRESSEDr   r(   r   r   r   rb   rz   ZEC_POINT_point2octr)   r+   )	r;   r%   
conversionr   rf   r|   buflenbufr/   r   r   r   _encode_point=  s:    
          z%_EllipticCurvePublicKey._encode_point)rl   r%   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
   ru   ZX962r}   r~   r   ra   r   r7   Z_public_key_bytesrS   )r;   rl   r%   r   r   r   public_bytesU  s*    



    z$_EllipticCurvePublicKey.public_bytesN)r2   r-   r   r>   c                 C   s0   t | t| j||j\}}t| j| || d S r6   )r   r   r7   ro   r3   )r;   r2   r-   r   r5   r   r   r   rO   n  s    z_EllipticCurvePublicKey.verify)rF   rG   rH   r<   r   rq   rX   rr   rs   rY   rK   r   rt   r   rw   r{   rh   r
   r}   r   ru   r   rO   r   r   r   r   re   
  s&   	
re   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   rt   r   r"   r#   r&   r0   r3   r4   rL   rI   rQ   rP   re   r   r   r   r   <module>   s   

	r