o
    îRµi_8  ã                   @   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d„Zd#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-   r#   ÚBackendÚreturnNc                 C   sV   | j  |¡}|  || jjk¡ | j  |¡}|  || jjk¡ | j  ||¡r)t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   ÚEC_POINT_is_at_infinityÚ
ValueError)r#   r,   Úpointr%   r   r   r   Ú_check_key_infinityM   s   ÿÿr4   c                 C   s\   | j  |¡}|  || jjk¡ | j  |¡}|  |¡}|dkr*| j  |¡dkr,tdƒ‚d S d S )Né   z1Invalid EC key (key out of range, infinity, etc.))	r   r   r   r   r   ÚEC_GROUP_get0_cofactorÚ
_bn_to_intÚEC_KEY_check_keyr2   )r#   r,   r%   ÚbnÚcofactorr   r   r   Ú_check_key_cofactorW   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_curveb   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[]r5   )	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_signl   s   ÿrM   c                 C   s8   | j  d|t|ƒ|t|ƒ|j¡}|dkr|  ¡  t‚d S )Nr   r5   )r   ÚECDSA_verifyrE   rB   Ú_consume_errorsr   )r#   Ú
public_keyÚ	signaturerH   rL   r   r   r   Ú_ecdsa_sig_verifyy   s   ÿþrR   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 )Ú_ECDSASignatureContextrG   Ú	algorithmc                 C   s   || _ || _t ||¡| _d S ©N)Ú_backendÚ_private_keyr	   ÚHashÚ_digest)Úselfr#   rG   rT   r   r   r   Ú__init__ƒ   s   z_ECDSASignatureContext.__init__rH   r/   Nc                 C   ó   | j  |¡ d S rU   ©rY   Úupdate©rZ   rH   r   r   r   r^   �   ó   z_ECDSASignatureContext.updatec                 C   s   | j  ¡ }t| j| j|ƒS rU   )rY   ÚfinalizerM   rV   rW   ©rZ   Údigestr   r   r   ra   �   s   
z_ECDSASignatureContext.finalize)Ú__name__Ú
__module__Ú__qualname__r   ÚEllipticCurvePrivateKeyr	   ÚHashAlgorithmr[   Úbytesr^   ra   r   r   r   r   rS   ‚   s    ý
ü
rS   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 )Ú_ECDSAVerificationContextrP   rQ   rT   c                 C   s$   || _ || _|| _t ||¡| _d S rU   )rV   Ú_public_keyÚ
_signaturer	   rX   rY   )rZ   r#   rP   rQ   rT   r   r   r   r[   —   s   z"_ECDSAVerificationContext.__init__rH   r/   Nc                 C   r\   rU   r]   r_   r   r   r   r^   £   r`   z _ECDSAVerificationContext.updatec                 C   s"   | j  ¡ }t| j| j| j|ƒ d S rU   )rY   ra   rR   rV   rk   rl   rb   r   r   r   Úverify¦   s   
ÿz _ECDSAVerificationContext.verify)r/   N)rd   re   rf   r   ÚEllipticCurvePublicKeyri   r	   rh   r[   r^   rm   r   r   r   r   rj   –   s    ýü
ûrj   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   s@   || _ || _|| _t||ƒ}t||ƒ| _t||ƒ t||ƒ d S rU   )rV   rB   Ú	_evp_pkeyr)   r@   Ú_curver-   r4   ©rZ   r#   Úec_key_cdataÚevp_pkeyr(   r   r   r   r[   ®   s   

z!_EllipticCurvePrivateKey.__init__rq   r/   c                 C   ó   | j jS rU   ©ÚcurveÚkey_size©rZ   r   r   r   rx   º   ó   z!_EllipticCurvePrivateKey.key_sizer   c                 C   s:   t ƒ  t|ƒ t|jƒ t|jtjƒsJ ‚t| j| |jƒS rU   )	r   r   r   rT   r   r	   rh   rS   rV   )rZ   r   r   r   r   Úsigner¾   s   

