o
    ™¨Êh.(  ã                   @   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   ÚECDSAr   r   Ú UNSUPPORTED_PUBLIC_KEY_ALGORITHM)Úsignature_algorithm© r   úY/var/www/html/env/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/ec.pyÚ_check_signature_algorithm   s   þÿr   c                 C   sr   | j  |¡}|  || jjk¡ | j  |¡}|| j jkrtdƒ‚| j  |¡}|  || jjk¡ | j 	|¡ 
d¡}|S )NzCECDSA certificates with unnamed curves are unsupported at this timeÚascii)Ú_libÚEC_KEY_get0_groupÚopenssl_assertÚ_ffiÚNULLÚEC_GROUP_get_curve_nameÚ	NID_undefÚNotImplementedErrorÚ
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_curve0   s   ÿr.   c                 C   s0   zt j| ƒ W S  ty   td |¡tjƒ‚w )Nz%{0} is not a supported elliptic curve)r   Ú_CURVE_TYPESÚKeyErrorr   Úformatr   ÚUNSUPPORTED_ELLIPTIC_CURVE)r$   r)   r   r   r   Ú_sn_to_elliptic_curve<   s   þÿr3   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_signF   s   ÿrA   c                 C   s8   | j  d|t|ƒ|t|ƒ|j¡}|dkr|  ¡  t‚d S )Nr   r4   )r   ÚECDSA_verifyr9   r6   Ú_consume_errorsr   )r$   Ú
public_keyÚ	signaturer<   r@   r   r   r   Ú_ecdsa_sig_verifyS   s   ÿþrF   c                   @   ó$   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__^   s   z_ECDSASignatureContext.__init__c                 C   ó   | j  |¡ d S rI   ©rM   Úupdate©rN   r<   r   r   r   rS   c   ó   z_ECDSASignatureContext.updatec                 C   s   | j  ¡ }t| j| j|ƒS rI   )rM   ÚfinalizerA   rJ   rK   ©rN   Údigestr   r   r   rV   f   s   
z_ECDSASignatureContext.finalizeN)Ú__name__Ú
__module__Ú__qualname__rP   rS   rV   r   r   r   r   rH   \   s    rH   c                   @   rG   )Ú_ECDSAVerificationContextc                 C   s$   || _ || _|| _t ||¡| _d S rI   )rJ   Ú_public_keyÚ
_signaturer   rL   rM   )rN   r$   rD   rE   rO   r   r   r   rP   n   s   z"_ECDSAVerificationContext.__init__c                 C   rQ   rI   rR   rT   r   r   r   rS   t   rU   z _ECDSAVerificationContext.updatec                 C   s"   | j  ¡ }t| j| j| j|ƒ d S rI   )rM   rV   rF   rJ   r]   r^   rW   r   r   r   Úverifyw   s   
ÿz _ECDSAVerificationContext.verifyN)rY   rZ   r[   rP   rS   r_   r   r   r   r   r\   l   s    r\   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   ó6   || _ t||ƒ || _|| _t||ƒ}t||ƒ| _d S rI   ©rJ   r.   r6   Ú	_evp_pkeyr*   r3   Ú_curve©rN   r$   Úec_key_cdataÚevp_pkeyr)   r   r   r   rP   €   ó   

z!_EllipticCurvePrivateKey.__init__rd   c                 C   ó   | j jS rI   ©ÚcurveÚkey_size©rN   r   r   r   rl   ‹   ó   z!_EllipticCurvePrivateKey.key_sizec                 C   s(   t ƒ  t|ƒ t|jƒ t| j| |jƒS rI   )r   r   r
   rO   rH   rJ   )rN   r   r   r   r   Úsigner�   s   

