U
    ÒZj_+  ã                   @   sü   d dl Z d dlmZmZmZ d dlmZmZ d dlm	Z	 d dl
mZ e jrVd dlmZ ejddœdd	„Zd
edœdd„Zd
dœdd„Zd
ddœdd„Zd
eejdœdd„Zd
deedœdd„Zd
deeddœdd„ZG dd„ dejƒZG dd„ dejƒZdS ) é    N)ÚInvalidSignatureÚUnsupportedAlgorithmÚ_Reasons)Ú_calculate_digest_and_algorithmÚ_evp_pkey_derive)Úserialization)Úec)ÚBackend)Úsignature_algorithmÚreturnc                 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   új/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/ec.pyÚ_check_signature_algorithm   s
    þr   r	   )Úbackendr   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 explicit parameters are unsupported at this timer   Úascii)Ú_libÚEC_KEY_get0_groupÚopenssl_assertÚ_ffiÚNULLÚEC_GROUP_get_curve_nameZ	NID_undefÚ
ValueErrorZCRYPTOGRAPHY_IS_LIBRESSLZEC_GROUP_get_asn1_flagZ
OBJ_nid2snÚstringÚdecode)r   Zec_keyÚgroupÚnidZ
curve_nameÚsnr   r   r   Ú_ec_key_curve_sn!   s$    ÿÿþÿr   ©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   Úec_cdatar   r   r   Ú_mark_asn1_named_ec_curve?   s     ÿr!   c                 C   sV   | j  |¡}|  || jjk¡ | j  |¡}|  || jjk¡ | j  ||¡rRtdƒ‚d S )Nz;Cannot load an EC public key where the point is at infinity)r   ÚEC_KEY_get0_public_keyr   r   r   r   ZEC_POINT_is_at_infinityr   )r   r    Úpointr   r   r   r   Ú_check_key_infinityK   s    ÿr$   )r   r   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_curveV   s    þr'   Ú_EllipticCurvePrivateKey)r   Úprivate_keyÚdatar   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   r)   r*   Úmax_sizeZsigbufZ
siglen_ptrÚresr   r   r   Ú_ecdsa_sig_sign`   s         ÿr2   Ú_EllipticCurvePublicKey)r   Ú
public_keyÚ	signaturer*   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   r4   r5   r*   r1   r   r   r   Ú_ecdsa_sig_verifyo   s         ÿr6   c                   @   s¤   e Zd Zddœdd„Zeejdœdd„ƒZe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 )r(   r	   r   c                 C   s@   || _ || _|| _t||ƒ}t||ƒ| _t||ƒ t||ƒ d S ©N©Ú_backendr,   Ú	_evp_pkeyr   r'   Ú_curver!   r$   ©Úselfr   Zec_key_cdataÚevp_pkeyr   r   r   r   Ú__init__~   s    

z!_EllipticCurvePrivateKey.__init__©r   c                 C   s   | j S r7   ©r;   ©r=   r   r   r   Úcurveˆ   s    z_EllipticCurvePrivateKey.curvec                 C   s   | j jS r7   ©rC   Úkey_sizerB   r   r   r   rE   Œ   s    z!_EllipticCurvePrivateKey.key_size)Ú	algorithmÚpeer_public_keyr   c                 C   sD   | j  || j¡stdtjƒ‚|jj| jjkr4tdƒ‚t| j | j	|ƒS )Nz1This backend does not support the ECDH algorithm.z2peer_public_key and self are not on the same curve)
r9   Z+elliptic_curve_exchange_algorithm_supportedrC   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMÚnamer   r   r:   )r=   rF   rG   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+   )r9   r   r   r,   r   r   r   r   Z_ec_key_new_by_curve_nidr"   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkeyr3   )r=   r   Z	curve_nidZpublic_ec_keyr#   r1   r>   r   r   r   r4   ¤   s    z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j | j¡}| j  |¡}tj||  ¡  ¡ d�S )N)Úprivate_valueÚpublic_numbers)	r9   r   ZEC_KEY_get0_private_keyr,   Ú
_bn_to_intr   ÚEllipticCurvePrivateNumbersr4   rK   )r=   ZbnrJ   r   r   r   Úprivate_numbersµ   s    
þz(_EllipticCurvePrivateKey.private_numbers)Úencodingr&   Úencryption_algorithmr   c                 C   s   | j  |||| | j| j¡S r7   )r9   Z_private_key_bytesr:   r,   )r=   rO   r&   rP   r   r   r   Úprivate_bytes½   s    úz&_EllipticCurvePrivateKey.private_bytes)r*   r
   r   c                 C   s&   t |ƒ t||jƒ\}}t| j| |ƒS r7   )r   r   rF   r2   r9   )r=   r*   r
   Ú_r   r   r   ÚsignÌ   s    þz_EllipticCurvePrivateKey.signN)Ú__name__Ú
__module__Ú__qualname__r?   Úpropertyr   ÚEllipticCurverC   ÚintrE   ZECDHÚEllipticCurvePublicKeyÚbytesrI   r4   rM   rN   r   ÚEncodingZPrivateFormatZKeySerializationEncryptionrQ   ÚEllipticCurveSignatureAlgorithmrS   r   r   r   r   r(   }   s(   
 þ
ûüc                   @   sŽ   e Zd Zddœdd„Zeejdœdd„ƒZe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 )r3   r	   r   c                 C   s@   || _ || _|| _t||ƒ}t||ƒ| _t||ƒ t||ƒ d S r7   r8   r<   r   r   r   r?   Ú   s    

z _EllipticCurvePublicKey.__init__r@   c                 C   s   | j S r7   rA   rB   r   r   r   rC   ä   s    z_EllipticCurvePublicKey.curvec                 C   s   | j jS r7   rD   rB   r   r   r   rE   è   s    z _EllipticCurvePublicKey.key_sizec           
   	   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ÚyrC   )r9   Z _ec_key_determine_group_get_funcr,   r   r"   r   r   r   Ú_tmp_bn_ctxZ
BN_CTX_getrL   r   ÚEllipticCurvePublicNumbersr;   )
r=   Zget_funcr   r#   Úbn_ctxZbn_xZbn_yr1   r^   r_   r   r   r   rK   ì   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ÚCompressedPointr9   r   ZPOINT_CONVERSION_COMPRESSEDÚUncompressedPointÚAssertionErrorZPOINT_CONVERSION_UNCOMPRESSEDr   r,   r   r   r   r"   r`   ZEC_POINT_point2octr-   r/   )	r=   r&   Ú
conversionr   r#   rb   ÚbuflenÚbufr1   r   r   r   Ú_encode_pointÿ   s:    
     ÿ     ÿz%_EllipticCurvePublicKey._encode_point)rO   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   r\   ZX962rc   rd   re   r   rj   r9   Z_public_key_bytesr:   )r=   rO   r&   r   r   r   Úpublic_bytes  s*    
ÿ
þ
ýþÿ
    ÿz$_EllipticCurvePublicKey.public_bytesN)r5   r*   r
   r   c                 C   s,   t |ƒ t||jƒ\}}t| j| ||ƒ d S r7   )r   r   rF   r6   r9   )r=   r5   r*   r
   rR   r   r   r   Úverify0  s    þz_EllipticCurvePublicKey.verify)rT   rU   rV   r?   rW   r   rX   rC   rY   rE   ra   rK   r   rc   r[   rj   r\   rk   r]   rl   r   r   r   r   r3   Ù   s    
üû)ÚtypingZcryptography.exceptionsr   r   r   Z*cryptography.hazmat.backends.openssl.utilsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   ÚTYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr	   r]   r   Ústrr   r!   r$   rX   r'   r[   r2   r6   ZEllipticCurvePrivateKeyr(   rZ   r3   r   r   r   r   Ú<module>   s4   þ
  þû\