ÿz_EllipticCurvePrivateKey.signerrT   Ú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[])rV   Ú+elliptic_curve_exchange_algorithm_supportedrw   r   r   ÚUNSUPPORTED_EXCHANGE_ALGORITHMÚnamer2   r   r   rB   ÚEC_GROUP_get_degreer   r   rC   r0   ÚECDH_compute_keyr   rF   )rZ   rT   r|   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 )Nr5   )rV   r   r   rB   r   r   r   r   Ú_ec_key_new_by_curve_nidr0   ÚEC_KEY_set_public_keyÚ_ec_cdata_to_evp_pkeyÚ_EllipticCurvePublicKey)rZ   r%   Ú	curve_nidÚpublic_ec_keyr3   rL   rt   r   r   r   rP   ê   s   z#_EllipticCurvePrivateKey.public_keyc                 C   s2   | j j | j¡}| j  |¡}tj||  ¡  ¡ d�S )N)Úprivate_valueÚpublic_numbers)	rV   r   ÚEC_KEY_get0_private_keyrB   r7   r   ÚEllipticCurvePrivateNumbersrP   r�   )rZ   r9   r�   r   r   r   Úprivate_numbersû   s   
þz(_EllipticCurvePrivateKey.private_numbersÚencodingr>   Úencryption_algorithmc                 C   s   | j  |||| | j| j¡S rU   )rV   Ú_private_key_bytesrp   rB   )rZ   r”   r>   r•   r   r   r   Úprivate_bytes  s   úz&_EllipticCurvePrivateKey.private_bytesrH   c                 C   s*   t |ƒ t| j||jƒ\}}t| j| |ƒS rU   )r   r   rV   Ú
_algorithmrM   )rZ   rH   r   rT   r   r   r   Úsign  s   ýz_EllipticCurvePrivateKey.signN)rd   re   rf   r[   r   Úread_only_propertyrw   ÚpropertyÚintrx   r   ÚEllipticCurveSignatureAlgorithmr   r{   ÚECDHrn   ri   rˆ   rP   r’   r“   r
   ÚEncodingÚPrivateFormatÚKeySerializationEncryptionr—   r™   r   r   r   r   ro   ­   sF    

ÿ
þÿÿ
þ þýü
ûþýüro   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   sJ   || _ || _|| _t||ƒ}t||ƒ| _t||ƒ t||ƒ t||ƒ d S rU   )	rV   rB   rp   r)   r@   rq   r-   r4   r;   rr   r   r   r   r[   !  s   


z _EllipticCurvePublicKey.__init__rq   r/   c                 C   ru   rU   rv   ry   r   r   r   rx   .  rz   z _EllipticCurvePublicKey.key_sizerQ   r   c                 C   sH   t ƒ  t d|¡ t|ƒ t|jƒ t|jtjƒsJ ‚t	| j
| ||jƒS )NrQ   )r   r   Ú_check_bytesr   r   rT   r   r	   rh   rj   rV   )rZ   rQ   r   r   r   r   Úverifier2  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 )Nr5   )ÚxÚyrw   )rV   Ú _ec_key_determine_group_get_funcrB   r   r0   r   r   r   Ú_tmp_bn_ctxÚ
BN_CTX_getr7   r   ÚEllipticCurvePublicNumbersrq   )
rZ   Úget_funcr%   r3   Úbn_ctxÚbn_xÚbn_yrL   r¤   r¥   r   r   r   r�   B  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 s‚w   Y  | jj |¡d d … S )Nr   zchar[])r
   ÚPublicFormatÚCompressedPointrV   r   ÚPOINT_CONVERSION_COMPRESSEDÚUncompressedPointÚPOINT_CONVERSION_UNCOMPRESSEDr   rB   r   r   r   r0   r§   ÚEC_POINT_point2octrC   rF   )	rZ   r>   Ú
conversionr%   r3   r«   ÚbuflenÚbufrL   r   r   r   Ú_encode_pointU  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±   r2   r·   rV   Ú_public_key_bytesrp   )rZ   r”   r>   r   r   r   Úpublic_bytesm  s   þÿ
ÿz$_EllipticCurvePublicKey.public_bytesrH   Nc                 C   s0   t |ƒ t| j||jƒ\}}t| j| ||ƒ d S rU   )r   r   rV   r˜   rR   )rZ   rQ   rH   r   rT   r   r   r   rm   †  s   ýz_EllipticCurvePublicKey.verify)rd   re   rf   r[   r   rš   rw   r›   rœ   rx   ri   r   r�   r   r£   r©   r�   r
   r®   r·   rŸ   rº   rm   r   r   r   r   rŒ      s<    
þý
üþý
üþýüûrŒ   )r#   r.   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-   r4   r;   r@   rM   rR   rS   rj   rg   ro   rn   rŒ   r   r   r   r   Ú<module>   s&   
ÿ




	s