3
ãde½+  ã               @   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   ú^/var/www/agendate/envp3/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/ec.pyÚ_check_signature_algorithm   s    r   r	   )Úbackendr   c             C   s”   | j j|ƒ}| j|| jjkƒ | j j|ƒ}|| j jkr>tdƒ‚| j j r`| j j	|ƒdkr`tdƒ‚| j j
|ƒ}| j|| jjkƒ | jj|ƒ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 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|| jjkƒ | j j|ƒ}| j|| jjkƒ | j 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   s8   yt j| ƒ S  tk
r2   t|› d�tjƒ‚Y nX d S )Nz" is not a supported elliptic curve)r   Z_CURVE_TYPESÚKeyErrorr   r   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|jƒ}| j|dkƒ | jjd|ƒ}| jjddƒ}| j jd|t|ƒ|||jƒ}| j|dkƒ | j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    r0   Ú_EllipticCurvePublicKey)r   Ú
public_keyÚ	signaturer(   r   c             C   s8   | j jd|t|ƒ|t|ƒ|jƒ}|dkr4| jƒ  t‚d S )Nr   r)   )r   ZECDSA_verifyr,   r*   Z_consume_errorsr   )r   r2   r3   r(   r/   r   r   r   Ú_ecdsa_sig_verifyo   s
    r4   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   Úec_key_cdataÚevp_pkeyr   r   r   r   Ú__init__~   s    

z!_EllipticCurvePrivateKey.__init__)r   c             C   s   | j S )N)r7   )r8   r   r   r   Úcurveˆ   s    z_EllipticCurvePrivateKey.curvec             C   s   | j jS )N)r<   Úkey_size)r8   r   r   r   r=   Œ   s    z!_EllipticCurvePrivateKey.key_size)Ú	algorithmÚpeer_public_keyr   c             C   sD   | j 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)
r5   Z+elliptic_curve_exchange_algorithm_supportedr<   r   r   ZUNSUPPORTED_EXCHANGE_ALGORITHMÚnamer   r   r6   )r8   r>   r?   r   r   r   Úexchange�   s    
z!_EllipticCurvePrivateKey.exchangec             C   s    | j jj| jƒ}| j j|| j jjkƒ | j jj|ƒ}| j j|ƒ}| j jj	| jƒ}| j j|| j jjkƒ | j jj
||ƒ}| j j|dkƒ | j j|ƒ}t| j ||ƒS )Nr)   )r5   r   r   r*   r   r   r   r   Z_ec_key_new_by_curve_nidr!   ZEC_KEY_set_public_keyZ_ec_cdata_to_evp_pkeyr1   )r8   r   Z	curve_nidZpublic_ec_keyr"   r/   r:   r   r   r   r2   ¤   s    z#_EllipticCurvePrivateKey.public_keyc             C   s2   | j jj| jƒ}| j j|ƒ}tj|| jƒ jƒ d�S )N)Úprivate_valueÚpublic_numbers)	r5   r   ZEC_KEY_get0_private_keyr*   Ú
_bn_to_intr   ÚEllipticCurvePrivateNumbersr2   rC   )r8   ZbnrB   r   r   r   Úprivate_numbersµ   s
    z(_EllipticCurvePrivateKey.private_numbers)ÚencodingÚformatÚencryption_algorithmr   c             C   s   | j j|||| | j| jƒS )N)r5   Z_private_key_bytesr6   r*   )r8   rG   rH   rI   r   r   r   Úprivate_bytes½   s    z&_EllipticCurvePrivateKey.private_bytes)r(   r
   r   c             C   s&   t |ƒ t||jƒ\}}t| j| |ƒS )N)r   r   r>   r0   r5   )r8   r(   r
   Ú_r   r   r   ÚsignÌ   s
    z_EllipticCurvePrivateKey.signN)Ú__name__Ú
__module__Ú__qualname__r;   Úpropertyr   ÚEllipticCurver<   Úintr=   ZECDHÚEllipticCurvePublicKeyÚbytesrA   r2   rE   rF   r   ÚEncodingZPrivateFormatZKeySerializationEncryptionrJ   ÚEllipticCurveSignatureAlgorithmrL   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 )r1   r	   )r   c             C   s@   || _ || _|| _t||ƒ}t||ƒ| _t||ƒ t||ƒ d S )N)r5   r*   r6   r   r%   r7   r    r#   )r8   r   r9   r:   r   r   r   r   r;   Ú   s    

z _EllipticCurvePublicKey.__init__)r   c             C   s   | j S )N)r7   )r8   r   r   r   r<   ä   s    z_EllipticCurvePublicKey.curvec             C   s   | j jS )N)r<   r=   )r8   r   r   r   r=   è   s    z _EllipticCurvePublicKey.key_sizec       	      C   sÎ   | j jj| jƒ}| j j|| j jjkƒ | j jj| jƒ}| j j|| j jjkƒ | j jƒ �`}| j jj	|ƒ}| j jj	|ƒ}| j jj
|||||ƒ}| j j|dkƒ | j j|ƒ}| j j|ƒ}W d Q R X tj||| jd�S )Nr)   )ÚxÚyr<   )r5   r   r   r*   r   r   r   r!   Ú_tmp_bn_ctxZ
BN_CTX_getZEC_POINT_get_affine_coordinatesrD   r   ÚEllipticCurvePublicNumbersr7   )	r8   r   r"   Úbn_ctxZbn_xZbn_yr/   rW   rX   r   r   r   rC   ì   s    z&_EllipticCurvePublicKey.public_numbers)rH   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jjkƒ | jjj| j
ƒ}| jj|| jjjkƒ | jjƒ �l}| jjj|||| jjjd|ƒ}| jj|dkƒ | jjjd|ƒ}| jjj||||||ƒ}| jj||kƒ W d Q R X | jjj|ƒd d … S )Nr   zchar[])r   ÚPublicFormatÚCompressedPointr5   r   ZPOINT_CONVERSION_COMPRESSEDÚUncompressedPointÚAssertionErrorZPOINT_CONVERSION_UNCOMPRESSEDr   r*   r   r   r   r!   rY   ZEC_POINT_point2octr+   r-   )	r8   rH   Ú
conversionr   r"   r[   ÚbuflenÚbufr/   r   r   r   Ú_encode_point  s"    
z%_EllipticCurvePublicKey._encode_point)rG   rH   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ƒ‚| j|ƒS | jj	||| | j
d ƒS d S )NzKX962 encoding must be used with CompressedPoint or UncompressedPoint format)r   rU   ZX962r\   r]   r^   r   rc   r5   Z_public_key_bytesr6   )r8   rG   rH   r   r   r   Úpublic_bytes  s    
z$_EllipticCurvePublicKey.public_bytesN)r3   r(   r
   r   c             C   s,   t |ƒ t||jƒ\}}t| j| ||ƒ d S )N)r   r   r>   r4   r5   )r8   r3   r(   r
   rK   r   r   r   Úverify2  s
    z_EllipticCurvePublicKey.verify)rM   rN   rO   r;   rP   r   rQ   r<   rR   r=   rZ   rC   r   r\   rT   rc   rU   rd   rV   re   r   r   r   r   r1   Ù   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	   rV   r   Ústrr   r    r#   rQ   r%   rT   r0   r4   ZEllipticCurvePrivateKeyr&   rS   r1   r   r   r   r   Ú<module>   s*   	\