ÿz_EllipticCurvePrivateKey.signerc                 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[])rJ   Ú+elliptic_curve_exchange_algorithm_supportedrk   r   r   ÚUNSUPPORTED_EXCHANGE_ALGORITHMÚnameÚ
ValueErrorr   r   r6   ÚEC_GROUP_get_degreer   r   r7   ÚEC_KEY_get0_public_keyÚECDH_compute_keyr   r:   )rN   rO   Úpeer_public_keyr&   Ú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k¡ | j j 	|| j jj
¡}| j j | j¡}| j  || j jjk¡ | j j ||¡}| j  |dk¡ | j  |¡}t| j ||ƒS )Nr4   )rJ   r   r   r6   r   r   r   r   ÚEC_KEY_new_by_curve_nameÚgcÚEC_KEY_freerw   ÚEC_KEY_set_public_keyÚ_ec_cdata_to_evp_pkeyÚ_EllipticCurvePublicKey)rN   r&   Ú	curve_nidÚpublic_ec_keyÚpointr@   rg   r   r   r   rD   µ   s   
ÿz#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j | j¡}| j  |¡}tj||  ¡  ¡ d�S )N)Úprivate_valueÚpublic_numbers)	rJ   r   ÚEC_KEY_get0_private_keyr6   Ú
_bn_to_intr   ÚEllipticCurvePrivateNumbersrD   r‰   )rN   Úbnrˆ   r   r   r   Úprivate_numbersË   s   
þz(_EllipticCurvePrivateKey.private_numbersc                 C   s   | j  |||| j| j¡S rI   )rJ   Ú_private_key_bytesrc   r6   )rN   Úencodingr1   Úencryption_algorithmr   r   r   Úprivate_bytesÓ   s   ûz&_EllipticCurvePrivateKey.private_bytesc                 C   s*   t |ƒ t| j||jƒ\}}t| j| |ƒS rI   )r   r	   rJ   Ú
_algorithmrA   )rN   r<   r   rO   r   r   r   ÚsignÜ   s
   
ÿz_EllipticCurvePrivateKey.signN)rY   rZ   r[   rP   r   Úread_only_propertyrk   Úpropertyrl   ro   r~   rD   rŽ   r’   r”   r   r   r   r   r`   ~   s    
	
	r`   c                   @   sJ   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S )r„   c                 C   ra   rI   rb   re   r   r   r   rP   æ   rh   z _EllipticCurvePublicKey.__init__rd   c                 C   ri   rI   rj   rm   r   r   r   rl   ñ   rn   z _EllipticCurvePublicKey.key_sizec                 C   s<   t ƒ  t|tƒstdƒ‚t|ƒ t|jƒ t| j| ||jƒS )Nzsignature must be bytes.)	r   r   ÚbytesÚ	TypeErrorr   r
   rO   r\   rJ   )rN   rE   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 )Nr4   )ÚxÚyrk   )rJ   Ú _ec_key_determine_group_get_funcr6   r   rw   r   r   r   Ú_tmp_bn_ctxÚ
BN_CTX_getr‹   r   ÚEllipticCurvePublicNumbersrd   )
rN   Úget_funcr&   r‡   Úbn_ctxÚbn_xÚbn_yr@   rš   r›   r   r   r   r‰      s"   ÿø
ýz&_EllipticCurvePublicKey.public_numbersc                 C   s*   |t jju r
tdƒ‚| j ||| | jd ¡S )Nz1EC public keys do not support PKCS1 serialization)r   ÚPublicFormatÚPKCS1ru   rJ   Ú_public_key_bytesrc   )rN   r�   r1   r   r   r   Úpublic_bytes  s   ÿûz$_EllipticCurvePublicKey.public_bytesc                 C   s0   t |ƒ t| j||jƒ\}}t| j| ||ƒ d S rI   )r   r	   rJ   r“   rF   )rN   rE   r<   r   rO   r   r   r   r_   %  s
   
ÿz_EllipticCurvePublicKey.verifyN)rY   rZ   r[   rP   r   r•   rk   r–   rl   r™   r‰   r§   r_   r   r   r   r   r„   ä   s    
	
r„   N)#Ú
__future__r   r   r   Ú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.   r3   rA   rF   Úregister_interfaceÚobjectrH   r\   Ú(EllipticCurvePrivateKeyWithSerializationr`   Ú'EllipticCurvePublicKeyWithSerializationr„   r   r   r   r   Ú<module>   s(   
	

e