o
    b62                     @   s   d dl mZ d dlmZmZmZ d dlmZ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_evp_pkey_derive_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_ALGORITHM)r    r   f/var/www/secure340b-portal/env/lib/python3.10/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_curveB   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   Z_CURVE_TYPESKeyErrorr   formatr   ZUNSUPPORTED_ELLIPTIC_CURVE)r   r!   r   r   r   _sn_to_elliptic_curveN   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_signX   s   r0   c                 C   s8   | j d|t||t||j}|dkr|   td S )Nr   r'   )r   ZECDSA_verifyr*   r(   Z_consume_errorsr   )r   
public_key	signaturer-   r/   r   r   r   _ecdsa_sig_verifye   s   r3   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,   r5   r   r   r   __init__o   s   z_ECDSASignatureContext.__init__r-   returnNc                 C      | j | d S r6   r:   updater;   r-   r   r   r   r@   y      z_ECDSASignatureContext.updatec                 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   n   s    

r4   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 )_ECDSAVerificationContextr1   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__r-   r=   Nc                 C   r>   r6   r?   rA   r   r   r   r@      rB   z _ECDSAVerificationContext.updatec                 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)r=   N)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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 r6   r7   r(   	_evp_pkeyr"   r&   _curver#   r;   r   Zec_key_cdataevp_pkeyr!   r   r   r   r<         
z!_EllipticCurvePrivateKey.__init__rU   r=   c                 C      | j jS r6   curvekey_sizer;   r   r   r   r\         z!_EllipticCurvePrivateKey.key_sizer   c                 C   s:   t   t| t|j t|jtjsJ t| j| |jS r6   )	r	   r   r   r5   r   r
   rJ   r4   r7   )r;   r   r   r   r   signer   s   

z_EllipticCurvePrivateKey.signerr5   peer_public_keyc                 C   sD   | j || jstdtj|jj| jjkrtdt| j | j	|S )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve)
r7   Z+elliptic_curve_exchange_algorithm_supportedr[   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMname
ValueErrorr   rT   )r;   r5   r`   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'   )r7   r   r   r(   r   r   r   r   Z_ec_key_new_by_curve_nidEC_KEY_get0_public_keyZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkey_EllipticCurvePublicKey)r;   r   Z	curve_nidZpublic_ec_keypointr/   rW   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_algorithmc                 C   s   | j |||| | j| jS r6   )r7   Z_private_key_bytesrT   r(   )r;   rl   r%   rm   r   r   r   private_bytes   s   z&_EllipticCurvePrivateKey.private_bytesr-   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_propertyr[   propertyintr\   r   EllipticCurveSignatureAlgorithmr   r_   ZECDHrP   rK   rc   r1   rj   rk   r   EncodingZPrivateFormatZKeySerializationEncryptionrn   rp   r   r   r   r   rQ      sF    
	


rQ   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 )re   c                 C   rR   r6   rS   rV   r   r   r   r<      rX   z _EllipticCurvePublicKey.__init__rU   r=   c                 C   rY   r6   rZ   r]   r   r   r   r\     r^   z _EllipticCurvePublicKey.key_sizer2   r   c                 C   sH   t   td| t| t|j t|jtjsJ t	| j
| ||jS )Nr2   )r	   r   _check_bytesr   r   r5   r   r
   rJ   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  2}| j j	|}| j j	|}||||||}| j |dk | j 
|}| j 
|}	W d    n1 sVw   Y  tj||	| jdS )Nr'   )xyr[   )r7   Z _ec_key_determine_group_get_funcr(   r   rd   r   r   r   _tmp_bn_ctxZ
BN_CTX_getri   r   EllipticCurvePublicNumbersrU   )
r;   Zget_funcr   rf   bn_ctxZbn_xZbn_yr/   rx   ry   r   r   r   rh     s   
z&_EllipticCurvePublicKey.public_numbersr%   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CompressedPointr7   r   ZPOINT_CONVERSION_COMPRESSEDUncompressedPointZPOINT_CONVERSION_UNCOMPRESSEDr   r(   r   r   r   rd   rz   ZEC_POINT_point2octr)   r+   )	r;   r%   
conversionr   rf   r|   buflenbufr/   r   r   r   _encode_point2  s(   
z%_EllipticCurvePublicKey._encode_pointrl   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   ru   ZX962r}   r~   r   rb   r   r7   Z_public_key_bytesrT   )r;   rl   r%   r   r   r   public_bytesJ  s"   



z$_EllipticCurvePublicKey.public_bytesr-   Nc                 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   c  s   z_EllipticCurvePublicKey.verify)rF   rG   rH   r<   r   rq   r[   rr   rs   r\   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   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"   


	f